PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC5 empfang klappt nicht



churchi
19.11.2004, 17:05
Hallo

Ich hab jetzt schon zig mal versucht einen Code zu schreiben um meinem ATMega128 mit 16Mhz den Empfang von RC5 Code beizubringen.
Es gibt zwar einige Versionen auch im Internet, jedoch bringe ich diese auch nicht wirklich zum laufen.
Früher wollte ich mal, dass der Empfang von RC5 einfach so nebensächlich abläuft, aber da ich das ja anscheinend nicht hin bekomme begnüge ich mich jetzt mal damit, dass er nur mal korrekt empfangen wird

Aber vielleicht ist hier ja so ein Genie, dass mir das jetzt endlich mal beibringen kann [-o<

Ich programmiere in CodeVision - ist zwar nicht AVRGCC, aber auch C O:)

hier mal der code:


#include <mega128.h>
#include <stdlib.h>

#include "uart.h";
#include "command.h";

unsigned long rc5_data = 0;
unsigned char rc5_laenge = 14;
unsigned int durchlauf = 0;
unsigned int laenge = 0;
unsigned char text[20];

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(++durchlauf == 16)
{
if(++laenge != rc5_laenge)
{
durchlauf = 0;
rc5_data << 1;

if(PIND.0 == 0)
{
rc5_data |= 1;
}
}
else
{
itoa(rc5_data,text);
Send_Str(text);
TCCR0 = 0x00;
}
}
}

void main(void)
{
PORTB=0x00;
DDRB=0xFF;

PORTD=0x00;
DDRD=0x00;

ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TIMSK=0x01;
ETIMSK=0x00;

#asm("sei")

init_uart();

while (1)
{
if(PIND.0 == 0)
{
TCCR0=0x02;
}
};
}


das Ausgeben des Ergebnisses auf UART ist nebensächlich - ich möchte nur gern den RC5 Code korrekt empfangen können.

Der TSOP hängt an PORT D Pin 0

Wenn möglich die Lösung auch für den CodeVision Compiler.


Hoffentlich kann mir jemand helfen. Danke im Vorraus.

churchi

Dino Dieter
19.11.2004, 19:24
Hallo

Schau dir mal den Code hier an. Habe den selbst schon im Einsatz gehabt.
Läuft ohne Probeme der Code, ist aber am Anfang aber nicht ganz leicht zu verstehen.

Ist aber nicht von mir !

http://www.mikrocontroller.net/forum/read-4-74473.html#new

Wenn du fragen hast, frage dann halt nochmal. So ganz so einfach, wie du es dir oben vorgestellt hast, ist es leider nicht.

MFG
Dieter

churchi
19.11.2004, 19:41
den Code hab ich auch schon vergeblich versucht einzubinden.
Die Umwandlung von dem AVRGCC Code in CodeVision Code hab ich geschafft - das is auch nicht schwer...

aber das mit dem umschreiben auf 16Mhz hat glaub ich nicht geklappt - auf jeden Fall kam nicht das Richtige raus...

Churchi

Dino Dieter
19.11.2004, 20:21
Hallo

Was hast du denn genau geändert ??
Du solltest nur

#define XTAL 16.00e6 //für 16 MHz einstellen

und dann noch anstatt
TCCR0 = 1<<CS02; //divide by 256

für den Mega 128

TCCR0 = (1<<CS02) | (1<<CS01) ; //divide by 256

einstellen. Und natürlich deinen PIN oben einstellen.

MFG
Dieter

churchi
19.11.2004, 21:20
Ich habe den Code angepasst, jedoch wird alle 0,03ms ein timer0 interrupt ausgelöst - ist das schon richtig? (gemessen über AVR-Studio)

laut den Einstellungen im TCCR0 müsste der Interrupt ja alle 4096us auftreten.

Der 1. Interrupt wird auch wirklich nach den 4096us aufgerufen (laut AVR Studio) -- 4096us=(1/(16000000/256))*256
Alle weiteren jedoch dann immer nach 0,03ms.

Ich denke, dass der Ausdruck TCNT0 = -2; nicht das tut was er soll.
Diese 0,03ms ließen sich nämlich daran erklären: 0,03ms=(1/(16000000/256))*2

Das heißt der Ausdruck TCNT0 = -2; lässt den Zähler nicht bis 256 zählen bis der Interrupt auftritt, sondern nur 2 mal.

Kann es sein, dass dies aufgrund der verschiedenen Compiler passiert?


edit:
da der Ausdruck TCNT0 = -2; nur bewirken soll, dass der Timer bis 512 zählen soll damit der Interrupt auftritt, habe ich jetzt einfach mal eine if Abfrage gemacht, die den Code erst beim 2. mal ausführt (if(++zaehler==....) - das währe dann das selbe als der Ausdruck TCNT0=-2; machen würde.

Jetzt ist es aber so, dass er erst alle 4096us in den Programmteil kommt.
Er sollte aber alle 1,78ms da rein kommen... :-s

Dino Dieter
19.11.2004, 23:06
Hallo
Der erste INT kommt nach 4096 µs das ist richtig, da der timer0 = 0 ist .

Alle weiteren INT kommen nach 32 µs. Ist auch richtig. Da timer0 mit TCNT= -2 mit 254 gelden wird. Das macht er deshalb, damit er besser sehen kann, wie oft der INT kommt. TCNT0 ist ja nur eine 8 BIT Variable und -2 entspricht 0xFE. Also der INT kommt nach 256 * 2 = 512 Takten = 32 µs.

Nach ändern deiner Frequenz und des Vorteiler auf 256 sollte das eigentlich laufen.

MFG
Dieter

churchi
19.11.2004, 23:34
ahsoo - dann stimmt der Kommentar bei TCNT0 = -2; gar nicht?
Da steht ja: // 2 * 256 = 512 cycle...

jedoch steht oben bei den defines:
#define PULSE_MIN (uchar)(XTAL / 512 * RC5TIME * 0.4 + 0.5)
da steht auch 512 drinnen??


leider funktioniert das noch immer nicht.

wie könnte ich jetzt herausfinden was der Fehler ist?
Ich habe jetzt auch schon andere Philips Fernbedienungen zum ausprobieren, aber mit keiner funktioniert es. :cry:

Dino Dieter
19.11.2004, 23:51
Hallo

Der Kommentar stimmt schon.

TCNT0 = -2; // 2 * 256 = 512 cycle...

In TCNT0 steht dann 254 drin. Nach 256 Takten erhöht sich TCNT0 auf 255. Nach weiteren 256 Takten erfolgt dann der Sprung von 255 --> 256 = 0 . Dann erfolgt der INT. Also 512 Takte !.

ei mir klappt das auch nur mit einer einzigen alten Fernbedienung. War auch schon am grübeln. Oder bau dir einen kleinen RC5 Sender. Habe noch einen ganz einfachen Code für einen Tiny 12 da. Aber in GGC.

MFG
Dieter

churchi
20.11.2004, 00:13
hmm - ich dachte der TCNT0 erhöht sich bei jedem Takt?
und wenn der TCNT0 auf 256=0 ist dann kommt der Interrupt?

Bis jetzt bin ich davon ausgegangen, dass das mit jeder Philips Fernbedienung funktioniert. - da dem anscheinend doch nicht so ist, werd ich mir dann wohl oder übel erstmal noch einen RC5 Sender basteln müssen :?

Könntest du mir den Code zukommen lassen?
Denn ganz so einfach stelle ich mir das RC5 Senden nicht vor - immerhin muss da erst ein 38khz Signal erzeugt werden auf dem dann der RC5 Code aufmoduliert wird... :-k

Auf jeden Fall mal Danke für die Hilfe!

churchi

Dino Dieter
20.11.2004, 00:34
Hallo

Hier der Code mal. Ist aber eine reine Testversion, läft zwar, ist aber nicht schön gemacht. Die UART Routinen habe ich raus genommen.

Timming mußt du vielleicht anpassen, asonsten ist der Code recht einfach gehalten.

MFG
Dieter

churchi
20.11.2004, 00:41
Danke! - den Sender werd ich mir jetzt erstmal bauen - hoffentlich klappts dann.

churchi

pebisoft
06.12.2004, 18:13
wenn du nebensächlich bestimmte elekronische überraschnungen einbinden möchtest in dein projekt, kauf dir "bascom". ich habe mich auch vorher mit "c" beschäftigt. wollte "ir-daten" versenden/empfangen, motoren steuern auf verschieden arten, funkübertragungset/video/audio bedienen, ultraschallsensoren betätigen (srf04,srf08), sharpsensoren auslesen,lcd-display ansteuern,relaiskarte ansteuern usw. usw. ich habe sehr viel zeit für die "c-sprache" aufgewendet, so das das projekt zu kurz kam und ich meine experiemente nie richtig mit genauen auswirkungen sehen konnte, weil immer wieder fehler im c-programm waren, die mir auch andere c-spezialisten nicht sagen konnten. dann bin ich auf bascom umgestiegen und es macht herrlichen spass die programmiespracher nur als nebensache zu verwenden und sich auf das projket zu konzentrieren.
mfg pebisoft

churchi
06.12.2004, 18:32
naja - ich bin von bascom nicht wirklich begeistert...
es hat mich einfach nicht so überzeugt

ich möchte möglichst alles schon selber ausprogrammieren weil ich denke nur so versteht man die Dinge am Besten und kann dann seine Funktionen noch weiter anpassen.
Bei Bascom sind diese Funktionen ja eigentlich nicht mehr erweiterbar oder anpassbar.

ursprünglich wollte ich ja mit assembler arbeiten, aber das hab ich mir sofort wieder abgewöhnt - so schwierig wollt ichs mir dann auch nicht machen.

C is da meiner Meinung nach so ein "Mittelding" zwischen "alles komplett selber" und "zu viel schon fertig".

Und: teilweise ist ja auch die Geschwindigkeit ein Thema: Mir kommts so vor, als währ da Bascom nicht das schnellste und kleinste.
C ist natürlich auch nicht immer das Schnellste, aber ich denke schneller und kleiner als Bascom.

Ich finde irgendwie, dass in Bascom schon zu viel automatisch dabei ist, und man nicht mehr wirklich programmieren können muss, sondern einfach nur noch die fertigen Sachen aneinanderreihen :-# - sry - is meine Meinung 8-[

Bitte korrigiert mich wenn ich falsch liege!

pebisoft
08.12.2004, 18:19
programmieren ist ja, das richtige aneinanderreihen, damit es funktioniert. wenn die reihenfolge nicht stimmt ,funktioniert auch der baustein nicht.
mfg pebisoft

churchi
08.12.2004, 18:34
programmieren ist ja, das richtige aneinanderreihen, damit es funktioniert. wenn die reihenfolge nicht stimmt ,funktioniert auch der baustein nicht.
mfg pebisoft

stimmt natürlich.
Ich find eh jeder soll einfach in der Sprache Programmieren die ihm am Besten liegt.
Jeder Compiler und jede Programmiersprache hat vor und Nachteile.

Ich werd mich vermutlich eh auch noch mit Bascom beschäftigen - oft is es ja eigentlich schon toll wenn man teilweise fertig programmierte Funktionen nehmen kann (siehe Codevision LCD Ansteuerung :-b )

08.12.2004, 20:29
hallo, ich habe an meinem küchenbrettroboter folgende baugruppen:
- 2x avr16 die miteinander kommunizieren und mit den einen habe ich auch noch
vom pc aus verbindung (rs232)
- 4x sharpsensoren die überwacht werden müssen
- 1x sr04 ultraschallsensor
- 1x relaiskarte mit 8relais
- 1x ir verbindung (powermid-funksender/empfänger 2,4 ghz) vom robby zum arbeitstisch
die gleiche verbindung zurück
- 1x pwm steuerung der 2 motoren
- 1x servoansteuerung für kamera
- 1x displayausgabe von daten zur kontrolle/fehlersuche
- 1x beschreiben und lesen eines i2c eeprom 24c256 (32kbyte)
der roboter schreibt messdaten von hindernisssen rein und ich frage diese
wieder vom pc aus eerpom wieder ab und lasse die mir zusenden
- fernbedienungsteuerung über eien fernsehfernbedienung, wenn der robby in meienr
reichweite ist
- den robby auf ir-bakensuche schicken, die ir-dioden habe ich im zimmer verteilt und der
robby muss diese nacheinander abfahren und mir das ergebnis senden.
dieses habe ich nicht in "c" geschafft zu programmieren.
in bascom habe ich hervorragende ergebnisse erzielt und kann mich jetzt auf
laser-sensoren konzentrieren, um damit abstände messen zu können.
so geht es weiter und weiter mit meinen elektronischen baugruppen,
ich habe noch nie soviel und schnell gelernt über die reaktionen der baugruppen,
dank bascom. jetzt versuche ich auch den robby mit "mswlogo" vom pc aus zu steuern.
logo habe ich jetzt erst kennengelernt, zufällig.
mfg pebisoft

churchi
08.12.2004, 20:47
den robby auf ir-bakensuche schicken

da is mir was unklar:
wie kann der robby zwischen verschiedenen Baken unterscheiden?
Strahlen die alle andere Bitmuster ab? - Wenn ja wie stellst du sicher, dass nicht mehrere Gleichzeitig senden?

pebisoft
10.12.2004, 00:34
ich habe am avr 8 relais (kontaktlos). das ir-signal besteht aus address(5bit) und command(5bit). jede ir-diode bekommt von ein relais die freischaltung, je nach address-nr. der avr steuert die immer nacheinander an und beginnt dann wieder von vorn. beim avr habe ich die 1. ir-diode, von da aus habe ich die anderen verteilt mit feinen kupferdraht 1/10mm als versorgungsleitung.
mfg pebisoft

pebisoft
10.12.2004, 09:18
korregiere: command(6bit)..................................... ....................
mfg pebisoft

churchi
10.12.2004, 13:39
ah - ok verstehe - du schaltest also schon jede Bake einzeln ein und aus...