«AVR шаг за шагом», версия для печати. Исходный документ: https://avr.ru/beginer/avrsbs/step4

творческие издевательства.

Теперь попробуем немного изменить схему и программу.

Для начала натыкаем светодиодов, да побольше. Так, чтобы получилась световая дорожка..  Теперь можно развлекаться созданием световых эффектов. Подаешь на ножку нолик– светодиод светится, подаешь еденичку – нет. Инструкция по сборке схемы проста: соединяем со светодиодами ножки чипа с 12дцатой по 19ую также как на предыдущей схеме была соединена только 17ая нога чипа.

 

Теперь пора поизмываться над программой. Мы будем создавать световой эффект – луч бластера. Для этого необходимо создать некий стек, типа «очередь» или по науке FiFo, ставить в очередь состояние кнопки, и потихоньку сдвигать эту очередь, отображая ее на «экран» из восьми светодиодов.

Секция инициализации точно такая же как у предыдущей программы.

Стек мы сформируем из регистра R18 и назовем его ViewReg. Принцип очереди будем формировать, сдвигая содержимое регистра влево, то есть от младших адресов к старшим. В начале программы мы «обнуляем» содержимое стека, записывая в него единицы командой ldi. (именно единицы не отображаются на нашем «крутом» восьмипиксельном мониторе).

Далее начинается бесконечный цикл, вначале которого командой out мы отображаем содержимое стека ViewReg в порт PortB.

Основная проблема в том, что чип у нас слишком быстрый. То есть, если не обеспечить задержку, то светодиоды будут мигать с такой частотой что мы даже и не заметим что что-то изменяется. По этому мы должны чем-то занять микропроцессор

                 ldi           Xh,0x7f
                 ldi           Xl,0xff
Delay:      sbiw      Xh:Xl,1
 
                 brne      delay
 

Этот кусок кода обеспечивает занятость процессора обратным отсчетом от 0x7FFF до ноля. (Эй, кто сказал, что не понял, что это за число такое? В Бобруйск, животное! учить олбанские системы счисления!). Смысл в том что некоторые из рабочих регистров процессор может обрабатывать парами., тоесть как машинное слово в 2 байта. У таких регистров есть специальные имена: X, Y, Z. Соответственно имена пар регистров входящих в эти «составные» регистры Xh:Xl, Yh:Yl, Zh:Zl. Мы используем регистровую пару Х. Командами ldi мы загружаем в регистровую пару число 0x7FFF. Затем командой sbiw мы вычитаем единицу из этой пары. А команда brne осуществляет переход если результат предыдущей операции небыл равен нолю. Таким образом, пока в регистровой паре не будет значение 0, процессор будет «крутится» в пустом цикле, обеспечивая задержку.

После задержки мы опрашиваем пятый вход порта D (это 9 ножка чипа) и запоминаем его состояние командой bst. После чего сдвигаем стек командой lsl. Далее, c помощью команды bld заполняем нулевой элемент стека запомненным состоянием пятого входа порта D

После чего программа выполняет безусловный переход на начало цикла, и снова отображает содержимое стека.

;==========================================================
;Autor:         MadMayDay 2008    
;Project:       StepByStep
;Name:          LED
;==========================================================
.device         AT90S2313
.include        "2313def.inc"
.def            SlopReg=R16
.def            ViewReg=R18
;==========================================================
Start:   rjmp   Init;

         ;----------------------------------------------------------
         ;устанавливаем часть ног микросхемы в состояние "выход",
         ;и часть в состояние "вход"
         ;входы   02,03,06,07,08,09,11
         ;выходы  12,13,14,15,16,17,18,19

Init:    ldi    SlopReg,0b11111111 ; грузим признак выхода
         out    DDRB,SlopReg       ; в регистр управления
                                   ; портом "B"
         ldi    SlopReg,0b00000000 ; грузим признак входа
         out    DDRD,SlopReg       ; в регистр упр. портом "D"

         ldi    SlopReg,0b11111111 ; грузим признак "активности"
         out    PortD,SlopReg      ; в регистр  входа

         ;----------------------------------------------------------
         ; заталкиваем данные из регистра D в стек FIFO8
         ; отображаем состояние стека на «монитор» регистра B

         ldi    ViewReg,0xff       ; формируем начальное состояние стека

Begin:   out    PortB,ViewReg      ;отображаем состояние стека на «экране»

         ldi    Xh,0x7f            ;формируем задержку циклом
         ldi    Xl,0xff
Delay:   sbiw   Xh:Xl,1
         brne   delay

         in     SlopReg,PinD       ;считываем показания кнопок
         bst    SlopReg,5          ;запоминаем состояние кнопки #5

         lsl    ViewReg            ;сдвигаем стек.
         bld    ViewReg,0          ;задвигаем в стек считанное состояние

         rjmp   Begin              ; и снова здорова.
End:
;==========================================================
 

Программу и прошивку можно скачать с сайта (/int/Files/Dounload/sbs/sbs_02.zip) или просто скопировать с экрана.

После компиляции и прошивки этой программы мы можем нажимать на кнопку, и наблюдать световые эффекты (/int/Files/Picture/avrsbs/step4/M1.wmv) .

 

 Далее ----> (/beginer/avrsbs/step5)

 

Все права защищены © AVR.RU, 2021.