Advertisement
ArBa

sprawko 3

Nov 21st, 2017
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .include "m32def.inc" ;dołączenie pliku nagłówkowego
  2. .def MSB = R16        ;przyporządkowanie rejestowi R16 nazwy MSB
  3. .def LSB = R17        ;przyporządkowanie rejestowi R17 nazwy LSB
  4. .def LICZNIK1 = R18   ;przyporządkowanie rejestowi R18 nazwy LICZNIK1
  5. .def LICZNIK2 = R19   ;przyporządkowanie rejestowi R19 nazwy LICZNIK2
  6. .def LICZNIK3 = R20   ;przyporządkowanie rejestowi R20 nazwy LICZNIK3
  7. .def DDR = R22        ;przyporządkowanie rejestowi R22 nazwy DDR
  8. .def PORT = R21       ;przyporządkowanie rejestowi R21 nazwy PORT
  9. .def ZE_STOSU = R23   ;przyporządkowanie rejestowi R23 nazwy ZE_STOSU
  10. .cseg                 ;dyrektywa oznaczająca, że wszystkie dalsze zapisy dotyczą pamięci programu
  11. .org 0x0000           ;określenie adresu, gdzie kompilator rozpocznie umieszczanie generowanych bajtów
  12. jmp START             ;skok do stykiety START
  13. START:                ;stworzenie etykiety START
  14. ldi MSB, HIGH(RAMEND) ;załadowanie do rejestru MSB starszej części adresu końca pamięci
  15. out SPH, MSB          ;załadowanie zawartości rejestru MSB do SPH
  16. ldi LSB, LOW(RAMEND)  ;załadowanie do rejestru LSB młodszej części adresu końca pamięci
  17. out SPL, LSB          ;załadowanie zawartości rejestru lsb do SPL
  18. ldi DDR, 0xFF         ;załadowanie do rejestru DDR wartości 0xFF
  19. out DDRA, DDR         ;ustawienie rejestru kierunku danych portu A
  20. ldi DDR, 0x00         ;załadowanie do rejestru DDR wartości 0x00
  21. out DDRB, DDR         ;ustawienie rejestru kierunku danych portu B
  22. ldi PORT, 0x01        ;załadowanie do rejestru PORT wartości 0x01
  23. out PORTB, PORT       ;ustawienie rezystora podciągającego na pierwszym pinie portu B
  24.  
  25. WCISKNIECIE_PRZYCISKU_1:    ;stworzenie etykiety WCISKNIECIE_PRZYCISKU_1           
  26. in PORT, PORTB          ;przeniesienie zawartości rejestru PORTB do rejestru PORT
  27. sbrc PORT, 0            ;instrukcja sprawdzająca, czy pod bitem 0 jest stan niski (czy wciśnięto klawiaturę)
  28. rjmp WCISKNIECIE_PRZYCISKU_1 ;jeśli nie to powrót do WCISKNIECIE_PRZYCISKU_1
  29. rcall ZAPALANIE_DIOD    ;wywołanie zapalania diód
  30.  
  31. PO_ZAPALENIU_DIOD:      ;utworzenie etykiety PO_ZAPALENIU_DIOD
  32. ldi PORT, 0b00000010    ;załadowanie do rejestru PORT wartości 0x02
  33. out PORTB, PORT         ;ustawienie rezystora pull na drugim pinie portu B
  34.  
  35. WCISKNIECIE_PRZYCISKU_2: ;stworzenie etykiety WCISKNIECIE_PRZYCISKU_2
  36. in PORT, PORTB          ;przeniesienie zawartości rejestru PORTB do rejestru PORT
  37. sbrc PORT, 1            ;instrukcja sprawdzająca, czy pod bitem 1 jest stan niski (czy wciśnięto klawiaturę)
  38. rjmp WCISKNIECIE_PRZYCISKU_2 ;jeśli nie to powrót do WCISKNIECIE_PRZYCISKU_2
  39. rcall GASZENIE_DIOD     ;wywołanie wygaszania diód
  40.  
  41. PO_ZGASZENIU_DIOD:      ;utworzenie etykiedy PO_ZAPALENIU_DIOD
  42. rcall MIGANIE_DIODAMI           ;wywołanie migania diodami
  43. rcall START             ;wracam do startu programu
  44.  
  45.  
  46. OPOZNIENIE_2S:          ;instrukcje zajmująca mikroprocesor o taktowaniu 1MHz na 2 sekundy
  47. ldi  LICZNIK1, 1;11    aby poprawnie działała, nalezy usunąć w tych trzech linijkach "1;"
  48. ldi  LICZNIK2, 1;38
  49. ldi  LICZNIK3, 1;94
  50. P2: dec  LICZNIK3
  51.     brne P2
  52.     dec  LICZNIK2
  53.     brne P2
  54.     dec  LICZNIK1
  55.     brne P2
  56. ret
  57.  
  58. ZAPALANIE_DIOD:         ;Podprogram zapalający kolejne diody                  
  59. rcall OPOZNIENIE_2S     ;wywołanie opóźnienia dwusekundowego            
  60. ldi PORT, 0b00000001    ;załadowanie do rejestru PORT wartości
  61. out PORTA, PORT         ;ustawienie stanu wysokiego na wyjściu PORTA, aby zapalić konkretne diody
  62. rcall OPOZNIENIE_2S
  63. ldi PORT, 0b00000011
  64. out PORTA, PORT
  65. rcall OPOZNIENIE_2S
  66. ldi PORT, 0b00000111
  67. out PORTA, PORT
  68. rcall OPOZNIENIE_2S
  69. ldi PORT, 0b00001111
  70. out PORTA, PORT
  71. rcall OPOZNIENIE_2S
  72. ldi PORT, 0b00011111
  73. out PORTA, PORT
  74. rcall OPOZNIENIE_2S
  75. ldi PORT, 0b00111111
  76. out PORTA, PORT
  77. rcall OPOZNIENIE_2S
  78. ldi PORT, 0b01111111
  79. out PORTA, PORT
  80. rcall OPOZNIENIE_2S
  81. ldi PORT, 0b11111111               
  82. out PORTA, PORT     ;w tym miejscu wszystkie 8 diod na PORTA jest zapalonych
  83. rjmp PO_ZAPALENIU_DIOD ;powrót do instrukcji PO_ZAPALENIU_DIOD
  84.  
  85.  
  86. OPOZNIENIE_1S:          ;instrukcje zajmująca mikroprocesor o taktowaniu 1MHz na 1 sekundę
  87. ldi  LICZNIK1, 1;6     aby poprawnie działała, nalezy usunąć w tych trzech linijkach "1;"
  88. ldi  LICZNIK2, 1;19
  89. ldi  LICZNIK3, 1;174
  90. P1: dec  LICZNIK1
  91.     brne P1
  92.     dec  LICZNIK2
  93.     brne P1
  94.     dec  LICZNIK3
  95.     brne P1
  96. ret
  97.  
  98. GASZENIE_DIOD:          ;Podprogram wygaszający kolejne diody 
  99. rcall OPOZNIENIE_1S     ;wywołanie opóźnienia jednosekundowego
  100. ldi PORT, 0b01111111
  101. out PORTA, PORT
  102. rcall OPOZNIENIE_1S
  103. ldi PORT, 0b00111111
  104. out PORTA, PORT
  105. rcall OPOZNIENIE_1S
  106. ldi PORT, 0b00011111
  107. out PORTA, PORT
  108. rcall OPOZNIENIE_1S
  109. ldi PORT, 0b00001111
  110. out PORTA, PORT
  111. rcall OPOZNIENIE_1S
  112. ldi PORT, 0b00000111
  113. out PORTA, PORT
  114. rcall OPOZNIENIE_1S
  115. ldi PORT, 0b00000011
  116. out PORTA, PORT
  117. rcall OPOZNIENIE_1S
  118. ldi PORT, 0b00000001
  119. out PORTA, PORT
  120. rcall OPOZNIENIE_1S
  121. ldi PORT,0b00000000
  122. out PORTA, PORT    ;w tym miejscu wszystkie diody na PORTA są zgaszone
  123. rcall OPOZNIENIE_1S  
  124. rjmp PO_ZGASZENIU_DIOD ;powrót do instrukcji PO_ZGASZENIU_DIOD
  125.  
  126.  
  127. MIGANIE_DIODAMI:                ;stworzenie etykiedy MIGANIE_DIODAMI_
  128. ;Przesłanie wartości 0xf0 do rejestru PORT, odłożenie na stos, wzięcie ze stosu do rejestru ZE_STOSU, ustalenie stanu diód, czekanie
  129. ldi PORT, 0xf0
  130. push PORT
  131. pop ZE_STOSU
  132. out PORTA, ZE_STOSU
  133. rcall OPOZNIENIE_1S
  134. ;wygaszenie diód na 1 sekundę
  135. ldi PORT,0
  136. out PORTA, PORT
  137. rcall OPOZNIENIE_1S
  138. ;Przesłanie wartości 0xf0 do rejestru PORT, odłożenie na stos, wzięcie ze stosu do rejestru ZE_STOSU, ustalenie stanu diód, czekanie
  139. ldi PORT, 0xf0
  140. push PORT
  141. pop ZE_STOSU
  142. out PORTA, ZE_STOSU
  143. rcall OPOZNIENIE_1S
  144. ;Przesłanie wartości 0x0f do rejestru PORT, odłożenie na stos, wzięcie ze stosu do rejestru ZE_STOSU, ustalenie stanu diód, czekanie
  145. ldi PORT,0x0f
  146. push PORT
  147. pop ZE_STOSU
  148. out PORTA, ZE_STOSU
  149. rcall OPOZNIENIE_1S
  150. ;wygaszenie diód na 1 sekundę
  151. ldi PORT,0
  152. out PORTA, PORT
  153. rcall OPOZNIENIE_1S
  154. ;Przesłanie wartości 0x0f do rejestru PORT, odłożenie na stos, wzięcie ze stosu do rejestru ZE_STOSU, ustalenie stanu diód, czekanie
  155. ldi PORT,0x0f
  156. push PORT
  157. pop ZE_STOSU
  158. out PORTA, ZE_STOSU
  159. rcall OPOZNIENIE_1S
  160. ;wygaszenie diód na 1 sekundę
  161. ldi PORT,0
  162. out PORTA, PORT
  163. ret ;powrót
  164.    
  165.    
  166.  
  167. ;ZADANIE 2
  168. .include "m32def.inc" ;dołączenie pliku nagłówkowego
  169. .def LICZNIK1 = R18   ;przyporządkowanie rejestrowi R18 nazwy LICZNIK1
  170. .def LICZNIK2 = R19   ;przyporządkowanie rejestrowi R19 nazwy LICZNIK2
  171. .def LICZNIK3 = R20   ;przyporządkowanie rejestrowi R20 nazwy LICZNIK3
  172. .def LICZNIK = R15    ;przyporządkowanie rejestrowi R15 nazwy LICZNIK
  173. .def STAN = R16       ;przyporządkowanie rejestrowi R16 nazwy STAN
  174. .cseg                 ;dyrektywa oznaczająca, że wszystkie dalsze zapisy dotyczą pamięci programu
  175. .org 0x0000           ;określenie adresu, gdzie kompilator rozpocznie umieszczanie generowanych bajtów
  176. ldi STAN, 0xFF        ;załadowanie do rejestru STAN wartości 0xFF
  177. out DDRA, STAN        ;ustawienie rejestru kierunku danych portu A
  178. ldi STAN, 0x00        ;załadowanie do rejestru STAN wartości 0x00
  179. out PORTA, STAN       ;ustawienie rejestru stanu PORTA     
  180. out DDRB, STAN        ;ustawienie rejestru kierunku danych portu B
  181. ldi STAN, 0b00000011  ;załadowanie do rejestru STAN wartości 3
  182. out PORTB, STAN       ;ustawienie dwóch rezystorów pull-up na PORTB
  183. ldi LICZNIK,0         ;załadowanie do rejestru LICZNIK wartości 0
  184. clr R27               ;wyczyszczenie MSB wskaźnika X
  185. ldi XL, 0x61          ;przekazanie adresu do LSB wskaźnika X
  186. st X,LICZNIK          ;zapisanie zawartości rejestru LICZNIK w SRAM pod adresem 0x61
  187.  
  188.  
  189. //*W SYMULATORZE ABY ZCZYTAĆ STAN PINÓW UŻYWAM WARTOSĆI Z PORTB, NA PRAWDZIWEJ ATMEDZE NALEŻY ZMIENIĆ PORTB NA PINB, ABY W PRZYPADKU NACIŚNIĘCIA PRZYCISKU ZCZYTAĆ 0*//
  190.  
  191.  
  192. jmp START                            ;skok do etykiety Start
  193. START:                               ;utworzenie etykiety Start
  194. in STAN, PORTB                       ;przeniesienie zawartości rejestru PINB do rejestru STAN !!!!!!!!!!!!!!!!!!!!!!
  195. sbrs STAN, 0                         ;pominięcie następnej instrukcji jeżeli PINB0 jest logiczną jedynką
  196. rjmp SWIECENIE_DIOD              ;wywołanie świecenia diód, rjmp bo nie wraca przez ret A.B.
  197. sbrs STAN, 1                         ;pominięcie następnej instrukcji jeżeli PINB1 jest logiczną jedynką
  198. rjmp INKREMENTACJA_LICZNIKA      ;wywołanie inkrementacji licznika, j.w. A.B.
  199. PO_OPOZNIENIU:
  200. rjmp START                           ;powrót do START
  201.  
  202. INKREMENTACJA_LICZNIKA:              ;procedura zwiększania licznika
  203. ld LICZNIK,X
  204. inc LICZNIK
  205. st X,LICZNIK
  206. rjmp OPOZNIENIE_5mS
  207.  
  208. OPOZNIENIE_5mS:                      ;instrukcje zajmująca mikroprocesor o taktowaniu 1MHz na 5ms
  209.                                     ;instrukcja mówi o 5s, a nie 5ms A.B.
  210.     ldi  LICZNIK1, 1;5
  211. P1: ldi  LICZNIK2, 1;20
  212. P2: ldi  LICZNIK3, 1;50
  213. P3: dec  LICZNIK3
  214.     brne P3
  215.     dec  LICZNIK2
  216.     brne P2
  217.     dec  LICZNIK1
  218.     brne P1
  219.     nop
  220. rjmp PO_OPOZNIENIU
  221.  
  222. INKREMENTACJA_LICZNIKA_W_PETLI:     ;procedura zwiększania licznika podczas wyświetlania na diodach
  223. ld LICZNIK,X
  224. inc LICZNIK
  225. st X,LICZNIK
  226. rjmp OPOZNIENIE_5mS_W_PETLI
  227.      
  228.  
  229. OPOZNIENIE_5mS_W_PETLI:             ;instrukcje zajmująca mikroprocesor o taktowaniu 1MHz na 5ms sekund
  230.                                     ;j.w. 5s, a nie 5ms wedle instrukcji
  231.     ldi  LICZNIK1, 1;5
  232. D1: ldi  LICZNIK2, 1;20
  233. D2: ldi  LICZNIK3, 1;50
  234. D3: dec  LICZNIK3
  235.     brne D3
  236.     dec  LICZNIK2
  237.     brne D2
  238.     dec  LICZNIK1
  239.     brne D1
  240.     nop
  241. rjmp DO_SWIECENIA
  242.  
  243. SWIECENIE_DIOD:                     ;Podprogram zapalający diody na około 5 sekund                   
  244.     ldi  LICZNIK1, 1;83
  245. L1: ldi  LICZNIK2, 1;100
  246. L2: ldi  LICZNIK3, 1;100
  247. L3: dec  LICZNIK3
  248.     in STAN, PORTB     
  249.     sbrs STAN, 1                    ;jeżeli na PORTB1 jest logiczną jedynką pomiń inkrementację w pętli
  250.     rjmp INKREMENTACJA_LICZNIKA_W_PETLI ;j.w. rjmp, a nie rcall A.B.
  251.     DO_SWIECENIA:
  252.     ld STAN, X                      ;pobranie do STAN wartości ze wskaźnika X
  253.     out PORTA, STAN                 ;zaświecenie diód
  254.     brne L3
  255.     dec  LICZNIK2
  256.     brne L2
  257.     dec  LICZNIK1
  258.     brne L1
  259.     nop
  260. ;ret
  261. rjmp Start              ;nam na debbugerze wracało od początku programu na PODOBNYM kodzie zamiast wrócić do pętli głównej A.B.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement