Advertisement
Guest User

Untitled

a guest
Apr 16th, 2019
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //lab4 - przetwornik Analogowo Cyfrowy ADC
  2. .include"m8535def.inc"
  3. .def buffer = R16
  4. .def buffer2 = R17
  5. .def light = R18
  6. .def temp = R19
  7. .org 0x000
  8. rjmp RESET
  9.  
  10. RESET:
  11.     ldi buffer, high(ramend)    //inicjacja stosu
  12.     out sph, buffer
  13.     ldi buffer, low(ramend)
  14.     out spl, buffer
  15.  
  16.     rcall INIT_IO
  17.     rcall INIT_ADC
  18.     clr buffer
  19. rjmp MAIN
  20.  
  21. MAIN:
  22.     rcall RANGE
  23.     out PORTC, light
  24. rjmp MAIN
  25.  
  26. INIT_IO:
  27.     ser buffer          //portC na wyjscie
  28.     out DDRC, buffer
  29.     cer buffer, 1       //portA na wejscie (bez pull-up)
  30.     out DDRA, buffer
  31. RET
  32.  
  33. INIT_ADC:
  34.     //zarzadzanie czescia analogowa - ADMUX
  35.     ldi buffer, 1<<REFS1 | 1<<REFS0 | 1<<ADLAR | 1<<MUX0
  36.     out ADMUX, buffer
  37.     //zarzadzanie czescia cyfrowa - ADCSRA
  38.     ldi buffer, 1<<ADEN | 1<<ADSC | 1<<ADATE
  39. RET
  40.  
  41. RANGE:
  42.     in temp, ADCH       //odczytaj z ADCH i zapisz do temp
  43.     ldi light, 1<<0     //ustaw diode 00000001
  44.     cpi temp, 32        //porownaj temp z 32
  45.     brlo SKIP           //jesli temp<32 przejdz do SKIP, jesli nie -> przejdz dalej
  46.         LOOP:
  47.         lsl light       //przesun diody o bit w lewo
  48.         sbr light, 1    //uzupelnij najmlodszy bit diod
  49.         subi temp, 32   //odejmij 32 od temp
  50.         cpi temp, 32    //porownaj temp z 32
  51.         brsh LOOP       //jesli temp>=32 wroc do LOOP, jesli nie -> przejdz dalej
  52.     SKIP:
  53. RET
  54.  
  55. /*-----------WYJASNIENIE---------------
  56. ADC to ogólnie system dzięki, któremu mikrokontroler może
  57. współpracować z otoczeniem i zczytywać sygnały analogowe. W kodzie mamy
  58. dwa bajty odpowiedzialne za dyskretyzację czyli naszą maksymalną wartość 5V
  59. możemy podzielić z odpowiednią rozdzielczością. Kod polega na tym,
  60. że mikrokontroler nie wie jaka jest wartość sygnału zewnętrznego.
  61. My tylko to wiemy. On sprawdza porównując wartość sygnału zewnętrznego
  62. z liczbą 32 (2 bajty odpowiedzialne za rejestrowanie sygnału)
  63. czy wartość ta przedstawiana w postaci rejestrów jest mniejsza
  64. to zapala tylko jedną diodę i jak mamy tych diod przykłądowo 8,
  65. a zapali 1 to wartość sygnału wejściowego jest równa 1/8 maksymalnego
  66. sygnału wejściowgo. Jeżeli jest większa np. 100 to wchodzi do pętli
  67. przesuwa o jeden bit w lewo rejestr, który POTEM zostanie wyrzucony na PORTC,
  68. ale na tym nie kończy bo liczba może być większa, a mikrokontroler o tym
  69. nie wie dlatego sprawdza ponownie, jeśli znowu będzie większa niż 32 to znowu
  70. przesuwa bity w lewo i tym samym potem zapali więcej diod. Aż dojdzie do momentu
  71. kiedy ten sygnał nie będzie większy od 32 wtedy wystawi otrzymany rejstr na PORT C
  72. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement