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

[Atmega32][BASCOM]proste menu i przyciski

harti 12 Paź 2011 09:49 3933 8
  • #1 10018523
    harti
    Poziom 9  
    Witam,

    próbuję zaprogramować prosty zegarek na PCF8583 na płytce EvB i już na wstępie napotkałem na ścianę. Jestem początkujący - generalnie to pierwszy program w bascomie, który ma więcej niż kilkanaście linijek, więc liczę na Waszą wyrozumiałość i pomoc.

    Udało mi się na podstawie przykładów z tego forum i zaczerpniętych z netu, zmusić do działania PCF - nie jest to jeszcze dokładnie to co chciałbym osiągnąć, ale póki co, podstawowa funkcjonalność działa. Kolejnym krokiem było dodanie możliwości ustawiania zegara z "klawiatury" (kilka microswitchy) i tutaj właśnie odbiłem się od ściany.

    Mianowicie, układ zachowuje się całkowicie niedeterministycznie (przynajmniej takie mam wrażenie). W głównej pętli programu wyświetlam czas i oczekuję na wciśnięcie jednego z przycisków - tutaj bardzo uproszczone zachowanie bo na razie staram się rozgryźć jak do tematu podejść. W związku z tym, oczekiwane działanie poniższego kodu jest takie, że na lcd wyświetlany jest aktualny czas, jak nacisnę przycisk 1 to tryb pracy (current_mode) zmienia się na 1, wyświetlanie czasu zostaje zatrzymane, na LCD wyświetla się napis SET (tutaj w przyszłości będę próbował zaimplementować mechanizm ustawiania poszczególnych wartości czasu i daty). Z kolei po naciśnięciu drugiego przycisku, powracamy do trybu 1, znika napis SET i zegar dalej wyświetla aktualny czas (na razie nie ma funkcji zapisu bo nie było właściwego ustawiania czasu).

    Niestety zachowanie jest zupełnie dla mnie niespodziewane, mianowicie jeśli już uda mi się nacisnąć pierwszy przycisk i układ zadziała tak jak bym chciał to albo nie reaguje na naciśnięcie drugiego przycisku, albo całość działa tylko jednokrotnie, a potem nie reaguje już na nic. Najczęściej jednak od początku nie reaguje w ogóle na żaden przycisk, albo napis SET pojawia się losowo i znika zupełnie bez dotykania przycisków. Byłbym wdzięczny za pomoc - pewnie rzuci Wam się w oczy jeszcze wiele innych bzdur, które tam popełniłem, więc również proszę o ich wytknięcie i zasugerowanie poprawnego sposobu.
    Poniżej kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Próbowałem przetestować mechanizm na prostym przykładzie i tutaj działa bez zarzutów (może coś przeoczyłem). Poniższy kod, działa tak jak bym się tego spodziewał:


    Kod: text
    Zaloguj się, aby zobaczyć kod


    Bardzo proszę o pomoc.
  • #2 10018765
    korrus666
    Poziom 40  
    Czy jak wywalisz z kodu warunek:
    If Current_mode = 0 Then
          Call Gettime()
          If Sec_old <> Second Then
             Sec_old = Second
             Call Printtime()
             Call Displaytime()
          End If
       End If

    to działa prawidłowo ?
  • #3 10018806
    maximus22_kr
    Poziom 18  
    Menu dobrze jest zrobić przy użyciu Case.
    czyli jednym z przycisków wchodzi się do podprogramu Menu i tam przez Case wybiera się parametr, który chcemy zmienić. I odwołanie do programów.

    Coś w tym stylu - piszę z pamięci, więc mogę coś przekręcić:
    
    Do
    
    Debounce  0 , Menu, Sub
    
    Loop
    End
    
    Sub menu:
    Do
    
    Case 0
    Case 1
    Locate 1,1
    Lcd "Ustaw minuty"
    Gosub minuty
    
    Case 2
    Locate 1,1
    Lcd "Ustaw godziny"
    Gosub Godziny
    
    Case 3
    Locate 1,1
    Lcd "Ustaw dzień"
    Gosub Dzien
    
    Case 4
    Locate 1,1
    Lcd "Ustaw miesiac"
    Gosub miesiac
    
    Case 5
    Locate 1,1
    Lcd "Zapis"
    Gosub StoreTime()
    
    Case 6
    If klawisz = 0 Then
     Exit do
    End Sub
    


    Do tego podprogramy do ustawiania.
    Też miałem problemy z tym układem zegara i ustawianiem czasu przez menu. Odpuściłem PCF8585 na rzecz PCF8563, tam łatwiej się odczytuje dzień tygodnia i rok. A z pamięci EEPROM tego układu nie zamierzałem korzystać.
  • #4 10018817
    harti
    Poziom 9  
    Dziękuję za odpowiedź, po usunięciu warunków sprawdzających czy sekunda się zmieniła (myślałem że to dobry sposób żeby nie wysyłać na ekran/rs nie potrzebnie danych - pewnie źle myślałem) pozostał następujący kod

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Niestety to nie pomogło - teraz brak jakiejkolwiek reakcji na przyciski. Nie chcę wyrzucać całkowicie tej pętli, zostawiając samo oczekiwanie na naciśnięcie przycisków bo wtedy tracę wyświetlanie godziny :)

    jak zostawiam tylko:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    to zadziałało raz (oczywiście bez zegara - samo SET) i potem znowu to samo - brak reakcji. Będę wdzięczny za wszelką pomoc.

    Dodano po 28 [minuty]:

    Dziękuję również koledze maximus22_kr, jednak to również nie zmieniło zachowania - przetestowałem na boku używając case i nadal tak samo. Za to fajnie działa na tym prostym przykładzie testu menu - więc dziękuję za podpowiedź jak to się powinno robić (menu) :). Niemniej jednak problem pozostał - podejrzewam że coś strasznie musiałem zamieszać w tych procedurach obsługi czasu i coś się gryzie. Może ktoś wypatrzy jakąś głupotę i podpowie co z tym zrobić.
  • #5 10019312
    korrus666
    Poziom 40  
    Zrób sprawdzanie godziny na jakimś przerwaniu z timera. Uważam że niepotrzebnie robi się to cały czas w głównej pętli. Ustaw timer żeby sprawdzał czas co 0,5 sek i to na pewno wystarczy. A w pętli głównej zrób tylko obsługę menu czy co tam jeszcze będziesz robił.
  • #6 10019440
    harti
    Poziom 9  
    Niestety to nie pomogło, nie wiem czy to zrobiłem dobrze ale dodałem następujące elementy:


    Kod: text
    Zaloguj się, aby zobaczyć kod


    i dalej

    Kod: text
    Zaloguj się, aby zobaczyć kod


    w głównej pętli zostawiłem tylko:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    reszta bez zmian, niestety nadal brak jakiejkolwiek reakcji.

    Co może być źle? Pomocy!
  • #7 10019622
    korrus666
    Poziom 40  
    Widzę że na początku miałeś sprawdzenie pinb.4 i pinb.7 a teraz napisałeś pinb.5.
    Sprawdź jeszcze czy jak nic nie wciskasz to napięcie na pinb.4 i pinb.7 jest równe zasilaniu. Może zostaw tylko obsługę przycisków i dokładaj kod po kawałku i sprawdzał po czym przestanie działać. Rozumiem że odczyt godziny działa prawidłowo tylko klawisze nie przynoszą żadnego efektu. I czy czasem zegarem nie nadpisujesz sobie tego tekstu z klawiszy?
  • #8 10020716
    harti
    Poziom 9  
    Mam podpiętych kilka przycisków - stąd różnica - czasami przestawiałem raz tak, raz tak.

    Zrobiłem tak jak poradziłeś, wyszedłem od prostej obsługi przycisków (drugi przykład z pierwszego mojego postu) i po kawałku dodawałem fragmenty zegara, przy okazji wrzuciłem dwa rodzaje obsługi (przez select...case i tak jak miałem oryginalnie).

    No i ... działa. Oczywiście funkcjonalnie program na razie nic ciekawego nie robi - po prostu wyświetla czas i reaguje na przyciski (wyświetla tryb pracy) i dla trybu 3 ustawia jakiś zahardcode'owany czas (tak dla testu - żeby sprawdzić czy działa również procedura ustawiania czasu i nic nie psuje).

    Problem polega na tym, że nie potrafię odnaleźć, gdzie leżał problem. Przy okazji sprawdziłem, jak radziłeś, napięcia i rzeczywiście coś było nie tak, teraz mam tak samo jak było w oryginalnym prostym przykładzie z pierwszego postu, czyli ok 5V.
    Dodam że zasilam płytkę EvB z portu USB - może to ma jakiś wpływ. Generalnie nie wiem co było źle, więc nadal bardzo proszę o jakieś wskazówki - wziąłem się za to żeby się czegoś nauczyć, więc pozostawienie tego bez wyjaśnienia, trochę mnie słabo nastraja do przyszłych prób.

    Będę bardzo wdzięczny za rzucenie okiem na poniższy kod, może Wam wpadnie w oko coś, co mogło powodować takie a nie inne zachowanie przy poprzednich próbach.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam i proszę o dalsze wsparcie w tym temacie,
    harti
  • #9 10022201
    harti
    Poziom 9  
    Witam ponownie,

    trochę pozamiatałem i dodałem już funkcjonalność ustawiania zegara, powrzucałem wszystko w procedury itd..., jak na razie działa, co nie zmienia faktu, że nadal nie wiem co było nie tak wcześniej.

    W każdym razie prosiłbym doświadczonych kolegów o zerknięcie na poniższy kod i zasugerowanie, jak to powinno być zrobione zgodnie ze sztuką - za wszelkie sugestie i porady będę bardzo zobowiązany.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam,
    harti
REKLAMA