logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

EvB Atmega644P - nie mogę obciąć wyniku z ADC do postaci 123.45[BASCOM]

topstar 06 Wrz 2012 18:34 2457 22
REKLAMA
  • #1 11285016
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    witam otóż projektuje sobie zegarek z termometrem oraz czujnikiem ciśnienia MPX4115(analogowy), problem polega na tym że nie potrafię obciść wyniku ciśnienia do postaci xxx.xx lub samej wartosci xxx bez miejsc po przecinku.
    Jaka komendę trzeba zastosować aby wyświetlić porządany wynik ?
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 11285028
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    Istnieje funkcja Round(), która zaokrągla zmienną do najbliższej wartości całkowitej.
    Może wystarczy daną wartość pomnożyć przez 100, zaokrąglić i podzielić przez 100?
  • #3 11285083
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    Czyli co powinienem dodać do kodu bo nie bardzo jeszcze łapie Bascoma?
  • #4 11285130
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Przed wyświetleniem wyniku.
    O ile zmyślny Bascom tego nie zoptymalizuje.
    Może lepiej tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #5 11285161
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    niestety nie działa przy kompilacji w obu przypadkach wyrzuca błąd : Integer or Long expected forABS()
  • REKLAMA
  • #6 11285183
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    Kod: text
    Zaloguj się, aby zobaczyć kod


    To jest faktycznie prymitywny język.
    Nie akceptuje wyrażenia jako parametru funkcji.
  • #7 11285199
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    No tak wyświetla , proszę zobaczyć na screenie :
    EvB Atmega644P - nie mogę obciąć wyniku z ADC do postaci 123.45[BASCOM]
  • #8 11285283
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #9 11285369
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    Nie wiem ale albo ja coś źle pisze ale dalej mi wyświetla wynik z 9-cioma miejscami po przecinku .
  • #10 11285395
    Piotrek_P
    Poziom 18  
    Posty: 253
    Pomógł: 24
    Zadeklaruj sobie zmienną typu string, np coś takiego:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Aha. Jeżeli zostają jakieś znaki na końcu stringa na wyświetlaczu to trzeba je jakoś czyścić...

    Powinno działać.

    PP
  • #11 11285406
    Konto nie istnieje
    Poziom 1  
  • #12 11285681
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    Piotrek_P dziekuje bardzo teraz śmiga wszystko , tylko jeszcze jak zlikwidować całkiem liczby po przecinku ?
  • #13 11285736
    Piotrek_P
    Poziom 18  
    Posty: 253
    Pomógł: 24
    Nie wiem co masz przed pętlą główną, bo jeżeli tam wrzucasz coś na LCD to trzeba to też wziąć pod uwagę. Jeżeli w pętli głównej zostają na LCD jakieś śmieci "na końcu" to ja dodaję do stringa jakieś "spacje" i jest OK. Czyszczenie całego LCD nie wchodzi w grę w każdym obiegu pętli bo źle to wygląda (widać odświerzanie).
    Generalnie jeżeli wystarczy Ci wynik bez wartości po przecinku to wystarczy:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    A tak poza tym to czy potrzebujesz aktualizować tak często wyniki na LCD :?:
    Taktowanie masz 16MHz i na pewno LCD się z tym męczy. Poczytaj o Timerach i przerwaniach od nich.

    PP
  • #14 11285809
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    tak wygląda program :
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Narazie jest to sam program do pomiaru ciśnienia(później będzie to podprogram całości) , z tym że nie moge się pozbyć tych cyfr po przecinku. No i faktycznie przydałoby się zmienić odświeżanie na wolniejsze oraz czasem jak wynik skacze na 4 cyfrowy z 3 cyfrowego to za "hPa" dodaje dodatkową literę a .
  • #15 11285922
    Piotrek_P
    Poziom 18  
    Posty: 253
    Pomógł: 24
    Ale z cyferkami i ich wyświetlaniem tak już jest. Trzeba najlepiej na IFach kombinować.
    Jak Cisn < 1000 to dodaj spację z przodu.
    A co do cyfr po przecinku to widzę po zamieszczonym wyżej kodzie, że w funkcji Fusing masz na końcu stringa kropkę.

    PP
  • #16 11285949
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    Właśnie jeśłi usunę kropkę to nie kompiluje programu wywala błąd w tej linijce że ". expected [####] ".
  • #17 11285992
    Piotrek_P
    Poziom 18  
    Posty: 253
    Pomógł: 24
    A co to za nawias na końcu programu (zakończenie pętli "loop]) ?? Kompilator Bascoma czasem wskazuje na problem tam gdzie go nie ma, a jest gdzie indziej niestety.
  • REKLAMA
  • #18 11286067
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    Niestety dalej wyskakuje błąd przy kompilacji, po usunięciu kropki . Znak przy loop zostal usunięty.
  • #19 11286353
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    A nie możesz użyć po prostu str?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #20 11286552
    Konto nie istnieje
    Poziom 1  
  • #21 11286751
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    topstar napisał:
    ... problem polega na tym że nie potrafię obciść wyniku ciśnienia do postaci xxx.xx lub samej wartosci xxx bez miejsc po przecinku.
    Jaka komendę trzeba zastosować aby wyświetlić porządany wynik ?


    A próbowałeś instrukcji "Format" ?

    np.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    gdzie x to zmienna liczbowa, a wynik_x - zmienna tekstowa
  • #22 11291378
    topstar
    Poziom 18  
    Posty: 388
    Pomógł: 24
    Ocena: 39
    Poradziłem sobie już wystarczyło zadeklarować A jako Long i wtedy moglem użyć funkcji Round.
    Mam jeszcze pytanie bo nie chcę zakładać kolejnego tematu . Jak ustawić timer aby w poniższym programie aby robił pomiar ciśnienia co minutę ?
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #23 11293016
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    topstar napisał:
    ... Jak ustawić timer aby w poniższym programie aby robił pomiar ciśnienia co minutę ?...


    Przy taktowaniu 16MHz raczej musiał skorzystać z dodatkowego licznika programowego w przerwaniu, bo nawet Timer1 (16-o bitowy) z preskalerem 1024 to nadal będzie 15625 tyknięć na sekundę i bezpośrednio mógłbyś uzyskać co najwyżej lekko ponad 4-o sekundowy interwał.

Podsumowanie tematu

✨ Użytkownik projektuje zegarek z termometrem i czujnikiem ciśnienia MPX4115, napotykając problem z formatowaniem wyniku ciśnienia do postaci xxx.xx lub xxx. W odpowiedziach zasugerowano użycie funkcji Round() do zaokrąglania wartości oraz rzutowanie zmiennej cisn na typ Integer lub Word, aby wyświetlić wynik bez miejsc po przecinku. Użytkownik miał trudności z kompilacją kodu, ale ostatecznie rozwiązał problem, deklarując zmienną A jako Long, co umożliwiło użycie funkcji Round. Dodatkowo, poruszono temat ustawienia timera do pomiaru ciśnienia co minutę, wskazując na potrzebę użycia dodatkowego licznika programowego w przerwaniu.
Wygenerowane przez model językowy.
REKLAMA