Ich versuche gerade einen Tiny15 als fernbedienbaren Dimmer zu programmieren. Die Idee war die folgende: ich lasse den Prozessor im Schlafmodus, aus dem er durch den INT0-Interrupt geweckt wird. Dieser wird durch die fallende Flanke des Ausgangssignals des TSOP 1736 ausgelöst. Nun messe ich die Zeit für eine halbe Bitdauer, indem ich in einer 10-Takt-Schleife so lange ein Register hochzähle bis INT0 wieder auf "1" geht (Ende Startbit 1). Die Zeit wird 1.5mal genommen und nun warte ich auf die nächste fallende Flanke. Ab hier lese ich die folgenden 12 Bit in einer Schleife aus: ich warte die Zeit für 3/4 Tbit ab, frage den INT0-Eingang ab und kriege so mein nächstes Bit. Habe ich 6 Bits zusammen kopiere ich das Empfangsregister in das Adreßregister und lösche das Empfangsregister zur Aufnahme der nächsten 6 Bits (Kommando). Danach warte ich noch bis zum nächsten Flankenwechsel (Mitte des Bitintervalls) bevor ich die Empfangsschleife wieder durchlaufe. Nun meine Frage: Hab ich da was übersehen? Irgendwie funktioniert es doch nicht ganz so richtig.... Kann ich überhaupt bei den heutigen Fernbedienungen noch mit 2 Startbits rechnen? Oder ist das zweite Startbit gängigerweise ein Adreßbit (was aber für eine TV-Fernbedienung immer "1" sein müßte...). RESET: ldi tmp,cal out osccal,tmp ; write calibration byte sbi DDRB, led ; set led pin as output sbi DDRB, 0 sbi PORTB,int0pin ; activate pull-up sbi PORTB,led ; LED is low-active ldi tmp,0b01000000 ; GIMSK : activate INT0PIN out GIMSK,tmp ldi tmp,0b00100000 ; enable sleep mode, falling flank triggers INT0PIN interrupt out MCUCR,tmp sei ; enable interrupts main: sleep rjmp main ; (2T) receive: cli ; (1T) disable interrupts eor Ts,Ts ; (1T) clear Ts (2 + 8 clocks delay) measure: inc Ts ; (1T) cpi Ts,192 ; (1T) breq r_abort ; (1T) nop nop nop nop sbis PINB,int0pin ; (1T) skip jump if int0pin has changed to one rjmp measure ; (2T) 10 clocks / loop inc Ts ; compensate 10 clock delay from the beginning ;cpi Ts,30 ; Ts too low? ;brlo r_abort mov tmp,Ts lsr tmp ; tmp=Tbit/4 add Ts,tmp ; Ts=3/4*Tbit ldi bitcount,0 eor rbuf,rbuf wait_s2: sbic PINB,int0pin ; wait for falling edge in the middle of S2 rjmp wait_s2 rcvloop: ldi counter,0 wait_thrqtr: inc counter ; (1T) nop nop nop nop nop nop cp counter,Ts ; (1T) brne wait_thrqtr ; (2T) in tmp,PINB ; sample signal lsl rbuf ; next bit sbrc tmp,int0pin ; if input was "0", don't write a one bit inc rbuf inc bitcount cpi bitcount,6 ; address & toggle bit completed brne data_check mov address,rbuf eor rbuf,rbuf data_check: cpi bitcount,12 brne wait_middle mov command,rbuf rcall rc5handler sei reti wait_middle: sbrc tmp,int0pin ; if bit was set, we wait for a zero rjmp wait_zero ; jump to wait_zero if bit was "1" wait_one: sbis PINB,int0pin rjmp wait_one rjmp rcvloop wait_zero: sbic PINB,int0pin rjmp wait_zero rjmp rcvloop r_abort: sei reti rc5handler: mov tmp,address andi tmp,0b00011111 ; extract address cpi tmp,TV0 rjmp standby brne rc5h_end rjmp standby cpi command,01 ; standby command? breq standby rc5h_end: ret standby: sbrs address,5 rjmp switch_off cbi PORTB,led ;cpi command,0 ;brne switch_off ;cbi PORTB,led ret switch_off: sbi PORTB,led ret
Was meinst Du mit 'heutigen Fernbedienungen' ? Sendet Deine Fernbedienung überhaupt RC5 ?
Gute Frage - hab aber 3 Stück zum testen hier (Panasonic, Schneider, Sharp) - eine von denen sollte ja mal RC5 senden!
Ich habe 5 Fernbedienungen, von denen keine einzige RC5 spricht. Panasonic und Sharp sprechen kein RC5 und mein 15 Jahre alter Schneider Fernseher auch nicht. Markus
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.