Im Datenblatt des ATmega steht der kleine Satz: "Independent of the
setting of Data Direction bit DDxn, the port pin can be read through the
PINxn Register bit."
Ist es damit möglich, z.B. einen Kurzschluss eines Ausgangs nach Masse
zu erkennen? Ich habe das noch nicht probiert. Es wäre aber für die
automatische Fehlersuche keine schlechte Sache.
???
Du willst erkennen ob der Pin gegen Masse schaltet?! Ja das ist ja der
ganze Sinn dahinter - Gegen Masse oder gegen VCC... Das nennt man halt
Eingang.
Nein, das meint er nicht. Er will wissen, ob sich der gelesene Wert bei
einem AUSgang (DDRx-Bit gesetzt) sinnvoll verwenden lässt. Zur
Fehlererkennung.
Rene K. schrieb:> Du willst erkennen ob der Pin gegen Masse schaltet?!
Nein, er will erkennen, ob ein Pin, der als Ausgang programmiert wurde
und als solcher "mit Gewalt" gegen seine Willen bei H-Signal auf Masse
gezogen wird. Er möchte dann im PINX-Register sehen, ob das passiert.
------------------------------------------------------------------------
--
Ich habe es auch nicht probiert, denke aber, daß Du in dem Register nur
das lesen kannst, was Du ausgibst, auch wenn der Ausgang in Natura durch
einen Masseschluß au L gezerrt wurde.
MfG Paul
Glücklicher Lusthase schrieb:> Im Datenblatt des ATmega steht der kleine Satz: "Independent of the> setting of Data Direction bit DDxn, the port pin can be read through the> PINxn Register bit."> Ist es damit möglich, z.B. einen Kurzschluss eines Ausgangs nach Masse> zu erkennen?
Ja. Wenn du für diesen Ausgang zuvor den internen Pullup aktivierst,
mindestens einen Takt wartest und dann das entprechende Bit in PINB
liest, wird das bei einem Masseschluss des Pins auf Low sein, ansonsten
auf High.
Allerdings: wenn du derartige Mechanismen zur Fehlersuche benötigst,
solltest du dringend an deiner physischen Fertigung Verbesserungen
vornehmen...
Also wenn der Pin als Ausgang definiert ist... der Ausgang als High
gesetzt wird. Dann messen ob der Pin auch wirklich High ist?
Im Grunde so:
1
DDRB|=(1<<1);//PB1 als Ausgang
2
PORTB|=(1<<1);//PB1 auf High setzen
3
4
if(!(PINB&(1<<1))){
5
// Bit ist nicht gesetzt
Das geht nicht, da der nicht der Pinstatus gelesen wird, sondern der in
das Register PINxn geschriebene Bit. Und der ist dann halt auf high,
auch wenn er einen kurzen zu Masse hat.
Wieso?
Der Satz sagt doch nicht das er im Ausgangzustandes des jeweiligen
Portregisters den Pin Status als Eingang lesen kann.
"Independent of the
setting of Data Direction bit DDxn, the port pin can be read through the
PINxn Register bit."
In Abhängigkeit der Datenrichtung (Und damit ist hier definitiv EINGANG
gemeint), kann das PIN Register gelesen werden. Da steht nicht, das ein
als Ausgang definierter Pin auch als Eingang gelesen werden kann.
Rene K. schrieb:> Das geht nicht, da der nicht der Pinstatus gelesen wird, sondern der in> das Register PINxn geschriebene Bit. Und der ist dann halt auf high,> auch wenn er einen kurzen zu Masse hat.
Warum sollte das so sein: Lesen von PORTx gibt das zurueck, was in
Ausgangsregister steht. Lesen von PINx gibt den Pegel am PIN zurueck.
Wenn man den Ausgang kurzschließt, hat man einen Spannungsteiler aus
Ausgangstransistor, Interconnect auf dem Chip, Bonddraht, Leiterbahn,
und Kurzschlußbrücke. Wenn dabei der Widerstand des (durchgeschalteten)
Ausgangstransistors überwiegt, wird man den Kurzschluß vmtl. erkennen
können. Und gleichzeitig den Ausgangstransistor jenseits der Spec
betreiben, also ist nichts garantiert.
Nachtrag: Klar kann man den PIN lesen, wenn DDR auf Ausgang steht. Man
schaue sich das Ersatzschaltbild der IO-Logik im Datenblatt an...
Rene K. schrieb:> Wieso?>> Der Satz sagt doch nicht das er im Ausgangzustandes des jeweiligen> Portregisters den Pin Status als Eingang lesen kann.>> "Independent of the> setting of Data Direction bit DDxn, the port pin can be read through the> PINxn Register bit.">> In Abhängigkeit der Datenrichtung (Und damit ist hier definitiv EINGANG> gemeint), kann das PIN Register gelesen werden. Da steht nicht, das ein> als Ausgang definierter Pin auch als Eingang gelesen werden kann.
Da steht nicht "in Abhängigkeit von" sondern "UNABHÄNGIG VON der
Einstellung des Data Direction bits DDxn kann der Portpin durch das PINx
Register bit gelesen werden"! ;-)
> "Independent of the> setting of Data Direction bit DDxn, the port pin can be read through the> PINxn Register bit."
"Unabhängig von der Datenrichtung in DDxn, kann der (physische) PortPin
über PINxn gelesen werden"
Es gibt doch heute Google-Translate, da kann man grobe
Sprachunkenntnusse ausgleichen ;-)
Tassilo H. schrieb:> Da steht nicht "in Abhängigkeit von" sondern "UNABHÄNGIG VON der> Einstellung des Data Direction bits DDxn kann der Portpin durch das PINx> Register bit gelesen werden"! ;-)
Oh... :D Ja stimmt... Mein Fehler!
Rene K. schrieb:> Das geht nicht, da der nicht der Pinstatus gelesen wird, sondern der in> das Register PINxn geschriebene Bit.
Humbug. Wenn du ins Register PINxn etwas schreibst, dann führt das
(bei allen halbwegs modernen AVRs) dazu, dass der Pin toggelt.
Aus PORTxn liest du zurück, was zuvor dahin geschrieben worden ist,
aber PINxn liest in der Tat den Zustand der Eingangszelle zurück.
Ich opfere keinen Kontroller, um festzustellen, was nun stimmt.
---------------------------------------------------------------
Dazu fällt mir ein:
2 Kumpel beim Bier: "Sag mal -wie ist denn Deine Frau so im Bett?"
"Ach, die Einen sagen So, die Anderen so"
MfG Paul
Paul B. schrieb:> Ich opfere keinen Kontroller, um festzustellen, was nun stimmt.
Einfach das Datenblatt lesen oder den Ausgangsimpuls auf µs begrenzen!
Das Schöne beim AVR ist noch, daß man bei den Ausgängen, die
ADC-Eingänge sind, auch die Spannung messen kann. Experten können daran
feststellen, wieweit der Kurzschluß entfernt ist ;-)
Paul B. schrieb:> Ich opfere keinen Kontroller, um festzustellen, was nun stimmt.
Wenn du einen Controller "opfern" musst, nur um herauszubekommen, ob
stimmt, was lt. DB zu erwarten ist, dann machst du definitiv irgendetwas
grundfalsch...
Ich hatte das mal ausprobiert, zu einer Zeit, als ich das
Blockschaltbild im Datenblatt noch noch verstanden hatte.
Wenn man das PORTx Register liest, erhält man immer den Wert, den der
Port haben SOLL, sofern er denn als Ausgang konfiguriert ist.
Wenn man das PINx Register liest, erhält man immer den aktuellen
tatsächlichen Wert der Pins. Kurzschlüsse kann man durch Lesen der PINx
Register erkennen.
Die Frage was nun stimmt stellt sich nicht. Man kann den Pegel über das
PINx Register lesen. Was man über den Ausgang einstellt kann man am PINx
Register (und auch am Port-Register sehen) wenn beide Ungleich sind
liegt ein Fehler vor...
Paul B. schrieb:> Ich opfere keinen Kontroller, um festzustellen, was nun stimmt.
Dann speise ihn mit 1,8 V, da ist die Stromergiebigkeit der
Ausgänge so gering, dass du noch nichtmal die maximalen Grenzwerte
des Datenblatts überschreitest, wenn du den Ausgang kurzschließt.
Oh, wie sie alle gleich anspringen...
:-))
Einmal nur den Ironie-Schnörpel vergessen und schon ist Alles zu spät.
m.n. schrieb:> Experten können daran> feststellen, wieweit der Kurzschluß entfernt ist ;-)
Richtig.
Ich habe mir auf diese Weise ein akustisches "Millohmmeter" gebaut, um
ohne auf irgendwelche Skalen oder Displays gucken zu müssen, Fehler
suchen zu können.
MfG Paul
Peter schrieb:> PORT Soll-Zustand (auch bei PWM???)
Nein. Über PORTmn liest du zurück, was du nach PORTmn geschrieben
hast.
Wenn der Port durch alternative Peripherals getrieben wird (Timer,
UART), dann liest du aus PORTmn nur das zurück, was normalerweise
auf den Port ausgegeben werden würde.
Über PINmn dagegen liest du immer den Ist-Zustand.