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 32+LCD+ADC+Potencjometr - Nie mogę wyświetlić przeliczenia

czego005 28 Maj 2015 15:20 1497 9
REKLAMA
  • #1 14727944
    czego005
    Poziom 11  
    Witam,
    Ponizszy program wykorzystuje przetwornik ADC Atmega32 za pomoca potencjometru zmieniam przedziały i program wyświetla mi liczby od 0 do 255 bo jest on 8 bitowy i tutaj wszystko działa ok lecz nie mogę wyświetlić wyniku napięcia czyli zamienic rezultatu wyświetlanego z bitów na napięcie , jest doprowadzone 5V zasialne z USB. Próbuje wykonać to funkcja dtostrf jedan wynik negatywny. Komentarze w kodzie to tak jak robie zeby wyświetlic wynik w woltach.


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


    Dodano po 31 [minuty]:

    Natomiast jeżeli zrobie tak to wyświetla mi chinskie znaki, kręcąc potencjometrem również sie zmieniaja lecz są rózne znaki.




    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 14728054
    Sparrowhawk
    Poziom 22  
    Wyświetlenie wyniku w przerwaniu, nie jest dobrym pomysłem. Jeżeli ustawiłeś Vref na korzystanie z wewnętrznego wzorca, to nie zapominaj, że napięcie mierzone nie może być wyższe od 2.56V. Co do funkcji, której używać, to spróbowałbym tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 14728108
    tmf
    VIP Zasłużony dla elektroda
    Jeszcze jeden błąd - voltage_result ma miejsce tylko na 4 znaki, ale jeden z nich to musi być NUL, więc tablica powinna być co najmniej 5 elementowa.
  • REKLAMA
  • #5 14728155
    czego005
    Poziom 11  
    Problem rozwiązany do swojego kodu wstawiłem poprawke zaproponowana przez Sparrowhawk i trochu ją zmodyfikowałęm a dokładnie chodzi o te dwie linijki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Sprawdziełem na multimetrze i wszystko działa tak jak trzeba To co ta LCD zgadza sie na tym z multimetru :) Serdecznie dzięki z apomoc :)
    .

    Dodano po 1 [godziny] 49 [minuty]:

    Jeszcze pytanie do Sparrowhawk dlaczego Twoim zdaniem wyświetlanie wyniku na przerwaniach jest złym pomysłem ??
  • REKLAMA
  • #6 14728465
    dondu
    Moderator na urlopie...
    czego005 napisał:
    Jeszcze pytanie do Sparrowhawk dlaczego Twoim zdaniem wyświetlanie wyniku na przerwaniach jest złym pomysłem ??

    W tym konkretnym przypadku (pokazany przez Ciebie program) nie ma to znaczenia.
    Uwaga kol. Sparrowhawk dotyczyła ogólnej zasady: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html
  • #7 14737151
    czego005
    Poziom 11  
    Witam,

    Po napianiu programu na Atmega32 wykorzystujacego ADC oraz jego sprawdzeniu i dobrym działaniu postanowiłem umieścić go w moim głównym programie. Program zawiera obsługe czujnika odległosci HC-SR04 oraz czujnika temperatury ds18b20 i wszystko wyświetlane jest na wyświetlaczu LCD a wszystko działa pieknie. Lecz w momencie dodania kody ADC do głównego programu wszystko zaczyna wariować, jak mysle problem jest spowodowany przerwaniami lecz nie potrafie sobie z nimi poradzić. Wszystkie dane chce aby były wyświetlane na jednym LCD obecnie z czsem dodam menu.

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



    zastosowałem flage w przewaniach lecz to nic nie dało. oczywiście zmienna flaga została zadeklarowana globalnie "volatile char flaga_1;". To nie jest cały program reszta działa poprawnie.
  • REKLAMA
  • Pomocny post
    #8 14738238
    dondu
    Moderator na urlopie...
    A propos:

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

    to w ADC jest coś takiego jak Free Running mode (bit ADFR w ATmega8). Polega to na tym, że nowa konwersja (pomiar) rozpoczyna się zaraz po skończeniu poprzedniej. Nie trzeba się więc tak gimnastykować jak w kodzie wyżej, ale oczywiście można. Wtedy zamiast zmiennej flaga w pętli głównej sprawdzasz flagę przerwania ADC, a funkcja obsługi przerwania jak i samo przerwanie nie są potrzebne i nie włącza się przerwania.


    czego005 napisał:
    zastosowałem flage w przewaniach lecz to nic nie dało.

    Sprawdzasz ją tylko raz w dodatku przed pętlą główną i przed wystartowaniem pierwszej konwersji. Jaki więc to ma mieć sens?

    Przeanalizowałeś i wypróbowałeś przykłady z artykułu, który Ci wskazałem w poście #4?
    Jeśli nie, to poświęć na to swój czas.
  • #9 14739416
    czego005
    Poziom 11  
    WItam,
    Skorzystałem z Twojej porady i napisałem program wykorzystujący Free Running mode i wszystko działa. Oto program moze sie komus przyda:

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



    Obecnie zabieram sie za PWM na atmega32 an sam koniec zostawiam regulator PID.

    Z jakiego trybu PWM najleiej skorzystac ?? musze miec dwa wyjscia bo bede sterowac dwoma silnikami .
REKLAMA