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.

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

topstar 06 Wrz 2012 18:34 2109 22
  • #1 06 Wrz 2012 18:34
    topstar
    Poziom 18  

    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: basic4gl
    Zaloguj się, aby zobaczyć kod

    0 22
  • #2 06 Wrz 2012 18:37
    mickpr
    Poziom 39  

    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?

    0
  • #3 06 Wrz 2012 18:56
    topstar
    Poziom 18  

    Czyli co powinienem dodać do kodu bo nie bardzo jeszcze łapie Bascoma?

    0
  • #4 06 Wrz 2012 19:11
    mickpr
    Poziom 39  

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Przed wyświetleniem wyniku.
    O ile zmyślny Bascom tego nie zoptymalizuje.
    Może lepiej tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #5 06 Wrz 2012 19:20
    topstar
    Poziom 18  

    niestety nie działa przy kompilacji w obu przypadkach wyrzuca błąd : Integer or Long expected forABS()

    0
  • #6 06 Wrz 2012 19:26
    mickpr
    Poziom 39  

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    To jest faktycznie prymitywny język.
    Nie akceptuje wyrażenia jako parametru funkcji.

    0
  • #7 06 Wrz 2012 19:29
    topstar
    Poziom 18  

    No tak wyświetla , proszę zobaczyć na screenie :
    EvB Atmega644P - nie mogę obciąć wyniku z ADC do postaci 123.45[BASCOM]

    0
  • #8 06 Wrz 2012 19:48
    MArSTER_1
    Poziom 18  

    Jeśli chcesz wyświetlić bez miejsc po przecinku to rzutuj zmienną cisn na jakąś zmienna typu Integer lub Word. Zdefiniuj ją na przykład
    Dim cisn_int as integer i nastepnie napisz
    cisn_int= cisn
    I wyświetl bez fusing.
    Bascom to nie jest prymitywny język. Jest bardzo dobrym narzędziem do pisania nawet skomplikowanych programów.

    0
  • #9 06 Wrz 2012 20:09
    topstar
    Poziom 18  

    Nie wiem ale albo ja coś źle pisze ale dalej mi wyświetla wynik z 9-cioma miejscami po przecinku .

    0
  • #10 06 Wrz 2012 20:14
    Piotrek_P
    Poziom 18  

    Zadeklaruj sobie zmienną typu string, np coś takiego:

    Kod: basic4gl
    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

    0
  • #11 06 Wrz 2012 20:16
    MArSTER_1
    Poziom 18  

    Wyświetl zmienną cisn_int.
    Tak: lcd " cisnienie = " ; cisn_int

    0
  • #12 06 Wrz 2012 21:13
    topstar
    Poziom 18  

    Piotrek_P dziekuje bardzo teraz śmiga wszystko , tylko jeszcze jak zlikwidować całkiem liczby po przecinku ?

    0
  • #13 06 Wrz 2012 21:27
    Piotrek_P
    Poziom 18  

    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: basic4gl
    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

    0
  • #14 06 Wrz 2012 21:40
    topstar
    Poziom 18  

    tak wygląda program :

    Kod: basic4gl
    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 .

    0
  • #15 06 Wrz 2012 22:00
    Piotrek_P
    Poziom 18  

    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

    0
  • #16 06 Wrz 2012 22:07
    topstar
    Poziom 18  

    Właśnie jeśłi usunę kropkę to nie kompiluje programu wywala błąd w tej linijce że ". expected [####] ".

    0
  • #17 06 Wrz 2012 22:14
    Piotrek_P
    Poziom 18  

    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.

    0
  • #18 06 Wrz 2012 22:31
    topstar
    Poziom 18  

    Niestety dalej wyskakuje błąd przy kompilacji, po usunięciu kropki . Znak przy loop zostal usunięty.

    0
  • #19 06 Wrz 2012 23:51
    mickpr
    Poziom 39  

    A nie możesz użyć po prostu str?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #20 07 Wrz 2012 05:25
    emarcus
    Poziom 35  

    topstar napisał:
    Niestety dalej wyskakuje błąd przy kompilacji, po usunięciu kropki . Znak przy loop zostal usunięty.


    Jeżeli masz na myśli dokładnie wynik z tytułu, to oczywiście z uwagi na ograniczoną rozdzielczośc i zastosowany algorytm obliczenia ciśnienia to kolejne wyniki będą zbliżone (122.92; 124.00)
    Jeżeli jednak masz problem z uzyskaniem wyniku z dwoma miejscami dziesiętnymi to wyjaśnienie masz niżej.
    Masz będny syntax dla instrukcji fusing.
    Rozważ taką konstrukcję.
    [code]
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    e marcus

    0
  • #21 07 Wrz 2012 09:11
    SylwekK
    Poziom 29  

    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: basic4gl
    Zaloguj się, aby zobaczyć kod


    gdzie x to zmienna liczbowa, a wynik_x - zmienna tekstowa

    0
  • #22 08 Wrz 2012 17:50
    topstar
    Poziom 18  

    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: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #23 09 Wrz 2012 10:18
    SylwekK
    Poziom 29  

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

    0