Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .include "m32def.inc" ;dołączenie pliku nagłówkowego
- .def MSB = R16 ;przyporządkowanie rejestowi R16 nazwy MSB
- .def LSB = R17 ;przyporządkowanie rejestowi R17 nazwy LSB
- .def LICZNIK1 = R18 ;przyporządkowanie rejestowi R18 nazwy LICZNIK1
- .def LICZNIK2 = R19 ;przyporządkowanie rejestowi R19 nazwy LICZNIK2
- .def LICZNIK3 = R20 ;przyporządkowanie rejestowi R20 nazwy LICZNIK3
- .def DDR = R22 ;przyporządkowanie rejestowi R22 nazwy DDR
- .def PORT = R21 ;przyporządkowanie rejestowi R21 nazwy PORT
- .def ZE_STOSU = R23 ;przyporządkowanie rejestowi R23 nazwy ZE_STOSU
- .cseg ;dyrektywa oznaczająca, że wszystkie dalsze zapisy dotyczą pamięci programu
- .org 0x0000 ;określenie adresu, gdzie kompilator rozpocznie umieszczanie generowanych bajtów
- jmp START ;skok do stykiety START
- START: ;stworzenie etykiety START
- ldi MSB, HIGH(RAMEND) ;załadowanie do rejestru MSB starszej części adresu końca pamięci
- out SPH, MSB ;załadowanie zawartości rejestru MSB do SPH
- ldi LSB, LOW(RAMEND) ;załadowanie do rejestru LSB młodszej części adresu końca pamięci
- out SPL, LSB ;załadowanie zawartości rejestru lsb do SPL
- ldi DDR, 0xFF ;załadowanie do rejestru DDR wartości 0xFF
- out DDRA, DDR ;ustawienie rejestru kierunku danych portu A
- ldi DDR, 0x00 ;załadowanie do rejestru DDR wartości 0x00
- out DDRB, DDR ;ustawienie rejestru kierunku danych portu B
- ldi PORT, 0x01 ;załadowanie do rejestru PORT wartości 0x01
- out PORTB, PORT ;ustawienie rezystora podciągającego na pierwszym pinie portu B
- WCISKNIECIE_PRZYCISKU_1: ;stworzenie etykiety WCISKNIECIE_PRZYCISKU_1
- in PORT, PORTB ;przeniesienie zawartości rejestru PORTB do rejestru PORT
- sbrc PORT, 0 ;instrukcja sprawdzająca, czy pod bitem 0 jest stan niski (czy wciśnięto klawiaturę)
- rjmp WCISKNIECIE_PRZYCISKU_1 ;jeśli nie to powrót do WCISKNIECIE_PRZYCISKU_1
- rcall ZAPALANIE_DIOD ;wywołanie zapalania diód
- PO_ZAPALENIU_DIOD: ;utworzenie etykiety PO_ZAPALENIU_DIOD
- ldi PORT, 0b00000010 ;załadowanie do rejestru PORT wartości 0x02
- out PORTB, PORT ;ustawienie rezystora pull na drugim pinie portu B
- WCISKNIECIE_PRZYCISKU_2: ;stworzenie etykiety WCISKNIECIE_PRZYCISKU_2
- in PORT, PORTB ;przeniesienie zawartości rejestru PORTB do rejestru PORT
- sbrc PORT, 1 ;instrukcja sprawdzająca, czy pod bitem 1 jest stan niski (czy wciśnięto klawiaturę)
- rjmp WCISKNIECIE_PRZYCISKU_2 ;jeśli nie to powrót do WCISKNIECIE_PRZYCISKU_2
- rcall GASZENIE_DIOD ;wywołanie wygaszania diód
- PO_ZGASZENIU_DIOD: ;utworzenie etykiedy PO_ZAPALENIU_DIOD
- rcall MIGANIE_DIODAMI ;wywołanie migania diodami
- rcall START ;wracam do startu programu
- OPOZNIENIE_2S: ;instrukcje zajmująca mikroprocesor o taktowaniu 1MHz na 2 sekundy
- ldi LICZNIK1, 1;11 aby poprawnie działała, nalezy usunąć w tych trzech linijkach "1;"
- ldi LICZNIK2, 1;38
- ldi LICZNIK3, 1;94
- P2: dec LICZNIK3
- brne P2
- dec LICZNIK2
- brne P2
- dec LICZNIK1
- brne P2
- ret
- ZAPALANIE_DIOD: ;Podprogram zapalający kolejne diody
- rcall OPOZNIENIE_2S ;wywołanie opóźnienia dwusekundowego
- ldi PORT, 0b00000001 ;załadowanie do rejestru PORT wartości
- out PORTA, PORT ;ustawienie stanu wysokiego na wyjściu PORTA, aby zapalić konkretne diody
- rcall OPOZNIENIE_2S
- ldi PORT, 0b00000011
- out PORTA, PORT
- rcall OPOZNIENIE_2S
- ldi PORT, 0b00000111
- out PORTA, PORT
- rcall OPOZNIENIE_2S
- ldi PORT, 0b00001111
- out PORTA, PORT
- rcall OPOZNIENIE_2S
- ldi PORT, 0b00011111
- out PORTA, PORT
- rcall OPOZNIENIE_2S
- ldi PORT, 0b00111111
- out PORTA, PORT
- rcall OPOZNIENIE_2S
- ldi PORT, 0b01111111
- out PORTA, PORT
- rcall OPOZNIENIE_2S
- ldi PORT, 0b11111111
- out PORTA, PORT ;w tym miejscu wszystkie 8 diod na PORTA jest zapalonych
- rjmp PO_ZAPALENIU_DIOD ;powrót do instrukcji PO_ZAPALENIU_DIOD
- OPOZNIENIE_1S: ;instrukcje zajmująca mikroprocesor o taktowaniu 1MHz na 1 sekundę
- ldi LICZNIK1, 1;6 aby poprawnie działała, nalezy usunąć w tych trzech linijkach "1;"
- ldi LICZNIK2, 1;19
- ldi LICZNIK3, 1;174
- P1: dec LICZNIK1
- brne P1
- dec LICZNIK2
- brne P1
- dec LICZNIK3
- brne P1
- ret
- GASZENIE_DIOD: ;Podprogram wygaszający kolejne diody
- rcall OPOZNIENIE_1S ;wywołanie opóźnienia jednosekundowego
- ldi PORT, 0b01111111
- out PORTA, PORT
- rcall OPOZNIENIE_1S
- ldi PORT, 0b00111111
- out PORTA, PORT
- rcall OPOZNIENIE_1S
- ldi PORT, 0b00011111
- out PORTA, PORT
- rcall OPOZNIENIE_1S
- ldi PORT, 0b00001111
- out PORTA, PORT
- rcall OPOZNIENIE_1S
- ldi PORT, 0b00000111
- out PORTA, PORT
- rcall OPOZNIENIE_1S
- ldi PORT, 0b00000011
- out PORTA, PORT
- rcall OPOZNIENIE_1S
- ldi PORT, 0b00000001
- out PORTA, PORT
- rcall OPOZNIENIE_1S
- ldi PORT,0b00000000
- out PORTA, PORT ;w tym miejscu wszystkie diody na PORTA są zgaszone
- rcall OPOZNIENIE_1S
- rjmp PO_ZGASZENIU_DIOD ;powrót do instrukcji PO_ZGASZENIU_DIOD
- MIGANIE_DIODAMI: ;stworzenie etykiedy MIGANIE_DIODAMI_
- ;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
- ldi PORT, 0xf0
- push PORT
- pop ZE_STOSU
- out PORTA, ZE_STOSU
- rcall OPOZNIENIE_1S
- ;wygaszenie diód na 1 sekundę
- ldi PORT,0
- out PORTA, PORT
- rcall OPOZNIENIE_1S
- ;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
- ldi PORT, 0xf0
- push PORT
- pop ZE_STOSU
- out PORTA, ZE_STOSU
- rcall OPOZNIENIE_1S
- ;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
- ldi PORT,0x0f
- push PORT
- pop ZE_STOSU
- out PORTA, ZE_STOSU
- rcall OPOZNIENIE_1S
- ;wygaszenie diód na 1 sekundę
- ldi PORT,0
- out PORTA, PORT
- rcall OPOZNIENIE_1S
- ;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
- ldi PORT,0x0f
- push PORT
- pop ZE_STOSU
- out PORTA, ZE_STOSU
- rcall OPOZNIENIE_1S
- ;wygaszenie diód na 1 sekundę
- ldi PORT,0
- out PORTA, PORT
- ret ;powrót
- ;ZADANIE 2
- .include "m32def.inc" ;dołączenie pliku nagłówkowego
- .def LICZNIK1 = R18 ;przyporządkowanie rejestrowi R18 nazwy LICZNIK1
- .def LICZNIK2 = R19 ;przyporządkowanie rejestrowi R19 nazwy LICZNIK2
- .def LICZNIK3 = R20 ;przyporządkowanie rejestrowi R20 nazwy LICZNIK3
- .def LICZNIK = R15 ;przyporządkowanie rejestrowi R15 nazwy LICZNIK
- .def STAN = R16 ;przyporządkowanie rejestrowi R16 nazwy STAN
- .cseg ;dyrektywa oznaczająca, że wszystkie dalsze zapisy dotyczą pamięci programu
- .org 0x0000 ;określenie adresu, gdzie kompilator rozpocznie umieszczanie generowanych bajtów
- ldi STAN, 0xFF ;załadowanie do rejestru STAN wartości 0xFF
- out DDRA, STAN ;ustawienie rejestru kierunku danych portu A
- ldi STAN, 0x00 ;załadowanie do rejestru STAN wartości 0x00
- out PORTA, STAN ;ustawienie rejestru stanu PORTA
- out DDRB, STAN ;ustawienie rejestru kierunku danych portu B
- ldi STAN, 0b00000011 ;załadowanie do rejestru STAN wartości 3
- out PORTB, STAN ;ustawienie dwóch rezystorów pull-up na PORTB
- ldi LICZNIK,0 ;załadowanie do rejestru LICZNIK wartości 0
- clr R27 ;wyczyszczenie MSB wskaźnika X
- ldi XL, 0x61 ;przekazanie adresu do LSB wskaźnika X
- st X,LICZNIK ;zapisanie zawartości rejestru LICZNIK w SRAM pod adresem 0x61
- //*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*//
- jmp START ;skok do etykiety Start
- START: ;utworzenie etykiety Start
- in STAN, PORTB ;przeniesienie zawartości rejestru PINB do rejestru STAN !!!!!!!!!!!!!!!!!!!!!!
- sbrs STAN, 0 ;pominięcie następnej instrukcji jeżeli PINB0 jest logiczną jedynką
- rjmp SWIECENIE_DIOD ;wywołanie świecenia diód, rjmp bo nie wraca przez ret A.B.
- sbrs STAN, 1 ;pominięcie następnej instrukcji jeżeli PINB1 jest logiczną jedynką
- rjmp INKREMENTACJA_LICZNIKA ;wywołanie inkrementacji licznika, j.w. A.B.
- PO_OPOZNIENIU:
- rjmp START ;powrót do START
- INKREMENTACJA_LICZNIKA: ;procedura zwiększania licznika
- ld LICZNIK,X
- inc LICZNIK
- st X,LICZNIK
- rjmp OPOZNIENIE_5mS
- OPOZNIENIE_5mS: ;instrukcje zajmująca mikroprocesor o taktowaniu 1MHz na 5ms
- ;instrukcja mówi o 5s, a nie 5ms A.B.
- ldi LICZNIK1, 1;5
- P1: ldi LICZNIK2, 1;20
- P2: ldi LICZNIK3, 1;50
- P3: dec LICZNIK3
- brne P3
- dec LICZNIK2
- brne P2
- dec LICZNIK1
- brne P1
- nop
- rjmp PO_OPOZNIENIU
- INKREMENTACJA_LICZNIKA_W_PETLI: ;procedura zwiększania licznika podczas wyświetlania na diodach
- ld LICZNIK,X
- inc LICZNIK
- st X,LICZNIK
- rjmp OPOZNIENIE_5mS_W_PETLI
- OPOZNIENIE_5mS_W_PETLI: ;instrukcje zajmująca mikroprocesor o taktowaniu 1MHz na 5ms sekund
- ;j.w. 5s, a nie 5ms wedle instrukcji
- ldi LICZNIK1, 1;5
- D1: ldi LICZNIK2, 1;20
- D2: ldi LICZNIK3, 1;50
- D3: dec LICZNIK3
- brne D3
- dec LICZNIK2
- brne D2
- dec LICZNIK1
- brne D1
- nop
- rjmp DO_SWIECENIA
- SWIECENIE_DIOD: ;Podprogram zapalający diody na około 5 sekund
- ldi LICZNIK1, 1;83
- L1: ldi LICZNIK2, 1;100
- L2: ldi LICZNIK3, 1;100
- L3: dec LICZNIK3
- in STAN, PORTB
- sbrs STAN, 1 ;jeżeli na PORTB1 jest logiczną jedynką pomiń inkrementację w pętli
- rjmp INKREMENTACJA_LICZNIKA_W_PETLI ;j.w. rjmp, a nie rcall A.B.
- DO_SWIECENIA:
- ld STAN, X ;pobranie do STAN wartości ze wskaźnika X
- out PORTA, STAN ;zaświecenie diód
- brne L3
- dec LICZNIK2
- brne L2
- dec LICZNIK1
- brne L1
- nop
- ;ret
- 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