mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzgenerator mit ATMEGA8 - C


Autor: Dominik M. (gruwe)
Datum:

Bewertung
0 lesenswert
nicht 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:
int main(void)
{
DDRD = 0xC0;
PORTD = 0x00;
PORTB = 0xFF;

TCCR1A = (1<<COM1A1) | (1<<COM1A0); //Signal an OC1 wird invertiert
TCCR1B = (0<<CS12) | (1<<CS11) | (0<<CS10); //CPU-Takt/8
}

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

Autor: Stefan Ernst (sternst)
Datum:

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

Nein.
Nochmal ins Datenblatt schauen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Dominik M. (gruwe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also ich hab nochmal ins Datenblatt geschaut, die richtigen 
Einstellungen nun gewählt und CTC eingeschaltet.
int main(void)

TCCR1A = (1<<COM1A0) | (1<<WGM12);
TCCR1B = (0<<CS12) | (1<<CS11) | (0<<CS10):

while(1)

return 0;
}

Ergebnis:

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

Bin hier irgendwie kurz vorm verzweifeln ;)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.