Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; PROJEKT PRZYCISK 3
- .include "m32def.inc" ; dołączenie pliku z definicjami rejestrów
- .def Jeden = R16 ; przyporządkowanie rejestrowi R16 wartości Jeden
- .def Dwa = R17 ; przyporządkowanie rejestrowi R17 wartości Dwa
- ; REJESTRY OPOZNIENIA ; zdefiniowanie 3 rejestrów opóźnienia (max 255 cykli zliczeń w każdym rejestrze)
- .def licznik1 = R18 ; przyporządkowanie rejestrowi R18 wartości licznik1
- .def licznik2 = R19 ; przyporządkowanie rejestrowi R19 wartości licznik2
- .def licznik3 = R20 ; przyporządkowanie rejestrowi R20 wartości licznik3
- .cseg ; segment pamięci programu
- .org 0x0000 ; podanie adresu początku programu - pamięć programu
- jmp Start ; skok do pętli głównej programu
- Start: ; etykieta programu głównego
- ldi Dwa, HIGH(RAMEND) ; inicjacja 16 bitowego stosu , ładuj rejestr roboczy MSB adresu końca pamięci SRAM
- out SPH, Dwa ; inicjalizuj MSB wskaźnika stosu
- ldi Jeden, LOW(RAMEND) ; ładuj rejestr roboczy LSB adresu końca pamięci SRAM
- out SPL, Jeden ; inicjalizuj LSB wskaźnika stosu
- ldi Dwa, 0xFF ; ustalenie kierunków portów / zapisanie w rejestrze Dwa wartości FF
- out DDRA, Dwa ; załadowanie do rejestru kierunku portu A wartości z rejestru Dwa
- ldi Dwa, 0x00 ; zapisanie w rejestrze Dwa wartości 0
- out DDRB, Dwa ; załadowanie do rejestru kierunku portu B wartości z rejestru Dwa - port będzie pracował jako wejście
- ldi Dwa, 0x03 ; zapisanie do rejestru Dwa wartości 3
- 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
- Klawisz1: ; podprogram do zapalania linijki diod z opóźnieniem przez wciśnięcie klawisza W1
- in Dwa, PINB ; przeniesienie aktualnej zawartości rejestru danych wejściowych PINB do rejestru roboczego Dwa
- 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)
- rjmp Klawisz1 ; jeśli nie, to powrót do pracy w pętli
- rcall Zapalanie ; jeśli jednak wciśnięto klawisz W1, to przejdź do podprogramu Zapalanie
- rcall Klawisz2 ; wywołanie podprogramu Klawisz2
- ldi R21, 0x0F ; ładuj rejestr R21 wartością 0x0F
- push R21 ; połóż na stos wartość z rejestru R21
- out PORTA, R21 ; wyświetl w PORTA wartość 0x0F - część młodsza świeci się
- pop R22 ; zdejmij ze stosu ostatnio położoną wartość i zapisz w rejestrze R22
- out PORTA, R22 ; wyświetl w PORTA wartość rejestru R22 czyli 0x0F - część młodsza świeci się
- ldi R23, 0xF0 ; ładuj rejestr R23 wartością 0xF0
- push R23 ; połóż na stos wartość z rejestru R23
- out PORTA, R23 ; wyświetl w PORTA wartość 0xF0 - część starsza świeci się
- pop R24 ; zdejmij ze stosu ostatnio położoną wartość i zapisz w rejestrze R24
- out PORTA, R24 ; wyświetl w PORTA wartość rejestru R24 czyli 0xF0 - część starsza świeci się
- Klawisz2: ; podprogram do gaszenia linijki diod z opóźnieniem przez wciśnięcie klawisza W2
- in Dwa, PINB ; przeniesienie aktualnej zawartości rejestru danych wejściowych PINB do rejestru roboczego Dwa
- 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)
- rjmp Klawisz2 ; jeśli nie, to powrót do pracy w pętli
- rcall Gaszenie ; jeśli jednak wciśnięto klawisz W2, to przejdź do podprogramu Gaszenie
- ret ; powrót ze stosu do miejsca z którego wywołano podprogram
- Opoznienie: ; podprogram Opoznienie oddalający w czasie zapalanie kolejnych diod poprzez zajęcie ALU przez określoną liczbę cykli zegara
- ldi licznik3, 200 ; zapisanie do rejestru licznik3 wartości 200 (liczba cykli)
- Loop: ; etykieta Loop pierwszego opóźnienia
- ldi licznik2, 100 ; zapisanie do rejestru licznik2 wartości 100 (liczba cykli)
- Loop0: ; etykieta Loop0 drugiego opóźnienia
- ldi licznik1, 100 ; zapisanie do rejestru licznik1 wartości 100
- Loop1: ; etykieta Loop1 trzeciego opóźnienia
- nop ; pusta instrukcja
- dec licznik1 ; cykliczne zmniejszenie wartości rejestru licznik1
- 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)
- dec licznik2 ; zmniejszenie wartości rejestru licznik2
- brne Loop0 ; testowanie czy różne od 0
- dec licznik3 ; zmniejszenie wartości rejestru licznik3
- brne Loop ; testowanie czy różne od 0
- ret ; powrót ze stosu do miejsca z którego wywołano procedurę opóźniającą
- Opoznienie2: ; podprogram Opoznienie2 oddalający w czasie zapalanie kolejnych diod poprzez zajęcie ALU przez określoną liczbę cykli zegara
- ldi licznik3, 100 ; zapisanie do rejestru licznik3 wartości 100 (liczba cykli)
- Loop2: ; etykieta Loop2 pierwszego opóźnienia
- ldi licznik2, 100 ; zapisanie do rejestru licznik2 wartości 100 (liczba cykli)
- Loop3: ; etykieta Loop3 drugiego opóźnienia
- ldi licznik1, 100 ; zapisanie do rejestru licznik1 wartości 100
- Loop4: ; etykieta Loop4 trzeciego opóźnienia
- nop ; pusta instrukcja
- dec licznik1 ; cykliczne zmniejszenie wartości rejestru licznik1
- brne Loop4 ; instrukcja testowania etykiety, czy jest różna od 0, aż do spełnienia warunku, że Loop4 = 0
- dec licznik2 ; zmniejszenie wartości rejestru licznik2
- brne Loop3 ; testowanie czy różne od 0
- dec licznik3 ; zmniejszenie wartości rejestru licznik3
- brne Loop2 ; testowanie czy różne od 0
- ret ; powrót ze stosu do miejsca z którego wywołano procedurę opóźniającą
- Zapalanie: ; podprogram realizujący zapalanie kolejnych diod co ok. 2 sekundy
- rcall Opoznienie ; wywołanie podprogramu Opoźnienie
- sbi PORTA, 0 ; ustawiamy stan wysoki na pinie 0 portu A
- rcall Opoznienie ; wywołanie podprogramu Opoźnienie
- sbi PORTA, 1 ; ustawiamy stan wysoki na pinie 1 portu A
- rcall Opoznienie ; wywołanie podprogramu Opoźnienie
- sbi PORTA, 2 ; ustawiamy stan wysoki na pinie 2 portu A
- rcall Opoznienie ; wywołanie podprogramu Opoźnienie
- sbi PORTA, 3 ; ustawiamy stan wysoki na pinie 3 portu A
- rcall Opoznienie ; wywołanie podprogramu Opoźnienie
- sbi PORTA, 4 ; ustawiamy stan wysoki na pinie 4 portu A
- rcall Opoznienie ; wywołanie podprogramu Opoźnienie
- sbi PORTA, 5 ; ustawiamy stan wysoki na pinie 5 portu A
- rcall Opoznienie ; wywołanie podprogramu Opoźnienie
- sbi PORTA, 6 ; ustawiamy stan wysoki na pinie 6 portu A
- rcall Opoznienie ; wywołanie podprogramu Opoźnienie
- sbi PORTA, 7 ; ustawiamy stan wysoki na pinie 7 portu A
- ret ; powrót ze stosu do miejsca z którego wywołano podprogram
- Gaszenie: ; pogprogram gaszący kolejne diody co ok. 1 sekundę w odwrotnej kolejności niż zapalanie
- rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
- cbi PORTA, 7 ; ustawiamy stan niski na pinie 7 portu A
- rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
- cbi PORTA, 6 ; ustawiamy stan niski na pinie 6 portu A
- rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
- cbi PORTA, 5 ; ustawiamy stan niski na pinie 5 portu A
- rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
- cbi PORTA, 4 ; ustawiamy stan niski na pinie 4 portu A
- rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
- cbi PORTA, 3 ; ustawiamy stan niski na pinie 3 portu A
- rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
- cbi PORTA, 2 ; ustawiamy stan niski na pinie 2 portu A
- rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
- cbi PORTA, 1 ; ustawiamy stan niski na pinie 1 portu A
- rcall Opoznienie2 ; wywołanie podprogramu Opoźnienie2
- cbi PORTA, 0 ; ustawiamy stan niski na pinie 0 portu A
- ret ; powrót ze stosu do miejsca z którego wywołano podprogram
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement