Программирование AVR в Linux. 2) Установка ПО, схема, первая программа(мигаем светодиодом)

0
ГОТОВО: Ваш голос учтен!
AVR linux logo

Итак, вторая часть руководства по программированию микроконтролеров AVR в Linux.

Установка ПО

Нам портебуется, как минимум, две программы - компилятор и программатор.
В качестве компилятора будем использовать gcc-avr, а в качестве программатора avrdude
Чтобы установить эти програмы в ubuntu нужно выполнить:

sudo apt-get install avrdude gcc-avr
Собственно, все. Идем дальше...

Схема

Схема довольно проста
 ATtiny2313 LED
У микроконторллеров AVR есть порты ввода/вывода огбозначаются они как PA, PB, PC и т.д. Порты эти восьмиразрядные, обозначение выводов порта состоит из названия порта и номера начинающегося с ноля, например PA0, PA1, .... PA7. На схеме мы подключили к первому выводу порта PB светодиод через токоограничивающий резистор.

Программа

Итак, открываем любой текстовый редактор и начинаем писать программу. В программе мы будем мигать светодиодом через определенные промежутки времени, для того чтобы отсчитать нужный промежуток времени, нужно знать частоту тактового генератора и написать пустой цикл который будет отсчитывать определенное количество тактов МК. К счастью уже есть библиотека содаржащая функцию задержки но ей нужно сообщить частоту процессора.
Микроконтроллер может работать от внутреннего генератора без кварцевого резонатора, от внутреннего генератора с кварцевым резонатором и от внешнего источника тактовых импульсов. Для нашей конструкции достаточно нестабилизированого(без кварцевого резонатора) внутренего генератора, микроконтроллер уже с завода сконфигурирован для работы от внутреннего нестабилизированого генератора на частоте 1МГц.
Чтобы сообщить функции задержки о частоте МК мы в начале файла задаем константу F_CPU

1
#define F_CPU 1000000L
Далее подключаем библиотеку для работы с портами ввода/вывода микроконтроллеров AVR и библиотеку функции задержки
1
2
#include <avr/io.h>
#include <util/delay.h>
И далее начинается собственно главная функция программы, внутри тела этой функции будут нахоиться все выполняемые дейтвия
1
2
3
void main() {
    
}
Помните про то что у МК есть порты ввода/вывода? Так вот. за каждый порт отвечает несколько восьмиразрядных регистров внутри микрокотроллера, разряды которого соответствуют номеру порта ввода/вывода. Запись в регистр производится параллельно, а значит нельзя поменять значение только на одном выводе, значения на всех выводах меняются одновременно.
Итак. Сконфигурируем первый вывод порта PB как выход
1
DDRB = 0b00000001;
Тут все просто, мы записываем в конфигурационный регистр DDRB байт 00000001 это означает что все выводы кроме PB0 сконфигурированы как входы а PB0 как выход
Далее мы запускаем бесконечный цикл(мы же хотим чтобы светодиод мигал всегда)
1
2
while (1) {
}
В котором сначала включаем светодиод записывая в регистр двоичное значение 00000001 (если нужно зажечь сведодиод на вывода PB3, например, то нужно записать значение 00001000, если одновременно на PB0 и PB3 то 00001001)
1
PORTB = 0b00000001;
Затем ждем одну секунду
1
_delay_ms(1000);
Далее записываем ноль
1
PORTB = 0b00000000;
И опять ждем секунду
1
_delay_ms(1000);
Дальше цикл повторяется
Вот собственно вся программа
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define F_CPU 1000000L // Set CPU frequency for delay function

#include <avr/io.h>
#include <util/delay.h>


void main() {
    // Set 8bit register DDRB,
    // for configure pin PB0 as output
    // Port numbers PB[X]
    //   X = 76543210
    DDRB = 0b00000001;
    
    while (1) {
        // PORTB - is 8 bit register
        // which defines the status of the outputs
        PORTB = 0b00000001; // Set pin PB0 to high level and other pins to low
        _delay_ms(1000); // Wait 1000 ms
        PORTB = 0b00000000; // Set pin PB0 to low level and other pins to low
        _delay_ms(1000); // Wait 1000 ms
    }
}
Теперь сохраняем нашу программу в файл с расширением *.c, например attiny2313.c после чего можно приступить к компиляции


Наверное у вас сразу возникает вопрос что делать если на другие выводы порта используются и менять их х состояние нельзя, т.е. как изменить состояние вывода не трогая другие выводы?
Ответ: Никак, но...
Но можно переписать состояния выводов старыми значениями. Например
1
2
3
4
PORTB |= (1<<3); //Вывести еденицу на вывод 3 
PORTB |= (1<<2)|(1<<3)|(1<<6); //Вывести еденицу на выводы 2, 3 и 6
PORTB &= ~(1<<2); //Вфвести ноль на вывод 2
PORTB &= (~((1<<0)|(1<<2)|(1<<3))); //Вывести ноль на выводы 0, 2, 3

Компиляция

Теперь нашу программу нужно скомпилировать, для этого выполняем в терминале

1
avr-gcc -g -Os -mmcu=attiny2313 -c attiny2313.c
Это создаст файл attiny2313.o. Далее запускаем
1
avr-gcc -g -mmcu=attiny2313 -o attiny2313.elf attiny2313.o
И в конце
1
avr-objcopy -j .text -j .data -O ihex attiny2313.elf attiny2313.hex
Все, файл прошивки подготовлен, можно прошивать

Прошивка

Подключаем выводы программатора к компьютеру и к одноименным выводам(обозначеными оранжевым на схеме) микроконтроллера, включаем питание и шьем указав тип контроллера и программатора

1
sudo avrdude -p t2313 -c dasa3 -U flash:w:attiny2313.hex
После прошивки микроконтроллер радостно замигает светодиодом ;-)


Пожалуйста войдите, что-бы оставить коментарий.
Нет акаунта? Регистрация