Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem bei Timer 1 ATMEGA32


von Dennis (Gast)


Lesenswert?

Hallo zusammen,

ich verstehe nicht den Unterschied zwischen den beiden 
Vergleichsregistern OCR1A und OCR1B des Timer 1 beim Atmega32.

Vom Verständnis her müsste es doch so sein, dass mit OCR1B die Ausgabe 
am Pin PD4 und mit OCR1A die Ausgabe am Pin PD5 gesteuert wird.
Auf Seite 107 des Datenblattes von Atmel wird aber unter der Spalte TOP 
nur das A-Register, nie das B-Register aufgeführt.

Konfiguriere ich den Atmega so, dass der Wert im B-Register verglichen 
wird, funktioniert das nicht. Es erfolgt keine Umschaltung am Pin PD4 
und außerdem wird kein Interrupt ausgelöst.
Trotz des Vorhandenseins eines B-Registers muss ich für die Umschaltung 
des Pins PD4 das A-Register benutzen?!

Jetzt erkläre mir aber bitte jemand den Sinn und Zweck des B-Registers. 
Oder habe ich was falsch verstanden? Benutze auch noch das Buch 
"Mikrocomputertechnik Mit Controllern Der Atmell-AVR-Risc-Familie" von 
Günter Schmitt. Der hat meiner Meinung nach den Timer 1 in seinen 
erweiterten Betriebsarten auch nicht verstanden, wenn ich seine Tabellen 
mit der Doku von Atmel vergleiche. Wie dem auch sei.

Ich hab echt ein Verständnisproblem und wäre erfreut, wenn mir jemand 
einen Hinweis geben könnte, der mich weiterbringt.

Danke!


Grüße

Dennis

von Erik (Gast)


Lesenswert?

Hey wäre gut wenn du den Quelltext postest.

Meine erste Idee, was machen die Datenrichtungen der Pins D4 und D5 sind 
die auf Ausgang geschaltet?

von Timmo H. (masterfx)


Lesenswert?

Im Datenblatt (bei mir übrigens S.109) steht bei TOP/BOTTOM oben "Update 
of OCR1x" das "x" ist A bzw. B je nachdem wie du TCCR1x Register 
einstellst.

Du kannst mit OCR1A und OCR1B unterschiedliche Werte laden und die Ports 
verhalten sich entsprechen (Tastverhältnis) und zwar unabhängig 
voneinander, wobei die Frequenz dann gleich ist.
Wenn bei TOP das OCR1A steht betrifft das die anderen PWM Modi, wo der 
TOP bzw. BOTTOM vorgegeben werden soll. Wenn du beide "berechenbar" 
verwenden willst solltest du einen Mode-wählen der einen Festen TOP-Wert 
hat (also 0xFF,0x1FF, 0x3FF oder eben 0xFFFF)

von spess53 (Gast)


Lesenswert?

Hi

>Wenn du beide "berechenbar"
>verwenden willst solltest du einen Mode-wählen der einen Festen TOP-Wert
>hat (also 0xFF,0x1FF, 0x3FF oder eben 0xFFFF)

0xFFFF fest als Topwert gibt es nur im Normalmode. Für PWM geht das nur 
über OCR1A oder ICR1.

MfG Spess

von Timmo H. (masterfx)


Lesenswert?

Ja das meinte ich mit dem entsprechenden PWM Mode. Hab mich da 
unglücklich ausgedrückt.

von Dennis (Gast)


Lesenswert?

So, hier ein Beispiel:
1
SIGNAL(SIG_OUTPUT_COMPARE1B)
2
{
3
  PORTC++;
4
}
5
6
7
int main (void)
8
{
9
10
11
  DDRC = 0xff;              // Port C Ausgang
12
  PORTC = 0x00;              // Port auf Null
13
14
  DDRD = 0xff;              // PORT D ist Ausgang
15
  PORTD = 0x00;              // Port D auf Null
16
17
18
  OCR1BH = 0x00;
19
  OCR1BL = 0xfe;
20
  
21
  TCCR1A |= (1 << COM1B0);
22
  TCCR1B |= (1 << WGM12) | (1 << CS11) | (1 << CS10);
23
  
24
  
25
  TIMSK |= (1 << OCIE1B);
26
  sei();                  // Globaler Interrupt frei
27
  
28
  while(1)
29
  {
30
31
  }
32
}

Folgendes passiert: Nichts.

Ändere ich aber die Zeilen
1
  OCR1BH = 0x00;
2
  OCR1BL = 0xfe;

nach
1
  OCR1AH = 0x00;
2
  OCR1AL = 0xfe;

wird auf Pin PD4 (NICHT PD5!!!) die gewünschte Frequenz ausgegeben und 
der Interrupt funktioniert auch.

Es wird also das A-Register verwendet, um den Pin OC1B zu steuern.
Warum?!

von spess53 (Gast)


Lesenswert?

Hi

>Es wird also das A-Register verwendet, um den Pin OC1B zu steuern.
>Warum?!

Weil du mit

TCCR1B |= (1 << WGM12) | (1 << CS11) | (1 << CS10);
           ^^^^^^^^^^
CTC gewählt hast. Und das geht nicht mit 2 Compare-Registern. Lies das 
Datenblatt.

MfG Spess

von Erik (Gast)


Lesenswert?

Also ganz unabhängig laufen die beiden PWMs nicht.

OCR1A hat vorrang vor OCR1B. Du kannst OCR1B nicht höher/schneller 
einstellen als OCR1A.

Als Test kannst du ja den OCR1A auf maximum stellen und OCR1B auf die 
hälfte von OCR1A, dann mit nem Oszi vergleichen.

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.