logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega8] [ATmega8][C/C++] - ADC nie działa, konfiguracja i kod do sprawdzenia

jonathanT 19 Maj 2013 23:27 1581 8
REKLAMA
  • #1 12325400
    jonathanT
    Poziom 9  
    Witam, zacząłem zabawę z ADC i niestety nie mogę uruchomić. Przeczytałem wiele tematów, datasheet, próbowałem wielu różnych ustawień i nie mogę znaleźć co jest nie tak. Wejście do porównania jest na pinie ADC0, AREF połączone z VCC, a dioda na PB0. Proszę o pomoc :)


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 12325470
    Fredy
    Poziom 27  
    Z którego kanału korzystasz? Zwróć uwagę że w Twoim kodzie nigdzie nie podajesz informacji prockowi gdzie ma zmierzyć napięcie.
    Przed konwersją musisz w rejestr ADMUX wpisać numer kanału ADC.
  • #3 12325474
    jonathanT
    Poziom 9  
    Korzystam z ADC0, domyślnie ustawione są na 0 czyli powinno się zgadzać.
  • REKLAMA
  • #4 12325479
    Fredy
    Poziom 27  
    No chyba że tak, tylko skąd inni mają to wiedzieć gdzie się podłaczasz.
    SPróbuj zmienić tą pętlę:
    while(ADCSRA & (1<<ADSC))

    na

    while(ADCSRA & (1<<ADSC)==0)
  • #5 12325498
    jonathanT
    Poziom 9  
    Zamieniłem na while((ADCSRA & (1<<ADSC))==0) i po wgraniu programu na ułamek sekundy dioda zapala się i zgasza nawet dla skrajnych wartości, potem nie ma żadnej reakcji.
  • REKLAMA
  • #6 12325509
    Fredy
    Poziom 27  
    Masz tu dzialającą procedurę:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 12325524
    jonathanT
    Poziom 9  
    Teraz mam tak i nie ma żadnej reakcji:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #8 12325603
    dondu
    Moderator na urlopie...
    Fredy napisał:
    Zwróć uwagę że w Twoim kodzie nigdzie nie podajesz informacji prockowi gdzie ma zmierzyć napięcie.
    Przed konwersją musisz w rejestr ADMUX wpisać numer kanału ADC.

    Robi to tą linijką programu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ustawiając kanał ADC0, dlatego rozumowanie:

    jonathanT napisał:
    Korzystam z ADC0, domyślnie ustawione są na 0 czyli powinno się zgadzać.

    że ustawienie w tym wypadku jest domyślne jest błędne, choć kanał autor swoim programem ustawia prawidłowy.


    Fredy napisał:
    SPróbuj zmienić tą pętlę:
    while(ADCSRA & (1<<ADSC))
    na
    while(ADCSRA & (1<<ADSC)==0)

    W jakim celu? Zastosowane przez autora sprawdzanie flagi ADSC jest prawidłowe:

    ATmega8 datasheet napisał:
    ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero.

    zarówno pod kątem języka C (przykład 4) tutaj: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-operator-bitowy-and.html
    jak i datasheet oraz przykładu obsługi ADC: http://mikrokontrolery.blogspot.com/2011/03/adc-wstep-i-uruchomienie.html

    Program z pierwszego postu jest prawidłowy, a ja sądzę, że problem leży gdzie indziej:

    jonathanT napisał:
    Wejście do porównania jest na pinie ADC0, AREF połączone z VCC, a dioda na PB0.

    i jest nim prawdopodobnie nie podłączenie pinu AVcc.

    Lektura:
    http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html
    http://mikrokontrolery.blogspot.com/2011/03/avr-adc-podlaczenie.html

    A jeżeli AVcc jednak masz podłączony, to pokaż cały schemat i zdjęcia.
  • #9 12326638
    jonathanT
    Poziom 9  
    Sprawdziłem połączenia i... kabelek od AVCC nie łączył :/ Teraz wszystko śmiga, wielkie dzięki za pomoc :D
REKLAMA