Przetwornik ADC w ATTiny 861 ?

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Przetwornik ADC w ATTiny 861 ?

Post autor: kayron » 09 cze 2011, 19:47

Witam. Używał ktoś z was przetworników ADC w procesorach ATTiny 861 ? Ja od paru dni próbuję, ale mam takie efekty, program napisany w bascom. Nie wiem w nocie jest jakiś błąd czy co ?, bo przy AREF = VCC powinno to działać bez problemu.
Jak skręcę potencjometr na płytce w którekolwiek skrajne położenie to ekran LCD szaleje. Pomijając już że wyświetlane wartości są daleko absurdalne.
Filmik z eksperymentów

Kod: Zaznacz cały

'SHARP 2D120X tester
$crystal = 1000000
$regfile = "attiny861.dat"


Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Config Lcd = 16 * 2
Config Porta = Input


Dim Wynik As Word At &H60
Dim Ad_low As Byte At &H60 Overlay
Dim Ad_high As Byte At &H61 Overlay
Dim Licz As Byte

Cursor Off
Cls
Lcd " SHARP  2D120X"
Enable Interrupts
Enable Oc0a
'Ocr0a = 40                    ' przerwania ok 25 razy na sek
'Tccr0a = &H01                 ' CTC mode
'Tccr0b = &H0D                 ' start timera z dzielnikiem 1024
Admux = 0
Adcsra = &B10000110
Adcsrb = &H0
Adcsra = &B11000110
Do
  If Licz > 250 Then
     Licz = 0
  End If
  Locate 2 , 2
  Lcd Wynik
  If Adcsra.4 = 1 Then
    Locate 2 , 7
    Lcd "ADIF 1"
    Ad_low = Adcl
    Ad_high = Adch
    Reset Adcsra.4
    Adcsra = &B11000110
  End If
  Waitms 200
Loop

End
Wszystko robione na płytce ZL4AVR od Kamami.

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 09 cze 2011, 20:53

Nie znam BASCOMa, więc niestety musisz sam ocenić na ile zasadne są moje uwagi.
1. Z tego co widzę, potencjometr może być dołączony do jednego z czterech portów, nie pomyliłeś się czasem? Sprawdź zworki JP1 i JP3.
2. Włączasz przerwanie, ale nie widzę procedury jego obsługi.
3. ADIF zeruje się zapisując do niego jedynkę (patrz dokumentacja). Ja bym po prostu sprawdzał ADSC, ustawiasz i czekasz aż się wyzeruje, co będzie oznaczało koniec konwersji.
Obstawiam, że to wina przerwania, które wywala program w "maliny", bo nie ma poprawnego handlera. No chyba, że moja wiedza z zakresu BASCOMa jest tak słaba, że go nie widzę ;)

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 10 cze 2011, 13:59

Tzn. z tym ADIF sam jestem już głupi, bo w książce o ATTiny pisze.
ADIF - znacznik zakończenia konwersji.
Zakończenie operacji przetwarzania powoduje ustawienie znacznika ADIF. Bit ten jest jednocześnie znacznikiem przerwania dla modułu ADC. Jego zerowanie może zatem zachodzić automatycznie przy wejściu do procedury obsługi przerwania lub musi być przeprowadzone manualnie - poprzez załadowanie wysoką wartością.
Ale dosłownie akapit niżej.
ADIE - uaktywnienie przerwania od ADC.
Jeżeli bit ADIE oraz znacznik I w rejestrze SREG są ustawione, zakończenie konwersji (czyli przyjęcie przez bit ADIF stanu wysokiego) powoduje przejście do procedury obsługi dedykowanej modułowi ADC.
Czyli takie trochę masło maślane, bo w pierwszym cytacie jest że logiczne 1 to zerownie znacznika ADIF, a w drugim że niby jest odwrotnie ?
Ale zauważyłem że program zwisza się jak suwak potencjometru jest w jednym ze skrajnych położeń czyli +5V lub GND. Chyba że przetwornik AC nie toleruje takich napięć ?
PS.
Dobra rozgryzłem to, mały błąd w programie (właściwie poszedłem za porada kolegi), oraz w zworkach.
Teraz mogę podłanczać czujnik SHARPA i brnąc dalej, w meandry matematyki..

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 10 cze 2011, 20:59

kayron pisze:Ale zauważyłem że program zwisza się jak suwak potencjometru jest w jednym ze skrajnych położeń
Robisz zwarcie w jakiś sposób jak sądzę ;)
kayron pisze: Czyli takie trochę masło maślane, bo w pierwszym cytacie jest że logiczne 1 to zerownie znacznika ADIF, a w drugim że niby jest odwrotnie ?
Bez bicia się przyznaję, że nie kupiłem nigdy książki o AVR. Służę natomiast cytatem z dokumentacji Atmela:
ADIF is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, ADIF is cleared by writing a logical one to the flag.
kayron pisze:z tym ADIF sam jestem już głupi
Jasne, możesz sobie sprawdzać ADIF, ale musisz poprawnie wyzerować flagę. ADSC jest łatwiejsze i szybsze, bo nic nie trzeba zerować - ustawiasz i czekasz aż się samo wyzeruje.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 11 cze 2011, 15:19

Ważne że już działa tak jak trzeba :grin:
Tzn. jeszcze i tak będę nad tym pracował bo docelowo chciałbym aby przetwornik ADC był uruchamiany w przerwaniach od Timera, aby ilość próbek w czasie była stała.
Załączniki
Sharp 2d120x.JPG
ATTiny_ADC1.JPG

ODPOWIEDZ