Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

PIC 16f877A PICC ADC Problem z wyświetleniem

tomixxx 26 Mar 2007 00:34 1322 2
  • #1
    tomixxx
    Level 10  
    Mam płytkę z PIC16F877A mam podłączony wyświetlacz, na którym na bieżąco wyświetlam napięcie na AN0 (analog nr 0).Chciałem póki co zrobić zwykły woltomierz, ale mam problem ze sformatowaniem części dziesiętnej. 10bit ADC ma teoretycznie 5 mV dokładności,ale mam problem bo nie według kompilatora nie mogę używać typu float.
    -Używając sprintf( %f , zmienna) na wyświetlaczu dostaje 'f', ale %d daje normalną cyfre.
    - Mam funkcje która zwraca mi wartości po konwersji ac:
    wyn = (unsigned int)temphigh*256+(unsigned int)templow;
    wyn daje od 0 do 1023 czyli zakres ADC
    na wyswietlczu zmienia się ładnie od 0 do 1023, ale nie mogę zmienić żeby było 0 - 5V (z dwoma miejscami po przecinku)
    napisałem sobie przekształcenia ale część dziesiętna strasznie przekłamuje.
    mV = wyn*5%/1023*999/1023; #część dziesiętna
    V = wyn*5/1023 #część całkowita (ta działa bez zarzutu)
    5 - 5V(Vdd napięcie referencyjne górne, masa dolne)
    a propos mV czyli części dziesiętnej zapisaneej jako integer(a dokładniej float rzutowany na integer)
    mV = wyn*5%/1023*999/1023; #część dziesiętna
    --wyn*5%/1023 - zwraca od 0 - 1023 pomija część całkowitą
    --999/1023 - przeskalowanie zeby nie było 4,999 a pozniej 4,1023 - ta linijka coś psuje wszystko
    Jak nie będziecie wiedzieć co i jak to może ktośmi podrzuci jakiś prosty algorytm takiego przekształcenia
    PS. acha jak np zastąpiłem V = wyn*5/1023 ->V = wyn*(4,93)/1023
    to V było cały czas zero(problem z floatami). Naprawdę nie wiem jak rozwiązać problem.
    Dodatkowo bardzo skaczą wyniki, ale to już mniejszy problem bo można uśrednić, jak już będzie przeskalowanie dobre.
    (jakby ktośsię zgubił o co mi chdzi to jeszcze raz na podsumowanie
    jak zrobić z 0-1023 ->0,000V-5,000V) (części dziesiętne na pomocą integerów, myślę żę jest jakiśprostrzy sposób tylko na niego nie wpadłem :( )
    Myślężę dokładnie opisałem problem, Dzięki za odpowiedź.
  • #2
    Bigfoot
    Level 25  
    Tomixxx, czy dobrze zrozumialem, ze uzywasz PICC HiTecha? Chyba w kompilatorze nie ustawiles opcji wlaczenia pelnego printf.

    Project->Properties->C/C++Build->Linker->Printf->Printf Support: Integer, Long and Float.

    Mam nadzieje, ze w tym problem.

    Pozdrawiam

    BF
  • #3
    tomixxx
    Level 10  
    W moim MPlab było w:
    Project -> Build Options ->Project -> PICC Linker -> int + long + float
    teras sprintf w %f daje liczbe zmiennoprzecinkową, a nie 'f', wyniki się wachają i problemu do końca ie rozwiązałem ale to już inna bajka(uśrednianie), bardzoi mi pomogło. Dzięki