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

Nie można ponownie wejść do menu programu

holgan22 16 Kwi 2011 21:36 1284 9
REKLAMA
  • #1 9408594
    holgan22
    Poziom 10  
    Witam.
    Problem, z którym męczę się już kilka godzin wygląda tak:

    Po podłączeniu zasilania układ działa poprawnie, wyświetlając temperaturę. Po wciśnięciu przycisku "menu" program przechodzi do menu i poprawnie można z niego korzystać. Wyjście z "menu" również przebiega bezproblemowo.
    Problem zaczyna się gdy drugi raz chcę wejść w owe "menu".Nie ma możliwości. Należy odłączyć zasilanie i załączyć je ponownie (brak funkcji RESET). Domyślam się tylko iż problem leży w przepełnieniu stosu lecz nie mogę sobie z tym poradzić. Czytałem o funkcji "CALL" itp. lecz w praktyce się gubię. Proszę o pomoc w sprawie możliwości ponownego wejścia do "menu" bez odłączania zasilania


    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • REKLAMA
  • #3 9409466
    holgan22
    Poziom 10  
    Jeśli chodzi o samo "End" na końcu "podprogramu" to nic to nie zmienia w działaniu całego programu. Zmieniłem strukturę programu na taką jak poniżej i dalej jest ten sam efekt.


    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #4 9409588
    bogdan_p
    Poziom 39  
    Wywal Gosub z warunków , skoro zadeklarowałeś podprogramy .
  • REKLAMA
  • #5 9409761
    holgan22
    Poziom 10  
    Faktycznie "gosub" nie jest potrzebne. Program działa i bez niego lecz ciągle tak samo. Zastanawia mnie jeszcze fakt umieszczenia etykiety zwrotnej "Odczyt".W tej konfiguracji program działa, lecz nie wchodzi po wyjściu z "menu" ponownie do niego

    Kod: text
    Zaloguj się, aby zobaczyć kod


    A w tej konfiguracji przechodzi odrazu do "menu". Można się po nim swobodnie poruszać, lecz nie można z niego wyjść

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #6 9410726
    bogdan_p
    Poziom 39  
    Zmień konfigurację przerwania na stan niski
    Kod: text
    Zaloguj się, aby zobaczyć kod

    zupełnie bez sensu jest to :
    Kod: text
    Zaloguj się, aby zobaczyć kod

    skoro "OK" > INT0 port podciągnięty to zawsze jest 1 z kolei 0 wywoła kolejne przerwanie , usuń to i sprawdź . Możesz powiedzieć co Ty chcesz ustawiać w 6 podmenu dla termometru ?
  • Pomocny post
    #7 9410793
    xury
    Specjalista automatyka domowa
    No dobra, bo będziesz się męczył, a z rok jeszcze.
    Pierwsza sprawa to ten Gosub nieszczęsny do zadeklarowanych podprogramów do których wchodzimy przez Call (lub nawet bez).
    Ale to nie to. Jak już wspomniałem programy należy pisać tak by była możliwość zakończenia jego działania. W przeciwnym wypadku nigdy nie jest zwalniany adres powrotu ze stosu. To że dopisałeś END SUB nic nie zmienia ponieważ program nie dochodzi do tego miejsca. Rozwiązanie tego problemu to całkowita rezygnacja ze skoków CALL i GOSUB na rzecz flag bitowych. Po spełnieniu warunku ustawiana jest flaga a jej sprawdzenie i reset można wykonać później lub przy następnym obiegu pętli.
  • #8 9411148
    bogdan_p
    Poziom 39  
    Teraz dopiero zauważyłem kolejne błędy :
    Kod: text
    Zaloguj się, aby zobaczyć kod

    to mają być wejścia , dalej gdzie masz ustalony stan początkowy , następna sprawa sprawdzasz stan wysoki lepiej robić to sprawdzając stan niski z podciągniętymi pinami . Ponadto zrób tak jak radzi kolega nie skacz po kilku menu aby w końcu dojść do wyjścia tylko utwórz zmienną której stan określi wybrane menu jej wartość zmieniaj swoim góra / dół a np. naciśniecie obu spowoduje wyjście z warunków a tym samym wyjście z przerwania , na koniec obsługa przerwania powinna być jak najkrótsza . Nie lepiej stworzyć podprogram nie w przerwaniu bo Twoim "OK" poza wywołaniem przerwania nic nie robisz .
  • #9 9412244
    holgan22
    Poziom 10  
    Po usunięciu wszystkich gosub z programu i zastosowaniu instrukcji IF-THEN program wyraźnie przyspieszył swe działanie. Zmieniłem również metodę wchodzenia i wychodzenia z menu. Pierwotnym założeniem było to żeby wchodzenie i wychodzenie z menu odbywało się za pomocą jednego przycisku, lecz mocno gryzło się to z zastosowanym przerwaniem INT0. Do wyjścia z menu poprostu dodałem jeszcze jeden przycisk i wszystko działa bez problemu. Dlaczego nie zrezygnowałem z INT0?? Ponieważ po wciśnięciu przycisku menu program nie czeka na przejście całej pętli sczytującej i przeliczającej temperaturę a od razu ją przerywa i przechodzi do podprogramu. Bardzo dziękuję wszystkim za pomoc i za cenne rady jakich mi udzielono.
  • #10 9420779
    SylwekK
    Poziom 32  
    Jeszcze tak słowo ode mnie... Nie czytelniej i bezpieczniej by było jak by menu pisać z wykorzystaniem instrukcji Select...Case ? Jak dla mnie ciągłe przeskoki to prośba o kłopoty.
    Pozdrawiam
REKLAMA