Програмування мікроконтролерів avr
DESCRIPTION
Програмування мікроконтролерів AVR. Лекція 10 Судаков О.О, Радченко С.П. « Сучасна мікропроцесорна техніка ». Засоби спрощення програмування AVR. Програматор Arduino Роз ’ єми для периферії і контролера USB контролер Середовище Arduino.cc Бібл і отеки для створення програм - PowerPoint PPT PresentationTRANSCRIPT
Програмування мікроконтролерів 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(""); }