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

Stan nieustalony ? - Bascom

mariansq 10 Kwi 2011 13:48 867 4
  • #1 10 Kwi 2011 13:48
    mariansq
    Poziom 15  

    Witam

    W petli Do-Loop programu głównego mam warunek sprawdzajacy wcisniecie klawisza i jednoczesnie inna zmienna np

    Code:


    menu=0

    Do


     if przycisk.0 =0 and menu=0 then
    lcd " np napis"
    end if

    kod

    Loop


    Po uruchomienu urzadzenia program wykonuje mi ten warunek z przykładu powyżej choć nie powinien bo przycisk nie jest wcisniety i sprawdzałem przed tym warunkiem przycisk ma wartosc=1, wiec nie powinien wykonać sie IF.
    Co ciekawe jeśli przed petla programu głównego dam Wait 1


    Code:

    menu=0
    Wait 1

    Do


     if przycisk.0 =0 and menu=0 then
    lcd " np napis"
    end if

    kod

    Loop

    Wszystko jest poprawnie- wyglada to tak jakby jakis stan nieustalny gdzieś się wkradł i proc myśli, ze przycisk wcisniety.
    Obsługa przycisków na Timer0 - działa bez problemów.
    Zauważyłem tylko taką nieprawidłowość, że pomimo ustalenia na początku programu wartości dla zmiennych bez opóznienia przed DO Loop program ustawia po swojemu - potem już też działa poprawnie tylko ten moment początkowy. Nie wiem z czego to wynika.

    0 4
  • #2 10 Kwi 2011 15:43
    mirekk36
    Poziom 42  

    A masz podciągnięte wejście przycisku do VCC albo programowo albo zewnętrznie sprzętowo w ogóle ?

    0
  • #3 10 Kwi 2011 19:06
    arktik1
    Poziom 27  

    Miałem taką sytuacje z M8, gdy nie zgadzały się prędkości Uc z programem.
    Źle ustawiłem "$crystal".

    0
  • #4 10 Kwi 2011 20:23
    M. S.
    Poziom 34  

    Moim zdaniem pin nie podciągnięty. W momencie włączania mamy stany nieustalone na zasilaniu, które mogą się przenosić na wejście uC. Musimy pamiętać, że dla prądów zmiennych ścieżki PCB to pojemności, indukcyjności, anteny i Bóg wie co jeszcze.

    0
  • #5 11 Kwi 2011 08:18
    mariansq
    Poziom 15  

    Witam

    Elektrycznie jak najbardziej poprawnie - wszystko podciągnięte.
    Zegar wewnętrzny 8 Mhz

    Zmieniłem koncepcje programu i juz nie obserwuje zjawiska.
    poprzednio miałem 3 instrukcje wyboru select case

    Code:

    select case zmienna1
    case 1:
    .
    end select

    select case zmienna2
    case 1:
    .
    end select

    select case zmienna3
    case 1:
    .
    end select


    W zależności od tego czy przycisk był naciśnięty i czy zmienna1 była=1 były ustawiane wartości zmiena1 do zmiena3 co powodowało przełączenie działania na odpowiedni case. Czyli case'y w moim przypadku były taką struktura drzewa programowego - jak foldery w komputerze po których można było sie poruszać i wchodzić w głąb i z powrotem. I tu pojawił sie problem z warunkami początkowymi bo od razu wchodził mi na najniższy poziom programu - drzewka czyli do case zmienna 3,(potem program działał już ok) wykonując instrukcje if której nie powinien wykonać bo przycisk nie był wciśnięty, pomimo że warunki początkowe były ustawione na sztywno czyli
    Code:

    Zmienna1=1
    Zmienna2=0
    Zmienna3=0

    trochę to dziwne było ale wystarczyło dać minimalne opóźnienie Waitms przed pętla programu głównego Do Loop w którym były case'y i warunek początkowy był prawidłowy - i to mnie zaciekawiło dlaczego tak sie dzieje.
    Sprawdzałem kod czy coś po drodze nie zmienia mi ustawień Zmienna1 itd ale aż do momentu wystąpienia warunki IF z przyciskiem wartości były ok - chyba że coś tak szybko sie zmieniło że zdążyło przełączyć, a potem ustawiło poprawnie taka, że ja nie zauważyłem:-)

    W końcu zmieniłem podejście i zrobiłem jednego case'a i na nim drzewo przełączając tylko sie pomiędzy wartościami dziesiątek i działa.

    Ale sam fakt , że bez względu na to jakie nawet mam warunki początkowe przycisk nie był wciśnięty, a instrukcja sie wykonała - to juz dla mnie zagadka:)

    Przyciski nie wciśnięte maja stan-1 wiec wszystko ok.
    na pierwszym wejściu do pętli Do Loop tym bardziej przyciski maja wartości 1

    Ale fakt faktem, ze problem pojawił sie przy przełączaniu sie miedzy różnymi case'mi wiec może cos skopałem ale to nie tłumaczy wykonania sie if'a sprawdzającego wciśniecie klawisza.

    Jak pisałem wyżej klawisze mam zrobione na timer0 - czytam cały port co 26ms
    ze sprawdzaniem czy był wciśnięty na pewno:-) i wystawia wynik - działa to bez problemów,
    pod zmiennymi
    przycisk.0 do przycisk.3 mam wartość przycisku wciśniętego w danej chwili (trzymam to zero puszcze to jeden),
    a pod flaga1 do flaga4 mam odnotowane wciśniecie przycisku (zapamiętane wciśniecie , które trzeba anulować w programie)
    czyli dwie opcje do wyboru w zależności czego trzeba.

    W opisanym przykładzie używałem wartości chwilowych

    0