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

[Bascom] Współpraca przerwań zewnętrznych i wewnętrznych

s-jacek 12 Wrz 2010 13:43 1470 9
REKLAMA
  • #1 8502607
    s-jacek
    Poziom 10  
    Witam!
    Uczę się Bascoma i postanowiłem napisać "stoper" sterowany z pilota (pilot nadaje w standardzie rc5). Najpierw napisałem pętlę odpowiadającą za ustawienie stopera za pomocą pilota. Zrobiłem to za pomocą przerwania INT0. Wszystko działało jak należy. Problem się zaczął jak skonfigurowałem timer0 do pracy jako timer. Program przestał reagować na pilota, na lcd pojawiły się jakieś dziwne liczby. Nie wiem z czego może to wynikać. Dołączam kod, proszę o pomoc ;)

    
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    Config Lcd = 16 * 2
    
    Config Timer0 = Timer , Prescale = 256
    
    Config Int0 = Low Level
    Config Rc5 = Pind.2
    Config Portd.2 = Input
    Portd.2 = 1
    
    Config Portb.1 = Output
    Set Portb.1
    
    On Int0 Pobr_rc5
    
    Dim Address As Byte , Command As Byte , I As Byte
    Dim S As Integer , M As Integer
    Dim Sm As Bit , Odliczanie As Bit
    Dim Odeb_kod As Bit , Start_odm As Bit
    
    
    Enable Interrupts
    Enable Int0
    Enable Timer0
    
    Reset Odeb_kod
    Reset Start_odm
    Reset Odliczanie
    
    Cls
    
    Cursor Off
    Sm = 0                                                      '0 to minuty, 1 to sekundy
    S = 0
    M = 0
    I = 0
    
    Do                                                          ' w tej pętli nastawiany jest, za pomocą pilota, czas do odmierzenia
    
    If Sm = 0 Then
    Locate 1 , 1
    If Sm = 1 Then
    Locate 1 , 4
    End If
    End If
    
    If Odeb_kod = 1 Then
    Select Case Command
    
    Case 80:
    
    If Sm = 0 Then
    Incr M
    End If
    
    If Sm = 1 Then
    Incr S
    End If
    
    
    Case 82:
    
    If Sm = 0 Then
    Decr M
    End If
    
    If Sm = 1 Then
    Decr S
    End If
    
    Case 86:
    
    Toggle Sm
    
    
    Case 60:
    
    Odliczanie = 1
    
    
    
    End Select
    Reset Odeb_kod
    Cls
    End If
    
    If M < 10 Then
    Locate 2 , 6
    Lcd "0" ; M
    End If
    If M >= 10 Then
    Locate 2 , 6
    Lcd M
    End If
    
    Locate 2 , 8
    Lcd ":"
    
    If S < 10 Then
    Locate 2 , 9
    Lcd "0" ; S
    End If
    If S >= 10 Then
    Locate 2 , 9
    Lcd S
    End If
    
    If Sm = 0 Then
    Locate 1 , 4
    Lcd "Ile minut?"
    End If
    If Sm = 1 Then
    Locate 1 , 3
    Lcd "Ile sekund?"
    End If
    
    Loop Until Odliczanie = 1
    
    Disable Int0                                                ' wyłączam przerwanie zewnętrzne int0, żeby nie było reakcji na pilota
    On Timer0 Odmierz_1s                                        ' włączam timer żeby zacząć odliczanie
    Load Timer0 = 250
    
    
    Do                                                          ' pętla wyświetlająca odliczanie
    
    Locate 1 , 3
    Lcd "Odliczanie..."
    
    
    If M < 10 Then
    Locate 2 , 6
    Lcd "0" ; M
    End If
    If M >= 10 Then
    Locate 2 , 6
    Lcd M
    End If
    
    Locate 2 , 8
    Lcd ":"
    
    If S < 10 Then
    Locate 2 , 9
    Lcd "0" ; S
    End If
    If S >= 10 Then
    Locate 2 , 9
    Lcd S
    End If
    
    Loop Until M = 0 And S = 0
    
    Cls
    Lcd "koniec"
    
    
    
    
    
    End                                                         'end program
    
    
    Odmierz_1s:
    
    Load Timer0 = 250
    Incr I
    If I = 250 Then
    I = 0
    S = S - 1
    If S < 0 Then
    S = 59
    M = M - 1
    If M < 0 Then
    M = 0
    S = 0
    
    End If
    End If
    End If
    Cls
    
    Return
    
    Pobr_rc5:
    
    Disable Int0
    Enable Interrupts
    
    Getrc5(address , Command)
    
    Command = Command And &B01111111
    
    Set Odeb_kod
    
    Enable Int0
    
    Return
    
    
  • REKLAMA
  • Pomocny post
    #2 8502663
    landy13
    Poziom 31  
    Procedura Getrc5 wykorzystuje Timer0. Użyj innego.
  • #3 8502724
    s-jacek
    Poziom 10  
    Zmieniłem na timer1, teraz mam krzaki na lcd :D I na nic nie reaguje.

    Dodano po 4 [minuty]:

    krzaków już nie ma(nie zmieniłem timera w jednym miejscu), ale dalej nie odlicza
  • REKLAMA
  • #4 8502797
    zumek
    Poziom 39  
    s-jacek napisał:
    Uczę się Bascoma i ...

    ... nie zaglądasz do pliku pomocy :!:
    Gdybyś do niego zaglądał, to wiedziałbyś, że
    landy13 napisał:
    Procedura Getrc5 wykorzystuje Timer0. Użyj innego.

    i że tak ...
    
    Load Timer0 = 250
    
    ... zapisana instrukcja jest do d....

    Zacznij więc zaglądać do "helpa" :D
  • #5 8502927
    s-jacek
    Poziom 10  
    Korzystam z helpa, tego akurat nie zauważyłem. A o co Ci chodzi z load timer0 to nie rozumiem, jeśli chodzi Ci o znak "=", to nie ma znaczenia czy będzie tam "," czy "="

    Dodano po 13 [minuty]:

    Mógłbyś jaśniej o tym load timer? Chyba naprawdę coś jest nie tak. Moje myślenie jest takie:
    Chcę odmierzyć 1s, kwarc mam 16kHz, prescaler ustawiam na 256, więc mam
    16000000:256 = 62500
    wartość początkową timera ustawiam na 250 (load timer1=250), czyli licznik się przepełni po 250 impulsach, czyli po 0,004s, więc po 250 przerwaniach będę miał 1s.
    TAK???
  • #6 8502974
    xury
    Specjalista automatyka domowa
    No widzisz, nie czytasz tego helpa. Timer się inaczej ładuje.
    Chcąc mieć początkową wartość timera0 równe 250 piszemy:
    Load timer0 , 6
    Co do zmiany timera na Timer1 to trzeba wiedzieć, że ten timer jest 16 bitowy
  • REKLAMA
  • #7 8502989
    s-jacek
    Poziom 10  
    Po pierwsze:
    nie ma różnicy czy napiszę load timer0=250, czy load timer0, 250 (tak jest w książce Pana Marcina Wiązania)
    Po drugie:
    co z tego że timer1 jest 16 bitowy, jak wpiszę wartość początkową 250 to tu i tu licznik się przepełni po 250 impulsach

    jak nie mam racji to proszę mnie poprawić
  • REKLAMA
  • #8 8502999
    s-jacek
    Poziom 10  
    sam tego nie wymyśliłem, popatrz do książki Marcina Wiązani, on tam używa "="
  • #10 8503029
    s-jacek
    Poziom 10  
    Hmmmm, macie racje. Trochę się zdziwiłem bo w książce wszędzie tak używa. No cóż, teraz będę wiedział, że najlepiej kierować się help'em. Dzięki za pomoc. Nawet tym co mnie zjechali ;P
REKLAMA