Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Sprawozdanie - Podstawy Mikrosterowników - ćwiczenie 4
- GRUPA: C M00-O9c
- Imiona i nazwiska twórców sprawozdania: Zbigniew Zabłocki, Dominik Wojtalik
- Data zajęć laboratoryjnych, których dotyczy sprawozdanie 15-11-2017
- Numer sprawozdania: 4
- Zadanie nr. 1
- .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
- .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 etykiety Start
- Start: ;etykieta Start
- 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 ;zapisujemy w rejestrze Dwa same jedynki
- out DDRA, Dwa ; ustawiamy Port A jako wyjscie
- ldi Dwa, 0x00 ;zapisujemy w rejestrze Dwa same zera
- out DDRB, Dwa ;ustawiamy Port B jako wejście
- ldi Jeden, 0b00001111 ;zapisanie w rejestrze Jeden wartości 00001111
- ldi Dwa, 0b11110000 ;zapisanie w rejestrze Dwa wartości 11110000
- push Dwa ;zapisanie rejestru Dwa w stosie
- push Jeden ;zapisanie rejestru Jeden w stosie
- ldi Dwa, 0b00000011 ;zapisanie w rejestrze Dwa wartości 0b00000011
- out PORTB, Dwa ;piny 0 i 1 portu B ustawione jako wejście z rezystorami pull-up
- Klawisz1: ; etykieta Klawisz1
- sbic PINB, PINB0 ;sprawdzamy czy przycisk W1 został wciśnięty
- rjmp Klawisz1 ;petla bedzie wykonywana, az przycisk W1 nie zostanie wcisniety
- rcall Zapalanie ;jesli przycisk W1 zostanie wcisniety ominie instrukcje skoku i przejdzie do zapalania
- Klawisz2: ;etykieta Klawisz2
- sbic PINB, PINB1 ;sprawdzamy czy przycisk W1 został wciśnięty
- rjmp Klawisz2 ;petla bedzie wykonywana, az przycisk W2 nie zostanie wcisniety
- rcall Gaszenie ;jesli przycisk W2 zostanie wcisniety ominie instrukcje skoku i przejdzie do gaszenia
- nop
- pop Jeden ;wyciagniecie wartosci Jeden ze stosu
- out PORTA, Jeden ;wyswietlenie wartosci 00001111
- rcall OpoznienieChwilowe ;tutaj realizuje podprogram OpoznienieChwilowe
- pop Dwa ;wyciagniecie wartosci Dwa ze stosu
- out PORTA, Dwa ;wyswietlenie wartosci 11110000
- nop
- rjmp Start ;powrot do poczatku programu
- Opoznienie2sec: ;program trwajacy 2 000 000 cykli(2 sec)
- ldi licznik3, 0x12
- ldi licznik2, 0xBC
- ldi licznik1, 0xC4
- Petla:
- dec licznik1 ;zmiejszenie wartosci o 1
- brne Petla ;jesli powyzsze nie rowna sie 0 to skocz do Petla
- dec licznik2 ;zmiejszenie wartosci o 1
- brne Petla ;jesli powyzsze nie rowna sie 0 to skocz do Petla
- dec licznik3 ;zmiejszenie wartosci o 1
- brne Petla ;jesli powyzsze nie rowna sie 0 to skocz do Petla
- nop
- nop
- ret ;wyjscie z podprogramu
- Opoznienie1sec: ;program trwajacy 1 000 000 cykli (1 sec)
- ldi licznik3, 0x09
- ldi licznik2, 0xBC
- ldi licznik1, 0xC4
- Petla1:
- dec licznik1 ;zmiejszenie wartosci o 1
- brne Petla1 ;jesli powyzsze nie rowna sie 0 to skocz do Petla1
- dec licznik2 ;zmiejszenie wartosci o 1
- brne Petla1 ;jesli powyzsze nie rowna sie 0 to skocz do Petla1
- dec licznik3 ;zmiejszenie wartosci o 1
- brne Petla1 ;jesli powyzsze nie rowna sie 0 to skocz do Petla1
- nop
- ret ;wyjscie z podprogramu
- OpoznienieChwilowe: ;program trwajacy 100 000 cykli (0,1 sec)
- ldi Dwa, 0x00
- out PORTA, Dwa ;zgaszenie diod
- ldi licznik2, 0xA5
- ldi licznik1, 0xC9
- ldi licznik3, 0x03
- Petla3:
- dec licznik1 ;zmiejszenie wartosci o 1
- brne Petla1 ;jesli powyzsze nie rowna sie 0 to skocz do Petla3
- dec licznik2 ;zmiejszenie wartosci o 1
- brne Petla1 ;jesli powyzsze nie rowna sie 0 to skocz do Petla3
- dec licznik3 ;zmiejszenie wartosci o 1
- brne Petla1 ;jesli powyzsze nie rowna sie 0 to skocz do Petla3
- nop
- ret ;wyjdz z podprogramu
- Zapalanie: ;etykieta Zapalenie
- rcall Opoznienie2sec ;wywolanie podprogramu Opoznienie2sec
- rcall Jedynka ;podprogram Jedynka
- rcall Opoznienie2sec ;wywolanie podprogramu Opoznienie2sec
- rcall Dwojka ;podprogram Dwojka
- rcall Opoznienie2sec ;wywolanie podprogramu Opoznienie2sec
- rcall Trojka ;podprogram Trojka
- rcall Opoznienie2sec ;wywolanie podprogramu Opoznienie2sec
- rcall Czworka ;podprogram Czworka
- rcall Opoznienie2sec ;wywolanie podprogramu Opoznienie2sec
- rcall Piatka ;podprogram Piatka
- rcall Opoznienie2sec ;wywolanie podprogramu Opoznienie2sec
- rcall Szostka ;podprogram Szostka
- rcall Opoznienie2sec ;wywolanie podprogramu Opoznienie2sec
- rcall Siodemka ;podprogram Siodemka
- rcall Opoznienie2sec ;wywolanie podprogramu Opoznienie2sec
- rcall Osemka ;podprogram Osemka
- ret
- Gaszenie: ;etykieta Gaszenie
- rcall Opoznienie1sec ;wywolanie podprogramu Opoznienie1sec
- rcall Siodemka ;podprogram Siodemka
- rcall Opoznienie1sec ;wywolanie podprogramu Opoznienie1sec
- rcall Szostka ;podprogram Szostka
- rcall Opoznienie1sec ;wywolanie podprogramu Opoznienie1sec
- rcall Piatka ;podprogram Piatka
- rcall Opoznienie1sec ;wywolanie podprogramu Opoznienie1sec
- rcall Czworka ;podprogram Czworka
- rcall Opoznienie1sec ;wywolanie podprogramu Opoznienie1sec
- rcall Trojka ;podprogram Trojka
- rcall Opoznienie1sec ;wywolanie podprogramu Opoznienie1sec
- rcall Dwojka ;podprogram Dwojka
- rcall Opoznienie1sec ;wywolanie podprogramu Opoznienie1sec
- rcall Jedynka ;podprogram Jedynka
- rcall Opoznienie1sec ;wywolanie podprogramu Opoznienie1sec
- rcall Zero ;podprogram Zero
- rcall Opoznienie1sec ;wywolanie podprogramu Opoznienie1sec
- ret
- Zero: ;etykieta Zero
- ldi Dwa, 0b00000000 ;ladowanie wartosci 00000000 do rejestru Dwa
- out PORTA, Dwa ;wyświetlanie wartosci rejestru Dwa
- ret
- Jedynka: ;etykieta Jeden
- ldi Dwa, 0b0000001 ;ladowanie wartosci 00000001 do rejestru Dwa
- out PORTA, Dwa ;wyświetlanie wartosci rejestru Dwa
- ret
- Dwojka:
- ldi Dwa, 0b00000011 ;ladowanie wartosci 00000011 do rejestru Dwa
- out PORTA, Dwa ;wyświetlanie wartosci rejestru Dwa
- ret
- Trojka:
- ldi Dwa, 0b00000111 ;ladowanie wartosci 00000111 do rejestru Dwa
- out PORTA, Dwa ;wyświetlanie wartosci rejestru Dwa
- ret
- Czworka:
- ldi Dwa, 0b00001111 ;ladowanie wartosci 00001111 do rejestru Dwa
- out PORTA, Dwa ;wyświetlanie wartosci rejestru Dwa
- ret
- Piatka:
- ldi Dwa, 0b00011111 ;ladowanie wartosci 00011111 do rejestru Dwa
- out PORTA, Dwa ;wyświetlanie wartosci rejestru Dwa
- ret
- Szostka:
- ldi Dwa, 0b00111111 ;ladowanie wartosci 00111111 do rejestru Dwa
- out PORTA, Dwa ;wyświetlanie wartosci rejestru Dwa
- ret
- Siodemka:
- ldi Dwa, 0b01111111 ;ladowanie wartosci 01111111 do rejestru Dwa
- out PORTA, Dwa ;wyświetlanie wartosci rejestru Dwa
- ret
- Osemka:
- ldi Dwa, 0b11111111 ;ladowanie wartosci 11111111 do rejestru Dwa
- out PORTA, Dwa ;wyświetlanie wartosci rejestru Dwa
- ret
- Zadanie nr. 2
- .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
- .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 etykiety Start
- Start: ;etykieta Start
- 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 ;zapisujemy w rejestrze Dwa same jedynki
- out DDRA, Dwa ; ustawiamy Port A jako wyjscie
- ldi Dwa, 0x00 ;zapisujemy w rejestrze Dwa same zera
- out DDRB, Dwa ;ustawiamy Port B jako wejście
- ldi Dwa, 0b00000011 ;zapisanie w rejestrze Dwa wartości 0b00000011
- out PORTB, Dwa ;piny 0 i 1 portu B ustawione jako wejście z rezystorami pull-up
- ldi R20, 253 ;zapisaujemy w rejestrze R20 wartość 0
- ldi R21, 255
- Klawisz1: ; etykieta Klawisz1
- sbic PINB, PINB0 ;sprawdzamy czy przycisk W1 został wciśnięty
- rjmp Klawisz1 ;petla bedzie wykonywana, az przycisk W1 nie zostanie wcisniety
- rcall Inkrementacja ;jesli przycisk W1 zostanie wcisniety pominie instrukcje skoku i przejdzie do inkrementacji
- Klawisz2: ;etykieta Klawisz2
- rcall Zapalenie ;jesli przycisk W2 zostanie wcisniety ominie instrukcje skoku i przejdzie do gaszenia
- nop
- rjmp Start ;powrot do poczatku programu
- Opoznienie5sec: ;program trwajacy 2 000 000 cykli(2 sec)
- ldi licznik3, 0x1A
- ldi licznik2, 0x5E
- ldi licznik1, 0x6F
- Petla:
- dec licznik1 ;zmiejszenie wartosci o 1
- brne Petla ;jesli powyzsze nie rowna sie 0 to skocz do Petla
- dec licznik2 ;zmiejszenie wartosci o 1
- brne Petla ;jesli powyzsze nie rowna sie 0 to skocz do Petla
- dec licznik3 ;zmiejszenie wartosci o 1
- brne Petla ;jesli powyzsze nie rowna sie 0 to skocz do Petla
- nop
- nop
- ret ;wyjscie z podprogramu
- Inkrementacja:
- inc R20
- sub R21,R20
- sbrc R21, 1
- rjmp Klawisz2
- sbic PINB, PINB1 ;sprawdzamy czy przycisk W2 został wciśnięty
- rjmp Klawisz1 ;petla bedzie wykonywana, az przycisk W2 nie zostanie wcisniety
- nop
- ret
- Zapalenie:
- mov Dwa,R20
- out PORTA, Dwa
- rcall Opoznienie5sec
- ldi Dwa,0
- out PORTA, Dwa
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement