Code:
' '******************************************************************************
'
' AT Mega 8535 & LCD 16*2 Anschluß & TSOP 1736
'
'------ Standard-Init von Bascom ------------------------------
$regfile = "m8535.dat"
$crystal = 8000000
$hwstack = 40 ' default use 32 for the hardware stack
$swstack = 40 ' default use 32 for the SW stack
$framesize = 100 ' default use 40 for the frame space
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.6 , Rs = Porta.7
Config Lcd = 16 * 2
Cls
Dim Impuls_laenge As Word , Flanken_index As Byte , Flanken_anzahl As Byte , Bit_count As Byte
Dim Befehl As Word , Geraet As Word , Neg_befehl As Word , Neg_geraet As Word , Nrc17_start As Byte
Dim Daten_pruefung As Byte , Parity As Byte , Hersteller As Word , System As Byte , Produkt As Byte , Modus As Byte
Dim Imp_array(200) As Byte , Daten As Long , Daten1 As Long , Temp_daten As Long , Code_found As Byte
Dim Timer0_startwert As Word , I As Byte
Dim Print_pc As Byte
Dim Zeit As Byte
Zeit = 3
Const Std_pulse = 5
Const Std_pulse_min = Std_pulse - 2
Const Std_pulse_max = Std_pulse + 2
Config Timer0 = Timer , Prescale = 8 'hier den Timer eintragen (8-bit)
On Ovf0 Tim0_isr
Enable Timer0
Timer0_startwert = 78 '161 'bei mir 16000000/8/(256-56) entspricht 10Khz
Timer0 = Timer0_startwert 'Auflösung reicht und gefundene Werte entsprechen immer 100µs
Config Int0 = Change 'externer interrupt, bei mir Int0 auf portd.2
On Int0 Get_rc_isr
Enable Int0
Ddrd.2 = 0 'ausgang des RC-empfängers
Portd.2 = 1
$baud = 19200 'Vorsicht: Wenn's langsam geht, kann dies die erkannten Flankenzeiten beeinflussen
Print_pc = 0 'auf 1 setzen, um über Print auszugeben
Enable Interrupts
Do
If Code_found = 1 Then 'Jetzt geht es an die Erkennung des Codes
Flanken_index = Flanken_anzahl
Daten = 0
Daten1 = 0
Bit_count = 0
Code_found = 0
'RC5 hat immer gerade Anzahl Flanken, bei mir immer zwischen 16 und 26
'Imp_array(1) enthält die Pause seit dem letzten Befehl, ist also uninteressant
'Imp_array(2) ist das Ende der ersten Start-1
'Imp_array(3) ist der Anfang der zweiten Start-1
If Flanken_index > 15 And Flanken_index < 27 And Flanken_index.0 = 0 And Imp_array(2) > 6 And Imp_array(2) < 11 And Imp_array(3) > 6 And Imp_array(3) < 11 Then
Locate 1 , 1
If Print_pc = 1 Then Print "RC5: "
I = 4 ' Imp_array(4) ist das Toggle-bit
Daten.0 = 1
While I < Flanken_index ' Loop bis zur letzten Flanke, immer beim wichtigen Flankenwechsel in der Mitte des Impulses
Shift Daten , Left ' Daten (Ergebnis) nach links schieben, 0 einfügen
Daten.0 = Daten.1 ' Das letzte Bit wie das vorletzte setzen
If Imp_array(i) > 6 And Imp_array(i) < 11 Then ' kurzer Impuls (also kein Wechsel 0->0 oder 1->1)
Incr I ' nächste Flanke
If Imp_array(i) < 7 Or Imp_array(i) > 10 Then ' kein kurzer Impuls => Fehler (wenn in der Mitte ein kurzer war, dann muss noch ein kurzer kommen)
Exit While ' Abbruch
End If
Elseif Imp_array(i) < 19 And Imp_array(i) > 15 Then 'langer Impuls (also Wechsel 1->0 oder 0->1)
Toggle Daten.0 ' also letztes bit umschalten
Else
Exit While ' sonst Abbruch
End If
Incr I ' nächste Flanke
Incr Bit_count ' zählt die Anzahl der korrekt gelesenen Bits
Wend
If I >= Flanken_index Then 'Wenn kein Abbruch
If Imp_array(i) < 19 And Imp_array(i) > 15 Then 'Falls am Ende noch ein bit-Wechsel 1->0 kommt
Shift Daten , Left 'Daten (Ergebnis) nach links schieben, 0 einfügen
Incr Bit_count
End If
Temp_daten = Daten 'Daten zwischenspeichern
Befehl = Temp_daten And &B00111111 'Befehl sind die letzten 6 bits
Shift Temp_daten , Right , 6 'Befehls-bits rausshiften
Geraet = Temp_daten And &B00011111 'Gerät sind die ersten 5 bits
If Print_pc = 1 Then Print ": Ger=" ; Geraet ; ", Bef=" ; Befehl
Cls
Locate 1 , 1 : Lcd "RC5"
Locate 2 , 1 : Lcd "Ger=" ; Geraet ; ", Bef=" ; Befehl
End If
End If
Flanken_index = 0
Flanken_anzahl = 0
Impuls_laenge = 0
End If
'-------------------------------------------------------------------------------------------------------------------------------------------
'SIRCS
'26, 255 23 6 6 5 6 6 5 6 6 6 5 6 6 6 5 6 12 5 6 6 6 5 6 6 11
' (0) (0) (0) (0) (0) (0) (0) (1) (0) (0) (0) (1)
' (Startbit) (L BEFEHL M) (L ADRESSE M)
'----------------------------------------------------------------Sony
If Flanken_index = 26 And Imp_array(2) < 26 And Imp_array(2) > 22 And Imp_array(3) > 4 And Imp_array(3) < 8 Then
If Print_pc = 1 Then Print "SIRCS: Start "
I = 4
While I < Flanken_index
Shift Daten , Right
If Imp_array(i) > 4 And Imp_array(i) < 8 Then
nop
Elseif Imp_array(i) > 9 And Imp_array(i) < 14 Then
Daten.31 = 1
Else
Exit While
End If
Incr I
If Imp_array(i) < 5 Or Imp_array(i) > 7 Then
Exit While
End If
Incr I
Incr Bit_count
Wend
If I >= Flanken_index Then
If Imp_array(i) > 9 And Imp_array(i) < 14 Then
Shift Daten , Right
Daten.31 = 1
Incr Bit_count
End If
Shift Daten , Right , 20
Temp_daten = Daten
Befehl = Temp_daten And &B01111111
Shift Temp_daten , Right , 7
Geraet = Temp_daten And &B00011111
If Print_pc = 1 Then Print ": Gerät=" ; Geraet ; ", Befehl=" ; Befehl ; ", I=" ; I ; ", Flanken_index=" ; Flanken_index ; ", Daten=" ; Bin(daten)
Cls
Locate 1 , 1 : Lcd "SIRCS"
Locate 2 , 1 : Lcd "Geraet=" ; Geraet ; ", Befehl=" ; Befehl
End If
Flanken_index = 0
Flanken_anzahl = 0
Impuls_laenge = 0
End If
'-------------------------
Loop
End
Tim0_isr:
Timer0 = Timer0_startwert
Incr Impuls_laenge 'bei jedem Überlauf um 1 erhöhen
If Impuls_laenge = 200 Then 'Kein Impuls für 20ms und in Get_rc_isr schon mindestens 14 Flanken gespeichert
If Flanken_anzahl > 13 Then
Code_found = 1 'Auswertung im Hauptprogramm starten
End If
End If
Return
Get_rc_isr:
If Impuls_laenge > 0 Then
Incr Flanken_anzahl
If Flanken_anzahl > 200 Then Flanken_anzahl = 200
If Impuls_laenge > 255 Then Impuls_laenge = 255
Imp_array(flanken_anzahl) = Impuls_laenge
Impuls_laenge = 0
End If
Return
Lesezeichen