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

[Atmega16][BASCOM] Auto powrot z menu do ekranu glownego

gray77 14 Lip 2010 21:18 1874 7
  • #1 8292715
    gray77
    Poziom 12  
    Chcialbym sie dowiedziec, jak inni radza sobie z zagadnieniem powrotu z jakiejkolwiek strony menu do ekranu glownego, gdy nie jest nacisniety zaden przycisk w ciagu powiedzmy 20sek.

    Szukam w miare najlepszego rozwiazania.

    Ja to robie tak:
    Zaprzagam timer1 do odliczania 1 sek.
    W jego przerwaniu: zmienna = zmienna + 1
    Jesli zmienna osiagnie 20 wtedy ustawiam flage wyjscia do ekranu glownego.

    Dziala to ale ma jeden minus. Przy kazdej instrukcji wciskania przycisku musze zerowac ta zmienna, co nie poprawia wygladu programu, nie daje mu optymalnosci zwazywszy, ze sprawdzanie przyciskow jest prawie wszedzie (nastawy zal/wyl 4 kanalow, ust zegara, odczyt i przewijanie nastawien, kasowanie nastawien, itp).

    Jak wy to rozwiazujecie?
    Moze jest optymalniejsza metoda na ta sprawe niz moja.

    PS. Sorki, brak polskich liter...
  • #2 8292847
    arktik1
    Poziom 27  
    Jeśli nie potrzebny ci dokładny czas powrotu to możesz zrobić tak:
    
    If Pinx.0 = 1 Then
     Incr Y
    Else
    Y = 0
    End If
    
    
    If Y = 10 Then
    Y = 0
    Return
    End If
    
  • #3 8292853
    adambehnke
    Poziom 24  
    Ja to robię dokładnie tak samo tyle że nie używam do tego celu timera. Mam w układzie PCF-a i on generuje mi przerwanie co 1 sekundę i w tym przerwaniu sobie zliczam czasy. Oczywiście po naciśnięciu klawisza zeruję zmienną czasu.

    Dodano po 1 [minuty]:

    arktik1 napisał:
    Jeśli nie potrzebny ci dokładny czas powrotu to możesz zrobić tak:
    
    If Pinx.0 = 1 Then Incr Y
    If Y = 10 Then
    Y = 0
    Return
    End If
    


    Ale po naciśnięciu klawisza i tak musisz zerować zmienna.
  • #4 8292971
    gray77
    Poziom 12  
    Owszem mam PCFa w ukladzie. Sluzy jako zegar (niedlugo bedzie podtrzymany bateryjka).

    Jesli chodzi o porade arktik1 i adambehnke to jest ok ale jeszcze wiecej IFow i instrukcji.
    Tutaj moj kawalek kodu:

    If Klaw_minus = 0 Then : Waitms 50 : If Klaw_minus = 0 Then : Autopowrot = 0 :Decr Alarm_h_on : End If : End If
    If Klaw_plus = 0 Then : Waitms 50 : If Klaw_plus = 0 Then : Autopowrot = 0 : Incr Alarm_h_on : End If : End If
    If Klaw_menu = 0 Then : Waitms 50 : If Klaw_menu = 0 Then : Autopowrot = 0  : Exit Do : End If : End If
    


    i obsluga przerwania:

    Sprawdz_klaw:
       Timer1 = 32000
       If Autopowrot = 30 Then : Esc1 = 4 : End If
       Autopowrot = Autopowrot + 1
    Return
    


    Autopowrot - zmienna zadanego czasu powrotu zwiekszana przez Timer1 a zerowana przez jakikolwiek klawisz (Autopowrot = 0)
    Esc1 - flaga ustawiajace bezwarunkowe wyjscie z menu

    Wiec generalnie zasada jest podobna.
    Chyba pozostane przy swoim sposobie. Nie grzeszy on optymalnoscia ale za to dziala :)
    No i mam w miare jednakowy czas powrotu - rowne 30sek od momentu nieuzywania klawiaturki.
  • #5 8293273
    rpal
    Poziom 27  
    Niedawno był tu temat o menu i sposobie jego rozwiązania. Jeśli kolega chce usłyszeć mojej rady to osoboście zrobiłem to używając przerwania timera, obojetnie jakiego. Po odliczeniu określonej wartości czasu (jaki to twoj już wybór) przerwanie to w przypadku bezczynności klawiszy wpisuje do bufora klawiatury znak odpowiadający powrotowi z menu czyli de facto symuluje naciśniecie klawisza, umownie go nazwę Esc. Reszta robi się sama bo jak się domyślam obsługa menu przewiduje wyjście z niego na skutek naciśnięcia jakiego klawisza, W samej obsłudze klawiatury należy zadbać aby kasować flagę albo licznik który będzie odpowiedzialny za odliczenie ustalonego czasu bezczynności klawiatury.
  • #6 8293341
    gray77
    Poziom 12  
    No wlasnie. czyli tak jak robie to ja.
    Timer generuje przerwanie co 1s. Zwieksza zmienna o 1. Wcisniecie jakiekolwiek klawisza jest rowniez sygnalem do wyzerowania tej zmiennej i cykl sie powtarza az do momentu, gdy zmienna osiagnie zadana wartosc. Oczywiscie reczne wychodzenie z menu jest tylko i wylacznie uwarunkowane klawiszem ESC. Ta zmiena symuluje jego wcisniecie (ustawiona flaga pomocnicza).
    Resetowanie zmiennej niestety musze powtarzac przy kazdej instrukcji sprawdzania wcisniecia jakiegokolwiek klawisza, co dodaje do programu dodatkowe bajty.

    Ale widze na oko, ze zastosowalem schemat, ktory jest bardzo podobny do innych rozwiazan. Pozostaje przy nim.

    Dziekuje za szybkie odpowiedzi.
  • #7 8293376
    rpal
    Poziom 27  
    Nie bądź taki skąpy w tej ilości bajtów :) jak dobrze pokombinujesz np definiując flagę w jakimś rejestrze to jej skasowanie zajmnie jedną instrukcję asemblera a jeśli jest w pamięci to ze dwie.
  • #8 8293609
    gray77
    Poziom 12  
    He, he, o asemblerze to ja moge tylko pomarzyc. Kiedys myslalem o nim ale nic kompletnie nie moglem zaskoczyc.
    Basic lyknalem kilkadziesiat lat temu na 8-bitowych komputerach (ZX spectrum, C64, Atari), by po przerwie wrocic do niego pod postacia BASCOMA.
    Jak umiem, tak programuje.

    Jesli ktos bedzie zainteresowany (a zwlaszcza jakis akwarysta bo pod tym katem jest pisany program, choc po niewielkich modyfikacjach mozna go zaadoptowac do czegokolwiek) to wrzuce tu moje wypocinki.
    PCB jeszcze nie mam. Caly czas pisze i testuje na plytce stykowej.
REKLAMA