Liebe Forengemeinde, ich schlage mich seit ein paar Tagen mit folgendem Problem herum: An einem ATMEGA 2561 möchte ich den PORTB, der auch die PWM-Kanäle beinhaltet, als einfachen i/o-Port nutzen. Leider schlägt dieses fehl, da ich trotz Deklaration als Ausgang diese nicht wie gewünscht nutzen kann. Auch manuell die Register, welche die PWM-Funktionalität beinhalten, auf 0 setzen, brachte leider nicht den erwünschten Erfolg. Was habe ich bei der Konfiguration übersehen? Gruß
Hallo Marco, poste doch mal dein Quellcode für die Konfiguration.
Grundsätzlich braucht man nur das Bit für jeden Ausgangspin im DDRx Register auf 1 setzen und natürlich die alternative Funktion ausschalten. In deinem Fall also die PWM Funktionen von den Timern 1 und 2.
Hier mal der Auszug mit der Konfiguration von PORTB /*Definieren der Ausgänge*/ DDRB |= (1<<DDB4) | (1<<DDB5) | (1<<DDB6) | (1<<DDB7); /*Setzen der Startwerte der Ports*/ PORTB |= (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7); TCCR0A &= ~(1<<COM0A0) | (1<<COM0A1) | (1<<COM0B0) | (1<<COM0B1); TCCR0B &= ~(1<<COM0A0) | (1<<COM0A1) | (1<<COM0B0) | (1<<COM0B1);
Marco G. schrieb: > TCCR0A &= ~(1<<COM0A0) | (1<<COM0A1) | (1<<COM0B0) | (1<<COM0B1); > TCCR0B &= ~(1<<COM0A0) | (1<<COM0A1) | (1<<COM0B0) | (1<<COM0B1); Du hast da ein paar Klammern vergessen, daher sind die Pins mit dem Timer verbunden.
Marco G. schrieb: > TCCR0A &= ~(1<<COM0A0) | (1<<COM0A1) | (1<<COM0B0) | (1<<COM0B1); > TCCR0B &= ~(1<<COM0A0) | (1<<COM0A1) | (1<<COM0B0) | (1<<COM0B1); Dir ist klar dass das das gleiche ist wie
1 | TCCR0A &= (~(1<<COM0A0)) | (1<<COM0A1) | (1<<COM0B0) | (1<<COM0B1); |
2 | TCCR0B &= (~(1<<COM0A0)) | (1<<COM0A1) | (1<<COM0B0) | (1<<COM0B1); |
und damit das gleiche wie
1 | TCCR0A &= 0xFF; |
2 | TCCR0B &= 0xFF; |
Und damit einfach gar nichts bewirkt?
Wieso eigentlich TCCR0B? Das ist nicht fuer die OC-Pins zustaendig. Auf PortB liegen OC-Pins von Timer 0, 1 und 2, also doch eher: TCCR0A &= ~(_BV(COM0A1) | _BV(COM0A0) | _BV(COM0B1) | _BV(COM0B0)); TCCR1A &= ~(_BV(COM1A1) | _BV(COM1A0) | _BV(COM1B1) | _BV(COM1B0)); TCCR2A &= ~(_BV(COM2A1) | _BV(COM2A0) | _BV(COM2B1) | _BV(COM2B0)); Nach einem Reset steht in den Registern aber sowieso 0.
Stefan Ernst schrieb: > Du hast da ein paar Klammern vergessen, daher sind die Pins mit dem > Timer verbunden. Danke, hatte ich glatt übersehen :( natürlich kann das so nicht funktionieren. Klammern eingefügt, schon geht's. Danke für die Hilfe, einen offensichtlichen Fehler zu korrigieren :)
@tassilo H. Ich dachte auch, dass eigentlich die Register nach einem Reset auf 0 stehen müssten. Laut Datenblatt reicht aber schon, im DDRB Register die entsprechenden Pins als Ausgang zu definieren. Das TCCR0B ist für den Output B der einzelnen Timer. Auch diese muss ich abschalten, da ich die Pins PB4 und PB6 auch als normale i/o's nutzen möchte.
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.