Wie am besten 32,768 kHz mit Atmel erzeugen?

Gast #1858842
Lesenswert?
• ▲
▼
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.
#1858854
Lesenswert?
• ▲
▼
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
Moderator Persönliche Seite #1858914
Lesenswert?
• ▲
▼
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. ;-)
Gast #1862472
Lesenswert?
• ▲
▼
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.