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

[ATmega8][C]Płynne odświeżanie temperatury na lcd

Bartek.k.k 01 Lip 2011 11:52 4716 31
REKLAMA
  • #1 9668875
    Bartek.k.k
    Poziom 21  
    Witam, w jaki sposób w języku C zrobić płynne odświeżanie na lcd, aby wynik nie gasł i ponownie się zaświecał. Chodzi mi o coś takiego jak tu(obr): http://www.youtube.com/watch?v=PXr-0NK0qvI . Można powiedzieć, że nawet płynnie się odświeża. Pozdrawiam, Bartekk!
  • REKLAMA
  • #3 9668964
    Bartek.k.k
    Poziom 21  
    Kod to baza z książki Pana Mirka i moje wypociny. Chodzi mi o to, aby odświeżanie było tak szybkie, żeby nie było widać przygasania lcd. U mnie wygląda to tak: http://www.youtube.com/watch?v=7Yj1xosiZQk .
  • #4 9668985
    dondu
    Moderator na urlopie...
    Bartek.k.k napisał:
    Kod to baza z książki Pana Mirka i moje wypociny. Chodzi mi o to, aby odświeżanie było tak szybkie, żeby nie było widać przygasania lcd. U mnie wygląda to tak: http://www.youtube.com/watch?v=7Yj1xosiZQk .

    Bartku, oszczędź nam czasu i postępuj tak:
    http://mikrokontrolery.blogspot.com/2011/04/fora-dyskusyjne-sa-bardzo-pomocne.html
  • REKLAMA
  • #5 9668992
    Bartek.k.k
    Poziom 21  
    dondu napisał:
    Bartek.k.k napisał:
    Kod to baza z książki Pana Mirka i moje wypociny. Chodzi mi o to, aby odświeżanie było tak szybkie, żeby nie było widać przygasania lcd. U mnie wygląda to tak: http://www.youtube.com/watch?v=7Yj1xosiZQk .

    Bartku, oszczędź nam czasu i postępuj tak:
    http://mikrokontrolery.blogspot.com/2011/04/fora-dyskusyjne-sa-bardzo-pomocne.html


    Znam dobrze zasady panujące na forum, lecz czy mogę wkleić kod, który był dołączony do książki?
  • #7 9669061
    PUPILANDER
    Poziom 15  
    Prawdopodobnie "czyścisz" drugą linię wyświetlacza przed wpisaniem nowej wartości. Wystarczy po prostu nadpisać w odpowiednie miejsca nowe wartości bez czyszczenia i efekt powinien zniknąć.
    PS: Kod byłby pomocny bo bez niego to wróżenie.
  • Pomocny post
    #8 9669077
    piotrva
    VIP Zasłużony dla elektroda
    Kod jest mi nie potrzebny - zasada jest taka - masz określone formaty danych i tak np. temperatura składa się z 3 cyfr i kropki, znak stopni jest stały, podobnie jak reszta napisów.
    I teraz masz stare odczyty, powiedzmy tak:
    ___DOM____POLE__
    __21.5_C__12.2_C
    Potem dajesz locate, w tym przypadku (1,2) i wyświetlasz nową temperaturę, która przy okazji "zmaże" starą bez żadnego mignięcia (no chyba, że masz wolny LCD i szybko kamerę). Podobnie postępujesz dla 2 temperatury locate(1,10) i znów zamazujesz starą temperaturę za pomocą nowej - bardziej elegancko chyba się nie da ;-)
  • #9 9669083
    Bartek.k.k
    Poziom 21  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Komentarze Pana Mirka zostały usunięte.
  • REKLAMA
  • #11 9669112
    Bartek.k.k
    Poziom 21  
    Wyświetla dziesiętne stopnie temperatury.
  • #13 9669141
    Bartek.k.k
    Poziom 21  
    dondu napisał:
    Zmienna cel nie powinna być volatile?


    Jeżeli zmienna cel będzie volatile wtedy występują błędy podczas kompilacji.
  • REKLAMA
  • #15 9669182
    Bartek.k.k
    Poziom 21  
    Multiple markers at this line
    - Line breakpoint: main.c [line: 63]
    - passing argument 3 of 'DS18X20_read_meas' discards qualifiers from
    pointer target type

    Wracając, mógłby ktoś mnie nakierować co zmienić w kodzie, aby temperatura była płynna?
  • Pomocny post
    #16 9669266
    LordBlick
    VIP Zasłużony dla elektroda
    Zastosuj buforowanie w tablicy w pamięci RAM, nadpisuj, to co ma się zmienić, a inna procedura niech przesyła co jakiś czas to co jest w RAM do wyświetlacza.
  • #17 9669276
    Bartek.k.k
    Poziom 21  
    Light-I napisał:
    Zastosuj buforowanie w tablicy w pamięci RAM, nadpisuj, to co ma się zmienić, a inna procedura niech przesyła co jakiś czas to co jest w RAM do wyświetlacza.


    To przerasta moje umiejętności. Prościej się nie da?
  • #18 9669487
    piotrva
    VIP Zasłużony dla elektroda
    Ale zupełnie nie wiem dlaczego Twój program działa tak a nie jak powinien.
    A co da taki program:
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
     
    #include "LCD/lcd44780.h"
    
    int main(void){
    lcd_init();	/* inicjalizacja LCD */
    lcd_locate(0,0);
    lcd_str("Obr:13652");
    while(1){
       _delay_ms(1000);
       lcd_locate(0,4);
       lcd_str("00023");
       _delay_ms(1000);
       lcd_locate(0,4);
       lcd_str("15982");
    }
    }
    

    Założenie: przy poprawnej pracy LCD liczba po słowie Obr powinna się zmieniać bez migania
    EDIT: Kod poprawiony ;-)
  • #19 9669534
    Bartek.k.k
    Poziom 21  
    piotrva napisał:
    Ale zupełnie nie wiem dlaczego Twój program działa tak a nie jak powinien.
    A co da taki program:
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
     
    #include "LCD/lcd44780.h"
    
    int main(void){
    lcd_init();	/* inicjalizacja LCD */
    lcd_locate(0,0);
    lcd_str("Obr:13652");
    while(1){
       delay(1000);
       lcd_locate(0,4);
       lcd_str("00023");
       delay(1000);
       lcd_locate(0,4);
       lcd_str("15982");
    }
    }
    

    Założenie: przy poprawnej pracy LCD liczba po słowie Obr powinna się zmieniać bez migania


    Faktycznie, wszystko działa tak jak bym pragnął. Tylko jak zastosować taki myk w moim programie?

    PS W Pańskim kodzie jest błąd:

    _delay_ms zamiast delay.
  • #20 9669555
    piotrva
    VIP Zasłużony dla elektroda
    Bartek.k.k napisał:

    PS W Pańskim kodzie jest błąd:

    _delay_ms zamiast delay.

    Racja, mój błąd - piszę właśnie kurs Arduino i tam składnia jest taka jak w C/C++, ale są dodatkowe funkcje, m. in. to delay();
    Cóż, na zrobienie i testowanie gotowca nie mam czasu, ale z rozwiązaniem wyjdź od mojego kodu i na początek dołóż odczyt z 1 termometru, potem z 2 (na razie z _delay_ms(); do ustalenia czasu konwersji). Potem dołóż to rozdzielanie zadań na timerze i zobacz czy i kiedy zacznie migać. Spróbuj wrzucić wyświetlanie liniowo w kodzie, a nie w funkcji...
  • #21 9669592
    mirekk36
    Poziom 42  
    Bartek.k.k --> widzisz twój podstawowy problem i to z porozumiewaniem się na forum bierze się chyba z tego, że co innego pokazujesz (np na filmiku z Youtube) a co innego pokazujesz w kodzie a na dodatek kod ten opatrujesz na górze moim podpisem, podczas gdy jest on mocno przez ciebie zmodyfikowany.

    Jeszcze raz powiem, takie progemy jak ten, które przerabiasz we własnym zakresie - przynajmniej tą część z całego main - możesz spokojnie tu pokazywać i się dopytywać. Ale jak pokazujesz filmik z działania na Youtube to pokaż dokładnie ten sam kod.

    Już nie mówię tylko o tym napisie że jest inny na LCD "brak :(" zamiast " error "

    ale gdybyśmy zobaczyli ten dokładnie kod to od razu - w 5 sekund ze 20 osób podpowiedziałoby ci, co tam nabroiłeś, że ci tak to miga co sekundę ;)

    Ja tylko mogę podejrzewać, że gdzieś używasz po drodze polecenia do czyszczenia ekranu albo całej linii i stąd taki dziwny efekt.

    A wystarczyłaby taka mała modyfikacja żeby ci to działało tak jak pokazał wyżej kolega piotrva ;)

    tylko jeszcze raz - pokaż swój kod - ten na podstawie którego ten filmik nakręciłeś ok?
  • #22 9669620
    Bartek.k.k
    Poziom 21  
    Rzeczywiście namieszałem. No to tak, poniżej poprawny filmik oraz kod, który jest wgrany.

    Program:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Film:



  • #23 9669761
    zumek
    Poziom 39  
    W kodzie stoi jak byk ....
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ... a funkcji ISR(TIMER1_COMPB_vect) ani widu, ani słychu :-P
  • Pomocny post
    #24 9669769
    mirekk36
    Poziom 42  
    zumek napisał:
    W kodzie stoi jak byk ....
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ... a funkcji ISR(TIMER1_COMPB_vect) ani widu, ani słychu :-P


    Dokładnie, a ja już w innym podobnym twoim temacie podpowiadałem ci , że robisz niestety kardynalne błędy podczas konfiguracji Timer1. Bo w książce miałeś timer0 i było tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Więc gdybyś przeniósł to na Timer2 - to byłoby mniej boleśnie a tak? ;) widać , że jeszcze nadal niestety po omacku konfigurujesz timer.

    I dokładnie w tamtym temacie miałeś właśnie taki problem, ze włączałeś przerwanie OCIE1B natomiast procedurę obsługi miałeś tylko dla OCIE1A. A tutaj nie wiedzieć czemu zsumowałeś to sobie ;) .... TIMSK |= (1<<OCIE1A) | (1<<OCIE1B) - jak podał zumek.

    A to powoduje resetowanie się procka i stąd taki dziwolągowaty efekt.
  • #25 9669775
    Bartek.k.k
    Poziom 21  
    zumek napisał:
    W kodzie stoi jak byk ....
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ... a funkcji ISR(TIMER1_COMPB_vect) ani widu, ani słychu :-P


    Ale słychać i widać ISR(TIMER1_COMPA_vect) :D Po prostu musiałem dopisać OCIE1B, ponieważ bez tego wyświetlacz nie odświeżał się.
  • Pomocny post
    #26 9669798
    dondu
    Moderator na urlopie...
    Bartek.k.k napisał:
    Ale słychać i widać ISR(TIMER1_COMPA_vect) :D

    Jedna literka A czy B - co za różnica :D

    Bartek.k.k napisał:
    Po prostu musiałem dopisać OCIE1B, ponieważ bez tego wyświetlacz nie odświeżał się.

    Musiałem walnąć siekierą po masce samochodu, bo nie chciał jechać.
  • #27 9669803
    Bartek.k.k
    Poziom 21  
    dondu napisał:
    Bartek.k.k napisał:
    Ale słychać i widać ISR(TIMER1_COMPA_vect) :D

    Jedna literka A czy B - co za różnica :D

    Bartek.k.k napisał:
    Po prostu musiałem dopisać OCIE1B, ponieważ bez tego wyświetlacz nie odświeżał się.

    Musiałem walnąć siekierą po masce samochodu bo nie chciał jechać.


    Wychodzi na to, że nadaje się jedynie do tarcia chrzanu, a nie programowania :D Teraz wymiękłem, myślałem, że dobrze mniej więcej kod napisałem, a tu w całości jest błędny :-<
  • #29 9669841
    Bartek.k.k
    Poziom 21  
    Brak wiedzy motywuje do zdobycia tej wiedzy, gotowca nie chcę, więc idę dalej główkować jak to rozwiązać. Pozdrawiam gorąco. Bartek !
  • #30 9680394
    Bartek.k.k
    Poziom 21  
    Gdyby ktoś miał problemy z migającym lcd jak na moim filmiku, jest na to jedna rada, przeglądnijcie jeszcze raz dobrze datasheet i ustawcie odpowiednio timer :-> Wszystko działa jak należy. Pozdrawiam Bartekk.


    PS Dziękuje moderatorowi zumek za odblokowanie tematu.
REKLAMA