www.mikrocontroller.net

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


Autor: julian (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Johannes,

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

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

Danke,
julian

Autor: julian (Gast)
Datum:

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

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.