habe schon asm-schnippsel mit reingebracht beim rc5-senden. jetzt geht es mit dem empfängerprogramm welches im anhang ist (aus diesem forum). irgendwie muss ich jetzt noch eine asm-schleife finden für die (5bit) adresswerte und die (6bit) command-werte.
der Getrc5(address , Command) von basocm ist ein bisschen eirig, also selbst proggen ist machmal besser in bascom.
aber das selbsterstellte einleseprogramm vom rc5-code ist super , übersetzt den code fehlerfrei.
Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 8000000
Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Declare Sub Rc5out()
Dim Adre As Byte
Dim Command As Byte
Dim Togglebit As Byte
Enable Interrupts
Compare1a = 111
Do
Adre = 13
Togglebit = 0
Command = 37
Call Rc5out()
Waitms 500
Loop
End
Sub Rc5out()
' 2x hi
!Call Bit_hi
!Call Bit_hi
' toglebit
lds r17,{togglebit}
sbrs r17,0
!call bit_lo
sbrc r17,0
!call bit_hi
' 5x adresse
lds r17,{adre}
sbrs r17,4
!call bit_lo
sbrc r17,4
!call bit_hi
sbrs r17,3
!call bit_lo
sbrc r17,3
!call bit_hi
sbrs r17,2
!call bit_lo
sbrc r17,2
!call bit_hi
sbrs r17,1
!call bit_lo
sbrc r17,1
!call bit_hi
sbrs r17,0
!call bit_lo
sbrc r17,0
!call bit_hi
' 6x command
lds r17,{command}
sbrs r17,5
!call bit_lo
sbrc r17,5
!call bit_hi
sbrs r17,4
!call bit_lo
sbrc r17,4
!call bit_hi
sbrs r17,3
!call bit_lo
sbrc r17,3
!call bit_hi
sbrs r17,2
!call bit_lo
sbrc r17,2
!call bit_hi
sbrs r17,1
!call bit_lo
sbrc r17,1
!call bit_hi
sbrs r17,0
!call bit_lo
sbrc r17,0
!call bit_hi
!Call Ende_rc5
Bit_hi:
Config Timer1 = Timer , Prescale = 1 , Compare A = Clear , Clear Timer = 1
Waitus 889
Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Waitus 889
ret
Bit_lo:
Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1
Waitus 889
Config Timer1 = Timer , Prescale = 1 , Compare A = Clear , Clear Timer = 1
Waitus 889
ret
Ende_rc5:
Config Timer1 = Timer , Prescale = 1 , Compare A = Clear , Clear Timer = 1
Waitms 50
End Sub
empfängerprogramm :
Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 8000000
$baud = 19200
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.6 , Rs = Portc.7
Config Lcd = 20 * 2
Config Portd.2 = 0
Input_pin Alias Pind.2 'Pin für TSOP1736
Config Timer0 = Timer , Prescale = 8
On Timer0 Timer_irq
Const Timervorgabe = 78 'Timeraufruf alle 178µs (10 Samples = 1 Bit = 1,778ms)
Enable Timer0
Enable Interrupts
'Timing für 10 Samples Per Bit = 1,778ms
Const Samples_early = 8 'Flanke Frühestens Nach 8 Samples
Const Samples_late = 12 'Flanke Spätestens Nach 12 Samples
Const Samples_min = 3 'Flanke Vor 3 Samples - > Paket Verwerfen
'Variablen der ISR
Dim Sample As Byte 'eigentlich Bit, spart aber 46Byte ROM
Dim Ir_lastsample As Byte 'zuletzt gelesenes Sample
Dim Ir_bittimer As Byte 'zählt die Aufrufe von Timer_IRQ
Dim Ir_data_tmp As Word 'Bitstream
Dim Ir_bitcount As Byte 'Anzahl gelesener Bits
'Rückgabewerte der ISR
Dim Address_rc5 As Byte
Dim Command_rc5 As Byte
Dim Rc5_flag As Bit
Cls
Lcd "test"
Do
If Rc5_flag = 1 Then
Reset Rc5_flag
Cls
'Print "toggle:" ; Command_rc5.7;
'clear the toggle bit
Command_rc5 = Command_rc5 And &B01111111
Lcd " Adr:" ; Address_rc5 ; " Code:" ; Command_rc5
End If
'Waitms 100
Loop
End
Timer_irq:
Timer0 = Timervorgabe
Sample = Not Input_pin
'bittimer erhöhen (bleibt bei 255 stehen)
If Ir_bittimer < 255 Then Incr Ir_bittimer
'flankenwechsel erkennen
If Ir_lastsample <> Sample Then
If Ir_bittimer <= Samples_min Then
'flanke kommt zu früh: paket verwerfen
Ir_bitcount = 0
Else
'nur Flankenwechsel in Bit-Mitte berücksichtigen
If Ir_bittimer >= Samples_early Then
If Ir_bittimer <= Samples_late Then
'Bit speichern
Shift Ir_data_tmp , Left , 1
Ir_data_tmp = Ir_data_tmp + Sample
Incr Ir_bitcount
Else
'Flankenwechsel zu spät: Neuanfang mit gemessener Flanke
Ir_bitcount = 1
Ir_data_tmp = Sample
End If
'bittimer zurücksetzen wenn Timer > Samples_early
Ir_bittimer = 0
End If
End If
'Kontrolle des Startbits auf 1
If Ir_bitcount = 1 Then Ir_bitcount = Ir_data_tmp.0
'Alle 14 Bits gelesen?
If Ir_bitcount >= 14 Then
Command_rc5 = Ir_data_tmp 'Bit 6 und 7 siehe unten
Shift Ir_data_tmp , Right , 6
Address_rc5 = Ir_data_tmp And &B00011111
'For extended RC5 code, the extended bit is bit 6 of the command.
Command_rc5.6 = Not Ir_data_tmp.6
'The toggle bit is stored in bit 7 of the command
Command_rc5.7 = Ir_data_tmp.5
'Paket erfolgreich gelesen
Set Rc5_flag
'paket zurücksetzen
Ir_bitcount = 0
End If
End If
'sample im samplepuffer ablegen
Ir_lastsample = Sample
Return
Lesezeichen