Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define portA 0x1B
  2. #define portB 0x18
  3. #define portC 0x15
  4. #define portD 0x12
  5.  
  6. .macro confPortForOutput
  7.     ldi r16, 255
  8.     out @0-1, r16; @0-1 так как ddrX=portX-1 по документации контроллера.
  9. .endm
  10.  
  11. .macro confPortForInput
  12.     ldi r16, 0
  13.     out @0-1, r16; @0-1 так как ddrX=portX-1 по документации контроллера.
  14. .endm
  15.  
  16. .macro delay
  17.     /*
  18.     Usage:
  19.         delay a, b, c
  20.     Args:
  21.         a - параметр подгонки
  22.         b - средний параметр
  23.         c - грубый параметр
  24.     Description:
  25.         ћакрос нелинеен к аргументам.
  26.         ћожно было бы сделать его линейным,
  27.         но это не так интересно. ¬едь именно
  28.         вывод формулы рассчета задержки по
  29.         этим трем циклам значительно продвинет
  30.         вас в понимании јссемблера.
  31.         ?а и возможных значений задержек больше,
  32.         чем если бы мы обнул¤ли переменные при
  33.         выходе во внешний цикл.
  34.     */
  35.     ldi r16, @0 ; a
  36.     ldi r17, @1 ; b
  37.     ldi r18, @2 ; c
  38.     Loop:
  39.         dec r16;    1
  40.         brne Loop;  1
  41.  
  42.         dec r17;    1
  43.         brne Loop;  1
  44.  
  45.         dec r18
  46.         brne Loop
  47.         ;-------------------
  48.         /* од на python дл¤ вычислени¤
  49.         количества тактов находитс¤ в файле
  50.         clock.py
  51.         */
  52.  
  53. .endm
  54.  
  55. .macro delay_500ms
  56.     delay 192, 75, 21   ; 3'999'999 тактов
  57.     sleep               ; +1 такт.
  58. .endm
  59.  
  60. .macro delay_250ms
  61.     delay 95, 38, 11    ; 1'999'998 тактов
  62.     sleep               ; +1
  63.     sleep               ; +1
  64. .endm
  65.  
  66. .macro sendValueToPort
  67.     /*
  68.     Usage:
  69.         sendValueToPort portA, 12
  70.     Description:
  71.         ѕосылает значение на порт.
  72.         предполагаеся, что порт установлен
  73.         на вывод.
  74.     */
  75.     LDI R16, @1
  76.     OUT @0, R16 ;
  77. .endm
  78.  
  79. .macro Wave
  80.     //r16 - регистр с исходной фигней
  81.     //r17 - регистр с уменьшающимся фигней
  82.     //r18 - регистр с увеличивающейся фигней
  83.     //r19 - регистр c суммой r17 и r18 для отображения
  84.     //r20 - регистр со счетчиком для цикла
  85.  
  86.     //считываем значение из @0 в r16
  87.     // @0-2  согласно мануалу это pinX, где X - буква порта
  88.     in r16,  @0-2
  89.    
  90.     //переводим порт @0 в режим вывода
  91.     confPortForOutput @0
  92.  
  93.     //зажигаем светодиод на месте нажатой кнопки
  94.     out @0, r16
  95.  
  96.     //обнуляем r17 и r18
  97.     ldi r17,0
  98.     ldi r18,0
  99.  
  100.     //записываем в r17 и r18 исходное значение нажатой кнопки
  101.     add r17, r16
  102.     add r18, r16
  103.  
  104.     //цикл от 7 до 0
  105.     ldi r20, 7
  106.     Cycle:
  107.         //делим r17 на 2
  108.         lsr r17;
  109.         //умножаем r18 на 2
  110.         lsl r18;
  111.    
  112.         //обнуляем r19 и записываем в него сумму r17 и r18
  113.         ldi r19,0
  114.         add r19,r17
  115.         add r19,r18
  116.        
  117.         //выводим в @0 r19
  118.         out @0, r19
  119.  
  120.         //пауза в 250 мс
  121.         delay_250ms
  122.  
  123.         //декрементируем r20 и переходим на следующую итерацию
  124.         dec r20;
  125.         brne Cycle
  126. .endm
  127.  
  128.  
  129. //начало проги
  130. //Переводим порты в режим ввода
  131. confPortForInput    portA
  132. confPortForInput    portB
  133. confPortForInput    portC
  134. confPortForInput    portD
  135.  
  136. loop:
  137.     //Бесконечно в цикле выполняем программу волны для каждого из портов
  138.    
  139.     waveA:
  140.         //сравнение значения в порте А с нулем (cpi = сравнение с константой)
  141.         ldi r16, portA-2
  142.         cpi r16,0
  143.         //переход к метке waveB если равно нулю (то есть кнопка не нажата и мы пропускаем выполнение волны, breq=переход если равно)
  144.         breq waveB
  145.         //выполняем программу волны если что-то было нажато
  146.         Wave portA
  147.    
  148.     waveB:
  149.         ldi r16, portB-2
  150.         cpi r16,0
  151.         breq waveC
  152.         Wave portB
  153.    
  154.     waveC:
  155.         ldi r16, portC-2
  156.         cpi r16,0  
  157.         breq waveD
  158.         Wave portC
  159.  
  160.     waveD:
  161.         ldi r16, portD-2
  162.         cpi r16,0  
  163.         breq next
  164.         Wave portD
  165.  
  166.     next:
  167.         rjmp loop
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement