PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro - InfrarotDiode zum RC5 Code senden bringen



pentagonchicken
17.11.2005, 17:01
Hallo,
ich versuche gerade verzweifelt meinem Asuro das senden im RC5 code beizubringen.
Ich benutze die erweiterte asuro lib.
wenn ich die lib richtig verstanden haben müsste ich nur ocr2 auf 0xC7 setzen um ein Fast PWM signal zu erhalten, welches die ir diode für 6,9 µs anschaltet und für 20µs ausschaltet. Also mir ein 36 khz Signal im rc 5 norm erzeugt. anschließend muss ich nur noch um eine 1 zu senden die diode 899µs ausschalten und dann für 899µs ein. und bei einer 0 genau umgedreht. soweit hab ich es in meinem code verwirklicht.. nur das problem, es funktioniert nicht und ich finde den fehler nicht.

#include "asuro.h"
#include <stdlib.h>
#define lup 0x31df
#define ldown 0x31dd
#define chup 0x38f10
#define chdown 0x3811
void sendrc5(unsigned long int cmd){
DDRD |= (1<<DDD1);
OCR2= 0xC7;
int length=0;
while(length<=14){
PORTD |=(1<<PD1);
if(cmd & 0x2000){
TCNT0=0;
TCCR0=(1<<CS01) | (1<<CS00); //timer start
while(TCNT0<111);
while(TCNT0<222) PORTD &=~(1<<PD1);
}else{
TCNT0=0;
TCCR0=(1<<CS01) | (1<<CS00); //timer start
while(TCNT0<111) PORTD &=~(1<<PD1);
while(TCNT0<222);
}

length++;
cmd <<=1;
}
PORTD |=(1<<PD1);
}

int main(void)
{
int taste1=0,taste2=0;
Init();
StatusLED(GREEN);
while(1){
taste1=PollSwitch();
taste2=PollSwitch();
if((taste1 > 0) && (taste2 > 0) && (taste1==taste2)){
if (taste1==1){
StatusLED(RED);
sendrc5(ldown);
}
if (taste1==2){
StatusLED(GREEN);
DDRD |= (1<<DDD1);
sendrc5(lup);

}
if (taste1==4){
StatusLED(YELLOW);
sendrc5(chup);
}
if (taste1==8){
StatusLED(RED);
sendrc5(chdown);
}
}
}
return 0;
}

Vieleicht sieht ja wer anderst den fehler..

m.a.r.v.i.n
18.11.2005, 10:39
Hallo pentagonchicken,

lustiger Name. :cheesy:
Willkommen im Forum.
Ob in deinem Programm ein Fehler steckt kann ich dir leider nicht sagen,
kenne mich da zu wenig mit aus.
In folgendem Thread wurde aber schon mal erfolgreich RC5 Code mit einem AVR gesendet. Allerdings nicht mit dem Asuro.

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=7732

Hast du die Möglichkeit mit einem Oszilloskop nachzumessen?
Die Sendeleistung der IR Diode ist nicht alzu hoch, funktioniert nur auf kurze Entfernung.

Gruß Peter

pentagonchicken
18.11.2005, 17:44
ein oszi hab ich leider nicht zu verfügung.
hab auch schon probiert den asuro direkt an den fernseher zu halten und dann zu senden... hat aber nichts geändert.

waste
19.11.2005, 10:48
Hallo pentagonchicken,

im Ansatz ist dein Programm ok, sind nur einige kleine Fehler drin.
1. Ein Bit wird zuviel gesendet.
2. Phasenwechsel Low-High wird nicht ausgeführt
3. Pause zwischen den Paketen fehlt

Das korrigierte Programm ist im Code-Fenster. Bei mir funktioniert es. Musst nur die Tastencodes für lup und ldown wieder an deinen Empfänger anpassen, dann sollte es auch bei Dir funktionieren.

#include "asuro.h"
#include <stdlib.h>
#define lup 0x3010
#define ldown 0x3011
#define chup 0x38f10
#define chdown 0x3811

void sendrc5(unsigned long int cmd){
DDRD |= (1<<DDD1);
OCR2= 0xC7;
int length=0;
while(length<=13){
//PORTD |=(1<<PD1);
if(cmd & 0x2000){
TCNT0=0;
TCCR0=(1<<CS01) | (1<<CS00); //timer start
while(TCNT0<111) PORTD |=(1<<PD1);
while(TCNT0<222) PORTD &=~(1<<PD1);
}else{
TCNT0=0;
TCCR0=(1<<CS01) | (1<<CS00); //timer start
while(TCNT0<111) PORTD &=~(1<<PD1);
while(TCNT0<222) PORTD |=(1<<PD1);
}

length++;
cmd <<=1;
}
PORTD |=(1<<PD1);
Msleep(40);
}

int main(void)
{
int taste1=0,taste2=0;
Init();
StatusLED(GREEN);
while(1){
taste1=PollSwitch();
taste2=PollSwitch();
if((taste1 > 0) && (taste2 > 0) && (taste1==taste2)){
if (taste1==1){
StatusLED(RED);
sendrc5(ldown);
}
if (taste1==2){
StatusLED(GREEN);
DDRD |= (1<<DDD1);
sendrc5(lup);

}
if (taste1==4){
StatusLED(YELLOW);
sendrc5(chup);
}
if (taste1==8){
StatusLED(RED);
sendrc5(chdown);
}
}
}
return 0;
}

Übrigens OCR2 braucht nicht eingestellt zu werden, schadet aber auch nicht.

Gruß Waste

pentagonchicken
20.11.2005, 13:04
ah vielen dank jetzt funktionierts auch bei mir....
Gruß Pentagonchicken

waste
20.11.2005, 19:21
Gern geschehen!

Sag mal, will dein Asuro selbstständig fernsehen? :cheesy:

Waste

pentagonchicken
20.11.2005, 19:27
was ich genau damit machen will weiß ich noch net :)
hab nur gedacht eigentlich müsstes es doch möglich sein damit den fernseher zu steuern... naja :) und dann gibt man solange keine ruhe bis es geht :)

waste
20.11.2005, 20:19
Eine clevere Anwendung wäre z.B. das Fernsehverhalten der Kinder zu überwachen. Der Asuro überwacht mittels IR-Empfänger welcher Kanal eingestellt wird. Bei falschem Kanal wird der Sender gewechselt oder ausgeschaltet. Das wär doch was sinnvolles!

Gruß Waste

ICH_
20.11.2005, 20:22
Das ist wirklich eine gute Idee! "Mamaa, der Fernseher ist kaputt, da stellt sich dauernd ein anderer Kanal ein ..."

pentagonchicken
20.11.2005, 20:24
hehe :) oder man verwendet ihr als fernbedienungsersatz so dass man nur noch eine fernbedienung braucht um z.b dvd player und ferseher zu steuern..

Elle
30.01.2006, 14:22
hi wo gib es denn die stdlib.h zu downloaden ??
MFG

Elle

Vogon
30.01.2006, 20:45
Die solltest du schon haben denn sie gehört zur GCC Installation.
Schau mal in: C:\WinAVR\avr\include