Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.68 KB | None | 0 0
  1. //#define PORTA 0x1B
  2. //#define PORTB 0x18
  3. //#define PORTC 0x15
  4. //#define PORTD 0x12
  5.  
  6. .macro confPortForOutput
  7. ldi r23, 255
  8. out @0-1, r23; @0-1 так как ddrX=portX-1 по документации контроллера.
  9. .endm
  10.  
  11. .macro confPortForInput
  12. ldi r23, 0
  13. out @0-1, r23; @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.  
  127. //обнуляем значение порта во избежание ошибок
  128. ldi r16,0
  129. out @0, r16
  130.  
  131. //переводим порт @0 обратно в режим ввода
  132. confPortForInput @0
  133. .endm
  134.  
  135.  
  136. //начало проги
  137. //Переводим порты в режим ввода
  138. confPortForInput PORTA
  139. confPortForInput PORTB
  140. confPortForInput PORTC
  141. confPortForInput PORTD
  142.  
  143. loop:
  144. //Бесконечно в цикле выполняем программу волны для каждого из портов
  145. nop
  146. nop
  147. waveA:
  148. //загрузка содержимого порта А в r16 (in = чтение)
  149. in r16, PINA
  150. //сравнение значения в порте А с нулем (cpi = сравнение с константой)
  151. cpi r16,0
  152. //переход к метке waveB если равно нулю (то есть кнопка не нажата и мы пропускаем выполнение волны, breq=переход если равно)
  153. breq waveB
  154. //выполняем программу волны если что-то было нажато
  155. Wave portA
  156.  
  157. waveB:
  158. in r16, PORTB
  159. cpi r16,0
  160. breq waveC
  161. Wave PORTB
  162.  
  163. waveC:
  164. in r16, PORTC
  165. cpi r16,0
  166. breq waveD
  167. Wave PORTC
  168.  
  169. waveD:
  170. in r16, PORTD
  171. cpi r16,0
  172. breq next
  173. Wave PORTD
  174.  
  175. //идем в начало цикла
  176. next:
  177. rjmp loop
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement