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ź.
-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ź.