PUE noch mal zum Verständnis

achim S.

Mitglied
16. Jan. 2010
704
13
18
Berlin Biesdorf
Sprachen
  1. ANSI C
Sorry, muss noch mal fragen. An einem Attiny 841 betreibe ich 2 LEDs und 2 Taster.
Belegung:

// PA0 --> L2
// PA1 --> L3
// PB2 --> T2
// PA7 --> T3

DDRA=0b00000011; // Port A auf Ausgang schalten
DDRB=0b00000100; // Port B auf Ausgang schalten

PORTA=0b00000011; // Port A auf aus
PORTB=0b00000100; // Port B auf aus

Bisher verwende ich diese Einstellungen. Leider funktionieren ohne Widerstände nach Vcc die beiden Taster nicht. Mit Widerstände geht es ohne Probleme.
Wir hatten uns ja bereits über PUE unterhalten. Damit ich es richtig anwenden kann:

PUEA=0b10000000
PUEB=0b00000100

Ist das so korrekt?
achim
 
Den kennst Du sicher schon...

DDRA=0b00000011; // Port A auf Ausgang schalten
DDRB=0b00000100; // Port B auf Ausgang schalten
Damit aktivierst Du die Ausgangstreiber für A0, A1 und B2.
Dadurch legt das Bit im PORT-Register den effektiven Pegel des Beines fest. Bei allen anderen Beinen ist der Zustand des Port-Register-Bits wirkungslos.
PORTA=0b00000011; // Port A auf aus
PORTB=0b00000100; // Port B auf aus
Dadurch werden A0, A1 und B2 auf high Pegel geschaltet (sind ja Ausgänge). Wenn Du an B2 jetzt 'n Taster gegen Gnd schließt, hast Du 'n Kurzschluß - das schwächste Glied wird dann meiner Vermutung nach der Ausgangstreiber des Beins sein.
Wenn an ein Bein extern irgendwelche Pegel angelegt werden (insbesondere Vcc oder Gnd), muß das Bein immer Eingang sein...

Beim Tiny441/841 werden die Pullups nur durch die Pullup Enable Bits festgelegt - unabhängig von der Datenrichtung (DDR) oder dem aufgelegten Pegel (PORT). Insbesondere kannst (ist aber definitiv nicht empfohlen) Du also bei einem Bein den Pullup aktivieren, und gleichzeitig das Bein auf Ausgang-Low-Pegel schalten. Dann fließt intern Strom von Vcc über den Pullup über den Ausgangstreiber nach Gnd. Also über den Vcc-Pin rein, durch den internen Pullup, durch den internen Treiber und raus über den Gnd Pin. Bei 5V-Vcc fallen dabei über den Daumen 0,556mW im Controller ab, in Form von Abwärme...

PUEA=0b10000000
PUEB=0b00000100
Aktiviert die internen Pullups von A7 und B2.

Gilt aber alles nur, wenn die Register-Bits nicht durch aktivierte alternative Hardwarefunktionen Overidden werden...
 
Da hab ich ein Fehler drin:
// PA0 --> L2
// PA1 --> L3
// PB2 --> T2
// PA7 --> T3
Muss so sein:
DDRA=0b00000011; // Port A auf Ausgang schalten
DDRB=0b00000000; // Port B auf Ausgang schalten

PORTA=0b00000011; // Port A auf aus
PORTB=0b00000000; // Port B auf aus

PUEA=0b10000000 // R auf PA7
PUEB=0b00000100 // R auf PB2

Damit müsste es stimmen. Werde ich gleich fesstellen wenn es nicht raucht.
 
Deine Kommentare stimmen nicht.
schaltet A7..2 auf Eingang und A1..0 auf Ausgang
schaltet den ganzen PortB auf Eingang (wenn er das nicht schon vorher war)
Wenn nur bestimmte Bits festgelegt werden sollen, unabhängig von anderen, mußt Du entweder mit "Read-Mofify-Write" arbeiten, oder die Bits direkt zuweisen (sofern das Register das unterstützt).

Schaltet A1..0 auf High Pegel (da sie Ausgang sind), A7..2 würden auf Low geschaltet werden, aber wegen den DDR-Bits sind die Ausgangstreiber deaktiviert (Eingang). also haben die Bits keinen Effekt. Schaltest Du die Beine aber irgendwann auf Ausgang, werden die hier gesetzten Low-Pegel wirksam. Ich hatte ja oben das Bild verlinkt - die Einsen stehen zwar im Port-DQ-Latch, aber der Treiber ist wegen des DDR-Latches inaktiv. Wird die Datenrichtung geändert, schaltet der Treiber durch, ind das Port-Latch wirkt...
Würde analog dazu alle Ausgangs-Beine von PortB auf Low Pegel schalten - die sind aber eh alle Eingang, was im Port-Register steht ist (erstmal) Wurscht.

PUEA=0b10000000 // R auf PA7
PUEB=0b00000100 // R auf PB2
Hier werden entsprechend alle Pullups von PortA und PortB deaktiviert, außer die von A7 und B2 - die werden aktiviert.
 
Danke für deine Info. War also auf dem rechten Weg. Die Kommentare hatte ich vollkommen vernachlässigt. Werde sie im Programm gleich ändern. Hautsache ich habe das mit dem PUE endlich verstanden und korrekt angewendet.
achim
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)