Hi,
bei meinem Asuro-Roboter (http://de.wikipedia.org/wiki/ASURO) gibt es
eine Übertragung vom Atmega8L zum PC über Infrarot (Baudrate 2400) und
einen USB-Infrarot-Empfänger. Dabei ist die IR-Diode mit einem
Widerstand an PB3(MOSI/OC2) und an PD1(TXD).
Der Code dazu ist dieser:
Jetzt nöchte ich von einem Atmega32 Daten zum PC übertragen, wieder über
IR-Diode und -empfänger.
Wo muss ich denn nun die IR-Diode am Atmega32 anschließen? Muss ich an
der Übertragungsmethode etwas ändern?
Bisher habe ich schon versucht, die unveränderte Methode zu benutzen und
die Diode an PB5(MOSI) und PD1(TXD) anzuschließen, aber so hat der
IR-Empfänger leider nichts gemeldet.
Electric S. schrieb:> Dabei ist die IR-Diode mit einem> Widerstand an PB3(MOSI/OC2) und an PD1(TXD).Electric S. schrieb:> die unveränderte Methode zu benutzen und> die Diode an PB5(MOSI) und PD1(TXD) anzuschließen,
Siehst Du den Unterschied? Der Witz ist, dass das 2. Bein der IR-Diode
an einen Output-Compare Ausgang eines Timers anzuschließen ist, welcher
mit 36..40kHz toggelt.
Ah ok. Leider wusste ich nicht, ob am Atmega8 der MOSI oder der OC2
genutzt wird.
Also soll ich einfach mal die Diode an PD7(OC2) und an PD1(TXD)
anschließen?
Electric S. schrieb:> Also soll ich einfach mal die Diode an PD7(OC2) und an PD1(TXD)> anschließen?
Genau. Und Timer2 entsprechend konfigurieren, dass 36...40kHz-Pulse mit
50% Duty-Cycle entstehen. DDRD, 7 auf Ausgang setzen.
Knut Ballhause schrieb:> Genau. Und Timer2 entsprechend konfigurieren, dass 36...40kHz-Pulse mit> 50% Duty-Cycle entstehen. DDRD, 7 auf Ausgang setzen.
Ah ok.
Wie programmiere ich das? Bisher habe ich nur mit fertigen Funktionen
gearbeitet...
Das funktioniert mit TCCR2?
Da ich bisher noch nicht mit Timern gearbeitet habe, würde ich mich sehr
freuen, wenn Sie mir den Code für diese Funktion programmieren könnten.
Das sind vermutlich nur wenige Zeilen.
Electric S. schrieb:> Welche Frequenz hat er denn?
Alles zwischen 0...16Mhz. Intern 8, 4, 2 oder 1MHz, extern je nach Quarz
oder Oszillator. Die Fuses müssen u.U. umgesetzt werden. Fabrikneu läuft
das Teil mit relativ ungenauen, internen 1Mhz.
Kenn ich dein Projekt :)
Der hat das was du eventuell an Taktgeber im Schaltplan (Zaunpfahl 1!)
verbaut und dann in den AVR Fuses (Zaunpfahl 2!) eingestellt hast.
Woher kennst du mein Projekt? :D
Serieller schrieb:> Der hat das was du eventuell an Taktgeber im Schaltplan (Zaunpfahl 1!)> verbaut und dann in den AVR Fuses (Zaunpfahl 2!) eingestellt hast.
Aha. Du meinst die Pins XTAL1/2?
Da hängt nichs dran...
Welche Fuses eingestellt sind, weiß ich nicht, da ich mit einer IDE
arbeite, nicht mit den AVR-Compilern.
Electric S. schrieb:> Hi,>> Software-PWM für 36kHz habe ich im Internet gefunden:
Wozu willst du dir mehr arbeit machen als notwendig?
> Aber wie bekomme ich eine 36kHz PWM an den Pin OC0?
Fang endlich an, das Datenblatt deines Prozessors zu lesen!
Atmel hat da einen ganzen Abschnitt nur diesem Timer gewidmet.
Und nein: Ohne Datenblatt kommst du nicht weit.
In Ergänzung zum Datenblatt
AVR-TutorialAVR-GCC-Tutorial> Da ich bisher noch nicht mit Timern gearbeitet habe,
das ist keine Ausrede
> würde ich mich sehr> freuen, wenn Sie mir den Code für diese Funktion programmieren könnten.> Das sind vermutlich nur wenige Zeilen.
Eben.
Und es ist dir zuzumuten, dass du dir diese aus dem Datenblatt
zusammensuchst. Beim ersten mal dauert das noch ein wenig, aber mit
jedem mal diese Datenblattsektion ansehen, wirst du immer schneller beim
AUffinden der relevanten Information. Nebeneffekt: Du weißt was deine
Timer noch so alles können.
Guck Dir den CTC-Modus des Timers an. Stelle den OCxx-Pin (die beiden x
stehen für den betreffenden Timer und das A oder B des betreffenden
Komparators) auf 'Toggle on Compare', danit hast Du alles, was Du
brauchst. Das OCRxx-Register lädst Du mit einem Wert, der die
CPU-Frequenz so dividiert, dass der OCxx-Ausgang mit 36kHz umschaltet.
Ok, danke euch beiden.
Den Abschnitt im Datenblatt hab ich mir jetzt mehrmals durchgelesen,
dabei aber relativ wenig verstanden... Egal, ich versuche es weiter.
Auf der Seite rn-wissen.de habe ich diesen Code gefunden:
1
TCCR2|=(1<<WGM21);
Der Code schaltet anscheinend den CTC-Modus ein. Ist das richtig?
Damit ich einen 50%-Duty Cicle habe, muss ich in OCR2 den Wert 127
schreiben. Weiterhin muss ich den Pin OC2 als Ausgang schalten: