210 likes | 487 Views
Програмування мікроконтролерів AVR. Лекція 10 Судаков О.О, Радченко С.П. « Сучасна мікропроцесорна техніка ». Засоби спрощення програмування AVR. Програматор Arduino Роз ’ єми для периферії і контролера USB контролер Середовище Arduino.cc Бібл і отеки для створення програм
E N D
Програмування мікроконтролерів 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 • Користувач програмує • setup(); • loop(); • Вже написані функції • init() - підключаються пристрої до виводів плати • serialEventRun()-UART ввід-вивід #include <Arduino.h> int main(void) { init(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; }
Фукнкції і бібілотеки 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 - передача 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 • Обрахунок часу • 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 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; // 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(""); • }