Forum: Mikrocontroller und Digitale Elektronik Frequenzgenerator mit ATMEGA8 - C


von Dominik M. (gruwe)


Lesenswert?

Hallo,

ich bin Neuling in der Arbeit mit Mikrocontrollern, versuche derzeit 
aber mit einem ATMEGA8-16PU einen Frequenzgenerator zu bauen.
Die Frequenz möchte ich von 1Hz-1kHz in 1Hz-Schritten ändern können.

Aber erstmal möcht ich einfach nur mal eine Frequenz an einem Ausgang 
abgreifen können.

Dazu hab ich gelesen, dass man das mit einem Timer machen soll, am 
besten mit dem 16-bit Timer.
Habe mich auch mal in das AVR-GCC Tutorial eingelesen, nur fehlt mir im 
Moment irgendwie noch der Durchblick.

Mein Code sieht derzeit so aus:
1
int main(void)
2
{
3
DDRD = 0xC0;
4
PORTD = 0x00;
5
PORTB = 0xFF;
6
7
TCCR1A = (1<<COM1A1) | (1<<COM1A0); //Signal an OC1 wird invertiert
8
TCCR1B = (0<<CS12) | (1<<CS11) | (0<<CS10); //CPU-Takt/8
9
}

Jo, also so wie ich das bisher gelesen habe sollte das doch reichen.
Ist es nicht so, dass der Zähler nun mit einer Frequenz von 2MHz 
(16MHz/8) heraufzählt und dann beim Überlauf das Signal am Ausgang 
invertiert wird?
Oder verstehe ich das falsch?

Hab bisher auf jeden Fall am Ausgang andauernd 1-Signal anstehen.

Bin dankbar für jede Hilfe!

MfG

von Stefan E. (sternst)


Lesenswert?

> TCCR1A = (1<<COM1A1) | (1<<COM1A0); //Signal an OC1 wird invertiert

Nein.
Nochmal ins Datenblatt schauen.

von spess53 (Gast)


Lesenswert?

Hi

Jein. Dazu musst du noch den CTC-Modus einschalten. Also die WGM-Bits 
entsprechend setzen. Näheres im Datenblatt.

MfG Spess

von Dominik M. (gruwe)


Lesenswert?

Hallo,

also ich hab nochmal ins Datenblatt geschaut, die richtigen 
Einstellungen nun gewählt und CTC eingeschaltet.
1
int main(void)
2
3
TCCR1A = (1<<COM1A0) | (1<<WGM12);
4
TCCR1B = (0<<CS12) | (1<<CS11) | (0<<CS10):
5
6
while(1)
7
8
return 0;
9
}

Ergebnis:

Genau das Gleiche wie vorher!
An OC1 liegt weiterhin dauerhaft 1 an.

Bin hier irgendwie kurz vorm verzweifeln ;)

von spess53 (Gast)


Lesenswert?

Hi

OCR2 muss auch noch gesetzt werden. Z.B. 128.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Entschuldige:

>OCR2 muss auch noch gesetzt werden. Z.B. 128.

Muss natürlich OCR1H /OCR1L heissen (War beim falschen Timer). Evtl kann 
man in C das 16Bit-Register in einem Rutsch setzen. Ansonsten 
Reihenfolge beachten. Der wert sollte natürlich auch grösser werden, 
z.B. 0x8000.

MfG Spess

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.