ADC Free Running, Bits() i ADLAR :D

Proste przykłady do częstych pytań.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

ADC Free Running, Bits() i ADLAR :D

Post autor: niveasoft » 21 mar 2017, 3:42

Nie każdy wie jak działa polecenie Getadc()
Kiedy napiszesz Getadc(0) to żeby odczytać wartość napięcia z odpowiadającego ADC0 pinu program musi najpierw przestawić Multiplexer.
Przetwornik bowiem najczęściej jest jeden. Jest on tylko przełączany pomiędzy pinami.
Kiedy kanał zostanie przełączony to pierwszego odczytu nie powinniśmy brać pod uwagę. Taki odczyt chwilę trwa..
Bascom jednak musi przestawić multiplexer, wystartować konwersję, poczekać na jej zakończenie, wystartować nową i dopiero po jej zakończeniu oddać nam wynik...

Są sytuacje gdzie korzystamy sobie tylko z jednego kanału, na przykład potencjometru, ale program mamy trochę napięty czasowo.
Możemy wtedy nie korzystać z Getadc(). Możemy sobie ustawić ten wybrany kanał i uruchomić tryb w którym ADC będzie samplowało samo. Wynik będzie gotowy czekał na nas i wystarczy go sobie szybko wciągnąć i lecieć dalej ;)

Czasami niepotrzebna nam jest też pełna dokładność przetwornika do 1024 i zupełnie zadowolilibyśmy się wynikiem do 255 i jeszcze dostali szybsze jego działanie :D

Funkcje Free Running, automatyczne dobranie optymalnego preskalera dla ADC i łatwy wybór napięcia odniesienia możemy powierzyć Bascomowej instrukcji Config ADC Włączy ona też i zainicjuje przetwornik.
Natomiast wybór kanału i zmniejszenie wyniku do 255 w odpowiedzialnym za to rejestrze ADMUX wygodnie ustawimy funkcją Bits()
Funkcją tą wybieramy sobie bity do ustawienia. Reszta nas nie interesuje ;)
Za wybór kanału odpowiadają bity od 0 do 4, a wynik przesunie nam do rejestru ADCH bit ADLAR

Poniższy program będzie zmieniał wynik na LCD kiedy będziemy zmieniać położenie potencjometru..a Getadc() tam nie ma :D
  1. $regfile = "attiny26.dat"               'SRAM 128B, EE 128B, FLASH 2KB
  2. $crystal = 8000000
  3. $hwstack = 16
  4. $swstack = 2
  5. $framesize = 24
  6.  
  7. Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
  8. Config Lcd = 16x2                       'nowy sposob zapisu
  9. Cursor Off
  10. Cls
  11.  
  12. 'ADC Settings
  13. '-------------------------------------------
  14. Config Adc = Free , Prescaler = Auto , Reference = Avcc
  15.  ADMUX = Bits(MUX0 , MUX1 , ADLAR)                'bits 0&1=ADC3, bit 5=ADLAR
  16.  
  17. Dim New_adc As Byte , Old_adc As Byte   'nowa i poprzednia wartość
  18. '-------------------------------------------
  19.  
  20. Do
  21.  
  22.  New_adc = ADCH
  23.  
  24.  If Old_adc <> New_adc Then             'jeśli poprzednia wartośc różni się od nowej..
  25.   Old_adc = New_adc
  26.    Locate 2 , 1 : Lcd New_adc ; "  "
  27.  End If
  28.  
  29.  
  30. Loop
  31. End
  32.  
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
kaktus
Posty: 32
Rejestracja: 19 sie 2015, 15:13
Lokalizacja: opolskie
Kontakt:

Re: ADC Free Running, Bits() i ADLAR :D

Post autor: kaktus » 17 kwie 2017, 20:22

Powiem tak:

spróbuj tej wersji Twojego kodu
  1. $regfile = "attiny26.dat"               'SRAM 128B, EE 128B, FLASH 2KB
  2. $crystal = 8000000
  3. $hwstack = 16
  4. $swstack = 2
  5. $framesize = 24
  6.  
  7. $baud = 9600
  8.  
  9. 'Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
  10. 'Config Lcd = 16x2                       'nowy sposob zapisu
  11. 'Cursor Off
  12. 'Cls
  13.  
  14. 'ADC Settings
  15. '-------------------------------------------
  16. Print Admux
  17. Config Adc = Free , Prescaler = Auto , Reference = Avcc
  18. Print Admux
  19.  ADMUX = Bits(MUX0 , MUX1 , ADLAR)                'bits 0&1=ADC3, bit 5=ADLAR
  20. Print Admux
  21.  
  22.  
  23. End
i daj znać o zaobserwowanych spostrzeżeniach
:mrgreen:
teraz życie można rozdzielić między NOP i SLEEP
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: ADC Free Running, Bits() i ADLAR :D

Post autor: niveasoft » 17 kwie 2017, 20:55

Nie wiem o czym tu pisać jeśli ten Tiny nie ma w ogóle UART`a. To się nie ma prawa skompilować.

Normalnie martwiłbym się, że w rejestrach mogą być śmieci, ale po pierwsze w nocie piszą, że rejestry przy Reset będą miały "initial values" a dodatkowo Bascom dba o takie sprawy. Śmieciami mógłbym się przejmować przy $noramclear.

Ten konkretny przykład działa na pewno, a posłużył za przykład użycia komendy.
Kiedy ktoś już wcześniej ustawił sobie jakieś bity w rejestrze to wiadomym jest, że komenda Bits ich nie skasuje ;)
Wtedy lepiej do rejestru wpisać najpierw zero, a potem ustawiać bity.
Awatar użytkownika
kaktus
Posty: 32
Rejestracja: 19 sie 2015, 15:13
Lokalizacja: opolskie
Kontakt:

Re: ADC Free Running, Bits() i ADLAR :D

Post autor: kaktus » 18 kwie 2017, 15:44

Szkoda że nie chcesz ;)
teraz życie można rozdzielić między NOP i SLEEP
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: ADC Free Running, Bits() i ADLAR :D

Post autor: niveasoft » 18 kwie 2017, 17:33

Pomimo całej sympatii proponuję na drugi raz najpierw spróbować samemu a nie pisać enigmatyczne wypowiedzi.
Coś czym nie powinienem się w ogóle zajmować zajeło mi, tylko niepotrzebnie, 5 minut.
Oczywiście potwierdziło moje przypuszczenia.

Co Ty na to?
Obrazek
Awatar użytkownika
kaktus
Posty: 32
Rejestracja: 19 sie 2015, 15:13
Lokalizacja: opolskie
Kontakt:

Re: ADC Free Running, Bits() i ADLAR :D

Post autor: kaktus » 24 kwie 2017, 17:48

No to masz babo placek ...

może i enigmatycznie napisałem ale akurat BARTuś wie o co mi chodziło ... i się głupio bawi ... Widzę to z przytoczonej wypowiedzi.
- ponieważ potraktowałeś moją skromną osobę z góry więcej eksperymentu nie zaproponuję, a miałem ku temu uzasadnione powody. :(

AMEN
teraz życie można rozdzielić między NOP i SLEEP
ODPOWIEDZ