PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuros IR an Mega32? [gelöst]



dark_flash01
14.11.2006, 15:34
Hallo Leute,
ich habe einen Asuro, daher hab ich den Infrarotempfänger. Ich habe mir nach der Schaltung im Asuro Wiki einen neues Gegenstück (also das am bot) gebaut.
http://asuro.pytalhost.de/pmwiki/uploads/Main/ir_interface.jpg
Nun möchte ich es anschliessen. Problem: Ich verwende einen Mega32 und keinen Mega8. Wie muss ich den Code (hier zu bekommen:
http://sourceforge.net/project/showfiles.php?group_id=155217&package_id=172835&release_id=379542
)
umschreiben um auch daten mit meinem Mega32 an den PC senden zu können?

Hoffe ihr könnt mir helfen...
Viele Grüße,
Sebastian

EDIT: Habe vorher schon die Suchfunktion benutzt bin aber nicht fündig geworden... also nicht sauer sein, wenns soetwas schonmal gab und ichs nicht gefunden habe ;)
--

uwegw
14.11.2006, 15:57
Andere Pins:
Die Anode der IR-LED+Widerstand an PBD7 des M32. Dieser Pin muss außerdem als Ausgang geschaltet werden.


Ich hab das System für meinen neusten Bot eigesetzt, zur Ansteuerung hab ich die Fleury-RS23-lib verwendet und die Erzeugung der Trägerfrequenz schnell selbst geschrieben.

Cornu
14.11.2006, 18:52
Ich habe ein ähnliches Problem.
Ich möchte die gleiche Schaltung an einen Mega8 anschließen, jedoch ist dort PB3 (MOSI/OC2) schon vom ISP belegt, kann mann diese Schaltung auch an PB1 (OC1A) oder PB2 (OC1B) anschöießen und dort die Frequenz generieren?
MfG Cornu

uwegw
14.11.2006, 19:08
Bei mir stören der ISP und die IR-Funktion sich nicht gegenseitig. Wenn der Programmiervorgang läuft, werden alle nicht dafür benutzten Pins am AVR abgeschaltet, sodass die IR-LED nicht stört, weil ihre Kathode nicht durch den TX Pin auf Masse gezogen wird.
Vorraussetzung dafür ist nur ein ordentlicher ISP, der seine Pins hochohmig schaltet, wenn der AVR sein Programm ausführt. Also kein Widerstandsgefrickel, sondern zumindestens einer mit Buffer-IC, oder nen 910er (den benutze ich).

Aber natürlich kannst du auch Timer 1 verwenden. Zur Not ginge auch Timer 0, aber da hätte man etwas Interruptlast, weil er keinen Output-Compare-Pin hat. Und wenn alle Stricke reißen, kann man natürlich auch noch nen 555 anklemmen, wie beim Tranceiver.

dark_flash01
14.11.2006, 19:13
@uwegw:
Könntest du mir den Code bitte gleich geben..?
Hat nichts mit Faulheit zutun. Es soll nur so schnell wie möglich funktionieren, damit wir weiter arbeiten können.

uwegw
14.11.2006, 19:17
ich seh grad, ich hab die Timer-Initialisierung doch aus der Yeti-Lib kopiert.

void initIR (void)
{//------------------------------------------------------------//
// Init Timer2, used for generating RS232 IR carrier signal //
//------------------------------------------------------------//
//prepare 36kHz for IR - Communication
//WGM21: waveform generation mode 2 => CTC mode => TOP = OCR2
// (Only counting up until value OCR2 (TOP) reached)
//COM20: Toggle OC2 on Compare Match
//CS20: No prescaling (so Timer2 clock frequency = 8MHz = 125ns)
TCCR2=(1<<WGM21)|(1<<COM20)|(1<<CS20);
//0x6E = 110, so frequency is 110 * 125ns = 13.75us = 72.727KHz
//as output is toggled, the real frequency is 72.727KHz / 2 = roughly 36KHz
OCR2=0x6E;
//reset timer2
TCNT2=0;
//enable tx-carrier signal (by switching 'carrier' port to output)
DDRB|=(1<<PB3);
}


Für den Mega32 müsste nur die letzte Zeile angepasst werden. Die eigentlichen Sende/Empfangsfunktionen brauchst du natürlich auch. Da werde ich die Tage die Fleury-lib auf halbduplex umstricken, weil es sonst Rückkopplungen zwischen Sender und Empfänger auf dem selben Board gibt.

Ein Tipp noch: schließ drei IR-Dioden in Reihe an (mit kleinerem Vorwiderstand), das gibt mehr Sendeleistung ohne zusätzlichen Energieverbrauch.

dark_flash01
15.11.2006, 15:06
Schreibst du schon?
Will ja keine Panik verbreiten... brauche es aber dringend... :)
Danke erstmal für die Hinweise bisher :))

dark_flash01
15.11.2006, 16:22
Achso und ich arbeite mit 16 Mhz statt 8. Da muss ich doch die Berechnung bei dem Counter irgendwie ändern, oder?

uwegw
15.11.2006, 20:18
OCR2=0xDE;

ansosnten könntest du auch die RS232-Funktionen vom Asuro anpassen...

dark_flash01
16.11.2006, 16:36
inwiefern muss ich die noch anpassen? Mit dem Mega32 kann ich doch auch den Timer 2 anschieben und am Pin PD7 die Frequenz abgreifen.
Aber das sollte dann funktionieren... Habe mir vorhin durch ein blödes kaputtes Netzteil meinen AVR zerhauen... :( Bestell mir erstemal n paar neue bei www.elektro-nix.de

Mal sehn wie schnell der 24-h-Lieferservice ist ;)
Hat jemand mit dem schon Erfahrung?

dark_flash01
22.11.2006, 09:13
Hast du den Code jetzt schon geschrieben? War nämlich nicht wirklich erfolgreich... und dann habe ich mir durch fehlerhaft verlötete Lichtschranken meine Spannungsversorgung und nen Mega32 zerknallt und durfte bis gestern auf ersatz warten.

dark_flash01
23.11.2006, 02:44
:) Habe es hinbekommen, hatte dummerweise nur den Interrupt in der Asuro-Lib übersehen. Weiterhin habe ich Peter Fleurys UART Lib benutzt.
Mein Code ohne die Lib von Fleury:

volatile unsigned char count36kHz;


SIGNAL (SIG_OVERFLOW2)
{
TCNT2 = 249;
count36kHz ++;
}

void InitIR (void)
{
TCCR2=(1<<WGM21)|(1<<COM20)|(1<<CS20);
OCR2=0xDE;
//reset timer2
TCNT2=0;
//enable tx-carrier signal (by switching 'carrier' port to output)
DDRB|=(1<<PD7);
}


Ich hoffe es nützt jemandem nochmal. Ist auf den Mega32 angepasst (PD7=OC2), "OCR2=0xDE;" auf 16 Mhz