Advertisement
Guest User

last sprawko

a guest
Jan 29th, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. Sprawozdanie 4
  2. Grupa D
  3. Godzina rozpoczecia zajec: 15:15 środa
  4. 29.01.20r
  5. Zadania: 1B, 2A, 3A
  6.  
  7. Zad. 1B
  8. .include "m32def.inc"
  9. .def licznik1 = R18
  10. .def licznik2 = R19
  11. .def licznik3 = R20
  12. .def W1 = R22
  13. .def W2 = R24
  14. .equ bit0 = 0b11111110
  15. .equ bit1 = 0b11111101
  16.  
  17. .def Dwa = R23
  18. .org 0x0000
  19. jmp Start
  20.  
  21. Start:
  22.  
  23. ldi R17, HIGH(RAMEND)
  24. out SPH, R17
  25. ldi R17, LOW(RAMEND)
  26. out SPL, R17
  27. ldi ZH, high(Procedura_krecenia)
  28. ldi ZL, low(Procedura_krecenia)
  29.  
  30. ldi R21, 0b11110000
  31. out DDRB, R21
  32.  
  33. ldi R16,0
  34. out DDRA, R16
  35.  
  36.  
  37.  
  38. Test_W1:
  39. ldi W1, bit0
  40. inc W1
  41. ldi R25, 64
  42. out PORTA, W1
  43. in W1, PINC
  44.  
  45. sbrs W1, 0
  46. icall
  47. rjmp Test_W2
  48.  
  49. Test_W2:
  50. ldi W2, bit1
  51. inc W2
  52. out PORTA, W2
  53. in W2, PINC
  54. sbrs W2, 1
  55. rcall Procedura_krecenia2
  56. rjmp Test_W1
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64. Procedura_krecenia:
  65.  
  66. ldi R16, 0b00010000
  67. out PORTB, R16
  68. rcall Opoznienie
  69. nop
  70. ldi R16, 0b00100000
  71. out PORTB, R16
  72. rcall Opoznienie
  73. nop
  74. ldi R16, 0b01000000
  75. out PORTB, R16
  76. rcall Opoznienie
  77. nop
  78. ldi R16, 0b10000000
  79. out PORTB, R16
  80. rcall Opoznienie
  81. nop
  82. dec R25
  83. tst R25
  84. brne Procedura_krecenia
  85. ldi R16, 0b00000000
  86. out PORTB, R16
  87.  
  88. ret
  89.  
  90.  
  91.  
  92.  
  93. Procedura_krecenia2:
  94. ;ldi R25, 2
  95. ldi R16, 0b10000000
  96. out PORTB, R16
  97. rcall Opoznienie
  98. nop
  99. ldi R16, 0b01000000
  100. out PORTB, R16
  101. rcall Opoznienie
  102. nop
  103. ldi R16, 0b00100000
  104. out PORTB, R16
  105. rcall Opoznienie
  106. nop
  107. ldi R16, 0b00010000
  108. out PORTB, R16
  109. rcall Opoznienie
  110. nop
  111. dec R25
  112. tst R25
  113. brne Procedura_krecenia2
  114. ldi R16, 0b00000000
  115. out PORTB, R16
  116.  
  117. ret
  118.  
  119.  
  120.  
  121.  
  122. Opoznienie:
  123. ldi licznik3, 26
  124. LoopA:
  125. ldi licznik2, 16
  126. LoopA0:
  127. ldi licznik1, 25
  128. LoopA1:
  129. dec licznik1
  130. brne LoopA1
  131. dec licznik2
  132. brne LoopA0
  133. dec licznik3
  134. brne LoopA
  135. ret
  136.  
  137.  
  138.  
  139.  
  140. 2A
  141.  
  142. ; PROJEKT SERWO 1
  143. .include "m32def.inc"
  144. .def Jeden = R16 ; przyporzadkowanie rejestrowi R16 wartosci Jeden
  145. .def Dwa = R17 ; przyporzadkowanie rejestrowi R17 wartooci Dwa
  146. .def W1 = R21 ; przyporzadkowanie rejestrowi R18 wartooci W1
  147. .def W2 = R22 ; przyporzadkowanie rejestrowi R19 wartooci W2
  148. .def W3 = R23 ; przyporzadkowanie rejestrowi R19 wartooci W2
  149. .def licznik1 = R18
  150. .def licznik2 = R19
  151. .def licznik3 = R20
  152. .equ bit1 = 0b11111101
  153.  
  154. .equ Zera = 0x00
  155. .equ Jedynki = 0xff
  156. .equ bit0 = 0b11111110
  157. .cseg ; segment pamięci programu
  158. .org 0x0000
  159. jmp Start
  160. .org INT0addr ; standardowa formula dotyczy uruchomienia obsługi przerwania zewnetrznego
  161. jmp przerwanie_0 ; przeniesienie do etykiety z procedura obslugi przerwania
  162. Start:
  163. ldi R25, 0;
  164. ldi R26, 0;
  165. cli
  166. ; przygotowania STOSu
  167. ldi R17, HIGH(RAMEND)
  168. out SPH, R17
  169. ldi R17, LOW(RAMEND)
  170. out SPL, R17
  171. ldi Jeden, Zera ; ustalenie zawartosci rejestrów roboczych
  172. ldi Dwa, Jedynki
  173. out DDRA, Dwa ; port zasilajacy linijkę diod
  174. out DDRC, Jeden ; port do odczytywania, czy wcisnieto switch
  175. sbi PORTD, 2 ; port z pull-up do reagowania na sygnal w INT0
  176. ; procedura konfiguracji przerwania INT0
  177. in Jeden, MCUCR ; kopia rejestru MCUCR
  178. cbr Jeden, 0 << ISC00 ; reczna konfiguracja bitu ISC00 w INT0 na stan 0 i nie zmienia
  179.  
  180. pozostałych bitow
  181. sbr Jeden, 1 << ISC01 ; reczna konfiguracja bitu ISC01 w INT0 na stan 1 i nie zmienia
  182.  
  183. pozostałych bitow
  184. out MCUCR, Jeden ; ETAP I zrealizowany, teraz mamy juz zdefiniowane przerwanie,
  185. ; które będzie wywoływane sygnalem zbocza opadającego wywoływanego wcisnieciem wsitcha
  186.  
  187. S13
  188. ; uaktywnienie przerwania w rejestrze GICR:
  189. in Jeden, GICR ; główny rejestr kontroli przerwań
  190. sbr Jeden, 1 << INT0 ; reczne ustawienie bitu na 1 odpowiadajacego za odblokowanie
  191. ; zewnętrznego przerwania INT0 znajdujacego się pod adresem INT0addr
  192. out GICR, Jeden ; ETAP II, od teraz już tylko czekamy na zbocze opadajace, ktore ma
  193.  
  194. pojawic sie na INT0
  195. sei ; ETAP III, od teraz mamy aktywne przerwania zewnetrzne, bo flaga I w SREG jest
  196.  
  197. ustawiona
  198. ; robimy standardowa PRZESTRZEN We/Wy jeśli będzie potrzebna
  199. ; definicje przerwan, jeśli beda potrzebne
  200.  
  201. ; zaczynamy ustawiac serwo w konkretne polozenie
  202. Procedura_krecenia_pwm:
  203. ; 10 odpowiada polozeniu serwa
  204. sbi DDRB, 3 ; na PB3 będzie generowane PWM, praca w trybie wyjściowym
  205. ldi R17, (1<<WGM00) | (1<<WGM01) | (1<<COM01) | (0<<COM00) | (1<<CS00) | (1<<CS01) |
  206.  
  207. (0<<CS02) ; uzupełnij # aby praca PWM umożliwila poprawna prace serwa
  208. out TCCR0, R17 ; ustawienie rejestru TCCR0 w celu skonfigurowania pracy TC0
  209. out OCR0, R26 ; rejestr porownawczy, przy ktorym zrownanie licznika bedzie
  210.  
  211. generowalo zmiane stanu na OC0 (PB3)
  212. rcall Opoznienie
  213. nop
  214. rjmp Procedura_krecenia_pwm
  215.  
  216. ; opóźnienie do testow
  217. Opoznienie:
  218. ldi licznik3, 50
  219. LoopA:
  220. ldi licznik2, 30
  221. LoopA0:
  222. ldi licznik1, 10
  223. LoopA1:
  224. dec licznik1
  225. brne LoopA1
  226. dec licznik2
  227. brne LoopA0
  228. dec licznik3
  229. brne LoopA
  230. ret
  231.  
  232. Test_W1: ; etykieta z pętlą testującą stan przycisków na JP23
  233. ldi W1, bit0
  234. inc W1
  235. out PORTC, W1 ; przygotowanie procedury pod wystawienie jedynki na bit nr 0
  236. in W1, PINC ; mapowanie aktualnego stanu portu B
  237. ; tutaj warto zastanowić się nad wprowadzeniem dodatkowych warunków/procedur dla
  238.  
  239. upewnienia się mikrosterownika, czy nie wciśnięto przy okazji S9?
  240.  
  241. sbrs W1, 0 ; testowanie bitu w W1,
  242. rjmp inc1 ; skok, jesli wcisnieto S1
  243. rjmp Test_W2 ; skok, jesli nie wcisnieto S1
  244.  
  245. Test_W2: ; etykieta z pętlą testującą stan przycisków na JP23
  246. ldi W2, bit1
  247. inc W2
  248. out PORTC, W2 ; przygotowanie procedury pod wystawienie jedynki na bit nr 1
  249. in W2, PINC ; mapowanie aktualnego stanu portu B
  250. sbrs W2, 1 ; testowanie bitu nr 1
  251. rjmp inc2 ; skok, jesli wcisnieto S5
  252. rjmp Test_W1 ; skok, jesli nie wcisnieto S5
  253.  
  254. inc1:
  255. inc R25
  256. out PORTA,R25
  257. rjmp Test_W1
  258.  
  259. inc2:
  260. inc R26
  261. out PORTA, R26
  262. rjmp Test_W1
  263.  
  264. przerwanie_0:
  265. in R17, SREG ; kopiuj aktualną zawartosc rejestru statusu SREG
  266. push R17 ; zrzucenie na czas obsługi przerwania zawartości rejestru statusu SREG
  267. reti
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement