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.
jeśli ktoś bardziej doświadczony poprawi kod i wykaże błąd będę wdzięczny:-)
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.
Pomiar ADC odczytuje się z rejestru ADC, a nie z definicji pinu PC0
to:
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.
Zmieniłem zgodnie z sugestią ale nadal mam same zera na LCD.
A skąd się biorą te dzielenia przez 1000 i 10000?
0Aby 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
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?
0Wstawił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.
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.
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?
0ADC to nie jest pin, tylko rejestr ADC przetwornika ADC. Odpal ten kod w symulatorze i sprawdź co ci wchłania dane.
0Odnoszę 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.
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 .
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.
0Pewnie 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
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 .
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.
mirek1968 napisał:odpowiedź dla Dondu nie rozumiem pytania o optymalizację?
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ę?
dondu napisał:0Odnoszę 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.
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
0Już 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.