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

rc5 przerwanie + bascom + atmega162 czy to mozliwe!!!

ssamburski 15 Maj 2007 18:35 1215 4
REKLAMA
  • #1 3887659
    ssamburski
    Poziom 16  
    Posty: 269
    Pomógł: 2
    Ocena: 2
    Witam!!! Mam pytanko w dosc popularnym temacie na forum ale tego co potrzebuje konkretnie nie znalazłem. Czy udało sie komus opanowac opsługę rc5 w baskomie tak zeby działało na przerwanie tak jak w tym programie ktory znalazłem na forum, ale niestety podobnie jak u kolegi u ktorego znalazłem to w temacie umnie tez sie wiesza!!!
    kod:
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0
    Cursor Off
    Config Int0 = Low Level
    Config Rc5 = Pind.2
    On Int0 Pobr_rc5

    Dim Address As Byte
    Dim Address1 As Byte
    Dim Command As Byte
    Dim Command1 As Byte


    Enable Interrupts
    Enable Int0
    Address1 = 255
    Command1 = 255
    Cls
    Do

    Locate 1 , 1
    Lcd "Adres: " ; Address1 ; " "
    Locate 2 , 1
    Lcd "Komenda: " ; Command1 ; " "

    Enable Int0

    Loop
    End

    Pobr_rc5:
    Disable Int0
    Enable Interrupts
    Getrc5(address , Command)
    Command = Command And &B01111111
    If Address < 255 Then
    Address1 = Address
    Command1 = Command
    End If
    Return

    Czy komuś udała sie opanowac ten problem w bascomie!!! Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 3889877
    andrzejek23
    Poziom 19  
    Posty: 314
    Pomógł: 21
    Ocena: 146
    http://www.btc.pl/pliki/bas_listingi.zip ->program 8_24.BAS

    Ja też długo się męczyłem z RC5, ale odpaliłem to i już wiedziałem, gdzie miałem błędy. Spróbuj sobie tak jak w tym przykładzie dołożyć jakąś flagę i ustawiaj ją w procedurze obsługi przerwania RC5, a dopiero w pętli głównej badaj jej stan, bo bezcelowe wydaje się "Enable INT0" w każdym przejściu pętli, wystarczy raz łącznie z zerowaniem flagi po wyświetleniu danych na LCD.
  • REKLAMA
  • #3 3896103
    ssamburski
    Poziom 16  
    Posty: 269
    Pomógł: 2
    Ocena: 2
    Zrobiłem tak jak zaproponowałes i tez sie wiesza, odpusciłem sobie przerwanie i getrc5 zakąbinowałem w pętli głownej programu i cyka az miło:) Pozdrawiam
  • REKLAMA
  • #4 3896306
    john_t
    Poziom 29  
    Posty: 1070
    Pomógł: 127
    Ocena: 89
    ssamburski napisał:
    Zrobiłem tak jak zaproponowałes i tez sie wiesza, odpusciłem sobie przerwanie i getrc5 zakąbinowałem w pętli głownej programu i cyka az miło:) Pozdrawiam

    Właśnie w pętli głównej tkwi Twój problem. Nie można raz po razie uruchamiać instrukcji zapisu na LCD a jeszcze do tego bez poprzedzającej CLS. Również w Bascom 8051 takie postępowanie zawiesi procka. Pętla powinna wyglądać tak:

    Do
    Cls
    LCD "Adress, Command"
    'I tu musi się coś wykonać dłuższego niz 3ms
    'Jeśli nie to daj Wait 1 lub Waitms 500
    Loop
  • #5 3897944
    ssamburski
    Poziom 16  
    Posty: 269
    Pomógł: 2
    Ocena: 2
    Witam!!! Ale nie wiesz sie cały program tylko RC5, zrobiłem to bez przerwania i działa bez zarzutu, moj progam wyglada tak
    kod:
    $regfile = "m162def.dat" 'informuje kompilator o pliku
    'dyrektyw mikrokontrolera
    $crystal = 8000000
    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
    Config Sda = Porta.2 'i2c
    Config Scl = Porta.3
    Dim H As Byte
    Dim M As Byte
    Dim S As Bit
    S = 0

    Cursor Off
    Cls
    Declare Sub Ds1 'ds
    Declare Sub Ds2
    Dim Odczyt As Integer
    Dim T As Single
    Dim Odczyt2 As Integer
    Dim T2 As Single


    Deflcdchar 1 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32


    ' rc5
    Config Rc5 = Pind.2
    Declare Sub Pobr_rc5

    Dim Address As Byte
    Dim Command As Byte


    Address = 255
    Command = 255

    Declare Sub Ustawczas
    Cls

    Enable Interrupts


    Do

    Getrc5(address , Command)
    Command = Command And &B01111111

    If Command = 12 Then
    Call Pobr_rc5
    End If


    Call Ds1
    Call Ds2
    Cls

    Locate 1 , 1
    Lcd "t1=" ; Fusing(t , "#.#") ; Chr(1)
    Lcd "t2=" ; Fusing(t2 , "#.#") ; Chr(1) ; " "
    If H < 10 Then
    Lcd "0"
    End If
    Lcd H ;
    If S = 0 Then
    Lcd ":"
    Set S
    Else
    Lcd " "
    Reset S
    End If

    If M < 10 Then
    Lcd "0"
    End If
    Lcd M
    I2cstart
    I2cwbyte 160
    I2cwbyte 3
    I2cstart
    I2cwbyte 161
    I2crbyte M , Ack
    I2crbyte H , Nack
    I2cstop
    M = Makedec(m) : H = Makedec(h)

    Loop



    Sub Pobr_rc5

    Cls

    Do
    Locate 1 , 1
    Lcd "1.wyjdz 2.ustaw czas "
    Getrc5(address , Command)
    If Address = 0 Then
    Command = Command And &B01111111

    End If
    If Command = 2 Then
    Call Ustawczas
    End If
    If Command = 1 Then
    Cls
    End Sub
    End If
    Loop


    Sub Ustawczas
    Cls
    Do
    Locate 1 , 1
    If H < 10 Then
    Lcd "0"
    End If
    Lcd H ; ":"
    If M < 10 Then
    Lcd "0"
    End If
    Lcd M

    Locate 2 , 1
    Lcd "1,2 godz 3,4 min 5.ok"
    Getrc5(address , Command)
    Command = Command And &B01111111
    If Command = 1 Then
    H = H + 1
    If H > 23 Then
    H = 0
    End If
    End If

    If Command = 2 Then
    If H = 0 Then
    H = 24
    End If
    H = H - 1
    End If

    If Command = 3 Then
    M = M + 1
    If M > 59 Then
    M = 0
    End If
    End If

    If Command = 4 Then
    If M = 0 Then
    M = 60
    End If
    M = M - 1

    End If

    If Command = 5 Then
    M = Makebcd(m)
    H = Makebcd(h)
    I2cstart
    I2cwbyte 160
    I2cwbyte 0
    I2cwbyte 8
    I2cstop
    I2cstart
    I2cwbyte 160
    I2cwbyte 3
    I2cwbyte M
    I2cwbyte H
    I2cstop
    Cls
    End Sub
    End If

    Loop



    Sub Ds1
    Config 1wire = Porta.0
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 400
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Odczyt = 1wread(2)
    T = Odczyt - 16
    T = T \ 16
    T = T * 10
    End Sub



    Sub Ds2
    Config 1wire = Porta.1
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 400
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Odczyt2 = 1wread(2)
    T2 = Odczyt2 - 16
    T2 = T2 \ 16
    T2 = T2 * 10
    End Sub


    Pozdrawiam
REKLAMA