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

dziwne działanie programu

s-jacek 25 Sie 2010 20:18 1272 4
REKLAMA
  • #1 8438054
    s-jacek
    Poziom 10  
    Nie wiem czy wybrałem dobry dział na ten problem, ale zapytam.
    Ćwicząc multipleksowe sterowanie wyświetlaczem 7 segmentowym, chciałem napisać licznik wciśnięć przycisku. Oto kod:

    
    
        $regfile = "m32def.dat"
        $crystal = 16000000
    
        Config Portb = Output
        Config Porta = Output
        Config Pinc.0 = Input
        Config Timer0 = Timer , Prescale = 256
    
        Declare Sub Wys(cyfra As Byte)
        Dim Licz1 As Byte
        Dim Licz2 As Byte
        Dim Wart As Byte
        Dim Nr_wysw As Byte
    
        On Timer0 Multi
    
        Enable Interrupts
        Enable Timer0
    
        Load Timer0 , 125
    
    
        Do
        Waitms 50
    
        If Pinc.0 = 0 Then
        Licz1 = Licz1 + 1
        If Licz1 > 9 Then
        Licz1 = 0
        Licz2 = Licz2 + 1
        If Licz2 > 9 Then
        Licz1 = 0
        Licz2 = 0
        End If
        End If
        End If
    
    
        Loop
        End
    
        Sub Wys(cyfra As Byte)
        Porta = Lookup(cyfra , Kody7seg)
        End Sub
    
    
        Multi:
    
        Load Timer0 , 150
        Set Portb.2
        Set Portb.3
    
    
        Select Case Nr_wysw
    
        Case 0:
        Call Wys(licz1)
        Reset Portb.2
    
    
        Case 1:
        Call Wys(licz2)
        Reset Portb.3
    
    
    
        End Select
    
        Incr Nr_wysw
        If Nr_wysw = 2 Then
        Nr_wysw = 0
        End If
        Return
    
    
    
    
        Kody7seg:
        Data &B10000001 , &B11110011 , &B01001001 , &B01100001 , &B00110011 ,
        Data &B00100101 , &B00000101 , &B11110001 , &B00000001 , &B00100001
    
    


    na początku pętli do loop wstawiłem waitms 50, żeby nie dodawał przez cały czas trzymania palca na przycisku, i wyświetlacz cały czas pokazuje mi 30. Jak wstawiam wait 1 lub więcej to jest wszystko w porządku. Ma ktoś pomysł o co chodzi??
  • REKLAMA
  • Pomocny post
    #2 8439553
    kubus_puchatek
    Poziom 18  
    kolego. to jest błędne podejście. Musisz to zrobić w następujący sposób: jeśli przez np 10 pętli ciągle był wciśnięty przycisk to masz inkrementować swój licznik. i zablokować możliwość inkrementacji aż do czasu gdy przez kolejne 10 pętli przycisk będzie puszczony........
    taka funkcja nazywa się debouncer i służy do eliminacji drgań zestyków.
    a jak ją dobrze napiszesz to możesz wywalić całkiem tego delaya....
  • REKLAMA
  • #3 8441299
    s-jacek
    Poziom 10  
    dzięki za podpowiedź, natomiast nadal zastanawiam mnie skąd bierze się takie działanie tego kodu?
  • REKLAMA
  • #4 8441990
    kubus_puchatek
    Poziom 18  
    Jak zaczniesz pisać w c lub asm to pytaj ;).
    ale po pierwsze ja bym zrobił tak:

    Do
    If Pinc.0 = 0 Then
    If Licz1 < 9 Then
    Licz1 = Licz1 + 1
    If Licz1 = 10 Then
    Licz2 = Licz2 + 1
    End if
    End if
    Else
    If Licz1 > 0 Then
    Licz1 = Licz1 - 1
    End if
    End If
    Loop
    End


    może się nie walnąłem....... ale ten kod zmienia Licznik2 1 raz dopiero po osiągnięciu 10 przez licznik 1

    Kod proszę umieścić w znacznikach code!
    Robak
  • #5 8442171
    s-jacek
    Poziom 10  
    C trochę znam, ale nie programowałem w nim uC. jeśli chodzi o samą pętlę to jej działanie jest prawidłowe, bo jak ustawiem wait na 1s lub więcej to wszystko jest w porządku, liczby wyświetlają się po koleji
REKLAMA