Forum: Mikrocontroller und Digitale Elektronik Pullups am Atmega88 PORTD gehen nicht?


von Chris (Gast)


Lesenswert?

Hallo,

ich bin ratlos zwecks meiner Pullup Widerstände.

Folgender Code wird verwendet:
1
int main ()
2
{
3
  // Ausgänge einstellen
4
  DDRC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5);
5
  DDRB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5);
6
  DDRD |= (1<<DDD7) | (1<<DDD6) | (1<<DDD5);
7
  DDRD &= ~(1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
8
9
  // Pullupwiderstände der Taster
10
  PORTD |= (1<<PD0 | 1<<PD1 | 1<<PD2 | 1<<PD3 | 1<<PD4);
11
  PORTB |= (1<<PB6);

Das sollte auf alle Fälle dafür sorgen, dass die Pins PD0-PD4 EINGÄNGE 
sind UND DIE PULLUPS AN sind.

Ich weiß dass es doppelt ist, aber ich wollte auf Nummer sicher gehen.

Folgender Effekt tritt auf:
Der Pullup des Ports B (PB6) ist einwandfrei.
Der Pullup des Ports D (PB0) zieht nur auf 2,5 (von 3,3V) hoch.
Die Pullups am restlichen Port D, also PD1-4 ziehen gar nicht hoch.

Dementsprechend funktionieren natürlich auch die Taster nicht.

getestet an: Atmega88-20PU, Atmega168PV-10PU

Was mach ich falsch, sind die alternativ Funktionen von PortD 
angeschaltet? Wenn ja wo schalt ich sie ab?

Dank und Gruß
Chris

von Johannes M. (johnny-m)


Lesenswert?

Chris wrote:
> Folgender Code wird verwendet:
>
1
>   DDRD &= ~(1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
2
> //[...]
3
>   PORTD |= (1<<PD0 | 1<<PD1 | 1<<PD2 | 1<<PD3 | 1<<PD4);
4
>
> Das sollte auf alle Fälle dafür sorgen, dass die Pins PD0-PD4 EINGÄNGE
> sind UND DIE PULLUPS AN sind.
Wenn DDRD vorher garantiert auf 0x00 (Reset-Zustand) steht, dann ist 
zumindest die Zeile mit DDRD ohne Effekt. Ansonsten wird nur DDD4 
überhaupt verändert. Für den Rest fehlt eine Klammer. So wie oben wird 
nur (1 << DDD4) durch den Bitkomplement-Operator verarbeitet.

Außerdem hast Du bei allen Zugriffen die einzelnen Bitshifts geklammert, 
was immer empfehlenswert ist. Aber warum hast Du das ausgerechnet in der 
Zeile mit PORTD anders gemacht? Fällt Dir der Unterschied überhaupt 
nicht auf? Generell gilt: Lieber ein Paar überflüssige Klammern als ein 
Paar zuwenig, wenn man sich nicht sicher ist, in welcher Reihenfolge die 
Operatoren abgearbeitet werden.

von Chris (Gast)


Lesenswert?

Mmm, also an den Klammern usw. liegts definitiv nicht, denn Meine 
Ausgänge funktionieren alle Tadellos. Die anderen Eingänge ja auch - nur 
die am PortD nicht.

Ich hab aber mal den Code wiefolgt geändert:
1
  DDRC |= ((1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5));
2
  DDRB |= ((1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5));
3
  DDRD |= ((1<<DDD7) | (1<<DDD6) | (1<<DDD5));
4
  DDRD &= ~((1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0));
5
6
  //Pullupwiderstände der Taster
7
  PORTD |= ((1<<PD0) | (1<<PD1) | (1<<PD2) | (1<<PD3) | (1<<PD4));
8
  PORTB |= (1<<PB6);

Das sollte ja auf jeden Fall funktionieren - und JA ich weiß dass DDRD 
wahrscheinlich Effektlos ist. Ich weiß auch, dass PORTD anders 
geklammert war - aber wenn bei mir Fehler auftreten, versuche ich 
erstmal selbst alle Möglichkeiten durch bevor ich hier ins Forum poste, 
Ihr nicht?!

Allerdings weiß ich, dass es so oder so funktionieren müsste und auf 
jeden Fall so wie ich es jetzt stehen habe.

Der Effekt ist aber immernoch der gleiche? Was mache ich nun? Ich habe 
nur noch diese Eingänge frei.

Gruß
Chris

von Chris (Gast)


Lesenswert?

Weiß denn keiner einen Rat?

Ich hab gehört es gibt verschiedene Betriebsmodi der MPU - wo stelle ich 
die ein? Evtl. liegts daran.

Gruß
Chris

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.