Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.58 KB | None | 0 0
  1. ; PROJEKT PRZYCISK 3
  2. .include "m32def.inc" ; dołączenie pliku z definicjami rejestrów
  3. .def Jeden = R16 ; przyporządkowanie rejestrowi R16 wartości Jeden
  4. .def Dwa = R17 ; przyporządkowanie rejestrowi R17 wartości Dwa
  5. ; REJESTRY OPOZNIENIA ; zdefiniowanie 3 rejestrów opóźnienia (max 255 cykli zliczeń w każdym rejestrze)
  6. .def licznik1 = R18 ; przyporządkowanie rejestrowi R18 wartości licznik1
  7. .def licznik2 = R19 ; przyporządkowanie rejestrowi R19 wartości licznik2
  8. .def licznik3 = R20 ; przyporządkowanie rejestrowi R20 wartości licznik3
  9. .cseg ; segment pamięci programu
  10. .org 0x0000 ; podanie adresu początku programu - pamięć programu
  11. jmp Start ; skok do pętli głównej programu
  12. Start: ; etykieta programu głównego
  13. ldi Dwa, HIGH(RAMEND) ; inicjacja 16 bitowego stosu , ładuj rejestr roboczy MSB adresu końca pamięci SRAM
  14. out SPH, Dwa ; inicjalizuj MSB wskaźnika stosu
  15. ldi Jeden, LOW(RAMEND) ; ładuj rejestr roboczy LSB adresu końca pamięci SRAM
  16. out SPL, Jeden ; inicjalizuj LSB wskaźnika stosu
  17. ldi Dwa, 0xFF ; ustalenie kierunków portów / zapisanie w rejestrze Dwa wartości FF
  18. out DDRA, Dwa ; załadowanie do rejestru kierunku portu A wartości z rejestru Dwa
  19. ldi Dwa, 0x00 ; zapisanie w rejestrze Dwa wartości 0
  20. out DDRB, Dwa ; załadowanie do rejestru kierunku portu B wartości z rejestru Dwa - port będzie pracował jako wejście
  21. ldi Dwa, 0x03 ; zapisanie do rejestru Dwa wartości 3
  22. out PORTB, Dwa ; przesłanie wartości z rejestru Dwa do rejestru danych portu B, wymuszenie na dwóch najmłodszych pinach wysokiego stanu za pomocą rezystorów podciągających pull-up
  23.  
  24.  
  25. Klawisz1: ; podprogram do zapalania linijki diod z opóźnieniem przez wciśnięcie klawisza W1
  26. in Dwa, PINB ; przeniesienie aktualnej zawartości rejestru danych wejściowych PINB do rejestru roboczego Dwa
  27. sbrc Dwa, 0 ; instrukcja sprawdzająca, czy wciśnięto przycisk klawiatury pod bitem 0 (od tego miejsca w programie będzie zależała realizacja kolejnych podprogramów)
  28. rjmp Klawisz1 ; jeśli nie, to powrót do pracy w pętli
  29. rcall Zapalanie ; jeśli jednak wciśnięto klawisz W1, to przejdź do podprogramu Zapalanie
  30. rcall Klawisz2 ; wywołanie podprogramu Klawisz2
  31.  
  32. ldi R21, 0x0F ; ładuj rejestr R21 wartością 0x0F
  33. push R21 ; połóż na stos wartość z rejestru R21
  34. out PORTA, R21 ; wyświetl w PORTA wartość 0x0F - część młodsza świeci się
  35. pop R22 ; zdejmij ze stosu ostatnio położoną wartość i zapisz w rejestrze R22
  36. out PORTA, R22 ; wyświetl w PORTA wartość rejestru R22 czyli 0x0F - część młodsza świeci się
  37.  
  38. ldi R23, 0xF0 ; ładuj rejestr R23 wartością 0xF0
  39. push R23 ; połóż na stos wartość z rejestru R23
  40. out PORTA, R23 ; wyświetl w PORTA wartość 0xF0 - część starsza świeci się
  41. pop R24 ; zdejmij ze stosu ostatnio położoną wartość i zapisz w rejestrze R24
  42. out PORTA, R24 ; wyświetl w PORTA wartość rejestru R24 czyli 0xF0 - część starsza świeci się
  43.  
  44. Klawisz2: ; podprogram do gaszenia linijki diod z opóźnieniem przez wciśnięcie klawisza W2
  45. in Dwa, PINB ; przeniesienie aktualnej zawartości rejestru danych wejściowych PINB do rejestru roboczego Dwa
  46. sbrc Dwa, 1 ; instrukcja sprawdzająca, czy wciśnięto przycisk klawiatury pod bitem 1 (od tego miejsca w programie będzie zależała realizacja kolejnych podprogramów)
  47. rjmp Klawisz2 ; jeśli nie, to powrót do pracy w pętli
  48. rcall Gaszenie ; jeśli jednak wciśnięto klawisz W2, to przejdź do podprogramu Gaszenie
  49. ret ; powrót ze stosu do miejsca z którego wywołano podprogram
  50.  
  51.  
  52. Opoznienie: ; podprogram Opoznienie oddalający w czasie zapalanie kolejnych diod poprzez zajęcie ALU przez określoną liczbę cykli zegara
  53. ldi licznik3, 200 ; zapisanie do rejestru licznik3 wartości 200 (liczba cykli)
  54. Loop: ; etykieta Loop pierwszego opóźnienia
  55. ldi licznik2, 100 ; zapisanie do rejestru licznik2 wartości 100 (liczba cykli)
  56. Loop0: ; etykieta Loop0 drugiego opóźnienia
  57. ldi licznik1, 100 ; zapisanie do rejestru licznik1 wartości 100
  58. Loop1: ; etykieta Loop1 trzeciego opóźnienia
  59. nop ; pusta instrukcja
  60. dec licznik1 ; cykliczne zmniejszenie wartości rejestru licznik1
  61. brne Loop1 ; instrukcja testowania etykiety, czy jest różna od 0, aż do spełnienia warunku, że Loop1 = 0 (jeśli flaga Z = 0 w SREG, to skok)
  62. dec licznik2 ; zmniejszenie wartości rejestru licznik2
  63. brne Loop0 ; testowanie czy różne od 0
  64. dec licznik3 ; zmniejszenie wartości rejestru licznik3
  65. brne Loop ; testowanie czy różne od 0
  66. ret ; powrót ze stosu do miejsca z którego wywołano procedurę opóźniającą
  67.  
  68.  
  69. Opoznienie2: ; podprogram Opoznienie2 oddalający w czasie zapalanie kolejnych diod poprzez zajęcie ALU przez określoną liczbę cykli zegara
  70. ldi licznik3, 100 ; zapisanie do rejestru licznik3 wartości 100 (liczba cykli)
  71. Loop2: ; etykieta Loop2 pierwszego opóźnienia
  72. ldi licznik2, 100 ; zapisanie do rejestru licznik2 wartości 100 (liczba cykli)
  73. Loop3: ; etykieta Loop3 drugiego opóźnienia
  74. ldi licznik1, 100 ; zapisanie do rejestru licznik1 wartości 100
  75. Loop4: ; etykieta Loop4 trzeciego opóźnienia
  76. nop ; pusta instrukcja
  77. dec licznik1 ; cykliczne zmniejszenie wartości rejestru licznik1
  78. brne Loop4 ; instrukcja testowania etykiety, czy jest różna od 0, aż do spełnienia warunku, że Loop4 = 0
  79. dec licznik2 ; zmniejszenie wartości rejestru licznik2
  80. brne Loop3 ; testowanie czy różne od 0
  81. dec licznik3 ; zmniejszenie wartości rejestru licznik3
  82. brne Loop2 ; testowanie czy różne od 0
  83. ret ; powrót ze stosu do miejsca z którego wywołano procedurę opóźniającą
  84.  
  85. Zapalanie: ; podprogram realizujący zapalanie kolejnych diod co ok. 2 sekundy
  86. rcall Opoznienie ; wywołanie podprogramu Opoźnienie
  87. sbi PORTA, 0 ; ustawiamy stan wysoki na pinie 0 portu A
  88. rcall Opoznienie ; wywołanie podprogramu Opoźnienie
  89. sbi PORTA, 1 ; ustawiamy stan wysoki na pinie 1 portu A
  90. rcall Opoznienie ; wywołanie podprogramu Opoźnienie
  91. sbi PORTA, 2 ; ustawiamy stan wysoki na pinie 2 portu A
  92. rcall Opoznienie ; wywołanie podprogramu Opoźnienie
  93. sbi PORTA, 3 ; ustawiamy stan wysoki na pinie 3 portu A
  94. rcall Opoznienie ; wywołanie podprogramu Opoźnienie
  95. sbi PORTA, 4 ; ustawiamy stan wysoki na pinie 4 portu A
  96. rcall Opoznienie ; wywołanie podprogramu Opoźnienie
  97. sbi PORTA, 5 ; ustawiamy stan wysoki na pinie 5 portu A
  98. rcall Opoznienie ; wywołanie podprogramu Opoźnienie
  99. sbi PORTA, 6 ; ustawiamy stan wysoki na pinie 6 portu A
  100. rcall Opoznienie ; wywołanie podprogramu Opoźnienie
  101. sbi PORTA, 7 ; ustawiamy stan wysoki na pinie 7 portu A
  102. ret ; powrót ze stosu do miejsca z którego wywołano podprogram
  103.  
  104. Gaszenie: ; pogprogram gaszący kolejne diody co ok. 1 sekundę w odwrotnej kolejności niż zapalanie
  105. rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
  106. cbi PORTA, 7 ; ustawiamy stan niski na pinie 7 portu A
  107. rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
  108. cbi PORTA, 6 ; ustawiamy stan niski na pinie 6 portu A
  109. rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
  110. cbi PORTA, 5 ; ustawiamy stan niski na pinie 5 portu A
  111. rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
  112. cbi PORTA, 4 ; ustawiamy stan niski na pinie 4 portu A
  113. rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
  114. cbi PORTA, 3 ; ustawiamy stan niski na pinie 3 portu A
  115. rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
  116. cbi PORTA, 2 ; ustawiamy stan niski na pinie 2 portu A
  117. rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
  118. cbi PORTA, 1 ; ustawiamy stan niski na pinie 1 portu A
  119. rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
  120. cbi PORTA, 0 ; ustawiamy stan niski na pinie 0 portu A
  121. ret ; powrót ze stosu do miejsca z którego wywołano podprogram
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement