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
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?
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)
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
Ja das meinte ich mit dem entsprechenden PWM Mode. Hab mich da unglücklich ausgedrückt.
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?!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.