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

[Atemga16/32][Bascom] Obsługa DS18B20 w przerwaniu

morswin89 20 Mar 2011 21:46 2301 9
REKLAMA
  • #1 9301559
    morswin89
    Poziom 23  
    Posty: 834
    Pomógł: 23
    Ocena: 190
    Witam

    Tak wygląda mój kod;

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jeżeli z przerwania (przerwanie co 1 sekundę) wyrzucę odczyt temp. wszystko działa dobrze ale jeżeli jest tam odczyt temp. to po włączeniu po chwili układ sam wchodzi do menu a gdy z niego wyjdę wywala się zegarek a temp. czasami dziwnie się zachowuje i pokazuje np. -0.1. Nie wiem już w czym może być problem jeżeli podprogramów do odczytu temp. użyje na początku programu pokazuje się wszystko dobrze.
  • REKLAMA
  • #2 9301937
    xury
    Specjalista automatyka domowa
    Posty: 7085
    Pomógł: 878
    Ocena: 1498
    Dużo skoków i dużo rzeczy w przerwaniu. Ja bym wywalił większość z przerwania. A już na pewno pozbyłbym się bezsensownych Gosub'ów
    Po co one skoro i tak podprogramy wykonywane są tylko raz na pętlę ?
    Polecenie Gosub powinno się stosować tylko wtedy kiedy pewny określony fragment kodu jest wykonywany conajmniej dwa razy na pętlę, bo w przeciwnym wypadku tylko powoduje niepotrzebne rozrastanie stosu.
    I to prawdopodobnie jest przyczyną Twoich problemów. Pomimo źle zaprojektowanego kodu zwiększenie stosu powinno pomóc.
    Druga sprawa, że polecenia formatujące i wyświetlające na LCD, a z zwłaszcza w Bascomie trwają zbyt długo. Na tę chwilę ujdzie, bo przerwanie masz co sekundę, ale to kiedyś na tobie się zemści.
  • #3 9302415
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Jaki zysk z tego ze cały odczyt w przerwaniu?
    W/g mnie żaden.
    I do tego przerwanie co 1 sek? dla mnie bzdura.
    Niech sobie przerwanie bedzie co sek ale w przerwaniu zrobic tylko inkrementacje dowolnej zmiennej.
    Reszte przepisac do głownego i sprawdzac czy ta zmienna sie zmieniła a w przypadku zmiany wykonać odpowiedni odczyt w zaleznosci od warosci tej zmiennej.
    Jaki zysk z takiego rozwiazania? Obsługa przerwania króciutka i inne takie ale juz późno wiec dobranoc.
  • REKLAMA
  • #4 9303435
    morswin89
    Poziom 23  
    Posty: 834
    Pomógł: 23
    Ocena: 190
    Nie mogę odczytywać temp. w pętli głównej bo co będzie jak wejdę w menu? Odczyt temp. czasu i sprawdzanie jeszcze innych zmiennych musi być wykonywane w tle niezależnie od tego czy ustawiam coś w menu czy nie. W przerwaniu dałem gosuby gdyż do tych fragmentów odwołuje się 2 razy ale spróbuje przenieść je do przerwania i zobaczymy co będzie.

    Edit:

    Przeniesienie obsługi temp do przerwania bez skoków nie pomogło dalej samoczynnie wchodzi do menu.
  • REKLAMA
  • #5 9303558
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Jest na to sposób podprogram odczytu umieszczasz w podprogramie odczytującej klawiature. Teraz gdzie byś nie był czy w menu czy w programie głownym czy tez gdzie indziej zawsze masz pomiar bo procesor w tym wypadku chyba jest troszkę szybszy od ciebie i zawsze czeka na twoją reakcje a nie odwrotnie, wiec moze sie zając odczytem. Z kolei odczyt nie trwa aż tak długo aby to było zauważalne jako opóźnienie naciśniecia klawisza.
  • REKLAMA
  • #7 9304245
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    To po to masz to przerwanie a w nim zmienną aby własnie nie czekać na konwersje temperatury. Rób po swojemu bo nie kumasz tego co ja do ciebie mówie a najlepiej umiesc wszystko w przerwaniu to nie bedzie sz potrzebował programu głownego - czysty zysk.;-)
  • #8 9304258
    xury
    Specjalista automatyka domowa
    Posty: 7085
    Pomógł: 878
    Ocena: 1498
    No dobra... nie chcesz to nie. W dodatku to nie jest cały kod więc nie wiadomo czy tam gdzie indziej się dzieje. Głównej porady czyli przepełnienia stosu nie bierzesz w ogóle pod uwagę ? Trudno powiedzieć coś więcej na tym fragmencie kodu.
  • #9 9305291
    morswin89
    Poziom 23  
    Posty: 834
    Pomógł: 23
    Ocena: 190
    Przecież napisałem ze wywaliłem te gosuby z przerwania i kompletnie nic się nie zmieniło. W reszcie kodu jest menu i podmena oraz ustawianie w nich jakiś zmiennych. Dopiero się uczę programowania więc proszę o wyrozumiałość.
  • #10 9305524
    xury
    Specjalista automatyka domowa
    Posty: 7085
    Pomógł: 878
    Ocena: 1498
    No to skoro się uczysz to ucz się od razu porządnie. W przerwaniach ustawiaj jedynie flagi, a działania przeprowadzaj w pętli głównej.
    Poczytaj też o stosach $hwstack, itp.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem obsługi czujnika temperatury DS18B20 w przerwaniu w kodzie napisanym w Bascom. Użytkownik zwrócił uwagę na złożoność kodu, w tym nadmiarowe wywołania podprogramów (Gosub) w przerwaniu, co może prowadzić do przepełnienia stosu. Uczestnicy sugerowali uproszczenie kodu poprzez ograniczenie działań w przerwaniu do ustawiania flag, a nie wykonywania pełnych operacji, co powinno być realizowane w pętli głównej. Zasugerowano również, aby odczyt temperatury był realizowany w kontekście skanowania klawiatury, co pozwoli na niezależne działanie od menu. Użytkownik próbował przenieść obsługę temperatury do przerwania, ale problemy nadal występowały, co wskazuje na potrzebę dalszej optymalizacji kodu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA