Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 - Woltomierz atmega8_pomiar napięcia akumulatora

mirek1968 13 Sty 2013 00:17 3036 21
  • #1 13 Sty 2013 00:17
    mirek1968
    Poziom 13  

    Mam prośbę.Próbuję uruchomić woltomierz do pomiaru napięcia akumulatora i wyświetla mi na LCD same zera.
    prawdopodobne coś mam źle w kodzie.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    jeśli ktoś bardziej doświadczony poprawi kod i wykaże błąd będę wdzięczny:-)

    0 21
  • #3 13 Sty 2013 10:23
    tmf
    Moderator Mikrokontrolery Projektowanie

    W dodatku warto zaqpoznać się z koncepcją arytmetyki liczb całkowitych, np. fragment:
    wynik=pm*(VREF_VCC/1024)*3;
    zawsze da zero. Bo int VREF/1024 da zero. Nie ma czegoś takiego jak automatyczna promocja do float. Co innego gdyby tam było VREF/1024.0, ale i tak cała koncepcja o bliczeń jest kiepska.

    0
  • #4 13 Sty 2013 10:43
    mirek1968
    Poziom 13  

    Zmieniłem zgodnie z sugestią ale nadal mam same zera na LCD.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Co jeszcze musiałbym zmienić aby otrzymać prawidłowy pomiar?
    Proszę o dalsze pomysły.

    0
  • #6 13 Sty 2013 11:32
    dondu
    Moderator Mikrokontrolery Projektowanie

    Aby Twój sposób liczenia działał zmienna wynik musiałaby być typu float.
    http://mikrokontrolery.blogspot.com/2011/03/adc-prezentacja-wyniku-na-lcd.html

    Musisz się zdecydować, czy chcesz robić operacje na liczbach całkowitych, czy zmiennoprzecinkowych.

    Dodatkowo zapoznaj się z rzutowaniem i promocją typów: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-rzutowanie-promocja-typow.html

    0
  • #7 13 Sty 2013 11:53
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie używaj żadnych float. Policz napięcie w mniejszych jednostkach, np. w mV i trzymaj je jako liczbę całkowitą.

    0
  • #8 13 Sty 2013 12:47
    mirek1968
    Poziom 13  

    Miałem wcześniej działający układ ze zmienną typu float , i użytą funkcją sprintf ale są bardzo pamięciożerne i ze względu na małą pamięć mojego atmega8 chciałbym to w jakiś sposób obejść.A odnośnie tych dzieleń to nie mój pomysł ale słyszałem że jest to potrzebne aby wyświetlić wynik pomiaru po przecinku.Co musiałbym zmienić lub dodać to mojego kodu aby uniknąć zmiennej float i wyświetlić wynik pomiaru po przecinku?

    0
  • #9 13 Sty 2013 13:08
    BlueDraco
    Specjalista - Mikrokontrolery

    Przykład dla dzielnika wejściowego 1/3 i napięcia odniesienia 5V (czyli zakres wejściowy do 15V).

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #10 13 Sty 2013 18:32
    mirek1968
    Poziom 13  

    Wstawiłem ten kod do pętli while ale niestety wyświetla mi na LCD same zera tzn. dokładnie w ten sposób
    00.000

    Być może muszę jeszcze coś zmienić ale nie wiem co.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #11 13 Sty 2013 20:37
    BlueDraco
    Specjalista - Mikrokontrolery

    Spróbuj zadeklarować temp na zewnątrz, a później po pomiarze tylko zrób podstawienie temp = ADC;

    Jeśli nie pomoże - spróbuj sprawdzić działanie kodu przez podstawienie pod temp jakiejś stałej wartości. Jeśli to pomoże - szukaj błędu w obsłudze przetwornika.

    0
  • #12 14 Sty 2013 09:30
    mirek1968
    Poziom 13  

    Wstawiłem temp na zewnątrz ale to nic nie zmieniło.Mam pytanie gdzie w tym kodzie jest definicja pinu ADC w moim przypadku PC0?

    0
  • #13 14 Sty 2013 16:08
    tmf
    Moderator Mikrokontrolery Projektowanie

    ADC to nie jest pin, tylko rejestr ADC przetwornika ADC. Odpal ten kod w symulatorze i sprawdź co ci wchłania dane.

    0
  • #14 15 Sty 2013 00:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    Odnoszę wrażenie, że to zadanie Ciebie przerasta ponieważ nie rozumiesz, co piszesz i tworzysz. Tylko się nie obraź :)

    Zacznij od początku czyli np. od kursu do którego Ci link podałem, a jeżeli chcesz się tym zajmować dłużej, to kup książkę ze stopki tmf'a i ruszysz z kopyta.

    0
  • #15 15 Sty 2013 21:09
    mirek1968
    Poziom 13  

    implicit declaration of function 'sprintf'
    Description Resource Path Location Type
    incompatible implicit declaration of built-in function 'sprintf' main.c

    Takie błędy co wypisałem powyżej wywala mi środowisko Eclipse jak chcę używać funkcji sprintf.(a AVR Studio brak błędów)pewnie czegoś brakuje w konfiguracji Eclipse,jak ktoś ma jakiś pomysł to proszę śmiało i rzeczowo.

    Zrobiłem coś takiego w swoim kodzie w c i działa tylko jak już wspomniałem na początku mojego tematu za dużo mi to pożera pamięci programu oraz pamięci RAM.
    Co prawda działa mi pomiar napięcia akumulatora na tym kodzie ale proszę o dalszą pomoc w odchudzeniu pamięci bo nie jestem z tego zadowolony (pamięć flash 90% a RAM 40%) a mogło by być dużo przecież dużo oszczędniej bo to tylko Atmega8 .

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #16 15 Sty 2013 21:19
    BlueDraco
    Specjalista - Mikrokontrolery

    Przecież właśnie powyżej odchudzaliśmy Twój program, najskuteczniej jak się da. Pewnie gdzieś jest drobny błąd do wyśledzenia i usunięcia. Jeżeli to, co pokazałeś powyżej, działa, to tamto też musi.

    0
  • #17 15 Sty 2013 21:43
    mirek1968
    Poziom 13  

    Pewnie masz rację BlueDraco muszę poszukać przyczyny tego dlaczego nie działa.Proszę o cierpliwość i wyrozumiałość dla mojej słabej wiedzy,jak do czegoś dojdę to się odezwę.Pozdrawiam serdecznie szanownych kolegów:-)

    0
  • #18 16 Sty 2013 11:39
    dondu
    Moderator Mikrokontrolery Projektowanie

    mirek1968 napisał:
    Zrobiłem coś takiego w swoim kodzie w c i działa tylko jak już wspomniałem na początku mojego tematu za dużo mi to pożera pamięci programu oraz pamięci RAM.
    Co prawda działa mi pomiar napięcia akumulatora na tym kodzie ale proszę o dalszą pomoc w odchudzeniu pamięci bo nie jestem z tego zadowolony (pamięć flash 90% a RAM 40%) a mogło by być dużo przecież dużo oszczędniej bo to tylko Atmega8 .

    Jaką optymalizację masz włączoną?

    0
  • #19 17 Sty 2013 00:45
    mirek1968
    Poziom 13  

    Kod BlueDarco już działa ale tylko w głównym programie int main(void) po każdej regulacji napięcia robię restart programu maint i wyśwetla mi poprawną wartość ale jak zmieniam to nic się nie dzieje ale to zrozumiałe bo muszę użyć pętli ciągłej np. while
    Nie wiem co jest nie tak ale nie wiem jak ten kod wstawić do ciągłej pętli jak już wstawiam to wyświetlają mi się na wszystkich wierszach LCD zera.Prosze o pomoc co mama zostawić wprogramie głównym a co w pętli while.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    odpowiedź dla Dondu nie rozumiem pytania o optymalizację?

    0
  • Pomocny post
    #20 17 Sty 2013 02:29
    dondu
    Moderator Mikrokontrolery Projektowanie

    mirek1968 napisał:
    odpowiedź dla Dondu nie rozumiem pytania o optymalizację?

    Czytaj tutaj: http://mikrokontrolery.blogspot.com/2011/04/bledy-kompilacji-programu.html


    mirek1968 napisał:
    Nie wiem co jest nie tak ale nie wiem jak ten kod wstawić do ciągłej pętli jak już wstawiam to wyświetlają mi się na wszystkich wierszach LCD zera.Prosze o pomoc co mama zostawić wprogramie głównym a co w pętli while.

    .... nie rozumiem pytania o optymalizację?


    Powtórzę ponownie:

    dondu napisał:
    Odnoszę wrażenie, że to zadanie Ciebie przerasta ponieważ nie rozumiesz, co piszesz i tworzysz. Tylko się nie obraź :)

    Zacznij od początku czyli np. od kursu do którego Ci link podałem, a jeżeli chcesz się tym zajmować dłużej, to kup książkę ze stopki tmf'a i ruszysz z kopyta.

    0
  • #21 17 Sty 2013 09:46
    mirek1968
    Poziom 13  

    Dondu mam optymalizacje -OS włączoną w AvrStudio a w Eclipse niewiem gdzia jest taka informacja.Ale teraz wolałbym się skupić nad umieszczeniem części tego kodu co jest w poprzednim moim poście w pętli ciągłej bo tu mam z tym problem bo wyswietla mi na LCD we wszystkich wierszach same zera

    0
  • #22 19 Sty 2013 23:41
    mirek1968
    Poziom 13  

    Już wszystko mi działa dobrze.wygląda na to że mi brakowało czegoś,ale ważne że jest już ok.Odchudzony mam program pamięć flesh 52%,RAM 14%:-)
    Czeli cel osiągnięty dzięki Waszej pomocy i cierpliwości.Jeszcze raz dzięki.:-)

    0