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


von Karsten K. (karsten42)


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)


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)


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)


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
}

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.