Hallo Forum,
habe nach Recherche von
http://www.atmel.com/Images/Atmel-8272-8-bit-AVR-microcontroller-ATmega164A_PA-324A_PA-644A_PA-1284_P_datasheet.pdf
nicht genau herausfinden können, was diese AVR Prozessoren (z.B.
Atmega164 oder -328) für Output Ports haben:
Sind es
- Push-Pull (für mich Gegentakt Ausgangsstufen/ Komplementärstufe) oder
- open drain oder
- was ganz anderes.
Der Umstand, dass man einen PullUp Widerstand auf dem Chip aktivieren
kann, spricht für Open Drain.
Wo kann ich das schwarz auf weiß nachlesen?
Danke für Hinweise, Laedi
14.1 :
"Each output buffer has symmetrical drive
characteristics with both high sink and source capability."
Bei Electrical Characteristics kann man das auch sehen: Gleiche Ströme
für Sink und Source.
Sind also PushPull.
Die Pullups sind für Eingänge da.
In dem von Dir verlinkten PDF findest Du auf den Seiten 318 und 319
Angaben zur Output Low/High Voltage und Hinweise, das die I/Os strom
sourcen und sinken können.
Das lässt eigentlich nur Push-Pull aus Deiner Lösungsliste zu.
Die Pull-Up Widerstände lassen sich für die I/Os nur in
Eingangskonfiguration zuschalten.
Stefan P. schrieb:> Die Pull-Up Widerstände lassen sich für die I/Os nur in> Eingangskonfiguration zuschalten.
Was für neuere AVRs aber nicht mehr stimmt. Dort gibt es getrennte PUE
Register welche das Zuschalten des PullUps immer erlauben. z.B. Tiny841.
Hi Stefan und Cyberlord,
danke für die schnelle Antwort. Habe bei meiner Suche
nach "Push-Pull" und "open" gesucht und nichts gefunden. Gut, dass es
Leute gibt, die die 600 Seiten Doku so gut kennen.
Vielen Dank,
Laedi
Der hat doch ein TWI Modul mit dem sich auch I2C realisieren lässt.
Eigentlich müsste dafür der Pin Open-Dain können.
Warum steht davon nichts im Datenblatt?
Noch einer schrieb:> Eigentlich müsste dafür der Pin Open-Dain können.
Open drain = Wechsel zwischen pull auf low oder offener Eingang
Mit der Einschränkung zum "echten" open drain, daß der High-Pegel < VCC
+0.6 V sein muß.
Noch einer schrieb:> Der hat doch ein TWI Modul mit dem sich auch I2C realisieren lässt.> Eigentlich müsste dafür der Pin Open-Dain können.>> Warum steht davon nichts im Datenblatt?
Es gibt µController, die in ihrer Pinsteuerung explizit Open Drain drin
stehen haben. Weil man da die Pins so einstellen kann, dass ein Output
Pin als Open Drain arbeitet.
Und es gibt welche, die keine explizite Fähigkeit zu Open Drain haben.
Aber die es ihre Pins dennoch nutzen können, indem man den Pin nicht als
Ausgang auf 0 und 1 setzt, sondern zwischen Ausgang=0 und Eingang
umschaltet. Hier kann aber wichtig sein, dass Ausgangs- und
Eingangsregister verschieden sind, was bei manchen alten Controllern
nicht der Fall ist.
Noch einer schrieb:> Der hat doch ein TWI Modul mit dem sich auch I2C realisieren lässt.> Eigentlich müsste dafür der Pin Open-Dain können.>> Warum steht davon nichts im Datenblatt?
Es gibt µController, die in ihrer Pinsteuerung explizit Open Drain drin
stehen haben. Weil man da die Pins so einstellen kann, dass ein Output
Pin als Open Drain arbeitet.
Und es gibt welche, die keine ausdrücklich erwähnte und konfigurierbare
Fähigkeit zu Open Drain haben. Aber die es ihre Pins dennoch nutzen
können, indem man den Pin nicht als Ausgang auf 0 und 1 setzt, sondern
zwischen Ausgang=0 und Eingang umschaltet. Hier kann aber wichtig sein,
dass Ausgangs- und Eingangsregister verschieden sind, was bei manchen
alten Controllern nicht der Fall ist.
Noch einer schrieb:> Der hat doch ein TWI Modul mit dem sich auch I2C realisieren> lässt. Eigentlich müsste dafür der Pin Open-Dain können.
Nicht nur eigentlich. Sobald man das TWI einschaltet, werden die SDA und
SCL Pin-Treiber auf Open Drain umkonfiguriert.
> Warum steht davon nichts im Datenblatt?
Das steht sicher irgendwo. Im Datenblatt des ATmega8 steht es unter
"Alternate Port Functions"
A. K. schrieb:> Hier kann aber wichtig sein, dass Ausgangs- und Eingangsregister> verschieden sind, was bei manchen alten Controllern nicht der Fall ist.
Du sprichst in Rätseln.
Wenn man bei der Initialisierung das Bit im Ausgangsregister auf 0 setzt
und mit seinen Daten das Datenrichtungsregister füttert, benutzt man den
unteren FET der PushPull-Ausgangsstufe als Open Drain.
Werner M. schrieb:>> Hier kann aber wichtig sein, dass Ausgangs- und Eingangsregister>> verschieden sind, was bei manchen alten Controllern nicht der Fall ist.>> Du sprichst in Rätseln.> Wenn man bei der Initialisierung das Bit im Ausgangsregister auf 0 setzt> und mit seinen Daten das Datenrichtungsregister füttert, benutzt man den> unteren FET der PushPull-Ausgangsstufe als Open Drain.
Bei Controllern mit gemeinsamem Ein/Ausgangsregister (z.B. alte PICs)
greift man beim Lesen eines Eingangspins auf den Zustand des Pins zu,
nicht auf den Zustand des Ausgangsregisters. Dennoch werden
üblicherweise alle Bits des Ausgangsregisters beim Schreiben gesetzt,
egal ob sie tatsächlich Ausgänge sind oder nicht.
Wenn man auf einem solchen Port eine read-modify-write Operation
durchführt, dann werden alle Bits des Ausgangsregisters, die gerade
Eingänge sind, so nebenbei auf Zustand des Pins gesetzt. Wenn also ein
1-Wire Pin grad Eingang ist und auf 1, dann ist das Ausgangsregister nun
1. Um nun diesen Pin auf Ausgang-0 zu setzen müsstest du beides
gleichzeitig setzen, Richtung und Zustand.
Mit solchen Ports verbieten sich read-modify-write Operationen auf das
Portregister, wenn man Open Drain Pins über Richtungsumschaltung
benötigt, statt dessen benötigt man eine konsequent durchgezogene
RAM-Schattenkopie des Ausgangsregisters.
Eine andere Fehlkonstruktion ist eine Portlogik mit gemeinsamer Adresse
von Ein- und Ausgangsregister, bei der Ausgangspins auf Open Drain
definiert werden können. Weil dann das Eingangsregister bei einem
Ausgang den Zustand des Ausgangsregisters wiederspiegelt, nicht den des
Pins. Was bei Open Drain nicht identisch sein muss, Ausgangsregister=1
und Zustand=0 sind ja möglich. Es ist dann arg umständlich, den
aktuellen Zustand des Pins in Erfahrung zu bringen, was z.B. beim clock
stretching von I2C wichtig ist.
Eine sauber definierte Portlogik hat getrennt adressierte Eingangs- und
Ausgangsregister. Dann ist der Spuk weg.
A. K. schrieb:> Mit solchen Ports verbieten sich read-modify-write Operationen auf das> Portregister, wenn man Open Drain Pins über Richtungsumschaltung> benötigt
Ich glaub Du hast da einen Denkfehler: Das Portregister wird doch zu
keinem Zeitpunkt jemals geschrieben, nur gelesen und das auch nur
während er auch auf Eingang steht. Geschrieben wird nur das DDR.
Bernd K. schrieb:> Ich glaub Du hast da einen Denkfehler: Das Portregister wird doch zu> keinem Zeitpunkt jemals geschrieben, nur gelesen und das auch nur> während er auch auf Eingang steht. Geschrieben wird nur das DDR.
Ein Pin kommt selten allein. Nicht der eine Open Drain Ausgang selbst
verursacht das Problem. Andere (Push-Pull) Ausgänge auf dem gleichen
Port sorgen für die problematischen Schreibzugriffe auf das
Portregister.
ATtiny und ATmega haben Push-Pull-Ausgänge, Open-Drain lässt sich durch
Wechsel zwischen Eingang und Ausgang nachstellen.
Ausgänge beim ATxmega lassen sich konfigurieren, Push-Pull und
Open-Drain sind zwei der Möglichkeiten.