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

Atmega – nieprawidłowy odczyt ADC, diody na PB1 i PB0 nie reagują na czujnik

15 Sie 2014 19:22 1974 17
REKLAMA
  • #1 13879996
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 13880096
    Gunslinger
    Poziom 30  
    Posty: 1649
    Pomógł: 114
    Ocena: 461
    Właśnie przechodziłem obsługę ADC, ale w Bascom. Pytanie może banalne, ale czy zasiliłeś część analogową? Najlepiej podaj schemat.
  • REKLAMA
  • #3 13880275
    kaka0204
    Poziom 28  
    Posty: 954
    Pomógł: 148
    Ocena: 153
    Co to za czujnik? Rozumiem, że atmega8?
    Poza tym:

    w pętli while(1) dodaj


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


    Zobacz czy to zadziała. Zmienna ADC jest zmienną typu uint16_t
  • #4 13880301
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2206
    goldcap napisał:
    Witam!
    Na wstępie napisze ,że napisałem tu ten temat ,bo nie są kasowane za to żadne punkty.
    Napisałem taki prosty program:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Na PB1 i PB0 są 2 diody.
    PC5 podłączone jest do analogowego czujnika temeratury. Dla 0 stopni jest 0.5 V
    a dla 30 stopni jest 0.8 V. Czemu ten kod nie działa? Może free styler prescaler jest źle ustawiony?


    Po pierwsze nie rozpoczynasz nigdzie konwersji. Drugi problem jest subtelniejszy - wynik ADC/1023 praktycznie zawsze jest równy 0, tylko jeśli ADC jest równe 1023 jest równy jeden. Co innego, gdybyś zrobił ADC/1023.0.
  • #5 13880593
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Jeżeli Vref jest równe 2.56 V, to wartość odczytana z ADC odpowiada napięciu wyrażonym w jednostkach 2,5 mV, Napięciu 0.8 V odpowiada więc wartość ADC 800 / 2.5, czyli 320.

    No i przypadkiem nie wpadnij na pomysł stosowania jakichkolwiek obliczeń na liczbach zmiennopozycyjnych.,,
  • REKLAMA
  • #6 13893068
    Konto nie istnieje
    Konto nie istnieje  
  • #7 13893088
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #8 13893190
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    Pomyśl co robi ta linijka, dokładnie to przeanalizuj :D:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 13893247
    kaka0204
    Poziom 28  
    Posty: 954
    Pomógł: 148
    Ocena: 153
    Dodatkowo zastanów się nad tymi linijkami:

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


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 13893336
    Konto nie istnieje
    Konto nie istnieje  
  • #11 13893753
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    DDRB jest po to, aby diody mogły świecić. żeby je następnie zaświecić lub zgasić - zapisujesz odpowiednią daną do PORTB.
  • #12 13893813
    Konto nie istnieje
    Konto nie istnieje  
  • #13 13893852
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    Powtórzę jeszcze raz - błąd jest TU:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 13893906
    kaka0204
    Poziom 28  
    Posty: 954
    Pomógł: 148
    Ocena: 153
    No dobrze, widzę, że w dalszym ciągu nie możesz wyłapać błędu. Podpowiem ci:

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


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


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


    A dlaczego tak? Zapytaj wujka google :)


    Dodatkowo. Nie pisz tak

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


    bo to jakiś bełkot. Prawidłowy zapis powinien wyglądać tak:

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



    Poza tym. Nie mogę zrozumieć, dlaczego czasami piszesz:

    |= a czasami tylko = ?

    Wytłumaczysz to jakoś :)

    Jeszcze jeden błąd...

    Funkcja initADC nie może zwracać wyniku.

    EDIT

    Kolega wyżej mnie uprzedził :D
  • #15 13893954
    Konto nie istnieje
    Konto nie istnieje  
  • #16 13894159
    kaka0204
    Poziom 28  
    Posty: 954
    Pomógł: 148
    Ocena: 153
    goldcap napisał:
    A po co ma zwracać jak np . z if(ADC > x) biorę wynik?


    Na końcu tej funkcji masz return...
  • #17 13894304
    Konto nie istnieje
    Konto nie istnieje  
  • #18 13894378
    kaka0204
    Poziom 28  
    Posty: 954
    Pomógł: 148
    Ocena: 153
    goldcap napisał:
    żeby funkcja ładnie wyglądała.


    WTF?! W funkcji nie zwracającej rezultatu ten return jest w ogóle nie potrzebny i następnym razem nie musisz "upiększać" takich funkcji :D

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zgłasza problem z pomiarem ADC w mikrokontrolerze Atmega, w szczególności z kodem, który nie inicjuje konwersji ADC oraz nieprawidłowo obsługuje diody LED. Odpowiedzi sugerują, aby dodać linię inicjującą konwersję ADC oraz poprawić obliczenia, aby uniknąć dzielenia całkowitego. Wskazano również na błędy w kodzie, takie jak niewłaściwe użycie operatorów bitowych oraz konieczność poprawnej obsługi portów do sterowania diodami. Użytkownik został zachęcony do przemyślenia logiki działania diod oraz do poprawienia funkcji inicjalizacyjnej ADC.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA