Styra AVR:en med TV-fjärrkontroll?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Styra AVR:en med TV-fjärrkontroll?

Inlägg av Glattnos »

Okej, jag har sökt på forumet men inte hittat tillfredsställande svar.

Jag tänkte försöka styra min mikroprocessor med TV:ns fjärrkontroll men hittar ingenstans hur informationen ser ut från en TV-fjärr. Eller jag hittade lite grann men fattade inte, rättare sagt. Så då har jag laborerat lite:

Testade en IR-mottagare(3-bent liten sak, ca 6x6 mm med ett ovalt "öga"). Den gav hög på OUT när den är opåverkad. Jag flipprade lite med TV-fjärren och såg att det i alla fall rörde sig på OUT-benet.
Kopplade IR-mottagaren till min processor och mätte tiden på pulserna(hur länge de var låga).
Jag fick det till att det är 3 st tider som är stabila(fick några andra tider som verkade vara slumpmässiga, stor variation, troligtvis "flimmer" i kretsarna på nått vis): 960us, 1776us och 1880us

Det är här jag är nu.

Kan det vara såhär:
1880us är startbit
1776us är 1
960us är 0

Jag har ju i alla fall fått för mig att man en TV-fjärr sänder ett 8-bitars tal, olika för olika knappar. Eller är jag ute och cyklar nu? Kan någon förklara eller skicka en länk(helst där det står på svenska).
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av Swech »

vad är det för märke på fjärren då? eller snarare tvn?

Swech
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av Glattnos »

Märket på TV:n är Kendo, från tidigt 90-tal
På fjärrkontrollen står det:
DIGITAL RC 5991
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av eqlazer »

http://www.epanorama.net/links/irremote.html#codes
Där kan du hitta lite info för några utav de vanligare protokollen.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av Glattnos »

Nja, jag får inte till det riktigt, hittar inte vilket protokoll som gäller för min fjärrkontroll. Vad behöver jag för att mäta? Är det ett oscilloskop jag behöver då? Och mäta på IR-mottagaren?
Kan någon tipsa om ett bra oscilloskop i så fall? Pris upp till 4 000:- och gärna svensk bruksanvisning.

Jag förstår om det finns billigare sätt att lösa mitt problem på men jag har länge funderat på att köpa ett oscilloskop och om det funkar att mäta fjärr-signalen med så är det ju ett bra tillfälle att köpa ett.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av vfr »

Fjärrkontrollsignalen är en ren digital signal, i dom allra flesta fallen, och kan även samplas med en mikrokontroller till ett SRAM eller liknande. Nackdelen med ett oscilloskåp, om man inte har ett digitalt sådant med minne, är att det är svårt att synka in och bevara signalen. Det har å andra sidan pratats om något Rigol-skåp som ska vara billigt och hyffsat bra. Se om du kan hitta en tråd om det.
Gnagarn
Inlägg: 2
Blev medlem: 31 augusti 2010, 21:17:05

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av Gnagarn »

Om du vill ha en billigare lösning och har en serieport tillgänglig så kan du bygga en enkel IR-mottagare till serieporten och använda mjukvaran LIRC (finns även till Windows). Ta en titt på deras förslag: http://www.lirc.org/receivers.html.

Om du bara vill titta på digitala signaler så finns det en uppsjö av USB-logikanalysatorer för under 2000:- som fixar det.

Att köpa ett oscilloskop kan också vara en bra idé i största allmänhet.
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av laban12 »

Jag har en kodsnutt i AVR assembler jag skrev för att ta emot signaler från en IR-fjärr.
Mest bara för att se om det gick. Ska se om jag hittar den...

Det är "RC5" du ska googla.

EDIT:
Jag hittade den.
Tänk nu på att det här är gammal kod som jag knackade när jag höll på att lära mig AVR så det finns säkerligen mycket som kan förbättras. ;)
Jag tror att det fungerar så att den tar emot ett kommando och skickar ut den på serieporten, jag har inte tokgranskat koden och det var LÄNGE sedan jag skrev den.

De rutiner som är intressanta är interruptrutinen som tar emot datat från ir-sensorn. OUT från sensorn kopplas till IRQ0. Och sedan "scan rc5"- rutinen som på något sätt tar hand om datat. Det borde man väl rimligtvis lägga in i irq-rutinen även det.
Det finns även en lysdiod på PortB 4 som blinkar när den tar emot data - som visuell indikering.

Skrivet för en 8515 på 8MHz

Kod: Markera allt

;******* miljövariabler ******
		.include "8515def.inc"	
		
		.def	Temp	=R16
		;.def		=R17
		.def	OldAd 	=R18
		.def	Key	=R19
		.def	UtData	=R20
		.def	Data	=R21 
		.def	Temp2	=R22
		.def    bitcnt	=R23
		.def    SysAd	=R24
		.def    SysCmd	=R25
		;.def		=R26	;res
		;.def		=R27	;res
		;.def		=R28	;res
		;.def		=R29	;res
		;.def		=R30	;res
		;.def		=R31	;res



;******* vektorer ******
		.cseg
		.org	$00
                	
 		rjmp Reset		;RESET
 		rjmp IRQ0		;IRQ 0
		reti           		;IRQ 1
		reti          		;Timer/Counter 1 Capture Handler
		reti          		;Timer/Counter 1 Compare A Handler
		reti          		;Timer/Counter 1 Compare B Handler
		reti         		;Timer/Counter 1 Overflow Handler
		reti  	  		;Timer/Counter 0 Overflow Handler
		reti            	;SPI Serial transfer complete interrupt.
		rjmp RS232Rec         	;Uart RX complete.
		reti           		;Uart TX data register empty.
		reti            	;Uart TX complete.
		reti           		;Analogue comparator interrupt.
 
		

 
;*************************************************************************
;* INITIERINGAR
;*************************************************************************
Reset:       
	
		

              	; **** Stack Pointer Setup Code ****  
		ldi 	r16, $02	; Stack Pointer setup 
		out 	SPH,r16		; Stack Pointer High Byte 
		ldi 	r16, $5F	; Stack Pointer setup 
		out 	SPL,r16		; Stack Pointer Low Byte 
		
		; **** UART Setup Code
		ldi	r16,$33		;=> 9600 vid 8MHz	
		out	ubrr,r16 	;till UART baudrate register
		ldi	r16,0b10011010	;RX interrupt
		out	ucr,r16		;till UART control register
		
		; **** Sleep Mode And SRAM  ****
		ldi 	r16,0b00000010	; Falling edge of IN0-> irq
		out 	MCUCR, r16	;  
   	
		; **** Comparator Setup Code ****  
		ldi 	r16,$80		; 
		out 	ACSR,r16	; Comparator Disabled to save power 	
		
 		; **** Port A Setup Code ****  
		ldi 	r16,0b11111111	; I/O direction values 
		out 	DDRA,r16	; Port A Direction Register
		ldi 	r16,$FF		; Init value 
		out 	PORTA,r16	; Port A value
                ; **** Port B Setup Code ****  
		ldi	r16,0b11111111	; I/O Direction Values 
		out 	DDRB,r16	; Port B Direction Register
		ldi	r16,0b11111111	; Init value 
		out 	PORTB,r16	; Port B value
                ; **** Port C Setup Code ****  
		ldi 	r16,0b11111111	; I/O direction values 
		out 	DDRC,r16	; Port C Direction Register
		ldi 	r16,$FF		; Init value 
		out 	PORTC,r16	; Port C value
		
		; **** Port D Setup Code ****  
		ldi	r16,0b00001011	; I/O direction values 
		out	DDRD,r16	; Port D Direction Register
		ldi 	r16,$00		; Init value 
		out 	PORTD,r16	; Port D value
	
		; **** Interrupt Setup Code **** 
		ldi	r16,0b01000010	;Int0 External Interrupt
		out	GIMSK,r16
		ldi	r16,0b0000000	;No Timer/Counter Interrupt
		out	TIMSK,r16

                sei                     ;Enable gobal iterrupt
                clr	SysAd
                clr	OldAd
                clr	SysCmd
                clr	Key
                ldi	UtData,$00	;Startläge för utdata
                rjmp	main
                
                
;*************************************************************************
;* Interrupt0
;*************************************************************************
IRQ0:  		    
		rcall	Delay450us	;Vänta 1/4 bit
		sbic	PIND,2		;kontrollera att det fortfarande är en nolla in
		reti			;om inte så var det nog bara brus => Hoppa tillbaka
		cbi	PORTB,4		;Tänd "IR mottagningsdiod"
		rcall	Delay1800us	;Vänta annars in första "riktiga" biten
		ldi	bitcnt,7	;Labba bitcnt för att läsa in de första 7 bitarna
		clr	SysAd 		;Nollställ "system"
SysLoop:	
		lsl	SysAd		;Rotera  "system" vänster
		sbis	PIND,2		;Testa INPINNE 
		sbr	SysAd,1		;Set bit 0 i "system" (inverterad)
		rcall	Delay1800us	;Vänta i 1.8mS
		dec	bitcnt		;Räkna ner antal bitar
		brne	SysLoop		;Loopa tills du hämtat 6
		clr	SysCmd		;Nollställ "command"
		ldi	bitcnt,6	;Labba bitcnt för att läsa in de nästa 6 bitarna
CmdLoop:	
		lsl	SysCmd		;Rotera  "command" vänster
		sbis	PIND,2		;Testa INPINNE 
		sbr	SysCmd,1	;Set bit 0 i "command" (inverterad)
		rcall	Delay1800us	;Vänta i 1.8mS
		dec	bitcnt		;Räkna ner antal bitar
		brne	CmdLoop		;Loopa tills du hämtat 6
		rcall	Delay1800us	;Vänta ut eventuella kvarvarande halva bitar
		sbi	PORTB,4		;Släck "IR mottagningsdiod"
	       	reti			;Återgå
	       	
	       	
	       	
	       	
	       	
;*************************************************************************
;*RS232Send
;*************************************************************************
RS232Send:
		sbis	usr,udre	;Vänta tills UART är redo
		rjmp	RS232Send
		out	udr,Data	;Kopiera "Data" till sendregistret
		ret			;Återgå
	


	

;*************************************************************************
;* MAIN
;*************************************************************************
main:     

		
		    	
		rcall	ScanRC5		;Läs av kommando från fjärr


		out	PORTA,UtData	
			 

                rjmp    main

	
	
	
	
	
	
	
	
;*************************************************************************
;* ScanRC5
;*************************************************************************
ScanRC5: 
		
		
		cp	SysAd,OldAd	;Jämför tidigare adress med ny (ny knapp?)
		brne	NewRC5		;är de olika -> nytt kommando
		ret			;är de inte olika så återgå
NewRC5:
		mov	OldAd,SysAd	;Spara undan nya adressen
		cpi	SysCMD,$01	;är kommandot "1"
		breq	RC5_1		;så hoppa till 1
		cpi	SysCMD,$02	;osv
		breq	RC5_2
		cpi	SysCMD,$03
		breq	RC5_3
		ret			;inget giltigt kommando -> återhopp
RC5_1:
		andi	UtData,$F0	;Nollställ 4LSB	(Peka ut adress "0")	
		ret			;återgå 
RC5_2:
		andi	UtData,$F0	;Nollställ 4LSB	
		ori	UtData,$01	;Peka ut adress "1"
		ret			;återgå 
RC5_3:
		andi	UtData,$F0	;Nollställ 4LSB	
		ori	UtData,$02	;Peka ut adress "2"
		ret			;återgå 










		
;*************************************************************************
;* Delay - rutiner    KLOCKADE i simulatorn för 8MHz (ej 1, 1800 & 450)
;*************************************************************************
Delay1us:;***********************************************	
	ldi	r16,$03		;Ladda r16 med 3 varv
LoopAV:		
	dec	r16		;Minska r16		
	brne	loopAV		;Loopa till r16 nått 0		
	ret



Delay40us:;***********************************************	
	ldi	r16,$6A		;Ladda r16 med 106 varv
Loop3:		
	dec	r16		;Minska r16		
	brne	loop3		;Loopa till r16 nått 0		
	ret			;Därefter återgå

Delay50us: ;*********************************************
	ldi	r16,$85		;Ladda r16 med 133 varv
Loop:	
	dec	r16		;Minska r16		
	brne	loop		;Loopa till r16 nått 0
	ret			;Därefter återgå
	
	
Delay450us: ;***********************************************
	ldi	r22,$09		;Ladda r22 med 9 yttervarv
LoopC:		
	ldi	r16,$85		;Ladda r16 med 133 varv
LoopD:		
	dec	r16		;  Minska r16		
	brne	loopD		;    loopa till r16 nått 0		
	dec	r22		;  Minska r22
	brne	loopC		;Loopa till r22 nått 0
	ret			;Därefter återgå
	
	

Delay1800us: ;***********************************************
	ldi	r22,$24		;Ladda r22 med 36 yttervarv
LoopA:		
	ldi	r16,$85		;Ladda r16 med 133 varv
Loop4:		
	dec	r16		;  Minska r16		
	brne	loop4		;    loopa till r16 nått 0		
	dec	r22		;  Minska r22
	brne	loopA		;Loopa till r22 nått 0
	ret			;Därefter återgå

	
Delay4ms: ;***********************************************
	ldi	r22,$2A		;Ladda r22 med 42 yttervarv
Loop1:		
	ldi	r16,$00		;  Nollställ r16 (256 innervarv)
Loop2:		
	dec	r16		;  Minska r16		
	brne	loop2		;    loopa till r16 nått 0		
	dec	r22		;  Minska r22
	brne	loop1		;Loopa till r22 nått 0
	ret			;Därefter återgå
	

RC5 fungerar så att den först skickar en adress. Som berättar vilken pryl som ska lyssna (TV, VCR, DVD, PVR)... och sedan data om vilken knapp som är nedtryckt.
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av strombom »

Angående oscilloskop så är jag helt såld på mitt usb-oscilloskop: http://bit.ly/dszTvT
Ingen svensk manual visserligen.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av Glattnos »

laban12: Tack så väldigt mycket! Det var guld värt! Din kod fungerar bra, fick dock ändra lite, som du sa, på grund av annan processor.
Dock så fick jag väldigt konstiga kombinationer av koder till en början. Tog ett tag innan jag förstod varför.
Din kod använde bara en start-bit(kan det vara RC5-Extended kanske). Min fjärr ger "standard" RC5 som har två start-bitar och en toggle-bit innan 5 adress-bitar. Men det var ju bara att lägga in "Delay1800us" två gånger till så fungerade det.

Jag har nu skrivit om så jag ser knapparnas värden binärt på en LCD-display istället för RS232.

strombom: Det där såg ju inte så tokigt ut, mycket prestanda för lite pengar.
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Re: Styra AVR:en med TV-fjärrkontroll?

Inlägg av laban12 »

Kul att kunna hjälpa till! :)
Skriv svar