Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#define PORTA 0x1B
- //#define PORTB 0x18
- //#define PORTC 0x15
- //#define PORTD 0x12
- .macro confPortForOutput
- ldi r23, 255
- out @0-1, r23; @0-1 так как ddrX=portX-1 по документации контроллера.
- .endm
- .macro confPortForInput
- ldi r23, 0
- out @0-1, r23; @0-1 так как ddrX=portX-1 по документации контроллера.
- .endm
- .macro delay
- /*
- Usage:
- delay a, b, c
- Args:
- a - параметр подгонки
- b - средний параметр
- c - грубый параметр
- Description:
- ћакрос нелинеен к аргументам.
- ћожно было бы сделать его линейным,
- но это не так интересно. ¬едь именно
- вывод формулы рассчета задержки по
- этим трем циклам значительно продвинет
- вас в понимании јссемблера.
- ?а и возможных значений задержек больше,
- чем если бы мы обнул¤ли переменные при
- выходе во внешний цикл.
- */
- ldi r16, @0 ; a
- ldi r17, @1 ; b
- ldi r18, @2 ; c
- Loop:
- dec r16; 1
- brne Loop; 1
- dec r17; 1
- brne Loop; 1
- dec r18
- brne Loop
- ;-------------------
- /* од на python дл¤ вычислени¤
- количества тактов находитс¤ в файле
- clock.py
- */
- .endm
- .macro delay_500ms
- delay 192, 75, 21 ; 3'999'999 тактов
- sleep ; +1 такт.
- .endm
- .macro delay_250ms
- delay 95, 38, 11 ; 1'999'998 тактов
- sleep ; +1
- sleep ; +1
- .endm
- .macro sendValueToPort
- /*
- Usage:
- sendValueToPort portA, 12
- Description:
- ѕосылает значение на порт.
- предполагаеся, что порт установлен
- на вывод.
- */
- LDI R16, @1
- OUT @0, R16 ;
- .endm
- .macro Wave
- //r16 - регистр с исходной фигней
- //r17 - регистр с уменьшающимся фигней
- //r18 - регистр с увеличивающейся фигней
- //r19 - регистр c суммой r17 и r18 для отображения
- //r20 - регистр со счетчиком для цикла
- //считываем значение из @0 в r16
- // @0-2 согласно мануалу это pinX, где X - буква порта
- in r16, @0-2
- //переводим порт @0 в режим вывода
- confPortForOutput @0
- //зажигаем светодиод на месте нажатой кнопки
- out @0, r16
- //обнуляем r17 и r18
- ldi r17,0
- ldi r18,0
- //записываем в r17 и r18 исходное значение нажатой кнопки
- add r17, r16
- add r18, r16
- //цикл от 7 до 0
- ldi r20, 7
- Cycle:
- //делим r17 на 2
- lsr r17;
- //умножаем r18 на 2
- lsl r18;
- //обнуляем r19 и записываем в него сумму r17 и r18
- ldi r19,0
- add r19,r17
- add r19,r18
- //выводим в @0 r19
- out @0, r19
- //пауза в 250 мс
- //delay_250ms
- //декрементируем r20 и переходим на следующую итерацию
- dec r20;
- brne Cycle
- //обнуляем значение порта во избежание ошибок
- ldi r16,0
- out @0, r16
- //переводим порт @0 обратно в режим ввода
- confPortForInput @0
- .endm
- //начало проги
- //Переводим порты в режим ввода
- confPortForInput PORTA
- confPortForInput PORTB
- confPortForInput PORTC
- confPortForInput PORTD
- loop:
- //Бесконечно в цикле выполняем программу волны для каждого из портов
- nop
- nop
- waveA:
- //загрузка содержимого порта А в r16 (in = чтение)
- in r16, PINA
- //сравнение значения в порте А с нулем (cpi = сравнение с константой)
- cpi r16,0
- //переход к метке waveB если равно нулю (то есть кнопка не нажата и мы пропускаем выполнение волны, breq=переход если равно)
- breq waveB
- //выполняем программу волны если что-то было нажато
- Wave portA
- waveB:
- in r16, PORTB
- cpi r16,0
- breq waveC
- Wave PORTB
- waveC:
- in r16, PORTC
- cpi r16,0
- breq waveD
- Wave PORTC
- waveD:
- in r16, PORTD
- cpi r16,0
- breq next
- Wave PORTD
- //идем в начало цикла
- next:
- rjmp loop
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement