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

[ATMEGA16][Bascom]Nie działa poprawnie obsługa menu

Tomysz1 03 Gru 2009 08:40 2618 6
  • #1 7339105
    Tomysz1
    Poziom 11  
    Witam,
    Rozpocząłem pracę nad programem obsługującym sampler kruszyw i już przy obsłudze menu natknąłem się na problem.

    
    $regfile = "m16def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Ddra.2 = 0
    Ddra.3 = 0
    Ddra.4 = 0
    
    Porta.2 = 1
    Porta.3 = 1
    Porta.4 = 1
    Declare Sub Inicjacja_menu
    Declare Sub Menu_czas_cyklu
    Declare Sub Mccp2
    Declare Sub Czas_cyklu_up
    Declare Sub Czas_cyklu_down
    Declare Sub Leave_menu_poziom2
    Declare Sub Menu_ilosc_probek
    Declare Sub Menu_czas_pobierania_probki
    Declare Sub Menu_powrot
    Declare Sub Menu_up
    Declare Sub Menu_down
    Declare Sub Leave_menu
    
    Dim Czas_cyklu As Byte
    Dim Zmiana As Bit
    Dim Zmiana2 As Bit
    Dim Menu As Byte
    Config Debounce = 50
    Czas_cyklu = 60
    Zmiana = 0
    Zmiana2 = 0
    
    Do
    Cls
    Debounce Pina.2 , 0 , Inicjacja_menu
    Loop
    End
    
    Inicjacja_menu:
    Menu = 1
    Do
     Select Case Menu
     Case 1 : Gosub Menu_czas_cyklu
     Case 2 : Gosub Menu_ilosc_probek
     Case 3 : Gosub Menu_czas_pobierania_probki
     Case 4 : Gosub Menu_powrot
     Case 5 : Return
     End Select
    Loop
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Menu_czas_cyklu:
    Zmiana = 0
    Cls
    Cursor Off
    Lcd "czas cyklu" ; " " ; Czas_cyklu
    Waitms 500
    Do
    Debounce Pina.3 , 0 , Menu_up
    Debounce Pina.4 , 0 , Menu_down
    Debounce Pina.2 , 0 , Mccp2
    If Zmiana = 1 Then
    Return
    Else
    Loop
    End If
    
    Mccp2:
    Zmiana2 = 0
    Do
    If Zmiana2 = 1 Then
    Zmiana = 1
    Return
    Else
    Cls
    Lcd Czas_cyklu
    Waitms 500
    Debounce Pina.3 , 0 , Czas_cyklu_up
    Debounce Pina.4 , 0 , Czas_cyklu_down
    Debounce Pina.2 , 0 , Leave_menu_poziom2
    End If
    Loop
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Menu_ilosc_probek:
    Zmiana = 0
    Cls
    Cursor Off
    Lcd "ilosc probek"
    Waitms 500
    Do
    Debounce Pina.3 , 0 , Menu_up
    Debounce Pina.4 , 0 , Menu_down
    If Zmiana = 1 Then
    Return
    Else
    Loop
    End If
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Menu_czas_pobierania_probki:
    Zmiana = 0
    Cls
    Cursor Off
    Lcd "czas pobierania probek"
    Waitms 500
    Do
    Debounce Pina.3 , 0 , Menu_up
    Debounce Pina.4 , 0 , Menu_down
    If Zmiana = 1 Then
    Return
    Else
    Loop
    End If
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    
    Menu_powrot:
    Zmiana = 0
    Cls
    Cursor Off
    Lcd "powrot"
    Waitms 500
    Do
    Debounce Pina.3 , 0 , Menu_up
    Debounce Pina.4 , 0 , Menu_down
    Debounce Pina.2 , 0 , Leave_menu
    If Zmiana = 1 Then
    Return
    Else
    Loop
    End If
    
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    Menu_up:
    Zmiana = 1
    Incr Menu
    If Menu = 5 Then
    Menu = 1
    End If
    Return
    
    Menu_down:
    Zmiana = 1
    Decr Menu
    If Menu = 0 Then
    Menu = 4
    End If
    Return
    
    Leave_menu:
    Menu = 5
    Zmiana = 1
    Return
    
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    Czas_cyklu_up:
    Do
    Czas_cyklu = Czas_cyklu + 1
    If Czas_cyklu = 120 Then
    Czas_cyklu = 1
    End If
    Return
    Loop
    
    
    Czas_cyklu_down:
    Do
    Czas_cyklu = Czas_cyklu - 1
    If Czas_cyklu = 0 Then
    Czas_cyklu = 120
    End If
    Return
    Loop
    
    Leave_menu_poziom2:
    Zmiana2 = 1
    Return
    


    Chodzi o obsługę podprogramu "Mccp2", a mianowicie po podaniu na PINA.3 i PINA.4 przechodzi do podprogramów "Czas_cyklu_up" i "Czas_cyklu_down" jednak po dodaniu lub odjęciu zmiennej "czas_cyklu" nie wraca do "Mccp2" lecz do podprogramu "Menu_ilosc_probek"... Próbowałem modyfikować kod na przeróżne sposoby nawet bez poleceń return, a program i tak wychodzi z obsługi podprogramu...
    Wydaje mi się, że jest to jakiś błąd kompilatora, lecz prosiłbym Szanownych Kolegów o rzucenie fachowym okiem na załączony kod... może coś przeoczyłem.
    Pozdrawiam
  • #2 7339291
    mirekk36
    Poziom 42  
    Sorry ale ja na miejscu procesora to bym zwariował jakbym zobaczył że mam takie polecenia do wykonania:

    Do 
    Czas_cyklu = Czas_cyklu + 1 
    If Czas_cyklu = 120 Then 
    Czas_cyklu = 1 
    End If 
    Return 
    Loop 
    


    to są fragmenty końcówek kilku twoich pod-procedur do których skaczesz za pomocą Gosub. A wewnątrz nich mieszasz tak strasznie albo nawet doprowadzasz do sytuacji, że nigdy nie pojawi się powrót z procedury tylko od razu przejście do następnej albo jakieś inne dziwne zapętlenia.

    Oj tak napisany program nigdy dobrze ci nie zadziała. Poczytaj dokładnie jak pisze się procedury - zastosuj lepiej funkcje, procedury, które sobie uprzednio jasno zadeklarujesz itp

    I nie wiem gdzie się nauczyłeś takich mieszanek wybuchowych jak np tu:

    Czas_cyklu_down: 
    Do 
    Czas_cyklu = Czas_cyklu - 1 
    If Czas_cyklu = 0 Then 
    Czas_cyklu = 120 
    End If 
    Return 
    Loop 
    
    Leave_menu_poziom2: 
    Zmiana2 = 1 
    Return 


    co to ma w ogóle być to

    Return
    Loop

    Label jakiejś kolejnej procedury


    nawet ciężko ocenić na podstawie takiego kodu jaki miałeś w ogóle zamiar - pokręcone z poplątanym. Postaraj się sam krok po kroku to przeanalizować a zobaczysz że sam też znajdziesz dużo błędów w takim kodzie.
  • #3 7339421
    Tomysz1
    Poziom 11  
    Bez pętli do loop w podprogramie działanie jest dokładnie takie samo. Generalenie oprocz tego jednego fragmentu o którym wspomniałem wszystko działa bezbłędnie. Wcale nie twierdze, że kod jest bezbłędny i optymalny (nie jestem biegły w programowaniu) lecz wydaje mi się, że nie pętla jest powodem błędnego działania. Niektóre dziwne komendy były dopisywane w akcie desperacji wiec proszę o wyrozumiałość ;)
  • #4 7339693
    mirekk36
    Poziom 42  
    Tomysz1 napisał:
    Niektóre dziwne komendy były dopisywane w akcie desperacji wiec proszę o wyrozumiałość ;)


    Dlatego zwróciłem ci uwagę jakim elementom swojego kodu musisz poświęcić wiele więcej uwagi. Ciężko tak wprost podpowiedzieć tu dlaczego coś nie działa - bo kod jest generalnie źle napisany.... ale to zrozumiałe skoro dopiero zaczynasz. Więc spróbuj zaobserwować jakieś inne kody tego typu, najlepiej przykłady z książek, poćwiczyć je, zrozumieć do końca jakie są podstawowe i dobre praktyki pisania programów - to na pewno ci pomoże
  • #5 7340820
    xury
    Specjalista automatyka domowa
    No właśnie te fragmenty:
    Return
    Loop
    Pozostawienie czegoś takiego robi syf na stosach.
    Tak być nie może. Należy zadbać o to by po spełnieniu jakiegoś warunku podprogram wychodził z pętli , a następnie opuszczał podprogram:
    Coś w tym stylu:
    Do
    ...
    If zmienna = 1 then Exit Do
    Loop
    Return

    lub
    Do
    ....
    Loop Until zmienna = 0
    Return
    



    A już na pewno nigdy coś takiego:
    
    Do
    ...
    If warunek = 1 then gosub etykieta
    Loop
    Return
    



    No i oczywiście należy zawsze pamiętać o tym by nie odkładać na stos za dużo.
  • #6 7588309
    stas11
    Poziom 13  
    Ja bym zamiast IF... then.... else użył

    WHILE warunek
    komenda
    WEND

    powinno uprościć sporo. Natomiast w Twoim programie nie ma prawa wracać do mccp2 bo siedzi gdzie indziej. Przez zakończenie RETURN z podprogramu mccp2 wychodzi wcześniej.
  • #7 7590222
    psine.pl

    Poziom 30  
    inventco.eu - poprawiłem temat, i kilka błędów w postach.
REKLAMA