Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Sprawozdanie 4
- Grupa D
- Godzina rozpoczecia zajec: 15:15 środa
- 29.01.20r
- Zadania: 1B, 2A, 3A
- Zad. 1B
- .include "m32def.inc"
- .def licznik1 = R18
- .def licznik2 = R19
- .def licznik3 = R20
- .def W1 = R22
- .def W2 = R24
- .equ bit0 = 0b11111110
- .equ bit1 = 0b11111101
- .def Dwa = R23
- .org 0x0000
- jmp Start
- Start:
- ldi R17, HIGH(RAMEND)
- out SPH, R17
- ldi R17, LOW(RAMEND)
- out SPL, R17
- ldi ZH, high(Procedura_krecenia)
- ldi ZL, low(Procedura_krecenia)
- ldi R21, 0b11110000
- out DDRB, R21
- ldi R16,0
- out DDRA, R16
- Test_W1:
- ldi W1, bit0
- inc W1
- ldi R25, 64
- out PORTA, W1
- in W1, PINC
- sbrs W1, 0
- icall
- rjmp Test_W2
- Test_W2:
- ldi W2, bit1
- inc W2
- out PORTA, W2
- in W2, PINC
- sbrs W2, 1
- rcall Procedura_krecenia2
- rjmp Test_W1
- Procedura_krecenia:
- ldi R16, 0b00010000
- out PORTB, R16
- rcall Opoznienie
- nop
- ldi R16, 0b00100000
- out PORTB, R16
- rcall Opoznienie
- nop
- ldi R16, 0b01000000
- out PORTB, R16
- rcall Opoznienie
- nop
- ldi R16, 0b10000000
- out PORTB, R16
- rcall Opoznienie
- nop
- dec R25
- tst R25
- brne Procedura_krecenia
- ldi R16, 0b00000000
- out PORTB, R16
- ret
- Procedura_krecenia2:
- ;ldi R25, 2
- ldi R16, 0b10000000
- out PORTB, R16
- rcall Opoznienie
- nop
- ldi R16, 0b01000000
- out PORTB, R16
- rcall Opoznienie
- nop
- ldi R16, 0b00100000
- out PORTB, R16
- rcall Opoznienie
- nop
- ldi R16, 0b00010000
- out PORTB, R16
- rcall Opoznienie
- nop
- dec R25
- tst R25
- brne Procedura_krecenia2
- ldi R16, 0b00000000
- out PORTB, R16
- ret
- Opoznienie:
- ldi licznik3, 26
- LoopA:
- ldi licznik2, 16
- LoopA0:
- ldi licznik1, 25
- LoopA1:
- dec licznik1
- brne LoopA1
- dec licznik2
- brne LoopA0
- dec licznik3
- brne LoopA
- ret
- 2A
- ; PROJEKT SERWO 1
- .include "m32def.inc"
- .def Jeden = R16 ; przyporzadkowanie rejestrowi R16 wartosci Jeden
- .def Dwa = R17 ; przyporzadkowanie rejestrowi R17 wartooci Dwa
- .def W1 = R21 ; przyporzadkowanie rejestrowi R18 wartooci W1
- .def W2 = R22 ; przyporzadkowanie rejestrowi R19 wartooci W2
- .def W3 = R23 ; przyporzadkowanie rejestrowi R19 wartooci W2
- .def licznik1 = R18
- .def licznik2 = R19
- .def licznik3 = R20
- .equ bit1 = 0b11111101
- .equ Zera = 0x00
- .equ Jedynki = 0xff
- .equ bit0 = 0b11111110
- .cseg ; segment pamięci programu
- .org 0x0000
- jmp Start
- .org INT0addr ; standardowa formula dotyczy uruchomienia obsługi przerwania zewnetrznego
- jmp przerwanie_0 ; przeniesienie do etykiety z procedura obslugi przerwania
- Start:
- ldi R25, 0;
- ldi R26, 0;
- cli
- ; przygotowania STOSu
- ldi R17, HIGH(RAMEND)
- out SPH, R17
- ldi R17, LOW(RAMEND)
- out SPL, R17
- ldi Jeden, Zera ; ustalenie zawartosci rejestrów roboczych
- ldi Dwa, Jedynki
- out DDRA, Dwa ; port zasilajacy linijkę diod
- out DDRC, Jeden ; port do odczytywania, czy wcisnieto switch
- sbi PORTD, 2 ; port z pull-up do reagowania na sygnal w INT0
- ; procedura konfiguracji przerwania INT0
- in Jeden, MCUCR ; kopia rejestru MCUCR
- cbr Jeden, 0 << ISC00 ; reczna konfiguracja bitu ISC00 w INT0 na stan 0 i nie zmienia
- pozostałych bitow
- sbr Jeden, 1 << ISC01 ; reczna konfiguracja bitu ISC01 w INT0 na stan 1 i nie zmienia
- pozostałych bitow
- out MCUCR, Jeden ; ETAP I zrealizowany, teraz mamy juz zdefiniowane przerwanie,
- ; które będzie wywoływane sygnalem zbocza opadającego wywoływanego wcisnieciem wsitcha
- S13
- ; uaktywnienie przerwania w rejestrze GICR:
- in Jeden, GICR ; główny rejestr kontroli przerwań
- sbr Jeden, 1 << INT0 ; reczne ustawienie bitu na 1 odpowiadajacego za odblokowanie
- ; zewnętrznego przerwania INT0 znajdujacego się pod adresem INT0addr
- out GICR, Jeden ; ETAP II, od teraz już tylko czekamy na zbocze opadajace, ktore ma
- pojawic sie na INT0
- sei ; ETAP III, od teraz mamy aktywne przerwania zewnetrzne, bo flaga I w SREG jest
- ustawiona
- ; robimy standardowa PRZESTRZEN We/Wy jeśli będzie potrzebna
- ; definicje przerwan, jeśli beda potrzebne
- ; zaczynamy ustawiac serwo w konkretne polozenie
- Procedura_krecenia_pwm:
- ; 10 odpowiada polozeniu serwa
- sbi DDRB, 3 ; na PB3 będzie generowane PWM, praca w trybie wyjściowym
- ldi R17, (1<<WGM00) | (1<<WGM01) | (1<<COM01) | (0<<COM00) | (1<<CS00) | (1<<CS01) |
- (0<<CS02) ; uzupełnij # aby praca PWM umożliwila poprawna prace serwa
- out TCCR0, R17 ; ustawienie rejestru TCCR0 w celu skonfigurowania pracy TC0
- out OCR0, R26 ; rejestr porownawczy, przy ktorym zrownanie licznika bedzie
- generowalo zmiane stanu na OC0 (PB3)
- rcall Opoznienie
- nop
- rjmp Procedura_krecenia_pwm
- ; opóźnienie do testow
- Opoznienie:
- ldi licznik3, 50
- LoopA:
- ldi licznik2, 30
- LoopA0:
- ldi licznik1, 10
- LoopA1:
- dec licznik1
- brne LoopA1
- dec licznik2
- brne LoopA0
- dec licznik3
- brne LoopA
- ret
- Test_W1: ; etykieta z pętlą testującą stan przycisków na JP23
- ldi W1, bit0
- inc W1
- out PORTC, W1 ; przygotowanie procedury pod wystawienie jedynki na bit nr 0
- in W1, PINC ; mapowanie aktualnego stanu portu B
- ; tutaj warto zastanowić się nad wprowadzeniem dodatkowych warunków/procedur dla
- upewnienia się mikrosterownika, czy nie wciśnięto przy okazji S9?
- sbrs W1, 0 ; testowanie bitu w W1,
- rjmp inc1 ; skok, jesli wcisnieto S1
- rjmp Test_W2 ; skok, jesli nie wcisnieto S1
- Test_W2: ; etykieta z pętlą testującą stan przycisków na JP23
- ldi W2, bit1
- inc W2
- out PORTC, W2 ; przygotowanie procedury pod wystawienie jedynki na bit nr 1
- in W2, PINC ; mapowanie aktualnego stanu portu B
- sbrs W2, 1 ; testowanie bitu nr 1
- rjmp inc2 ; skok, jesli wcisnieto S5
- rjmp Test_W1 ; skok, jesli nie wcisnieto S5
- inc1:
- inc R25
- out PORTA,R25
- rjmp Test_W1
- inc2:
- inc R26
- out PORTA, R26
- rjmp Test_W1
- przerwanie_0:
- in R17, SREG ; kopiuj aktualną zawartosc rejestru statusu SREG
- push R17 ; zrzucenie na czas obsługi przerwania zawartości rejestru statusu SREG
- reti
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement