RC5 Sende Routine

Was mir auch auffällt, wenn ich die Platine nen paar cm von meinem Empfänger weg halte ist der Empfang schon vorbei.
Du erkennst mit deinem Empfänger lediglich das Signal, also die Pulsfolge mit dem Träger? Wie verhält sich das mit einer Fernbedienung?

Kannst du das empfangene Signal mit einem IR Sensor, eventuell im Vergleich mit dem Signal von einer Fernbedinung, mit deinem "Oszi" prüfen?

Zur aufgebauten Hardware kann ich natürlich nichts sagen.

An deinem Code sehe ich soweit nichts mehr, wobei ich den etwas anders lösen würde. Aber bezüglich der Funktion ist es erst mal egal. Ich gehe auch davon aus, dass die Timingwerte vom Timer für die Trägerfrequenz stimmen, nachgerechnet habe ich nicht.
 
Wenn ich nicht ganz doof bin, sollten die Timer Werte doch passen? Das mit dem Toggeln ist doch soweit in Ordnung oder?
 
Das mit dem Toggeln ist doch soweit in Ordnung oder

Nach deinen Ozillogrammen könnte es stimmen, das Datenpaket ist in knapp 25ms gesendet. Trägerfrequenz kommt hin.
Was nicht richtig war, das waren die Bitpositionen, welche du übertragen hattest. ... und eventuell war das Signal invertiert.

Jetzt ist die Frage, was ist mit der Hardware. Reicht der Strom durch die SendeLED aus? Wie sieht das Signal aus, welches du nach einem Empfangstransistor misst?
 
Die IR Diode bekommt ~100mA gepulst.
Am Empfänger kann es nicht liegen, da meine Fernbedienung richtig ausgelesen werden.
 
Ich habe nun doch einmal die Timerwerte überschagen. Dies hast du zu deinem ersten Code geändert ...
OCR1A = (0x006E);

Damit erreichst du eine Periodendauer des CompareA Interrupts von ca. 6,88us, also 145kHz. Wenn du darin nun den IO-Pin für die SendeLED toggelst, sind das 72kHz. Also doppelt so viel wie du benötigst. Das geht dann so nicht. Da passt dann aber eigentlich auch dein Oszillogramm nicht mehr dazu.

Vielleicht stellst du noch einmal deinen aktuellen Code ins Forum.
 
Ich habe mir noch mal meinen Empfänger angeschaut, der Empfängt benötigt einen Carrier von 38kHz dieser scheint aber eine sehr große Bandbreite zu besitzen.
Hier noch mal mein aktueller Quellcode. Welchen Wert müsste ich denn OCR1A zuweisen?



CodeBox C

/*


* Send_RC5.c

*

* Created: 24.06.2015 16:58:52

* Author: Jan

*/



#defineF_CPU16000000

#defineRC5_HALF_BIT_TIME8// 8 * 110µs = 880µs

#defineRC5_SEND_ONPORTD|=(1<<PD1)

#defineRC5_SEND_OFFPORTD&=~(1<<PD1)

#defineRC5_SEND_TOGGLEPORTD^=(1<<PD1)

#include<avr/io.h>

#include<avr/interrupt.h>

#include<util/delay.h>

#include<stdbool.h>



voidrc5_send_command(uint16_tcommand);

voidrc5_send_one(void);

voidrc5_send_zero(void);

voiddelay_880(void);

voidrc5_modulation(void);

volatilestaticuint8_trc5_half_bit_cnt,rc5_state;

uint16_trc5_byte=0x00;

intmain(void)

{

DDRB|=(1<<PB7);

DDRD|=(1<<PD1);



// TCCR0A = (1<<WGM01); // CTC TIMER0

TCCR1B|=(1<<WGM12);// CTC TIMER1



// TCCR0B = (1<<CS01); // 8 ( ca. 110µs @ 16 MHz )

TCCR1B|=(1<<CS10);// 1 ( ca. 78 kHz @ 16 MHz )

// TIMSK0 = (1<<OCIE0A); // OutputCompare0A

TIMSK1=(1<<OCIE1A);// OutputCompare1A

OCR0A=0xE8;

OCR1A=0x00D2;

sei();





while(1)

{



rc5_send_command(0b11000000001000);// switch tv on

//_delay_ms(500);

}

}

/* send a 14 bit command to the IR - Receiver */

voidrc5_send_command(uint16_tcommand)

{

uint16_tsend_byte=command;



for(uint16_tx=0;x<14;x++)

{

if(send_byte&0x2000)

{

rc5_send_one();

}

else

{

rc5_send_zero();

}

send_byte<<=0x0001;

}

rc5_state&=~(0x80);

}

/* send a logical one to the Receiver ( 1 --> 0 ) */

voidrc5_send_one(void)

{

rc5_state|=0x80;

RC5_SEND_ON;

_delay_us(880);

rc5_state&=~0x80;

RC5_SEND_OFF;

_delay_us(880);

}

/* send a logical zero to the Receiver ( 0 --> 1 ) */

voidrc5_send_zero(void)

{

rc5_state&=~0x80;

RC5_SEND_OFF;

_delay_us(880);

rc5_state|=0x80;

RC5_SEND_ON;

_delay_us(880);

}

voiddelay_880(void)

{

while(1)

{

if((rc5_state&0x01)==0x01)

{

rc5_half_bit_cnt=0x00;

rc5_state&=~(0x01);

break;

}

}

}

/* called every 110 µs */

ISR(TIMER0_COMPA_vect)

{

rc5_half_bit_cnt++;



if(rc5_half_bit_cnt>=RC5_HALF_BIT_TIME)

{

rc5_half_bit_cnt=0x00;

rc5_state|=0x01;

}

}

/* 78kHz */

ISR(TIMER1_COMPA_vect)

{

if((rc5_state&0x80)==0x80)

{

RC5_SEND_TOGGLE;

}

else

{

RC5_SEND_ON;

}



}

 
Welchen Wert müsste ich denn OCR1A zuweisen?

Also 72kHz sind zu hoch.

Mit OCR1A = 208 kommst du auf 13,0625us; 1/t = 76555Hz
Wenn du mit dieser Periodendauer toggelst, sind es 38277Hz.
 
In deiner
ISR(TIMER1_COMPA_vect)
muss da nicht die SendeLED ausgeschaltet werden, wenn die Trägerfrequenz nicht da sein soll?
 
Habe ich auch schon probiert, ändert jedoch nichts. Ich weiß nicht mehr weiter.
 
Ich habe mal die Suchmaschine genutzt und folgendes gefunden: Der Burst sollte ein Puls-Pausenverhältnis von 1:3 oder sogar 1:4 haben.
http://www.sbprojects.com/knowledge/ir/rc5.php
(Hier würde sich wahrscheinlich ein Timer mit CTC und CompareOutput anbieten)


Dann überträgst du das Kommando 8d, das ist anscheinend die Taste "8"? Das ist dir bewust? Das TV Gerät möchtest du damit einschalten? Oder testest du noch mit einem Empfänger der dir den Code anzeigt?
 
Ich teste aktuell einfach nur den Sender. Mein Kommando kann daher abweichen. Das ein und ausschalten kommt dann später. Jetzt wo ich den Tester habe kann ich andere Codes senden.

Burst?
 
Okay, danke Dirk!
 
[...]Der Burst sollte ein Puls-Pausenverhältnis von 1:3 oder sogar 1:4 haben.[...]
Da wird aber nur nebenbei erwähnt, daß das die durchschnittliche Stromaufnahme senkt - nicht daß es erforderlich ist...
[...]Hier würde sich wahrscheinlich ein Timer mit CTC und CompareOutput anbieten.
Sag ich doch schon von Anfang an (#5). Nur eben FastPWM (begrenzt auf die gewünschte Frequenz). Das Umschalten zwischen Burst und aus dann über den Compare Output Mode...
Also nicht jedesmal die LED selbst an-/ausschalten, sondern nur festlegen ob sie flimmern soll oder nicht.
 
Zuletzt bearbeitet:
@LotadaC

Du meinst via. Konfigurationbit?
 
Ich benutze :

Diode : TSAL6100
Empfänger : TSOP34538
 
Sag ich doch schon von Anfang an (#5). Nur eben FastPWM (begrenzt auf die gewünschte Frequenz). Das Umschalten zwischen Burst und aus dann über den Compare Output Mode...
Also nicht jedesmal die LED selbst an-/ausschalten, sondern nur festlegen ob sie flimmern soll oder nicht.
Ich hatte ja auch schon erwähnt, dass ich es anders lösen würde. Und nun eben nochmal darauf hingewiesen, dass sich ein Timer mit OutputCompare anbietet, wenn man noch einen Dutycycle einstellen möchte. Aber das ist ja eigentlich egal, wenn der Fehler nicht am manuellen Toggeln liegt, sondern
- an einem falschen Kommando
- an einer zu hohen Trägerfrequenz
- an falsch übertragenen Bits
- am invertierten Signal
- ...?
Toggeln über OutputCompare bringt dann auch nichts, bzw. ist nicht die Lösung.

Wenn zwischendurch hier niemand in C weiterhelfen kann, schaue ich mal, ob ich das selber löse. Da werde ich aber erst Richtung Wochenende zu kommen.

Dirk :ciao:
 
Wenn du nur den internen RC-Oszillator verwendest, sind keine 16MHz möglich. Der Angegebene Systemtakt F_CPU und die Berechnung der Timer passen somit nicht.

Der interne RC Oszillator läuft mit 7,3MHz bis 8,1MHz wenn dann noch CKDIV8 programmiert ist, hast du 1MHz Systemtakt.

Also überprüfe mal, mit welchem Systemtakt nun dein Atmega2560 wirklich läuft. Wie man das schnell prüfen kann, wurde ja im Nachbarforum erklärt.
 
  • Like
Reaktionen: Janiiix3
Werde ich direkt nach der Arbeit tun. Bis heute Abend.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)