www.mikrocontroller.net

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


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin ratlos zwecks meiner Pullup Widerstände.

Folgender Code wird verwendet:
int main ()
{
  // Ausgänge einstellen
  DDRC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5);
  DDRB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5);
  DDRD |= (1<<DDD7) | (1<<DDD6) | (1<<DDD5);
  DDRD &= ~(1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);

  // Pullupwiderstände der Taster
  PORTD |= (1<<PD0 | 1<<PD1 | 1<<PD2 | 1<<PD3 | 1<<PD4);
  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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris wrote:
> Folgender Code wird verwendet:
>
>   DDRD &= ~(1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
> //[...]
>   PORTD |= (1<<PD0 | 1<<PD1 | 1<<PD2 | 1<<PD3 | 1<<PD4);
> 
> 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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  DDRC |= ((1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5));
  DDRB |= ((1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3) | (1<<DDB4) | (1<<DDB5));
  DDRD |= ((1<<DDD7) | (1<<DDD6) | (1<<DDD5));
  DDRD &= ~((1<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0));

  //Pullupwiderstände der Taster
  PORTD |= ((1<<PD0) | (1<<PD1) | (1<<PD2) | (1<<PD3) | (1<<PD4));
  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

Autor: Chris (Gast)
Datum:

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

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.