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

3 diody - 2 przyciski - gdzie jest błąd

IMEX 22 Cze 2009 21:55 1623 6
REKLAMA
  • #1 6690421
    IMEX
    Poziom 20  
    Czy moge prosić o pomoc - gotowca

    Spedzilem przed baskomem kilka dni w praktyce niedaje sobie rady w przelanczaniu funkcji

    a konkretnie chodzi o to

    oczywiscie chodzi o sterowanie diodami port D a 2 przyciski port C 0 i 1


    $regfile "m8def.dat"
    
    $crystal = 1000000
    
    Dim A As Byte
    
    Config Pind.0 = Output
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Set Pind.0
    Set Pind.2
    Set Pind.3
    
    
    Do
    'w góre
    If Pinc.0 = 0 Then
    If A <> 4 Then
    Incr A
    Waitms 100
    End If
    
    End If
    
    'w dół
    If Pinc.1 = 0 Then
    If A <> 0 Then
    Decr A
    Waitms 100
    End If
    
    End If
    
    Gosub Menu
    
    Loop
    
    Menu:
    
    Cls
    
    If A = 1 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 50
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 200
    End If
    
    If A = 2 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 200
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 200
    End If
    
    If A = 3 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 500
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 500
    
    End If
    
    If A = 4 Then
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 1000
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 1000
    
    End If
    
    Return


    powinno dzialac na 100% ale nie dziala
  • REKLAMA
  • #2 6690600
    ZbeeGin
    Poziom 39  
    Kto podciągnie PINC.0 i PINC.1? Masz rezystory z zewnątrz?
    Ponadto te sprawdzanie czy A<>4 i A<>0 jest bardzo nieeleganckie.
    Przy A=4 będziesz czekał 2 sekundy z palcem na klawiszu by zmienić sekwencję?

    Najważniejsze: Gdzie zjadłeś wcięcia?
  • REKLAMA
  • #3 6690683
    IMEX
    Poziom 20  
    podciagniecie nic niedaje - oczywiscie testowalem przed napisaniem postu



    jest dlatego ze to jest zakres w którym miesci sie wybrany program - w tym przypadku jest ich 4 ale to może sie zmienić
  • #4 6692650
    IMEX
    Poziom 20  
    Przeanalizowalem jak tylko sie dalo i niedziala do końca

    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Portc.5 = Input
    Set Portc.5
    
    Config Portd = Output
    Set Portd
    
       Dim Tryb As Byte
    
    Do
    
    While Portc.5 = 1
    Waitms 100
    Incr Tryb
    Wend
    
    
    Select Case Tryb:
       Case 0:
       Portd.0 = 0
       Portd.2 = 1
       Waitms 1000
       Portd.0 = 1
       Portd.2 = 0
       Waitms 1000
       Portd.0 = 0
       Portd.2 = 0
       Waitms 1000
                                                     '
       Case 1:
       Portd.0 = 1
       Portd.2 = 1
       Waitms 100
       Portd.0 = 0
       Portd.2 = 0
       Waitms 100
    
       Case 2:
       Portd.0 = 0
       Portd.2 = 0
    
    
        Case 3:
        Portd.0 = 1
        Portd.2 = 1
    
       Case Else:
       Tryb = 0
    
    End Select
    Loop
    
    End


    Wiec tak
    Ogólnie program na procku się uruchamia - dziala trym Case=0 poprostu diody migaja w sposoz zaprogramowany

    nie reaguje na przycisk Portc.5 - to jest pin 28 ukladu

    jezeli zrezygnuje z program przestaje dzialac po zaprogramowaniu a na przycisk brak reakcji

    Przepraszam ale HEY ci co pisze ze kodu za kogos nie napiszą - mysle ze wszyscy maja testowe - prosze o podlaczenie i odpalenie

    Dodam tylko ze na symulatorce dziala poprawnie

    Przycisk mam sprawny i poprawnie podpiety

    jestem przy kompie do 18 - piszcie a ja to od reki sprawdze OKI

    Dodam jeszcze tylko że sprawdzalem - połaczenie z masa i +5V -

    Dodano po 1 [godziny] 37 [minuty]:

    Sprawe rozwiazalem TAK
    $regfile = "m8def.dat"                                      'najpierw określamy typ proca
    $crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował
    
    Config Portc = Input                                        'port c  jako wejścia
           Portc = &B11111111
    Config Portd = Output                                       'pprt d jako wyjścia
           Portd = &B11111111
    
    
           Dim Tryb As Byte
    
    Do
    
    While Pinc.5 = 0                                            'od case0 do konca i dalej od poczatku
    Waitms 200
    Incr Tryb
    Wend
    
    
    While Pinc.4 = 0                                            'od koncz wroc do poczatku case0 i zatrzymaj
    Waitms 200
    Decr Tryb
    Wend
    
    
    Select Case Tryb:
    
       Case 0:
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 200
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 50
    
    
                                                     '
       Case 1:
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 1
    Waitms 200
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 0
    Waitms 200
    
    
       Case 2:
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 0
    Waitms 500
    Portd.0 = 0
    Portd.2 = 1
    Portd.3 = 0
    Waitms 500
    
    
       Case 3:
    Portd.0 = 1
    Portd.2 = 1
    Portd.3 = 1
    Waitms 1000
    Portd.0 = 0
    Portd.2 = 0
    Portd.3 = 0
    Waitms 1000
    
    
       Case Else:
       Tryb = 0
    
    End Select
    loop
    end


    Naszczęście działa

    jest jednak mały problem

    zeby przycisk zadzialał trzeba czekac na zakończenie operacji zawartej w CASE

    Jak to ominąć - tak żeby przycisk dzialał wciskam case wciskam case2 sie wlancza itd. tak żeby nieczekac
  • REKLAMA
  • #5 6704016
    jacek13
    Poziom 15  
    Witam
    Użycie funkcji "waitms" zawsze spowoduje, że program zostaje zatrzymany na ten czas i nic innego nie realizuje - tak działa ta funkcja.
    Należy unikać tej funkcji i jej podobnych (wait; waitus).
    Zamiast tej funkcji należy użyć odliczania czasu przez "Timer".
  • REKLAMA
  • #7 6715091
    sp3ots
    Poziom 38  
    Witam !
    Jeśli dałeś komendę: Waitms 1000
    to nie dziw się że program nie reaguje.
    Zmień to i zamiast czekaj 1000ms daj np. tak
    
    dim temp as byte
    for temp = 0 to 100 
    waitms 10
    ' tutaj napisz np. if klawysz =0 then .....
    next  
    

    W ten sposób 1000ms rozbijesz na 100x10ms
    Pozdrawiam. Stefan
REKLAMA