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][Bascom]Migotanie wyświetlacza przy zapisie do eeprom

morswin89 26 Paź 2011 22:20 1926 11
REKLAMA
  • #1 10069686
    morswin89
    Poziom 23  
    Witam

    Program to termostat który wyświetla dane na wyświetlaczach 7 segmentowych LED i problem polega na tym, że wyświetlacze zaczynają migotać gdy dołożę zapis ustawianej zmiennej do eeprom.

    Pętla główna

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Zmienna która chcę zapisać jest typu integer a wyświetlacze są odświeżane co 4ms
  • REKLAMA
  • #2 10070423
    Mundi1970
    Poziom 24  
    Małe pytanko a obsługa wyświetlania multipleksowanego jest wykonana w przerwaniu czy w pętli programu po ustawianiu zmiennej F4ms?

    EDIT:

    Nie rozumiem, zapis do eepromu wykonuje się 20 razy (zmienna Autoret = 20)
  • #3 10070428
    kaczart
    Poziom 14  
    obsługa wyświetlaczy powinna być zrobiona w przerwaniach, a zapis do eeprom w pętli głównej programu

    przed samym zapisem do eeprom trzeba wyłączyć przerwania, a po zapisie włączyć

    sprawdź ile w atmega8 trwa cały cykl zapisu do eeprom, z tego co pamiętam jakoś strasznie długo (około 3ms, ale mogę źle pamiętać) ale i tak przy odpowiednim ustawieniu powinieneś się zmieścić z obsługą wyświetlaczy co 4ms

    Poza tym na pewno nie zapisujesz cały czas do eepromu tylko raz na bardzo długi czas.. jeżeli jest inaczej to szybko "wyeksploatujesz" takiego eeproma (ma ograniczoną ilość zapisów)
  • #4 10071077
    morswin89
    Poziom 23  
    W przerwaniu odmierzam tylko czas i ustawiam odpowiednie flagi. A wywołanie podprogramu wyświetlania następuje z pętli głównej z podaniem odpowiedniej wartości. Już chyba znalazłem błąd zapis nie jest wykonywany 20 razy tylko za każdym razem po wystąpienie flagi F100ms jest sprawdzany warunek

    Kod: text
    Zaloguj się, aby zobaczyć kod


    czyli co 100ms
  • REKLAMA
  • REKLAMA
  • #6 10077410
    Mundi1970
    Poziom 24  
    Po pierwsze :) , tak jak kolega już mówił: "obsługa wyświetlaczy powinna być zrobiona w przerwaniach". Po drugie, jak na mój gust ;) funkcja Writeeeprom w Bascomie jest lekko skopana. Funkcja zbyt wcześnie wyłącza przerwania np. przy takim kodzie:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Pierwszy zapis do eepromu wygląda tak:
    - wyłączenie przerwania
    - sprawdzenie czy aktualnie nie jest wykonywany zapis do eeprom, jeżeli zapis jest wykonywany oczekuje na zakończenie zapisu
    - wypełnianie odpowiednich rejestrów i uruchomienie zapisu
    - włączenie przerwań, koniec pierwszego zapisu

    drugi zapis:
    - wyłączenie przerwania
    - sprawdzenie czy aktualnie nie jest wykonywany zapis do eeprom, jeżeli zapis jest wykonywany oczekuje na zakończenie zapisu
    - ...............

    W tym wypadku czas oczekiwania na zakończenie zapisu dla Atmegi 8 wynosi 8.5ms, w tym czasie nie jest wykonywane żadne przerwanie. A wystarczyło by wyłączyć przerwanie po sprawdzaniu, i już sprawniej by to działało :).
  • #7 10077618
    morswin89
    Poziom 23  
    Tak wygląda obecnie cały kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    wszytko działa jak należy oprócz tego zapisu. Zapisywać chcę tylko jedną zmienną Tu tylko wtedy gdy zostanie zmodyfikowana. Byłbym wdzięczny za pomoc co i jak mam zmienić.
  • REKLAMA
  • #8 10078557
    Mundi1970
    Poziom 24  
    Zobacz czy tak ci będzie działać, część podprogramu Wyswietl_zmierz przeniesiona do przerwania. Wywołanie Temp zmieniono, żeby nie wykonywało się w przerwaniu. Wykonuje się teraz co 100ms, można by to gdzieś indziej umieścić.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #10 10078760
    Mundi1970
    Poziom 24  
    Zrób mały test, interesuje mnie teraz tylko czy procedura wyświetlania działa poprwanie. W starej i nowej wersji przed Loop dopisz np. Waitms 15. W starszej wersji wyświetlanie powinno migotać w nowej, już nie.
  • #12 10081366
    morswin89
    Poziom 23  
    A teraz pytanie z trochę innej beczki. Chcę żeby przy pierwszym uruchomieniu zmienna Tu przyjęła jakąś domyślną wartość a przy następnym odczytała już ją z eepromu, napisałem coś takiego ale niestety przy pierwszym uruchomieniu Tu=0 przy następnych już odczytuje poprawnie to co zapisało w eeprom.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Fragment ten znajduje się przed główną pętlą.
REKLAMA