Програмування мікроконтролерів AVR Лекція 10 Судаков О.О, Радченко С.П. «Сучасна мікропроцесорна техніка»
Jan 13, 2016
Програмування мікроконтролерів AVR
Лекція 10
Судаков О.О, Радченко С.П. «Сучасна мікропроцесорна техніка»
Засоби спрощення програмування AVR Програматор Arduino
Роз’єми для периферії і контролера USB контролер
Середовище Arduino.cc Бібліотеки для створення програм
Симулятор Proteus Завантаження програми
Arduino Uno
Плата Підключення зовнішнього ARV328P Вбудований ARV328P Блок живлення Кварцевий генератор Програма-завантажувач у MCU
Зовнішні роз’єми GPIO Timer АЦП Компаратор I2C UART
Номера виводів Arduino не співпадають з номерами мікроконтролера
Середовище Arduino.CC
На Java Windows,Linux,Mac
Прості бібліотеки Керування пристроями Програми
Скетчі “Шматки” коду, які вбудовуються в програму Багато прикладів
Завантаженя програми в симулятор Файл налаштувань (середовище треба запинити)
/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) ~/.arduino/preferences.txt (Linux)
Зміна каталогу компіляції 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
INPUT - ввід OUTPUT-вивід INPUT_PULLUP ввід і підключення підтягуючого резистора до
живлення int digitalRead(pin)
Повертає 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 - передача 1000011000001101 /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
Обрахунок часу millis(), micros() - з часу запуску програми
Затримки delay() , delayMicroseconds() - мілі-мікросекунд
Генерація цифрових сигналів tone() , noTone() - запуск, вимкнення генератора shiftIn(),shiftOut() – побітове читання-запис
Генерація PWM 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 9const 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^2int 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; // select the input pin for the potentiometer int piny = A1;
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(""); }