Уже есть статья о том как прошить первый 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
Вот и всегото. Про подпрограмму задержки.
На ассемблере программу писал просто для удовольствия. Дело ваше. Ни о какой оригинальности или новизне, тут дело не идёт, новичку будет полезно надеюсь..
Время «моргания» светодиода не большое, меньше секунды. Но вполне достаточно чтобы заметить разницу.