Forum: Mikrocontroller und Digitale Elektronik Port B eines ATMEGA2561 als einfachen i/o Port nutzen


von Marco G. (grmg2010)


Lesenswert?

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ß

von Gad Z. (gad)


Lesenswert?

Hallo Marco,
poste doch mal dein Quellcode für die Konfiguration.

von Gad Z. (gad)


Lesenswert?

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.

von Marco G. (grmg2010)


Lesenswert?

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);

von Stefan E. (sternst)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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?

von Tassilo H. (tassilo_h)


Lesenswert?

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.

von Marco G. (grmg2010)


Lesenswert?

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 :)

von Marco G. (grmg2010)


Lesenswert?

@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
Noch kein Account? Hier anmelden.