Forum: Mikrocontroller und Digitale Elektronik ATmega8 CLK/timer1 an OC1B


von julian (Gast)


Lesenswert?

Hallo,
ich möchte gerne per Timer mit Prescaler 64 aus dem 8MHz Takt eines 
ATmega8 ein 125khz Takt an einen Pin herausführen. Ich dachte immer es 
sei möglich passend zum Timer OC1B "mitschwingen" zu lassen, kann es 
aber jetzt beim besten willen nciht mehr hinbekommen...
Geht das so garnicht, bzw. muss ich manuell per Interrupt-Handler einen 
Pin auf Low/High schalten?
Danke,
Julian

von Johannes M. (johnny-m)


Lesenswert?

Das was Du vorhast, geht zwar im Prinzip (also was das hardwaremäßige 
Umschalten eines Portpins durch die Compare-Einheit angeht), aber nicht 
mit den von Dir genannten Einstellungen.

Die Compare-Einheit kann im CTC-Modus (den sollte man für sowas 
verwenden, wenn das Signal nicht pulsbreitenmoduliert werden soll) den 
Pin nur toggeln (also umschalten). Pro Periode des Ausgangssignals sind 
aber zwei Umschaltungen nötig. 8 MHz / 64 sind aber schon 125 kHz, was 
bedeutet, dass mit der Prescaler-Einstellung die maximal mögliche 
Frequenz am Output-Compare-Pin 125 kHz / 2, also 62,5 kHz beträgt.

Abgesehen davon muss der betreffende Pin selbstverständlich als Ausgang 
konfiguriert sein. Wenn das der Fall ist, sollte das eigentlich 
funktionieren (z.B. ohne Prescaler und 31 im Compare-Register).

EDIT:
Hatte überlesen, dass Du es an OC1B machen willst. Das geht nicht so 
einfach, weil CTC nur mit OC1A geht. Wenn das Signal unbedingt an OC1B 
ausgegeben werden muss, dann musste wohl oder übel ne PWM nehmen.

Und noch was: Beim nächsten Mal schickste bitte deinen bisherigen Code 
mit, damit man sieht, was Du da überhaupt machst.

von julian (Gast)


Lesenswert?

Hallo Johannes,

danke für die Tipps, ich habe das gerade mal probiert. Port OC1A ist 
auch ok...
Habe dazu folgenden Code benutzt:
1
DDRB = (1<<DDB1);
2
OCR1A = 31;
3
TCCR1A = (1<<COM1A0);
4
TCCR1B = (1 << CS10);
5
TIMSK |= (1<<TOIE1);                // enable timer

Damit bekomme ich allerdings genau 60Hz statt 125kHz am OC1A Ausgang. 
Mache ich noch etwas falsch?

Danke,
julian

von julian (Gast)


Lesenswert?

Habe das Problem schon gefunden, hatte den CTC-Modus vergessen, muss 
natürlich heißen:
TCCR1B = (1 << CS10) | (1 << WGM12);

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.