Програмування мікроконтролерів 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("");
}