Verständnisproblem bei Timer 1 ATMEGA32

Gast #2107181
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
#2107202
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)
Gast #2107224
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
Gast #2107235
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?!
Gast #2107240
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
Gast #2107242
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren