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.

(Bascom) - polecenie Encoder() i przerwania

LemuRR 11 01 Lis 2012 13:50 1653 5
  • #1 01 Lis 2012 13:50
    LemuRR 11
    Poziom 26  

    Witam, w moim projekcie wykorzystuje enkoder, ale żeby przejść do następnego podprogramu, potrzebuję przycisku. W tym problem, ze używam instrukcji encoder()
    Próbowałem obsługiwać przyciski w pętli w której znajduje się ta instrukcja, ale w tym problem że stopuje ona całą pętlę, aż do przekręcenia enkodera.
    Dobra, przeszedłem na timer0, ale timer0 też jest stopowany przez encoder().
    Jak radzicie, co robić?

    0 5
  • #3 01 Lis 2012 17:34
    LemuRR 11
    Poziom 26  

    Niestety nie podziałało.
    Sformuję pytanie inaczej:
    Jak wyjść z pętli do loop, w której znajduje się encoder(). ?
    dodam że pętla while wend w tym przypadku nie działa.

    Dodano po 26 [minuty]:

    Oto fragment mojego kodu:
    Program znajduje się w funkcji "ustawzwoje"
    naciskając włącznik (pinc.3) program przechodzi do "ustawobroty"
    i w tym momencie zatrzymuje się timer2, nie wiem co z tym robić

    Code:
     $regfile = "m8def.dat".
    
     $crystal = 1000000
     Config Portb.1 = Output
     Config Portb.2 = Output
     Config Portc.4 = Input
    Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare B Pwm = Clear Down
    Config Timer2 = Timer , Prescale = 256

    Start Timer2
    On Timer2 Licz
    Config Lcd = 16 * 2
     Enable Timer1
     Enable Timer2
    Enable Interrupts




      Dim Dire As Bit
     Dim A As Long
     Dim B As Byte
     Dim X As Long
     Dim C As Byte
     Dim C1 As Byte
     Dim Menu As Byte
     Dim Obroty As Byte
     Dim W As Bit
     Dim W1 As Bit
     Dim W2 As Bit
     Dim W3 As Bit
     Dim W4 As Bit
     Dim Test As Byte
    Deflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 32 , 32
    Deflcdchar 1 , 27 , 27 , 27 , 27 , 27 , 27 , 32 , 32
    Deflcdchar 2 , 8 , 12 , 14 , 15 , 14 , 12 , 8 , 32
    Deflcdchar 3 , 32 , 5 , 13 , 29 , 13 , 5 , 32 , 32
    Deflcdchar 4 , 32 , 32 , 4 , 6 , 31 , 6 , 4 , 32

    Display On
    Cls
    Cursor Off
    A = 0
     Portb.1 = 0
     Pwm1b = 0
      Gosub Ustawzwoje
    Do
    Loop

    Links:
    C = C + 1
    If C = 8 And A <= 99999 Then
    A = A + 1
    C = 0
    End If
    Cls
    Return

    Rechts:
    C1 = C1 + 1
    If C = 8 And A >= 0 Then
    A = A - 1
    C = 0
    End If
    Cls

    Return
    Lewo:

    If X > 0 And Menu = 1 Then
    X = X - 1
    Elseif Menu = 3 Then
    Dire = 1
    End If
    Cls
    Return

    Prawo:
    If X <= 99999 And Menu = 1 Then
    X = X + 1
    Elseif Menu = 3 Then
    Dire = 0
    End If
    Cls
    Return

    Licz:
    If Pinc.4 = 0 And Menu = 1 Then
    Gosub Ustawobroty
    Elseif Pinc.4 = 0 And Menu = 2 Then
    Gosub Ustawkierunek
    End If
    Return

    Ustawzwoje:
    Gosub Wyswietl
    Menu = 1
    Cls
    Locate 1 , 1
    Lcd Chr(4)
    Locate 2 , 9
    Lcd Chr(0)
    Do
    B = Encoder(pind.1 , Pind.2 , Lewo , Prawo , 1)
    Locate 1 , 1
    Lcd Chr(4)
    Locate 2 , 9
    Lcd Chr(0)
    Gosub Wyswietl
    Loop

    Return

    Ustawobroty:
    Cls
    Gosub Wyswietl
    Menu = 2

    Locate 2 , 1
    Lcd Chr(4)
    Locate 2 , 9
    Lcd Chr(0)

    Do

    B = Encoder(pind.1 , Pind.2 , Lewo , Prawo , 1)

    Obroty = B
    Locate 2 , 1
    Lcd Chr(4)
    Locate 2 , 9
    Lcd Chr(0)
    Gosub Wyswietl
    Loop

    Return

    Ustawkierunek:
    Cls
    Gosub Wyswietl
    Menu = 3

    Locate 2 , 10
    Lcd Chr(4)
    Locate 2 , 9
    Lcd Chr(0)

    Do
    B = Encoder(pind.1 , Pind.2 , Lewo , Prawo , 1)

    Locate 2 , 10
    Lcd Chr(4)
    Locate 2 , 9
    Lcd Chr(0)
    Gosub Wyswietl
    Loop
    Return


    Wyswietl:
    Locate 1 , 2
    Lcd "z=" ; X
    Locate 1 , 10
    Lcd "p=" ; A
    Locate 2 , 2
    Lcd "obr-" ; Obroty
    Locate 2 , 8
    Lcd "("
    Locate 2 , 10
    Lcd ")"
    Locate 2 , 12
    Lcd "dir-"
    If Dire = 1 Then
    Locate 2 , 16
    Lcd "L"
    Elseif Dire = 0 Then
     Locate 2 , 16
     Lcd "P"
     End If
    Return

    0
  • Pomocny post
    #4 01 Lis 2012 18:29
    ZbeeGin
    Poziom 38  

    LemuRR 11 napisał:
    Jak wyjść z pętli do loop, w której znajduje się encoder(). ?

    Funkcja ENCODER ma parametr określający czy czekać na zdarzenie, czy tylko sprawdzić i przejść dalej. Ty ustawiasz tryb "czekaj". Samo wyjście z pętli to po prostu EXIT DO.

    0
  • #5 01 Lis 2012 18:38
    1537339
    Użytkownik usunął konto  
  • #6 01 Lis 2012 18:53
    LemuRR 11
    Poziom 26  

    nowynom napisał:
    A po co zaprzęgasz Bascomowy ENCODER()

    Zobacz na ten przykład :)
    Jest to bardzo proste
    Link
    ]
    Testowałem to, ale z uwagi na to że posiadam "gówniany" enkoder mechaniczny, drgania styków, powodują że kawałek kodu z linku nie działa jak powinien.

    0