PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IR LED takten



harry3
18.08.2007, 00:46
Hallo!

Wenn ich die IR LED anschalte mittels PORTB |= (1<<PB3); , ist dann die LED bereits mit 36kHz getaktet?

Wenn nein: Wenn ich die LED mittels der Funktion Sleep(1) in einer Schleife das eine mal einschalte und das andere mal ausschalte, so erhalte ich doch eigentlich nur eine Frequenz von 18kHz!?

Grüße,
Harri

harry3
18.08.2007, 01:09
DDRD |= (1<<PD1);
DDRB |= (1<<PB3);
PORTD &= ~(1<<PD1);

while(1)
{
if((Gettime()%1000)>500)
{
PORTB |= (1<<PB3);
StatusLED(GREEN);
}
else
{
PORTB &= ~(1<<PB3);
StatusLED(RED);
}
}

Und warum funktioniert dieser Code nicht? Die Statusled blinkt brav im vorgegebenen Rythmus, während die IR LED einfach die ganze Zeit leuchtet.

radbruch
18.08.2007, 01:29
Hallo

Der PB3 ist gleichzeitig auch der OC2, das bedeutet, du kannst ihn mit einem Timer ansteuern. Die serWrite()-Funktion macht das übrigens auch so. Auf der einen Seite (OC2) wird mit 72kHz umgeschaltet während der UART über TXD die Kathode der IR-LED im Rythmus der seriellen Daten gegen GND schaltet. So werden die Daten mit 36kHz moduliert.

Die Abstandsmessung von Waste (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11114) funktioniert auch so ähnlich. Allerdings steuert er noch zusätzlich die Helligkeit der IR-LED per PWM (glaube ich wenigstens).

Gruß

mic

A.Hoffmann
18.08.2007, 03:56
Hallo harry3

Der Timer 2 wird beim ASURO im CTC - Mode
( Clearte Timer on Compare Match ) betrieben. WGM21 = 1
Auserdem ist kein Prescaler eingeschaltet. CS20 = 1
Der Systemtakt von 8 Mhz liegt also am Timer an.
Das OCR2 Register wird mit 110 geladen.
Der Timer Zählt also von 0 bis 110 und schaltet dann den Ausgang um.
Von low nach high und umgekehrt. Der Counter beginnt wieder von
Null an zu Zählen. Der Systemtakt wird damit durch 110 geteilt, das egibt
annähernd die 72 kHz.
Für eine Phase sind zwei Halbwellen erforderlich, also 72 kHz / 2 = 36 kHz.
Für eine Frquenz von 18 kHz brauchst dur nur das OCR2 Register mit
220 laden.

Mfg
A.Hoffmann

harry3
18.08.2007, 15:50
Achso, jetzt geht mir schön langsam ein (infrarotes*g*)Licht auf:
Ich habe ja die Anode der IR LED ein/ausgeschaltet und die Kathode dauerhaft auf Masse gelegt. Das hat nicht funktioniert.
Nun schalte ich die IR LED mittels PD1 auf Masse oder auf +5V => somit kann ich die LED steuern.
Der Timer legt also IMMER an die LED den 36kHz Takt an, egal ob ich versuche, diesen PIN manuell zu verstellen(also dauerhaft auf HIGH/LOW) oder nicht.

Kennt jemand von Euch gute Tutorials zu dem Thema AVR? Das schwierige ist ja zu wissen, welches Register für was da sind. Sobald man das mal weiß ist es eh recht einfach.

Somit funktioniert nun mein RC5-Asuro: Ich kann einerseits RC5 Signale empfangen, andererseits nun aber auch welche versenden und Asuro somit als Fernsteuerung vewenden*g*

radbruch
18.08.2007, 16:23
Genau, jetzt hast du's.


Das schwierige ist ja zu wissen, welches Register für was da sind.
Das kommt von alleine je mehr man sich damit beschäftigt.

Gruß

mic

harry3
18.08.2007, 16:55
Das kommt von alleine je mehr man sich damit beschäftigt.


Es wird ja wirklich von Tag zu Tag verständlicher(vor allem jetzt mit AVR Studio wo man sich die ganzen Register bildlich anschauen kann).
Am Anfang hab ich außer Bahnhof bei den kryptischen Ausdrücken ja garnix verstanden. Ich hab mir außerdem Asuro Band 1 bestellt, da wird ja hoffentlich auch ein bisschen was in die Richtung erklärt. Das Buch werd ich mir dann nächstes WE bei einer längeren Zufahrt "reinziehen".

A.Hoffmann
19.08.2007, 08:55
Hallo harry3.

Eine Beschreibung der Register und wie man sie Verwendet, findest
du auf der Home Page von atmel.com.
Gib als Suchbegriff doc2486 ein.
Da wird nicht nur die Funktion der Register beschrieben, sondern
auch die Programierung in C und Assembler erklärt.

MfG
A. Hoffmann