Forum: Mikrocontroller und Digitale Elektronik timer 1 als 2 x 8 Bit


von Ingo L. (grobian)


Lesenswert?

Ist es eigentlich möglich den Timer 1 im Mega 32 so zu nutzen, dass ich 
2 unabhängige 8 Bit-Timer habe die ich mit als PWM nutzen kann. Im 
Datenblatt geht zwar hervor, dass ich die OCR setzen kann, aber in wie 
weit nutzbar kann ich nicht für meine Zwecke nicht erlesen.

Gruß aus Berlin

von spess53 (Gast)


Lesenswert?

Hi

>Ist es eigentlich möglich den Timer 1 im Mega 32 so zu nutzen, dass ich
>2 unabhängige 8 Bit-Timer habe die ich mit als PWM nutzen kann.

Nein. Mit den 2 OC-Registern kannst du aber zwei PWM-Kanäle erzeugen.

>...aber in wie weit nutzbar kann ich nicht für meine Zwecke nicht erlesen.

Und deine Zwecke wären?

MfG Spess

von Ingo L. (grobian)


Lesenswert?

zwei PWM Kanäle 0-255 !!

von spess53 (Gast)


Lesenswert?

Hi

>zwei PWM Kanäle 0-255 !!

Je nach gewünschter PWM, Mode 1 oder 5 einstellen. Fertig.

MfG Spess

von grobian (Gast)


Lesenswert?

Gut ok, jetzt will das Funktionelle nicht so richtig im meine Birne.
Der Timer 1 hat ein 16 Bit Zähler der aus TCNT1H und TCNT1L gebildet 
wird.
Ich gehe mal davon aus (vllt liegt hier mein Verständnissfehler), dass 
TNCT1H für eine PWM zuständig ist und TCNT1L für eine PWM zuständig ist. 
Der Zähler bekommt seinen Takt vom Quarz, den ich über den Prescaler 
teile. Jetzt fängt der Zähler an zu laufen bis TCNT1L den Wert 255 hat 
und sollte ja jetzt wieder abwärts laufen. Wie bekommt den jetzt der 
TCNT1H seinen Impuls ? Die müssen doch irgendwie parallel laufen oder ?

von Karl H. (kbuchegg)


Lesenswert?

grobian schrieb:

> Der Timer 1 hat ein 16 Bit Zähler der aus TCNT1H und TCNT1L gebildet
> wird.

Ja

> Ich gehe mal davon aus (vllt liegt hier mein Verständnissfehler), dass
> TNCT1H für eine PWM zuständig ist und TCNT1L für eine PWM zuständig ist.

Nein.

Die PWM entsteht in dem der Zählerwert (der in TCTN1H und TCNT1L 
realisiert ist), mit einem Vergleichswert verglichen wird. Mit einem 
Timer kann man soviele PWM machen, wie es Vergleichsregister gibt, deren 
Ergebnis auch nach aussen herausgeführt wird.

OCR1A und OCR1B sind dafür verantwortlich, dass man mit dem Timer1 2 
Stück PWM machen kann. Wenn es ein OCR1C (samt zugehöriger 
Infrastruktur) gäbe, dann könnte man 3 PWM machen. Mit einem OCR1D wären 
es dann 4, etc, etc.


Vielleicht nochmal nachlesen und darüber sinnieren, wie PWM eigentlich 
funktioniert.

von grobian (Gast)


Lesenswert?

Gut, dass ist mir ja soweit klar, dass ich die Zähler mit den 
Vergleichsregistern (OCR) vergleiche und damit meine PWM am 
entsprechenden Ausgang erzeuge. Was nicht sitzt ist, dass der TCNH über 
den TCNL realiesiert wird, nähmlich erst dann wenn TCNL über 255 
gelaufen ist. Wenn der TCNL bei 255 wieder rückwärts läuft wie bekommt 
TCNH zu senem Takt ?

von spess53 (Gast)


Lesenswert?

Hi

>Was nicht sitzt ist, dass der TCNH über den TCNL realiesiert wird, nähmlich
>erst dann wenn TCNL über 255 gelaufen ist. Wenn der TCNL bei 255 wieder
>rückwärts läuft wie bekommt TCNH zu senem Takt ?

Das ist ein 16-Bit-Zähler. TCNTnL/TCNTnH zählen überhaupt nicht. Die 
dienen lediglich dem Zugriff auf die unteren/oberen 8-Bit des Zählers. 
Sieh dir einfach mal die Bilder (so ab Figure 40) im Datenblatt an, und 
versuche mal den Aufbau eines Timers zu verstehen.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

grobian schrieb:
> Gut, dass ist mir ja soweit klar, dass ich die Zähler mit den
> Vergleichsregistern (OCR) vergleiche und damit meine PWM am
> entsprechenden Ausgang erzeuge. Was nicht sitzt ist, dass der TCNH über
> den TCNL realiesiert wird, nähmlich erst dann wenn TCNL über 255
> gelaufen ist. Wenn der TCNL bei 255 wieder rückwärts läuft wie bekommt
> TCNH zu senem Takt ?

Wozu brauchst du TCNTH bei einer 8-Bit PWM?

Du kannst einen 5 stelligen Dezimalzähler bauen, der theoretisch von 0 
bis 99999 zählen kann. Wenn du ihn aber nur benutzt um ständig von 0 bis 
100 und wieder zurück zu zählen, so ist das ja auch ok. Du könntest wenn 
du wolltest, von 0 bis 10000 zählen lassen. Aber da er nur bis 100 
zählen will, kann er das selbstverständlich tun.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

grobian schrieb:
> Gut, dass ist mir ja soweit klar, dass ich die Zähler mit den
> Vergleichsregistern (OCR) vergleiche und damit meine PWM am
> entsprechenden Ausgang erzeuge. Was nicht sitzt ist, dass der TCNH über
> den TCNL realiesiert wird,

TCNH, TCNL? Du hast vermutlich A und B vergessen.

> nähmlich erst dann wenn TCNL über 255
> gelaufen ist. Wenn der TCNL bei 255 wieder rückwärts läuft wie bekommt
> TCNH zu senem Takt ?

Rückwärts läuft der Timer nur im Phase-correct-Mode, den braucht man 
aber nur sehr selten. Meist genügt der Fast-PWM-Mode, da läuft der Timer 
nur vorwärts.

Um mit beiden Compare-Einheiten (A und B) separate Tastgrade (duty 
cycle) einzustellen, muss man unterschiedliche Werte in die beiden 
Compare-Register (A und B) schreiben. Da der Timer 16-bittig arbeitet, 
müssen diese Werte natürlich auch 16-bittig sein.
Willst Du den Zählbereich des Timers begrenzen, dann schau Dir mal das 
ICP-Register an. Bei vielen AVRs kann man damit nämlich den Zählumfang 
begrenzen, also den "TOP-Wert" bestimmen. Ob der Mega32 dieses Feature 
bietet, weiß ich jetzt nicht, da musst Du mal im Datenblatt nachschaun. 
Der Nachfolger (Mega324) kann es vermutlich (bin jetzt zu faul zum 
Nachschaun).

MfG

von Karl H. (kbuchegg)


Lesenswert?

Du hängst immer noch dem Gedanken an, dass die eine PWM den TCNTL 
benötigt und die andere den TCNTH.

Das ist falsch!
TCNTL und TCNTH bilden eine Einheit. Das sind die 2 Teile, aus denen der 
eine Zähler TCNT1 besteht! Die beiden zusammen bilden den Zähler!

von Ingo L. (grobian)


Lesenswert?

Also wäre das jetzt eine Wald und Wiesen PWM, nicht Invertierend
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
6
DDRD = (1<<PD5) | (1<<PD4);     // PORT auf Ausgang
7
8
    // Mode 1
9
TCCR1A |= (0<<WGM11) | (1<<WGM10);
10
TCCR1B |= (0<<WGM13) | (0<<WGM12);  
11
12
  // nicht invertierend
13
TCCR1A |= (1<<COM1A1)| (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0);
14
15
TCCR1B |= (1<<CS01);         // Prescaler  = 8 und Start Timer
16
17
OCR1A = 0x0F;           // PWMA= 15
18
OCR1B = 0x20;           // PWMB= 32
19
  
20
while(1)
21
{
22
asm ("nop");
23
}
24
}

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.