mikrocontroller.net

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


Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Erik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timmo H. (masterfx)
Datum:

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

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hier ein Beispiel:
SIGNAL(SIG_OUTPUT_COMPARE1B)
{
  PORTC++;
}


int main (void)
{


  DDRC = 0xff;              // Port C Ausgang
  PORTC = 0x00;              // Port auf Null

  DDRD = 0xff;              // PORT D ist Ausgang
  PORTD = 0x00;              // Port D auf Null


  OCR1BH = 0x00;
  OCR1BL = 0xfe;
  
  TCCR1A |= (1 << COM1B0);
  TCCR1B |= (1 << WGM12) | (1 << CS11) | (1 << CS10);
  
  
  TIMSK |= (1 << OCIE1B);
  sei();                  // Globaler Interrupt frei
  
  while(1)
  {

  }
}

Folgendes passiert: Nichts.

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

nach
  OCR1AH = 0x00;
  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?!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Erik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.