Forum: Mikrocontroller und Digitale Elektronik Timer in CTC mit A und !A Ausgang


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Karsten K. (karsten42)


Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Experten,

Ich möchte mit einem ATMEGA88A ein Rechtecksignal mit 50% Duty-Cycle und 
einer variablen Frequenz von 50kHz bis 220kHz mit zwei Ausgängen A und 
!A ( also ein 0° Signal und eins invertiert ) erzeugen. Die Frequenz 
soll in kleinen Schritten ( ca. 1kHz ) änderbar sein.

Dazu habe ich den Timer0 in CTC mode laufen, die Ausgänge OC0A und OC0B 
auf Toggle gestellt und kann mir mit OCR0A = OCR0B = Wert  die 
gewünschte Frequenz einstellen.
Jedoch scheitere ich daran, dass ich die Ausgänge nicht invertiert 
zueinander einstellen kann. Ein vorheriges Setzen des Port auf 1, dann 
die Datenrichtung auf Ausgang hat nicht geholfen. Im FastPWM ist eine 
invertierte Ausgabe natürlich möglich, jedoch kann ich hier nicht die 
Frequenz änderbar machen.

Gibt es doch eine Möglichkeit im CTC mode die Ausgänge invertiert 
zueinander einzustellen? Oder gibt es eine andere Möglichkeit meine 
Signale mit dem ATMEGA88A zu erzeugen?

Vielen Dank für Tips und Tricks :-)
Karsten

1
int
2
main(void)  {
3
4
  PORTD |= (1 << PD5);
5
  DDRD |= (1 << PD6) | (1 << PD5);
6
  
7
  // Init 8 Bit Timer0 COMP CTC mode every 62.5ns on 16.000000 MHZ
8
  TCCR0A = (1 << WGM01) | (1 << COM0A0) | (1 << COM0B0);
9
  TCCR0B |= (1 <<CS00); // No prescaling tic is 62.5ns
10
  OCR0A = 100; 
11
  OCR0B = 100;
12
13
14
  while(1);
15
16
  return(0);
17
18
}

von Maxim B. (max182)


Bewertung
0 lesenswert
nicht lesenswert
Karsten K. schrieb:

> Im FastPWM ist eine
> invertierte Ausgabe natürlich möglich, jedoch kann ich hier nicht die
> Frequenz änderbar machen.
>
> Gibt es doch eine Möglichkeit im CTC mode die Ausgänge invertiert
> zueinander einzustellen? Oder gibt es eine andere Möglichkeit meine
> Signale mit dem ATMEGA88A zu erzeugen?
>
> Vielen Dank für Tips und Tricks :-)
> Karsten

Du kannst PWM mit Timer1 erzeugen und Frequenz mit OCR1A ändern (Mode 11 
oder 15).

von Stefan E. (sternst)


Bewertung
0 lesenswert
nicht lesenswert
Karsten K. schrieb:
> Jedoch scheitere ich daran, dass ich die Ausgänge nicht invertiert
> zueinander einstellen kann. Ein vorheriges Setzen des Port auf 1, dann
> die Datenrichtung auf Ausgang hat nicht geholfen.

Ausgang auf "Set on Compare Match" konfigurieren, und ein "Force Output 
Compare" durchführen. Danach dann die eigentliche Timer-Konfiguration 
einstellen.

Beitrag #5343653 wurde vom Autor gelöscht.
von Karsten K. (karsten42)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Vielen Dank für die Hilfe.
Das Stichwort ist FOC0A. Ich bin noch nicht dahinter gekommen was das 
genau macht und warum man hier eine bestimmte Reihenfolge einhalten 
muss.
Aber immerhin funktioniert das jetzt..

Vielen Herzlichen Dank!
Karsten

1
int
2
main(void)  {
3
4
  DDRD |= (1 << PD6) | (1 << PD5);
5
  
6
  // Startup values for frequency
7
  OCR0A = 36; 
8
  OCR0B = 36;
9
  
10
  // Init 8 Bit Timer0 COMP CTC mode every 62.5ns on 16.000000 MHZ
11
  TCCR0A = (1 << WGM01) | (1 << COM0A0) | (1<< COM0A1) | (1 << COM0B1);
12
  TCCR0B = (1 << FOC0A) | (1 << FOC0B);
13
14
  // OC0A and OC0B to toggle
15
  TCCR0A = (1 << COM0A0) | (1 << COM0B0) | (1 << WGM01);
16
17
18
  // start the timer
19
  TCCR0B |= (1 <<CS00); // No prescaling tic is 62.5ns
20
21
22
  while(1);
23
24
  return(0);
25
26
}

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]
  • [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.