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

Użycie przerwania do wyjścia z pętli FOR... w BASCOM

xixin 25 Sie 2010 18:39 1479 2
REKLAMA
  • #1 8437605
    xixin
    Poziom 14  
    Witam
    Właśnie piszę program do sterowania diodami na dyskotekę tzn. wąż świetlny.
    Projekt jeszcze nie jest skończony ale niby działa i niestety pojawił się problem.

    Przycisk Sv1 Alias Pind.3 służy jak na razie do wyboru programu (zwiększa o jeden) Na razie jest 6 programów.

    Owy przycisk działa na zasadzie przerwania od przepełnienia timer0, które to wywołuje pod program "Corobic"

    Problem polega na tym, że po przyciśnięciu przycisku Sv1 nie włącza się od razu kolejny program tylko dopiero wtedy gdy zostanie zakończona instrukcja FOR w danym programie.
    Czy istnieje możliwość natychmiastowego zaprzestania pętli FOR..?


    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Input
    Config Pinb.7 = Input
    Config Portd = &B11000111
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
                                           'przerwanie od opadającego zbocza
    Config Timer0 = Timer , Prescale = 64
    On Timer0 Corobic
    Config Debounce = 60
    
    
    Portb = &B11111111
    Portd = &B11111111
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim Ktprog As Byte
    Dim W As Word
    
    
    
    Start Adc
    
    Enable Interrupts
    Enable Timer0
    
    Sv1 Alias Pind.3
    Sv2 Alias Pind.4
    Sv3 Alias Pind.5
    
    
    
    
    Ktprog = 1
    Do
    If Ktprog = 1 Then
    Restore Dane
    For A = 0 To 31
    Read B
    Rotate B , Right , 2
    Portb = B
    Portd = B Or &B00111111
    W = Getadc(1)
    W = W + 20
    Waitms W
    Next A
    End If
    
    
    If Ktprog = 2 Then
    Restore Dane
    For A = 0 To 31
    If A = 16 Then Restore Dane
    Read B
    Rotate B , Right , 2
    Portb = B
    Portd = B Or &B00111111
    W = Getadc(1)
    W = W + 20
    Waitms W
    Next A
    Restore Dane
    C = 15
    For A = 0 To 31
    If C = 31 Then C = 15
    C = C + 1
    B = Lookup(c , Dane)
    Rotate B , Right , 2
    Portb = B
    Portd = B Or &B00111111
    W = Getadc(1)
    W = W + 20
    Waitms W
    Next A
       End If
    
    If Ktprog = 3 Then
    Restore Dane2
    For A = 0 To 15
    Read B
    Rotate B , Right , 2
    Portb = B
    Portd = B Or &B00111111
    W = Getadc(1)
    W = W + 20
    Waitms W
    Next A
    End If
    
    If Ktprog = 4 Then
    Restore Dane3
    For A = 0 To 7
    Read B
    Rotate B , Right , 2
    Portb = B
    Portd = B Or &B00111111
    W = Getadc(1)
    W = W + 20
    Waitms W
    Next A
    
    End If
    
    If Ktprog = 5 Then
    Restore Dane4
    For A = 0 To 11
    Read B
    Rotate B , Right , 2
    Portb = B
    Portd = B Or &B00111111
    W = Getadc(1)
    W = W + 20
    Waitms W
    Next A
    
    End If
    
    If Ktprog = 6 Then
    For B = 255 To 0 Step -1
    Rotate B , Right , 2
    Portb = B
    Portd = B Or &B00111111
    W = Getadc(1)
    W = W + 20
    Waitms W
    Next A
    For B = 0 To 255
    Rotate B , Right , 2
    Portb = B
    Portd = B Or &B00111111
    W = Getadc(1)
    W = W + 20
    Waitms W
    Next A
    End If
    loop
    
    
    
    End
    
    
    Corobic:
    Debounce Sv1 , 0 , Robic , Sub
    Return
    Robic:
    Incr Ktprog
    If Ktprog = 7 Then Ktprog = 1
    
    Return
    
    ''''''''''''
    
    
    
    Dane:
    Data &B01111111 , &B00111111 , &B00011111 , &B00001111 , &B00000111 , &B00000011 , &B00000001 , &B00000000,
    Data &B10000000 , &B11000000 , &B11100000 , &B11110000 , &B11111000 , &B11111100 , &B11111110 , &B11111111,
    Data &B11111110 , &B11111100 , &B11111000 , &B11110000 , &B11100000 , &B11000000 , &B10000000 , &B00000000,
    Data &B00000001 , &B00000011 , &B00000111 , &B00001111 , &B00011111 , &B00111111 , &B01111111 , &B11111111
    
    Dane2:
    Data &B01111111 , &B00111111 , &B00011111 , &B00001111 , &B00000111 , &B00000011 , &B00000001 , &B00000000,
    Data &B00000001 , &B00000011 , &B00000111 , &B00001111 , &B00011111 , &B00111111 , &B01111111 , &B11111111
    
    Dane3:
    Data &B11100111 , &B11000011 , &B10000001 , &B00000000 , &B10000001 , &B11000011 , &B11100111 , &B11111111
    
    Dane4:
    Data &B00111111 , &B10011111 , &B11001111 , &B11100111 , &B11110011 , &B11111001 , &B11111100 , &B11111001,
    Data &B11110011 , &B11100111 , &B11001111 , &B10011111


    Do regulacji prędkości używam potencjometru i ADC
  • REKLAMA
  • Pomocny post
    #2 8437703
    aleexander
    Poziom 15  
    Witam,
    koledze pewnie chodzi o polecenie Exit For :)
    szczegóły w pomocy Bascoma'a.

    Pozdrawiam,
    aleexander
  • #3 8437790
    xixin
    Poziom 14  
    Dzięki kolego za pomoc
    zastosowałem dla każdego programu: If Ktprog <> 1 Then Exit For
    If Ktprog = 1 Then
    Restore Dane
    For A = 0 To 31
    If Ktprog <> 1 Then Exit For
    Read B
    Rotate B , Right , 2
    Portb = B
    Portd = B Or &B00111111
    W = Getadc(1)
    W = W + 20
    Waitms W
    Next A
    End If


    Działa wyśmienicie... pomógł dla Ciebie
REKLAMA