Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem bei Erzeugung eines 36kHz Signals mit ATMega8


von Silk7 (Gast)


Lesenswert?

Hallo,

ich habe eine IR-Hinderniserkennung nach folgender Anleitung gebaut:

http://www.societyofrobots.com/member_tutorials/files/TSOP2.pdf

Dabei wird mit einem ATMega8/8MHz mit dem Timer2 ein 36KHz-Signal 
erzeugt.
TCCR2=0b00001010 bedeutet, das ein Prescaler von 8 und der CTC Modus 
verwendet wird.
Also zählt der Timer2 in einer Sekunde 1 Mio Schritte. Demzufolge dauert 
ein Schritt 1 Mikrosekunde. Bei Zählerstand=OCR2 wird ein Interrupt 
ausgelöst und die Zählung beginnt wieder bei 0.

Bei einer Frequenz von 36kHz muß der Ausgangspin aller 13,9 
Mikrosekunden toggeln -> 1/(36000*2)

OCR2 sollte doch dann den Wert 13 erhalten, oder?
Der Timer2 zählt von 0 bis 13 => 14 Schritte a 1 Mikrosekunde = 14 
Mikrosekunden.
Warum ist in dem Code der zehnfache Wert?

Seltsam ist, dass die Schaltung mit OCR2=139 funktioniert und mit 
OCR2=13 nicht?

Kann mir jemand erklären, ob ich hier einen Denkfehler habe.

Danke.

von kavalar (Gast)


Lesenswert?

...schon mal mit dem Oszi gemessen?

von Harald M. (mare_crisium)


Lesenswert?

Silk7,

die Formel für die Timer2-CTC-Interruptfrequenz als Funktion vom OCR2 
findest Du auf Seite 109 des Manuals. Bei MC-Takt = 8MHz, Vorteiler = 8 
einer gewünschten Frequenz von 2*36kHz bekomme ich da einen Wert von 
OCR2 = 6 heraus.

Ich würde auch die Fuses nochmal kontrollieren. Mir ist es schon 
vorgekommen, dass ich meinte, der MC liefe auf dem externen Quarz - 
tatsächlich war's aber der interne RC-Taktgenerator und mit einer ganz 
anderen Frequenz.

TCCR2=0b00001010 bedeutet auch, dass das Signal an Pin PORTB3 nicht 
ausgegeben wird. Nix Oskar.

Ciao,

mare_crisium

von Spess53 (Gast)


Lesenswert?

Hi

>die Formel für die Timer2-CTC-Interruptfrequenz als Funktion vom OCR2
>findest Du auf Seite 109 des Manuals. Bei MC-Takt = 8MHz, Vorteiler = 8
>einer gewünschten Frequenz von 2*36kHz bekomme ich da einen Wert von
>OCR2 = 6 heraus.

Nein. Mit VT=8 und 8MHz ist ein OC-Wert von 13 notwendig. Bei VT=1 
ergibt sich ein Wert von 110. Beides Mit Oszi überprüft. Der Wert 139 
aus dem Link passt maximal für VT=1 und einen stark verstimmten internen 
Oszillator.

>TCCR2=0b00001010 bedeutet auch, dass das Signal an Pin PORTB3 nicht
>ausgegeben wird. Nix Oskar.

Wieso?

>// timer 2 interrupt routine
>ISR(TIMER2_COMP_vect)
>{PORTC=PORTC^(flag); // if bit 3 of “flag” is set, PORTC3

Geht auch in Software. Doch Oskar.

Allerdings ist unklar, warum es beim TO nicht funktioniert.

MfG Spess

von Harald M. (mare_crisium)


Lesenswert?

Spess53 schrieb:
> Mit VT=8 und 8MHz ist ein OC-Wert von 13 notwendig.

damit hättest Du recht, wenn Silk eine Interruptfrequenz von 36kHz 
erzeugen wollte. Aber:

Silk7 schrieb:
> Bei einer Frequenz von 36kHz muß der Ausgangspin aller 13,9
> Mikrosekunden toggeln -> 1/(36000*2)

Damit der Ausgangspin mit 36kHz zwischen 0 und 1 wechselt, muss Silk ihn 
mit einer Interruptfrequenz von 72kHz togglen. Und für 72kHz muss er 
OCR2 = 6 nehmen. Klar?

Silk7 schrieb:
> TCCR2=0b00001010
Die Funktion des OCR2-Pins wird von COM20 (Bit4) und COM21 (Bit5) im 
TCCR2 bestimmt. Laut Tabelle 43 auf Seite 116 im Datenblatt:
COM20 = 0 und COM21 = 0 bedeutet: Normal port operation, OC2 
disconnected.
Ich hätte erwartet, dass Silk COM20 = 0 COM21 = 1 (Toggle OC2 on Compare 
Match) nähme. Es kann natürlich sein, dass er einen anderen Pin per 
Software toggeln will. Der ist dann wieder was für den Oskar.

Ciao,

mare_crisium

von Silk7 (Gast)


Lesenswert?

Harald M. schrieb:
> Ich würde auch die Fuses nochmal kontrollieren. Mir ist es schon
> vorgekommen, dass ich meinte, der MC liefe auf dem externen Quarz -
> tatsächlich war's aber der interne RC-Taktgenerator und mit einer ganz
> anderen Frequenz.

...genau hier lag das Problem.
Der MC lief nicht mit dem externen Takt.

Jetzt habe ich die Einstellungen auf einen externen Takt von 16MHz 
eingestellt (was auch angeschlossen ist). Mit einem kleinen Testprogramm 
kontrolliert -> LED blinkt im 1 Sekunden-Rhytmus.

OCR2=28 / Prescaler=8 (ca. 36kHz) war für den TSOP zu empfindlich. Bei 
OCR2=30 (ca. 33kHz) und den entspr. Pausen funktioniert es super.

Danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.