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

Jak uruchomić ADC w Atmega 8a w języku C?

kamdz 04 Paź 2017 13:51 855 6
REKLAMA
  • #1 16737386
    kamdz
    Poziom 12  
    Posty: 191
    Pomógł: 6
    Ocena: 20
    Witam wszystkich
    Dzisiaj zwracam się do Was po pomoc w uruchomieniu adc w atmedze 8a

    Tak więc bez zbytniego owijania w bawełnę
    Kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po jego wgraniu na porcie dostaję krzaka. Konfiguracja uarta dobra, bo po zmianie "adc" na "odb" w funkcji wysyłania odsyła mi "0", gdy dostanie "0"
    Jak coś to port adc zwieram do 5V dla testu. Avcc i aref też do 5V
    Prrrroszę o pomoc :)
  • REKLAMA
  • Pomocny post
    #2 16737405
    Samuraj
    Poziom 35  
    Posty: 2792
    Pomógł: 286
    Ocena: 619
    Zamień na stringa to co otrzymujesz z ADC, albo przerób inaczej procedure wysyłania. W tej chwili w funkcję która wysyła stringa wrzucasz int'a
  • REKLAMA
  • #3 16737486
    kamdz
    Poziom 12  
    Posty: 191
    Pomógł: 6
    Ocena: 20
    Mój kod wygląda teraz tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dostaję 2 warningi:
    ../adcuart.c:41:1: warning: implicit declaration of function 'getADC' [-Wimplicit-function-declaration]
    adc = getADC(0);



    ../adcuart.c:42:11: warning: pointer targets in passing argument 2 of 'itoa' differ in signedness [-Wpointer-sign]
    itoa(adc,adc1,4);


    W terminalu dostaję za każdym razem "3ff"
    Coś już działa ;) ale jeszcze coś musi być źle... Funkcję zamiany int na char mam dobrą? Dobrze adc skonfigurowany?
    Z góry dzięki za pomoc.
  • REKLAMA
  • Pomocny post
    #4 16737509
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    W c przed użyciem funkcji musi ona być znana, a przynajmniej jej prototyp. Ty używasz funkcji getADC przed jej deklaracją/definicją i kompilator przyjmuje domyślny prototyp, stąd ostrzeżenie.
    Co do drugiego ostrzeżenia, zadeklaruj adc1 jako char, a nie unsigned char.
  • REKLAMA
  • #5 16737561
    kamdz
    Poziom 12  
    Posty: 191
    Pomógł: 6
    Ocena: 20
    Ok. w takiej postaci kod kompiluje się bez błędów i warningów. Ale dalej w terminalu dostaję 3ff. Gdy zmieniłem 3 argument funkcji itoa na 10 to zamiast 3ff dostaję 1023, ale nadal tylko i wyłącznie to, niezależnie od wartości na wejściu ADC.
    ADC mam dobrze skonfigurowany?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 16737699
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Sprawdź kilka rzeczy:
    - możesz używać ADIF, ale można też ADSC - ten bit się zeruje po zakończeniu konwersji i nie ma potrzeby dodatkowo go zerować.
    - czy masz podłączone AVcc i kondensator na VRef? Pamiętaj aby VRef nie łączyć z Vcc.
    - czy wybrałeś i podłączyłeś sygnał do właściwego pinu ADC? Sprawdź ustawienia multipleksera. Jeśli na pinie masz "1" to ADC odczyta to jako właśnie 0x3FF.
    - nie masz skonfigurowanego preskalera ADC, a dokładniej wynosi on 2 - jeśli procek jest taktowany np. 16 MHz, to ADC ma taktowanie 8 MHz, czyli 8x więcej niż dopuszczalne max.
  • #7 16737719
    kamdz
    Poziom 12  
    Posty: 191
    Pomógł: 6
    Ocena: 20
    To z czym ja mam połączyć to Vref? bo już nie rozumiem
    Mam taktowanie 8mhz jak ustawić ten preskaler?

    Dodano po 2 [godziny] 39 [minuty]:

    Okej udało mi się to rozwiązać do końca.
    Dla potomnych działający program korzystający z AREF
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dziękuje wszystkim za pomoc

Podsumowanie tematu

✨ Użytkownik poszukiwał pomocy w uruchomieniu przetwornika ADC w mikrokontrolerze Atmega 8a w języku C. W odpowiedziach zasugerowano m.in. konwersję wartości ADC na stringa oraz poprawne deklaracje funkcji. Użytkownik miał problemy z odczytem wartości, które zawsze wynosiły 1023, co sugerowało błędną konfigurację ADC. Wskazano na konieczność podłączenia AVcc oraz kondensatora na VRef, a także na poprawne ustawienie preskalera. Po kilku próbach użytkownik zdołał skonfigurować ADC, uzyskując działający program korzystający z AREF.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA