stowoda
16.10.2005, 10:46
Moin!
Würde gerne mit meine Sony Fernbedienung mienen PC steuern können..
Dazu sollte der PIC(16F84A) gemäß dem SIRCS Protokoll http://www.boehmel.de/sircs.htm, die KomandoBits detektieren und speichern,
sowie an den PC über rs232 senden.
Habe mir dazu einen Algorythmus einfallen lassen und ihn auch umgesetzt.
Vielleicht hat jemand Erfahrung in diesen Dingen und kann sich meinen Code kurz anschauen. Er ist gut kommentiert also keine Angst!
Werde versuchen die Senderoutine noch hinzuzufügen und falls alles gut geht (und der PC die richtigen bits empfängt) hier posten,
wenn nicht sowieso ;)
Bemerkung zu SIRCS:
Die ersten 7bits nach dem header(2.4ms) sind die KommandoBits, also liegt es nahe, nur die ersten Bits auszuhorchen und zu speichern,
anstatt den gesamten Code speichern zu müssen.
list p=16F84A
#include<P16F84A.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
errorlevel -302
;************************************************* *****************
;* Variablen *
;************************************************* *****************
x_start Equ 0x20
x_data1 Equ 0x21
data1 Equ 0x22
x_bytes Equ 0x23
x_bit Equ 0x24
x_onetime Equ 0x25
;************************************************* *****************
;* Programmstart *
;************************************************* *****************
org 0x00
clrf PCLATH
clrf STATUS
clrf INTCON
goto INIT
org 0x04
goto INT_RT
;************************************************* *****************
;* Initialisierung *
;************************************************* *****************
INIT
bsf STATUS, RP0
movlw b'00000001'
movwf TRISB
movlw .0
movwf TRISA
movlw b'00000111'
movwf OPTION_REG
bcf STATUS, RP0
movlw b'10110000'
movwf INTCON
clrf PORTB
clrf x_start
clrf data1
clrf x_onetime
org 0x20
sl
sleep
goto $-1
;************************************************* ****************
;* Interrupt Routine *
;************************************************* ****************
INT_RT
btfss x_start, 0 ; got header already?
goto INT_naglowek ; NO
goto INT_bity ; YES --> get bits
;************************************************* ****************
;* detect header *
;************************************************* ****************
INT_naglowek ; get header
movlw .6 ; set counter for data1
movwf x_data1 ;
bsf STATUS, RP0
movlw b'10000010' ; Prescaler 1.795ms (2.4)
movwf OPTION_REG ; for header!
bcf STATUS, RP0
bcf INTCON, T0IF
movlw .34 ; loading TMR0 to count 1.8ms
movwf TMR0
btfss INTCON, T0IF ; TMR0 overflowed??
goto $-1 ; t < t < 3t
btfsc PORTB, 0 ; YES.. if RB0=0 got header
goto fehler ; header detection failed
bsf x_start, 0 ; marking that header already detected
bcf INTCON, T0IF ;
bcf INTCON, INTF ; Clearing interrupt flags
retfie ; sleep and wait for 1st bit
;************************************************* ******************
; detect bits *
;************************************************* ******************
INT_bity ; Initialization due to bit detection
bsf PORTB, 2 ; debug LED
btfsc x_onetime, 0
goto fehler
bsf STATUS, RP0
movlw b'00000001' ; Prescaler TMR0 0.8ms
movwf OPTION_REG
bcf STATUS, RP0
bcf INTCON, T0IF
movlw .35
movwf TMR0
btfss INTCON, T0IF ; TMR0 overflowed??
goto $-1 ; 1t < t < 2t
btfss PORTB, 0 ; if after 0.903ms RB=1
goto sv_one ; one was detected, store it !!
goto sv_zero ; zero was detected, store it !!
;************************************************* ******************
;* speichere 0 in data1 || store a zero in data1 *
;************************************************* ******************
sv_zero
btfsc x_data1, 7 ; data1 full ??
goto got_it ; YES -> continue with data2 !!
bcf STATUS, C ; NO --> move zero in C !!
rrf data1, F ; move C in data1.
decf x_data1, F ; in order to detect if data1 is full.
bcf INTCON, T0IF ;
bcf INTCON, INTF ; Clearing interrupt flags.
retfie ; sleep and wait for NEXT bit !!
;************************************************* *****************
;* speichere 1 in data1 || store a one in data1 *
;************************************************* *****************
sv_one
btfsc x_data1, 7 ; data1 full ??
goto got_it ; YES -> continue with data2 !!
bsf STATUS, C ; NO --> move one in C !!
rrf data1, F ; move C in data1.
decf x_data1, F ; in order to detect if data1 is full.
bcf INTCON, T0IF ;
bcf INTCON, INTF ; Clearing interrupt flags.
retfie ; sleep and wait for NEXT bit !!
got_it
bsf x_onetime, 0
;senderoutine PIC to rs232
;leider noch keine Idee.
fehler
bcf PORTB, 2 ; debug LED
bcf INTCON, T0IF ;
bcf INTCON, INTF ; Clearing interrupt flags.
retfie ; sleep and wait for header !!
end
Falls jemandem was zu bemerken hat bitte ich drum!
thx
Gruß
lk
Würde gerne mit meine Sony Fernbedienung mienen PC steuern können..
Dazu sollte der PIC(16F84A) gemäß dem SIRCS Protokoll http://www.boehmel.de/sircs.htm, die KomandoBits detektieren und speichern,
sowie an den PC über rs232 senden.
Habe mir dazu einen Algorythmus einfallen lassen und ihn auch umgesetzt.
Vielleicht hat jemand Erfahrung in diesen Dingen und kann sich meinen Code kurz anschauen. Er ist gut kommentiert also keine Angst!
Werde versuchen die Senderoutine noch hinzuzufügen und falls alles gut geht (und der PC die richtigen bits empfängt) hier posten,
wenn nicht sowieso ;)
Bemerkung zu SIRCS:
Die ersten 7bits nach dem header(2.4ms) sind die KommandoBits, also liegt es nahe, nur die ersten Bits auszuhorchen und zu speichern,
anstatt den gesamten Code speichern zu müssen.
list p=16F84A
#include<P16F84A.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
errorlevel -302
;************************************************* *****************
;* Variablen *
;************************************************* *****************
x_start Equ 0x20
x_data1 Equ 0x21
data1 Equ 0x22
x_bytes Equ 0x23
x_bit Equ 0x24
x_onetime Equ 0x25
;************************************************* *****************
;* Programmstart *
;************************************************* *****************
org 0x00
clrf PCLATH
clrf STATUS
clrf INTCON
goto INIT
org 0x04
goto INT_RT
;************************************************* *****************
;* Initialisierung *
;************************************************* *****************
INIT
bsf STATUS, RP0
movlw b'00000001'
movwf TRISB
movlw .0
movwf TRISA
movlw b'00000111'
movwf OPTION_REG
bcf STATUS, RP0
movlw b'10110000'
movwf INTCON
clrf PORTB
clrf x_start
clrf data1
clrf x_onetime
org 0x20
sl
sleep
goto $-1
;************************************************* ****************
;* Interrupt Routine *
;************************************************* ****************
INT_RT
btfss x_start, 0 ; got header already?
goto INT_naglowek ; NO
goto INT_bity ; YES --> get bits
;************************************************* ****************
;* detect header *
;************************************************* ****************
INT_naglowek ; get header
movlw .6 ; set counter for data1
movwf x_data1 ;
bsf STATUS, RP0
movlw b'10000010' ; Prescaler 1.795ms (2.4)
movwf OPTION_REG ; for header!
bcf STATUS, RP0
bcf INTCON, T0IF
movlw .34 ; loading TMR0 to count 1.8ms
movwf TMR0
btfss INTCON, T0IF ; TMR0 overflowed??
goto $-1 ; t < t < 3t
btfsc PORTB, 0 ; YES.. if RB0=0 got header
goto fehler ; header detection failed
bsf x_start, 0 ; marking that header already detected
bcf INTCON, T0IF ;
bcf INTCON, INTF ; Clearing interrupt flags
retfie ; sleep and wait for 1st bit
;************************************************* ******************
; detect bits *
;************************************************* ******************
INT_bity ; Initialization due to bit detection
bsf PORTB, 2 ; debug LED
btfsc x_onetime, 0
goto fehler
bsf STATUS, RP0
movlw b'00000001' ; Prescaler TMR0 0.8ms
movwf OPTION_REG
bcf STATUS, RP0
bcf INTCON, T0IF
movlw .35
movwf TMR0
btfss INTCON, T0IF ; TMR0 overflowed??
goto $-1 ; 1t < t < 2t
btfss PORTB, 0 ; if after 0.903ms RB=1
goto sv_one ; one was detected, store it !!
goto sv_zero ; zero was detected, store it !!
;************************************************* ******************
;* speichere 0 in data1 || store a zero in data1 *
;************************************************* ******************
sv_zero
btfsc x_data1, 7 ; data1 full ??
goto got_it ; YES -> continue with data2 !!
bcf STATUS, C ; NO --> move zero in C !!
rrf data1, F ; move C in data1.
decf x_data1, F ; in order to detect if data1 is full.
bcf INTCON, T0IF ;
bcf INTCON, INTF ; Clearing interrupt flags.
retfie ; sleep and wait for NEXT bit !!
;************************************************* *****************
;* speichere 1 in data1 || store a one in data1 *
;************************************************* *****************
sv_one
btfsc x_data1, 7 ; data1 full ??
goto got_it ; YES -> continue with data2 !!
bsf STATUS, C ; NO --> move one in C !!
rrf data1, F ; move C in data1.
decf x_data1, F ; in order to detect if data1 is full.
bcf INTCON, T0IF ;
bcf INTCON, INTF ; Clearing interrupt flags.
retfie ; sleep and wait for NEXT bit !!
got_it
bsf x_onetime, 0
;senderoutine PIC to rs232
;leider noch keine Idee.
fehler
bcf PORTB, 2 ; debug LED
bcf INTCON, T0IF ;
bcf INTCON, INTF ; Clearing interrupt flags.
retfie ; sleep and wait for header !!
end
Falls jemandem was zu bemerken hat bitte ich drum!
thx
Gruß
lk