творческие издевательства.
Теперь попробуем немного изменить схему и программу.
Для начала натыкаем светодиодов, да побольше. Так, чтобы получилась световая дорожка.. Теперь можно развлекаться созданием световых эффектов. Подаешь на ножку нолик– светодиод светится, подаешь еденичку – нет. Инструкция по сборке схемы проста: соединяем со светодиодами ножки чипа с 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: ;========================================================== |
Программу и прошивку можно скачать с сайта или просто скопировать с экрана.
После компиляции и прошивки этой программы мы можем нажимать на кнопку, и наблюдать световые эффекты .