Nogmaals Hallo :),

Ook hier heb ik me zot zitte op zoeken.
Ik zou dus graag een afstandsbediening maken of nog liever een gewone (tv..)afstandsbediening gebruiken om "vanalles" op afstand te besturen via een avr µC (atmega32/attiny2313).

Ik denk dat ik al op alle links op google heb geklikt omtrend dit onderwerp... maar ik kom er nog niet uit.

Zou iemand de werking eens (fatsoenlijk?) willen uitleggen + (nog belangrijker..) mij wat hulp bieden om de software te schrijven/gebruiken?

Ik weet dat de signaal op een gemoduleerd signaal wordt verstuurt van xxKhz.
Deze kunnen we dan met zo een bijhorende tsopxx ontvangen en verder gebruiken in de programma...

maar hoe en wat...? :'-(

Alvast bedankt,

Schoolvragen?
Wat heb je zelf al gevonden?
Misschien eens een cursusje google doen dan? Zo moeilijk is 't toch niet:
http://domotica.homeip.net/dimmer.html

[Bericht gewijzigd door Zonnepaneeltje op ]

Nee het zijn geen schoolvragen.
Ik zou dit voor men eigen willen kunnen...

Bedankt voor de link maar ik zou dus gewoon de tsop willen kunnen sturen dmv een gewone afstandsbediening.
Dus wat ik minimaal moet doen om zoiets te sturen.

in het kort:
Hoe kan ik een knopje van de tvafstandsbediening toewijzen op een microcontroller endan deze toets kan gebruiken om een bepaalde uitgang hoog te maken..

met vriendelijke groeten,

edit:
wat ik zelf heb gevonden...
Ik heb al verscheidene websites doorbladerd.. maar omdat ik niets heb gevonden wat me verder kon helpen, ben ik hier om hulp komen vragen.

Ik wil niet gewoon kant en klare asm code.. waar ik momenteel niet veel mee ben (omdat ik me deze zomer pas met asm ga bezig houden..).

Gewoon enkele dingen die ik zeker moet weten met wat info erbij van hoe het werkt en hoe het moet gemaakt worden met een avr µC.

Ik weet dat ik nogal veel wil :).
Daarom wil ik iedereen bedanken die me hier wat mee kan helpen.

//
ik heb zelf al een tsopje aan een labview daqkaartje gehangen endan met een gewone afstandsbediening tot het besluit gekomen dat ik idd een puls krijg op het moment dat ik op een knop druk.

ik heb zelf ook een IR ledje met (ik denk toch) een juiste frequentie laten "flikkeren" maar dat gaf dan weer geen puls op de uitgang. (hoe berekenen jullie deze freq.?)

Het grootste probleem heb ik met het feit dat er een bepaalde periode een lege ruimte moet voorzien zijn tussen de stuurpulsen...

Ik ben hier dus niet zonder enige voorbereiding iets komen vragen , indien u zich daar druk over zou maken.

[Bericht gewijzigd door lilpac op ]

http://pe1grl.khds.nl/RC5Dimmer.htm
Voor de hardware en het IR en RC5 gebeuren.
Als je geen asm wilt moet je de source maar wegdenken ;-)

@ lilpac: Kijk, nu ben je een stuk duideljker :)

Een IR-remote zend een bepaalde code uit.
Elke fabrikant heeft z'n eigen code.
Je zult dus uit moeten vissen welke code jouw afstandbediening gebruikt, zodat je diezelfde code kunt gaan herkennen met je uC.
hier staan veel codes in detail beschreven.
Klik op "technical info" voor een beschrijving van de exacte vorm van het signaal.

[Bericht gewijzigd door Zonnepaneeltje op ]

Jammer dat het asm is.
maar toch bedankt Jojo!
(als niemand me dit zou kunnen uitleggen in c..., dan zal ik moeten wachten tot wanneer k tijdens de zomer kan beginnen aan asm denk ik :) )

Op 14 mei 2007 18:59:16 schreef Zonnepaneeltje:
@ lilpac: Kijk, nu ben je een stuk duideljker :)

Een IR-remote zend een bepaalde code uit.
Elke fabrikant heeft z'n eigen code.
Je zult dus uit moeten vissen welke code jouw afstandbediening gebruikt, zodat je diezelfde code kunt gaan herkennen met je uC.
hier staan veel codes in detail beschreven.
Klik op "technical info" voor een beschrijving van de exacte vorm van het signaal.

Ben blij dat ik me heb kunnen verduidelijken Zonnepaneeltje :).

Ik heb hier een Philips afstandsbediening (tv) en een Orion afstandsbediening (microketen).
Orion:

Code		Function
----		--------
#02FC31CF	Standby
#02FD00FF	1
#02FC817F	2
#02FD807F	3
#02FC41BF	4
#02FD40BF	5
#02FCC13F	6
#02FDC03F	7
#02FC21DF	8
#02FD20DF	9
#02FC01FF	0
#02FD10EF	10+
#02FC916F	20+
#02FDB04F	Sleep
#02FD50AF	Vol-
#02FC51AF	Vol+
#02FD30CF	Mute

Ik heb nu niet al deze knopjes op deze remote staan maar.
Betekent dit:
Dat ik "#02FD20DF" ontvang op de mircocontroller wanneer ik op het knopje "9" druk?

Philips 'zegt':


The RC5 code:
-------------

The RC5 code is an 13-bit code, it used to have a 5-bits group and a
6-bits command, and 2 stop-bits, but it was changed to 5-bits group,
7-bits command and 1 stop-bit.

Old RC5:
data length: 14bit (2sync bits, 1 control bit, 11 data bits) 24,889ms


Carrier: 36kHz

No header.

		 +----+
1 is coded:      |    |
	    +----+    +
	      T    T

	    +----+
0 is coded: |    |
	    +    +----+
	      T    T

T = 889us

******************************************************************************
------------------------------------------------------------------------------
Commnd: Video mode: TV1 & TV2   Video mode: TXT         Video mode: VD
	Group 0 (TV1) 1 (TV2)   Group 2                 Group 3
------------------------------------------------------------------------------
  0     0                       0                       0
  1     1                       1                       1
  2     2                       2                       2
  3     3                       3                       3
  4     4                       4                       4
  5     5                       5                       5
  6     6                       6                       6
  7     7                       7                       7
  8     8                       8                       8
  9     9                       9                       9
 10     1/2/3 digs (japan:10)   step page +             =/= =/=
...
...

Hier kan ik dus totaal niet aan uit :).

De meeste (oude) philips afstandsbedieningen gebruiken het RC5 protocol. Ik heb hier ook al een keer uitgelegd hoe je dat moet ontrafelen.

De afstandsbediening zend dus een binaire code uit. Hiervoor gebruikt hij biphase encoding geloof ik. Het houdt in dat een klok en een data signaal door een xor poort zijn gehaald.
Het resultaat is als volgt; een 1 is een lage periode gevolgd door een hoge; een 0 is een hoge gevolgd door een lage.


1:     _____       0:_____
      |     |       |     |
      |     |       |     |
  ____|     |       |     |_____

De afstandsbediening zend eerst twee start bits. Dit zijn twee 1-en en worden gebruikt om de bittijden te bepalen.
De ontvanger merkt pas wat als je al halverwege de bit zit, omdat een 1 altijd begint met een lage periode.
Door te meten hoe lang het duurt voordat het signaal weer laag wordt weet je de halve bit-tijd.

Nu begint het echte onvangen. Je hebt net gewacht tot het einde van de eerste bit. Je zit nu dus aan het begin van de tweede. Als het signaal nu laag is, weet je dat er een laag-naar-hoog-overgang komt, dus is het een 1. Als het signaal hoog is, is het een 0.
Dit sla je op, en je wacht op de daadwerkelijke overgang. Als die er is, wacht je net zo lang als dat je eerst gemeten had aan het begin. Het is aan te raden iets langer te wachten, zodat je niet voor het begin van de volgende bit terecht komt. Als het goed is zit je nu aan het begin van de volgende bit, en het hele verhaal herhaalt zich. Als je erg lang moet wachten op de 'overgang' weet je dat het signaal voorbij is. Let wel op dat de uitgang van de tsop geïnverteerd is; hoog=laag en laag=hoog.

Het signaal is als volgt opgebouwd: na de 2 startbits komt een toggle bit, deze veranderd elke keer dat je een knop indrukt. Hierna komt er een adres van 5 bits en daarna een commando van 6 bits.
Hier staan de adressen en commando's.
Ook staat er op picbasic.nl iets soortgelijks volgens mij.

EDIT: Je kunt het beste dit in een interrupt zetten en de interrupt laten beginnen bij een dalende flank (high to low transition)

Bedankt voor de uitgebereide uitleg Infrarood!
Ik snap het theorie errond (denk ik :) ), maar hoe ik het juist moet 'doen' is het probleem.

Wat ik (stap voor stap) moet doen is:
-> tsop uitgang aan een Int. hangen. (bij een dalende flank).

Maar wat moet ik nu juist vergelijken?
commando: knop "1" komt nu overeen met "01" .
maar wat is dit "01" nu juist? ( een overgang van flanken?(denk ik).

adres: "TV1" => dit is de instelling opwelke de afstandsbediening is ingesteld?
-> Hoe kan ik nu bevoorbeeld zeggen:
als knop1 dan poortb hoog.

Is het zoiets als:
als "??" = "0001" then PORTB = hoog;

Bedankt voor de moeite!

Op 14 mei 2007 20:18:25 schreef lilpac:
Wat ik (stap voor stap) moet doen is:
-> tsop uitgang aan een Int. hangen. (bij een dalende flank).

ja

Maar wat moet ik nu juist vergelijken?
commando: knop "1" komt nu overeen met "01" .
maar wat is dit "01" nu juist? ( een overgang van flanken?(denk ik).

Ik begrijp niet helemaal wat je bedoelt. Als een lage periode wordt gevolgd door een hoge, dus 0->1, is dat een 1. Bedenk wel dat er zes commando bits zijn; 1 wordt dus 000001.

adres: "TV1" => dit is de instelling opwelke de afstandsbediening is ingesteld?

ligt er aan wat voor afstandsbedienig het is. De meeste hebben als adres 00000; dat is dus TV1.

-> Hoe kan ik nu bevoorbeeld zeggen:
als knop1 dan poortb hoog.

Is het zoiets als:
als "??" = "000001" then PORTB = hoog;

?? moet dan de variabele zijn waar de interrupt de onvangen waarde in zet.

Hallo Infrarood,

Het wordt alsmaar duidelijker!

Op de website wat je gaf (http://www.sprut.de/electronic/ir/rc5.htm) staat voor "1" het commando "01", voor 2 het commando "02",... en voor het adres bv :TV1 = "00" .
Daarom kwam ik op "0001", hoe kom je eigenlijk aan de andere 2 bits? (Ik begrijp dat er 6 commandobits zijn, maar de ontbrekende 2 vind ik nergens terug. Of moet je die soms opvullen met "00"?.)

Dus de waarde dat ik wil 'inlezen' die haal ik binnen bij de int ingang. bij elke int dat er optreed moet ik dus omzetten naar een binaire waarde?
Dus even een voorbeeld:
"Hoog->laag->hoog->laag->laag->hoog->laag" aan de int ingang zou mij "01010" geven.
Dit is gewoon een 'soort' teller die ik dan laat uitvoeren/optellen elke keer als de int wordt uitgevoerd op het einde van de commandoreeks reset ik de teller dan?

(nogmaals bedankt!)

Op 14 mei 2007 22:10:47 schreef lilpac:
Op de website wat je gaf (http://www.sprut.de/electronic/ir/rc5.htm) staat voor "1" het commando "01", voor 2 het commando "02",... en voor het adres bv :TV1 = "00" .
Daarom kwam ik op "0001", hoe kom je eigenlijk aan de andere 2 bits? (Ik begrijp dat er 6 commandobits zijn, maar de ontbrekende 2 vind ik nergens terug. Of moet je die soms opvullen met "00"?.)

Op die site zijn de decimale codes gegeven. Deze moet je dus omzetten naar binaire codes.

Dus de waarde dat ik wil 'inlezen' die haal ik binnen bij de int ingang. bij elke int dat er optreed moet ik dus omzetten naar een binaire waarde?
Dus even een voorbeeld:
"Hoog->laag->hoog->laag->laag->hoog->laag" aan de int ingang zou mij "01010" geven.
Dit is gewoon een 'soort' teller die ik dan laat uitvoeren/optellen elke keer als de int wordt uitgevoerd op het einde van de commandoreeks reset ik de teller dan?

Hoezo en wat moet je omzetten bij elke interrupt? Ik zie ook niet helemaal het verband tussen het voorbeeld en de teller.
Misschien heb je wat aan dit voorbeeld?
stel: signaal niet geïnverteerd door de tsop.
Elke periode is een halve bittijd.


laag->hoog -> laag->hoog -> hoog->laag
      1           1            0
       _____       _____ _____
      |     |     |            |
      |     |     |            |
  ____|     |_____|            |_____

Ook nog een voorbeeld interrupt code voor de pic, ik weet niet of je er veel aan hebt, maar ik heb er zo veel mogelijk commentaar bij gezet. Hier wordt dus wel rekening gehouden met het geïnverteerde signaal.


	org  	04h
	movwf	temp
	movf	command,w
	movwf	savecommand
	clrf	del
	clrf	adres	;initialising and saving variables used in this interrupt
	movlw	17
	movwf	counter	;amount of bits to be received, minus 1 for the start bit
defdel
	incf 	del,f	;{
	call	delay	;	define half-a-bit time
	btfss	PORTB,0	;	
	goto	defdel	;}
	movlw	8	
	addwf	del,f	;add a little extra time to ensure we don't go too fast
loop			;the actual bit receiving loop, until halfway between labels dell and false
	movf 	PORTB,w
	andlw	1	
	rlf 	command,f
	rlf	adres	;carry bit from bit 7 of command is rotated into bit 0 of adres, creating a 16 bit shift
	bcf	command,0	
	iorwf	command,f	;set bit according to bit 0 in w register, which is the actual state of the receive line
	movf	PORTB,w	
	andlw	1
	movwf 	change	;save current state of B0
	movlw	255
	movwf	countdown
wachtopverander
	decfsz	countdown,f
	goto 	skip		;check if we are waiting too long
	goto 	false		;if so, the signal stopped before we reached the last bit.
skip
	movf	PORTB,w
	andlw	1
	subwf	change,w	;compare current state of B0 to previous state
	btfsc	status,z	
	goto	wachtopverander	;if still not changed; start again
	movf	del,w
	movwf	countdown	;initialise delay if changed
dell
	call 	delay
	decfsz	countdown	;delay loop
	goto 	dell
	decfsz  counter		;if we have received 17 bits, we are finished
	goto 	loop
	movlw	1
	subwf	adres,w
	btfss	STATUS,z
	goto 	false		;another check; if the adress isn't 1, we jump to false
	movf	temp,w		;restore w
	bcf     INTCON,1	;clear interrupt flag
	retfie			;return
false
	movf	savecommand,w	;a fake signal arrived, so all variables are restored; command and w.
	movwf	command
	movf	temp,w
	bcf     INTCON,1
	retfie
delay
	movlw 	9
	movwf	flup
	decfsz  flup
	goto	$-1
	return