Прошиваем первый живой контроллер AVR ATmega8

Уже есть статья о том как прошить первый stm32 контроллер. Но если в STM всё довольно понятно при наличии отладочной платы, то с AVR контроллерами сложилось иначе. Плат то навалом, но цена на них обычно не удовлетворяет конечного пользователя-радиолюбителя.

Итак. Я делаю ставку на то, что программатор у вас уже есть. Скорее всего это USBASP столь распространённый в наше время, когда LPT и COM порты есть уже далеко не у всех.

Условимся, что прошивать будем ATmega8. В пользу выбора именно этого контроллера для первой программы служит наличие его в DIP корпусе, что существенно упрощает пайку. Вы можете взять обычную макетную плату и что называется «на коленке» собрать ваше первое устройство.

Первым делом находим datasheet на mega8 и смотрим распиновку:

В итоге нам нужно получить вот такую схему:

На порт PD0 я повесил светодиод. Это сделано сугубо для того, чтобы проверить устройство программой хелло ворлд мира железа — миганием светодиодом.

Я не сделал даже подтяжки, просто за экономией времени. USBASP обеспечивает пригодное для наших целей питание, поэтому зачем морочить голову.

Кроме того прошу обратить внимание, что я не подсоеденял питание/землю к AREF/AVCC это выходя для питания для АЦП. Который в данном примере нам также не пригодится.

Про RESET.

Этот пин сбрасывает контроллер. Причём он инверсный, т.е. когда на нём +5В контроллер работает, когда 0В — простаивает. Он должен быть подключен к программатору и подтянут к питанию. Можно также подсоеденить кнопку, но это другая история.

Про отсутствие кварцевого резонатора.

Да, я не подключил кварц и конденсаторы. Это опять таки чтобы упростить схему. Если вы новичёк то и 10 проводов припаять вам будет довольно сложно. Тем более, что в ATmega8 есть встроенный генератор тактовых импульсов. Так что диодом можно поморгать и так.

Вроде всё описал…

Вот программа мигания светодиодом на ассемблере:

.include "m8def.inc"
 .def temp = r16
 .set all_high = 0xff
 .equ delay_time1 = 255
 .equ delay_time2 = 255

Reset:
 ldi temp, all_high ; загружаем в r16 0xFF
 out DDRD, temp     ; настраиваем все пины PD как выход 

Main:
 out PORTD, temp    ; выводим на порт D 0xFF, т.е. все пины +5B
 rcall Delay        ; ждём 
 com temp           ; инвертируем содержимое r16, на следующем проходе все пины 0B
 rjmp Main          ; переходим в Main

Delay:
 ldi r21, delay_time1
 delay1: ldi r20, delay_time2
 delay2: dec r20
 brne delay2
 dec r21
 brne delay1
 ret

Вот и всегото. Про подпрограмму задержки.

На ассемблере программу писал просто для удовольствия. Дело ваше. Ни о какой оригинальности или новизне, тут дело не идёт, новичку будет полезно надеюсь..

Время «моргания» светодиода не большое, меньше секунды. Но вполне достаточно чтобы заметить разницу.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий