Програмування мікроконтролерів AVR

Download Report

Transcript Програмування мікроконтролерів AVR

Програмування
мікроконтролерів AVR
Лекція 10
Судаков О.О, Радченко С.П.
«Сучасна мікропроцесорна техніка»
Засоби спрощення програмування AVR

Програматор Arduino



Середовище Arduino.cc


Роз’єми для периферії і контролера
USB контролер
Бібліотеки для створення програм
Симулятор Proteus

Завантаження програми
Arduino Uno

Плата






Зовнішні роз’єми







Підключення зовнішнього ARV328P
Вбудований ARV328P
Блок живлення
Кварцевий генератор
Програма-завантажувач у MCU
GPIO
Timer
АЦП
Компаратор
I2C
UART
Номера виводів Arduino не співпадають з номерами
мікроконтролера
Середовище Arduino.CC

На Java


Прості бібліотеки



Windows,Linux,Mac
Керування пристроями
Програми
Скетчі


“Шматки” коду, які вбудовуються в програму
Багато прикладів
Завантаженя програми в симулятор

Файл налаштувань (середовище треба запинити)





~/.arduino/preferences.txt (Linux)
Зміна каталогу компіляції



/Users/<USERNAME>/Library/Arduino/preferences.txt (Mac)
c:\Documents and Settings\<USERNAME>\Application
Data\Arduino\preferences.txt (Windows XP)
c:\Users\<USERNAME>\AppData\Roaming\Arduino\preferences.
txt (Windows Vista)
build.path=/home/saa
Можна зберігати шляхи до програм
Завантаження програми звичайним чином
Структура програми Arduino.cc
#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun)
serialEventRun();
}
return 0;
}
Користувач програмує
•setup();
•loop();
Вже написані функції
•init() - підключаються
пристрої до виводів
плати
•serialEventRun()UART ввід-вивід
Фукнкції і бібілотеки Arduino.cc


Мова програмування С++
Вбудовані функції
 Digital I/O (GPIO)
 Analog I/O (PWM,АЦП)
 Високорівневі функції

Затримки
 Математика
Бібліотеки
 LiquidCrystal, LED індикатори, дисплеї
 SD – флеш-карта
 Servo, Stepper - керування серво- та кроковими моторами
 SPI,I2C,OneWire – послідовні протоколи обміну
Документація є в інтернеті



Генерація сигналів, зсув, очікування
Програмування GPIO (портів в/в)

3 порти GPIO по 8 біт


більшість виводів AVR можна підключити до GPIO
Функції Arduino

pinMode(pin, mode)


pin – номер виводу Arduino (не контролера)
mode




int digitalRead(pin)


INPUT - ввід
OUTPUT-вивід
INPUT_PULLUP ввід і підключення підтягуючого резистора до
живлення
Повертає HIGH,LOW
digitalWrite(pin,val)

val= HIGH,LOW
Приклади програмування GPIO


Блимання світлодіода
Вимірювання часу перезарядки ємності






Оцінка ємності конденсатора
Оцінка опору резистора
Оцінка струму через фотодіод
Різні сенсори (кнопки, екрани …)
Керування кроковим двигуном
Послідовні і паралельні шини передачі

I2C,SPI…
Блимання світлодіода
// Pin 13 has an LED connected on most Arduino boards.
int led = 13;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH);
// turn the LED on (HIGH is the
voltage level)
delay(1000);
// wait for a second
digitalWrite(led, LOW);
// turn the LED off by making
the voltage LOW
delay(1000);
// wait for a second
}
Керування кроковим двигуном
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8,10,9,11);
void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(60);
}
void loop() {
// step one revolution in one direction:
myStepper.step(stepsPerRevolution);
delay(500);
// step one revolution in the other direction:
myStepper.step(-stepsPerRevolution);
delay(500);
}
Передача даних по UART
void setup() {
// initialize the serial port
Serial.begin(9600);
}
void loop() {
Serial.println(“a”);
}
010000110101011000010010100001
01100001 a - передача 10000110
00001101 /r - передача 10110000
00001010 /n - передача 01010000
GPIO на С

Всі регістри портів мають свої адреси, які позначаються тими ж
символами, що і в документації
 DDRx=0xf7;
// 4 біт ввід, інші вивід
 PORTx|=0xf7; // всі на 1, крім 4 біта
 PORTx^=0b1;
//перемикати 0-й біт
void setup() {
DDRD|=0x1;
}
void loop() {
PORTD^=0x1;
}
Таймери

Функції arduino

Обрахунок часу


Затримки



tone() , noTone() - запуск, вимкнення генератора
shiftIn(),shiftOut() – побітове читання-запис
Генерація PWM



delay() , delayMicroseconds() - мілі-мікросекунд
Генерація цифрових сигналів


millis(), micros() - з часу запуску програми
analogWrite()
Керування сервомотором
Вимірювання тривалості імпульсів

pulseIn()
Керування сервомотором
#include <Servo.h>
Servo myservo;
int pos = 0;
void setup()
{
myservo.attach(9);
}
void loop()
{
for(pos = 0; pos < 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
}
Генерація PWM (форма сигналів)
int ledPin = 9;
// LED connected to digital pin 9
const int s=16;
//unsigned char v[s]={255,255/4*3,255/2,255/4,0, 255/4, 255/2, 255/4*3};
//unsigned char d[s]={2,1,1, 2,2,1,1,2};
unsigned char v[s]={255,245,217,176,127,79,37,10,0,10,37,79,127,176,217,245};
//unsigned char d[s]={1,1,1, 1,1,1,1,1};
//cos^2
int i=0;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
analogWrite(ledPin, v[i] );
//delay(d[i]*10);
delay(10);
if(++i>=s) i =0;
}
Тривалість імпульсів
int pin = 7;
unsigned long duration;
void setup() {
pinMode(pin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
duration=pulseIn(pin,LOW);
Serial.println(duration);
}
АЦП – керування джойстиком













int pinx = A0;
int piny = A1;
// select the input pin for the potentiometer
void setup() {
// declare the ledPin as an OUTPUT:
Serial.begin(9600);
}
void loop() {
// read the value from the sensor:
Serial.print(analogRead(pinx));
Serial.print("\t:\t");
Serial.print(analogRead(piny));
Serial.println("");
}