Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

morswin89 20 Mar 2011 21:46 2037 9
  • #1 20 Mar 2011 21:46
    morswin89
    Poziom 23  

    Witam

    Tak wygląda mój kod;

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Kod: vb
    Zaloguj się, aby zobaczyć kod

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

    0 9
  • CControls
  • #2 20 Mar 2011 22:40
    xury
    Poziom 39  

    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.

    0
  • CControls
  • #3 21 Mar 2011 01:08
    asembler
    Poziom 32  

    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.

    0
  • #4 21 Mar 2011 12:43
    morswin89
    Poziom 23  

    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.

    0
  • #5 21 Mar 2011 13:15
    asembler
    Poziom 32  

    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.

    0
  • #6 21 Mar 2011 15:11
    morswin89
    Poziom 23  

    Tak, ale klawiatura jest częściej skanowana i trzeba odczekać jakiś czas aby DS przekonwertował temp. a to przerwanie które używam jest od PCF8583

    0
  • #7 21 Mar 2011 16:15
    asembler
    Poziom 32  

    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.;-)

    0
  • #8 21 Mar 2011 16:20
    xury
    Poziom 39  

    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.

    0
  • #9 21 Mar 2011 19:36
    morswin89
    Poziom 23  

    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ść.

    0
  • #10 21 Mar 2011 20:07
    xury
    Poziom 39  

    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.

    0