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.
Falls jemandem was zu bemerken hat bitte ich drum!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
thx
Gruß
lk







Zitieren
Lesezeichen