Timer in CTC mit A und !A Ausgang

OP #5343597
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
}
#5343608
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).
Beitrag #5343653 wurde von einem Moderator gelöscht.
OP #5343705
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

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.