Hallo Leute, ich habe hier eine vorgegebene Schaltung mit einem Atmega1281 und einem Drucksensor. Der Atmega1281 läuft mit 10MHz. Ich muss jetzt für den Sensor ein stabiles Taktsignal im Bereich zwischen 30 bis 35 kHz erzeugen. Die Taktleitung vom Sensor hängt beim Atmega am Pin PE5 (OC3C, INT5), das kann ich leider nicht mehr ändern. Wichtig ist, dass der Atmega allerhand im Hintergrund berechnet, ich aber trotzdem ein stabiles Taktsignal bekomme, mit möglichst wenig Jitter. Also toggeln fällt wohl aus. Wie man einen Timer auf die Frequenz programmiert, weiß ich... Aber wie bekommt man das Ausgangssignal auf den Pin? Bin für jede Hilfe dankbar.
Gerhard schrieb: > erzeugen. Die Taktleitung vom Sensor hängt beim Atmega am Pin PE5 (OC3C, > INT5), das kann ich leider nicht mehr ändern. OC3C also Output Compare vom Timer 3 Dann ist doch alles in Butter! Das müsste doch mit dem Teufel zugehen, wenn man den Timer nicht dazu bringt, diesen Pin ganz von alleine zu toggeln. > Wie man einen Timer auf die Frequenz programmiert, weiß ich... Aber wie > bekommt man das Ausgangssignal auf den Pin? Das kann doch der Timer ganz von alleine machen. Du musst ihn nur richtig konfigurieren. Details weiß das Datenblatt im Abschnitt über den Timer 3
@ Gerhard (Gast) >Wie man einen Timer auf die Frequenz programmiert, weiß ich... Aber wie >bekommt man das Ausgangssignal auf den Pin? Mit der Output Compare Funktion. RTFM. MFG Falk
Du mußt im Register TCCR3C die obersten 3 Bit angucken. Weiter bin ich auch noch nicht gekommen, -ein Datenblatt mit 444 Seiten kann einen schon weich machen... MfG Paul
Genauer, man muss zwei Dinge tun: . den CTC-Modus einschalten, damit der Timer sich nach Erreichen des compare match Wertes rücksetzt . das besagte "toggle on compare match" für den gewünschen Pin anschalten (den man aber noch manuell als Ausgang konfigurieren muss) Außerdem muss man natürlich die Taktquelle einschalten und einen compare match Wert vorgeben. ;-)
Danke, das hilft. Diese Timer können eine Menge und das Datenblatt ist etwas unübersichtlich, wenn man damit zum ersten Mal arbeitet. Ich tauche mal ab und probiere...
So Leute, danke! Natürlich habe ich zwischendurch noch etwas anderes gemacht, aber vorhin habe ich mich noch einmal an die Sache drangesetzt, das Datenblatt studiert und jetzt funktioniert es wunderbar:
1 | #define F_MCLK 32768
|
2 | #define OCR3A_VALUE F_CPU / 2 / 32768
|
3 | |
4 | void mclk_init(void) |
5 | {
|
6 | OCR3A = OCR3A_VALUE; |
7 | TCCR3A = (1<<COM3C0); |
8 | TCCR3B = (1<<WGM32) | |
9 | (1<<CS30); |
10 | PRR1 &= ~(1<<PRTIM3); |
11 | DDRE |= (1<<PINE5); |
12 | }
|
Natürlich muss das zweite 32768 noch durch F_MCLK ersetzt werden ;)
Du musst dabei allerdings aufpassen, wenn die Taktfrequenz kein vielfaches von 32768 Hz ist. Dann kriegst du Rundungsfehler. Außerdem hast du noch einen Fehler:
1 | #define OCR3A_VALUE F_CPU / 2 / F_MCLK
|
muss:
1 | #define OCR3A_VALUE F_CPU / 2 / F_MCLK - 1
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.