Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //lab4 - przetwornik Analogowo Cyfrowy ADC
- .include"m8535def.inc"
- .def buffer = R16
- .def buffer2 = R17
- .def light = R18
- .def temp = R19
- .org 0x000
- rjmp RESET
- RESET:
- ldi buffer, high(ramend) //inicjacja stosu
- out sph, buffer
- ldi buffer, low(ramend)
- out spl, buffer
- rcall INIT_IO
- rcall INIT_ADC
- clr buffer
- rjmp MAIN
- MAIN:
- rcall RANGE
- out PORTC, light
- rjmp MAIN
- INIT_IO:
- ser buffer //portC na wyjscie
- out DDRC, buffer
- cer buffer, 1 //portA na wejscie (bez pull-up)
- out DDRA, buffer
- RET
- INIT_ADC:
- //zarzadzanie czescia analogowa - ADMUX
- ldi buffer, 1<<REFS1 | 1<<REFS0 | 1<<ADLAR | 1<<MUX0
- out ADMUX, buffer
- //zarzadzanie czescia cyfrowa - ADCSRA
- ldi buffer, 1<<ADEN | 1<<ADSC | 1<<ADATE
- RET
- RANGE:
- in temp, ADCH //odczytaj z ADCH i zapisz do temp
- ldi light, 1<<0 //ustaw diode 00000001
- cpi temp, 32 //porownaj temp z 32
- brlo SKIP //jesli temp<32 przejdz do SKIP, jesli nie -> przejdz dalej
- LOOP:
- lsl light //przesun diody o bit w lewo
- sbr light, 1 //uzupelnij najmlodszy bit diod
- subi temp, 32 //odejmij 32 od temp
- cpi temp, 32 //porownaj temp z 32
- brsh LOOP //jesli temp>=32 wroc do LOOP, jesli nie -> przejdz dalej
- SKIP:
- RET
- /*-----------WYJASNIENIE---------------
- ADC to ogólnie system dzięki, któremu mikrokontroler może
- współpracować z otoczeniem i zczytywać sygnały analogowe. W kodzie mamy
- dwa bajty odpowiedzialne za dyskretyzację czyli naszą maksymalną wartość 5V
- możemy podzielić z odpowiednią rozdzielczością. Kod polega na tym,
- że mikrokontroler nie wie jaka jest wartość sygnału zewnętrznego.
- My tylko to wiemy. On sprawdza porównując wartość sygnału zewnętrznego
- z liczbą 32 (2 bajty odpowiedzialne za rejestrowanie sygnału)
- czy wartość ta przedstawiana w postaci rejestrów jest mniejsza
- to zapala tylko jedną diodę i jak mamy tych diod przykłądowo 8,
- a zapali 1 to wartość sygnału wejściowego jest równa 1/8 maksymalnego
- sygnału wejściowgo. Jeżeli jest większa np. 100 to wchodzi do pętli
- przesuwa o jeden bit w lewo rejestr, który POTEM zostanie wyrzucony na PORTC,
- ale na tym nie kończy bo liczba może być większa, a mikrokontroler o tym
- nie wie dlatego sprawdza ponownie, jeśli znowu będzie większa niż 32 to znowu
- przesuwa bity w lewo i tym samym potem zapali więcej diod. Aż dojdzie do momentu
- kiedy ten sygnał nie będzie większy od 32 wtedy wystawi otrzymany rejstr na PORT C
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement