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

[ATMEGA8][BASCOM] Wyłączenie przerwań nie do końca działa ..

krzywy1607 06 Mar 2010 18:49 1764 7
REKLAMA
  • #1 7792511
    krzywy1607
    Poziom 10  
    Witam.
    Mam pewien problem z programem. Generalnie układ posiada 3 przyciski.
    Kontaktron - generuje przerwania (nie sugerować się nazwą, testuję to na zwykłym switchu)
    P_zeruj - Przycisk od zerowania wyniku
    P_mierz - Jeśli jest w stanie 1 to przerwania są włączone jeśli nie to wyłączone.
    I tu pojawia się problem. Jeśli P_mierz ustawię w stan 0, to przy przerwaniach licznik nie liczy (i tak ma być), ale jeśli przestanę generować przerwania i ustawię P_mierz w stan 1 (włącze przerwania) to licznik dolicza wartość jednego przerwania.
    Oto program:
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Portb = &B11111111
    Portb = &B11111111
    Config Portd = &B00000000
    Portd = &B11111111
    
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    Cls
    Cursor Off Noblink
    
    On Int0 Prz_zew0 Nosave
    Config Int0 = Falling
    Enable Int0
    
    'stale parametry
    Const L = 50                                               
    Const Szerokosc = 2.80                                          
    
    Kontaktron Alias Pind.2                                     'kontaktron, przerwania
    P_mierz Alias Pind.0                                        'właczenie mierzenia
    P_zeruj Alias Pind.1                                        'zerowanie
    
    
    Dim Licz As Long
    Dim Dystans As Single
    
    
    
    
    '***********************************************
    Lcd "Pomiar pola v.1"
    Lowerline
    Lcd "by Krzywy"
    Wait 5
    Enable Interrupts
    
    Gosub Wyswietl
    
    '***********************************************
    Do
    
          If P_mierz = 1 Then
          Enable Int0
          Else
          Disable Int0
          End If
    Loop
    
    End
    
    Wyswietl:
    
    Cls
    
      Dystans = Licz * L                                        '[cm]
      Dystans = Dystans / 100                                   '[m]
      Dystans = Dystans * Szerokosc
    
      Locate 1 , 1
      Lcd "Dl:" ; Spc(1) ; Dystans ; "[m]"
    
    Return
    
    
    Prz_zew0:
     Incr Licz                        'zwiekszenie licz
     Gosub Przyciski                                          
    Return
    
    Przyciski:
    
     If P_zeruj = 0 Then
    Licz = 0
     End If
      Gosub Wyswietl
    
    Return
    
      


    Oprócz tego mam problem z przyciskiem zerującym. Teraz jest tak zrobione, że jeśli ustawie go w stan 0 i nastąpi przerwanie to wyzeruje, ale chcę zrobic, żeby zerowało się bez przerwania. Zrobiłem coś takiego:
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Portb = &B11111111
    Portb = &B11111111
    Config Portd = &B00000000
    Portd = &B11111111
    
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    Cls
    Cursor Off Noblink
    
    On Int0 Prz_zew0 Nosave
    Config Int0 = Falling
    Enable Int0
    
    'stale parametry
    Const L = 50                                               
    Const Szerokosc = 2.80                                          
    
    Kontaktron Alias Pind.2                                     'kontaktron, przerwania
    P_mierz Alias Pind.0                                        'właczenie mierzenia
    P_zeruj Alias Pind.1                                        'zerowanie
    
    
    Dim Licz As Long
    Dim Dystans As Single
    
    
    
    
    '***********************************************
    Lcd "Pomiar pola v.1"
    Lowerline
    Lcd "by Krzywy"
    Wait 5
    Enable Interrupts
    
    Gosub Wyswietl
    
    '***********************************************
    Do
    
          If P_mierz = 1 Then
          Enable Int0
          Else
          Disable Int0
          End If
                   If P_zeruj = 0 Then
                   Licz = 0
                   End If
    Loop
    
    End
    
    Wyswietl:
    
    Cls
    
      Dystans = Licz * L                                        '[cm]
      Dystans = Dystans / 100                                   '[m]
      Dystans = Dystans * Szerokosc
    
      Locate 1 , 1
      Lcd "Dl:" ; Spc(1) ; Dystans ; "[m]"
    
    Return
    
    
    Prz_zew0:
     Incr Licz                        'zwiekszenie licz
     Gosub Wyswietl                                     
    Return
    
      


    Tylko w tym przypadku nie działa ten przycisk zerowania, a podczas generowania przerwań, po kilku przerwaniach wynik się zeruje.

    Mógłby ktoś coś poradzić ?
    Z góry dzięki.
  • REKLAMA
  • #2 7793044
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7793255
    krzywy1607
    Poziom 10  
    Dzięki ;) Faktycznie, kasowanie flagi przerwań pomogło.
    Jedna linijka załatwiła problem.

    Co z tym przyciskiem zerującym ? Jakaś podpowiedź ?
  • REKLAMA
  • #4 7793387
    Konto nie istnieje
    Poziom 1  
  • #5 7793435
    krzywy1607
    Poziom 10  
    No w tym pierwszym programie to działa, ale przy pojawieniu się przerwania. Chciałbym jednak żeby działał niezależnie od przerwania (patrz drugi kod), jednak on nie działa ;/ Wynik zeruje się po kilku przerwaniach (niezależnie od przycisku zerowania).
  • REKLAMA
  • #6 7793462
    Konto nie istnieje
    Poziom 1  
  • #7 7793499
    krzywy1607
    Poziom 10  
    Tak już też próbowałem, ale jeszcze raz skompilowałem i zaprogramowałem (Twój kod). Może to i działa, ale niestety nic nie widać na wyświetlaczu ( za duża częstotliwosc wyświetlania?), dlatego wyrzuciłem " Wyswietl " po pojawieniu się przerwania.
  • #8 7793565
    Konto nie istnieje
    Poziom 1  
REKLAMA