Forum: Mikrocontroller und Digitale Elektronik Atmega8: Timer1 mit 2 CTC-Werten


von stefan-koch (Gast)


Lesenswert?

Hallo,

ist es möglich die Ports PB1 (OC1A) und PB2 (OC1B) unterschiedlich zu 
"schalten".

Also zwei voneinander unabhänginge PWM-Signale auf PB1 und PB2 mit dem 
Timer 1 auszugeben (ohne die Interrupt Service Routine (ISR) 
aufzurufen).

Mit 1nem PWM Signal funktioniert das ja so auf Port PB1:
1
//Timer 1
2
TCCR1A = (1<<COM1A0); //Toogle OC1A
3
TCCR1B = (1<<WGM12)|(1<<CS10); //Timer ein, Clock/1, CTC Modus
4
OCR1A = 32000;

Jetzt soll auf PB2 aber ein anderes Signal sein, auf PB1 das gleiche wie 
oben. Folgender Code sollte nicht funktionieren:
1
TCCR1A = (1<<COM1A0)|(1<<COM1B0); //Toogle OC1A
2
TCCR1B = (1<<WGM12)|(1<<CS10); //Timer ein, Clock/1, CTC Modus
3
OCR1A = 32000;
4
OCR1B = 64000;

Die LED sollte also auf PB1 doppelt so schnell blinken wie auf PB2.

Sinn sollte Sein für OC1A sollte auf OCR1A verglichen werden und für 
OC1B mit OCR1B, aber das geht nicht. Es steht eigentl. auch im 
Datenblatt das auf OCR1A verglichen wird. Für was ist dann OCR1B?

Was müsste verändert werden?

Danke

Stefan

von Uwe (Gast)


Lesenswert?

Es geht hier nur um einen Timer und zwei vergleichsregister. Diese 
können mit unterschiedlichen werten geladen werden und unterschiedliche 
aktionen am entsprechenden Pin herbeiführen. Beide benutzen jedoch den 
gleichen timer und laufen deshalb mit der gleichen Frequenz. Du kannst 
glaube ich bei PWM tricksen indem du den eineen im Fast PWM laufen läßt 
und den anderm im richtigen Up&Down Counting modus dann müßte der eine 
Doppelt so schnell wie der andere laufen. Wenn du jedoch im CTC modus 
bist wird die Frequenz von einem von beiden gesteuert und beeinflßt auch 
das andere Compare verhalten.

von Jörg G. (joergderxte)


Lesenswert?

Zwei CTC-Werte geht natürlich nicht - ein Timer kann nur bei einem 
Wert gelöscht werden, der höhere würde nie erreicht werden.

Zwei PWMs geht (natürlich): der jeweilige OC-Pin wird 
(an-/aus-)geschaltet, wenn der OC-Wert erreicht wird, der Timer läuft 
weiter bis Top und der Pin wird wieder geschaltet. Das geht bei allen 
PWM-Modi, bei denen der Top-wert fest ist.

von Stefan E. (sternst)


Lesenswert?

stefan-koch schrieb:
> Mit 1nem PWM Signal funktioniert das ja so auf Port PB1:
1
//Timer 1
2
TCCR1A = (1<<COM1A0); //Toogle OC1A
3
TCCR1B = (1<<WGM12)|(1<<CS10); //Timer ein, Clock/1, CTC Modus
4
OCR1A = 32000;
Nein. CTC mit Pin-Toggle ist kein PWM. Das ist einfach nur ein 50/50 
Signal, dessen Frequenz mit OCR1A variiert werden kann.

Also vielleicht erst mal präzisieren, was genau du tatsächlich haben 
willst.

von spess53 (Gast)


Lesenswert?

Hi

>Zwei PWMs geht (natürlich): der jeweilige OC-Pin wird
>(an-/aus-)geschaltet, wenn der OC-Wert erreicht wird, der Timer läuft
>weiter bis Top und der Pin wird wieder geschaltet. Das geht bei allen
>PWM-Modi, bei denen der Top-wert fest ist.

Das geht sogar mit variablen Top-Wert.

MfG Spess

von Uwe (Gast)


Lesenswert?

> Also zwei voneinander unabhänginge PWM-Signale auf PB1 und PB2 mit dem
> Timer 1 auszugeben (ohne die Interrupt Service Routine (ISR)
> aufzurufen).

> Die LED sollte also auf PB1 doppelt so schnell blinken wie auf PB2.

Wenn der eine im Fats PWM läuft und der Ander im Normalen sollte das 
gehen.
Aber nichts mit CTC

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Das was der TE sucht dürfte PWM-Mode 12 sein, siehe Datenblatt Seite 98.

Was OC1A bzw OC1B machen hängt dann vom jeweiligen "Compare Output Mode" 
ab siehe Datenblatt Seite 96

Edit:
sehe gerade
stefan-koch schrieb:
> Die LED sollte also auf PB1 doppelt so schnell blinken wie auf PB2.

Unterschiedliche Frequenzen gehen natürlich nicht.

von stefan-koch (Gast)


Lesenswert?

Also das mit dem doppelt so schnell ist nur ein Beispiel.
Letztendlich sollen statt einer LED Gleichstrommotoren über einen 
Transistor angeschlossen werden. Der eine Motor soll sich dann schneller 
drehen, der andere langsamer. Der Faktor muss dann nicht 2 sein, sondern 
eher so der eine Motor soll sich 10% langsamer drehen als der andere 
oder so.

Der eine Motor ist nun an PB1 und der andere an PB2 (über Transistor - 
und am Transistor sind 2 Motoren parallel geschaltet - was hierfür aber 
nicht wissenswert ist)

Ist das ohne ISR möglich?

von Stefan E. (sternst)


Lesenswert?

stefan-koch schrieb:
> Also das mit dem doppelt so schnell ist nur ein Beispiel.

Aber ein ziemlich schlechtes.

stefan-koch schrieb:
> Letztendlich sollen statt einer LED Gleichstrommotoren über einen
> Transistor angeschlossen werden. Der eine Motor soll sich dann schneller
> drehen, der andere langsamer.

Unterschiedlich schnell drehende Motoren und unterschiedlich schnell 
blinkende LEDs sind zwei verschiedene paar Schuhe. Dementsprechend ist 
dein bisheriger Code (mit CTC) auch für die Katz. Wenn du erst mal den 
Code mit LEDs testen willst, dann musst du die LEDs unterschiedlich hell 
leuchten lassen.

stefan-koch schrieb:
> Ist das ohne ISR möglich?

Ja, mit einem normalen PWM-Mode.

von stefan-koch (Gast)


Lesenswert?

Folgendes funktioniert zwar nicht doppelt so schnell (wie 
Ausgangsproblem). Aber bei diesem Beispiel leuchtet die LED an PB1 1/3 
der Zeit einer Periode und an PB2 leuchtet eine LED 2/3 der Zeit einer 
Periode. Also die Ports werden unterschiedlich angesteuert.
1
//Timer 1
2
  TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11)|(0<<WGM10); //CTC Modus
3
  TCCR1B = (1<<WGM13)|(1<<CS11); //Timer ein, Clock/8, CTC Modus
4
  OCR1A = 20000; // 256/2=128
5
  OCR1B = 40000;
6
  ICR1 = 60000;

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.