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.

Code:
	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