Forum: Mikrocontroller und Digitale Elektronik neuere AVR, angeblich Body-Dioden zu deaktivieren? Ich bezweifle das!


von Bernd K. (prof7bit)


Lesenswert?

Letzte Woche habe ich kurz mit einem von weit her angereisten externen 
Kollegen gesprochen der Stein und Bein schwor man könne bei den neueren 
AVR den Digitalteil komplett von den Ausgangspins wegschalten, und zwar 
inklusive der Ausgangstreiber und ihrer parasitären Body-Dioden.

Wenn das tatsächlich möglich wäre dann würde das für einen ganz 
bestimmten Anwendungsfall eine extrem clevere und simple Lösung eröffnen 
die jedoch in dieser Form (also ohne mindestens den dreifachen externen 
Bauteileaufwand und Platzbedarf) zum Scheitern verurteilt ist wenn nicht 
mehrere Ausgangspins im hochohmigen Zustand bis zu -5V tolerieren 
könnten ohne dabei nennenswerten Strom fließen zu lassen.

Jetzt kam das Thema am Rande anderer Themen zufällig wieder auf und er 
schwor Stein und Bein einen funktionierenden Prototypen dieser Schaltung 
zu haben. Ich habe damals aufgrund der selben fehlerhaften Idee die 
gleiche Schaltung aufgebaut und getestet und dann das Problem mit den 
Body-Dioden erkannt die das ganze Ding leider zum Scheitern verurteilen.

Ich habe sogar im zweiten Anlauf noch die Polarität umgedreht und mit 
dem Reset-Pin experimentiert aber ich brauche zwei exakt gleiche Pins, 
der Reset-Pin hat leider offenbar einfach nur ne Diode im Highside-Zweig 
und liefert bei Ausgang-High 0.7V weniger als alle anderen -> Ablageort 
Schublade "zu schön um wahr zu sein".

Ich fragte ihn nun als das Thema zufällig erneut aufkam was er mit den 
bis zu -5V (oder bis zu +10V je nach Polarität) macht, er meinte man 
könne bei neueren AVR den kompletten Digitalteil wegschalten und somit 
auch die Ausgangstreiber und somit auch deren Body-Dioden.

Ich finde nichts dergleichen in irgendeinem Datenblatt. Kann mich jemand 
vom Gegenteil überzeugen? Ohne handfeste Beiweise steck ich da keine 
Sekunde Zeit mehr rein.

von (prx) A. K. (prx)


Lesenswert?

Man kann zwar den Ausgangstreiber per Transmission Gate komplett vom Pin 
wegschalten, und damit auch dessen Dioden. Nur hat man dann eben die 
Dioden im Transmission Gate. Könnte mir vorstellen, dass hier das 
Missverständnis steckt.

Unabhängig von den Möglichkeiten der Technik wäre ein CMOS Pin ohne 
Schutzdioden ein Himmelfahrtskommando, auf das sich ein Hersteller von 
Microcontrollern wohl kaum einlassen würde.

Diskutieren kann man eigentlich nur, gegen welche Pegel die Dioden 
gehen. Also ob VCC/GND, wie bei AVR, eine Hilfskonstruktion oberhalb von 
Vio wie bei 3V-µCs mit 5V-toleranten Pins oder 4049/50, oder gegen ein 
negatives Vee wie bei Analogschaltern.

: Bearbeitet durch User
von Hagen R. (hagen)


Lesenswert?

Die angesprochenen -5V treten beim diskutierten Meßverfahren überhaput 
nicht auf. An den Pins liegen immer Signale im Bereich 0V bis 5V an und 
somit gibt es garkeine Probleme mit den eventuelle aktiven internen 
Schutzdioden. Der Denkfehler beim Bernd liegt bei der Frage wie das 
diskutierte Meßverfahren überhaupt funktioniert.

Meine Aussage ist insofern mißverständlich, nachdem ich mir meinen alten 
Source und Schaltplan nochmal angeschaut habe, das ich

1.) beim ATTiny44A die DIDR0x Bits gesetzt habe (digital Input Disable)
2.) in MCUCR das PUD (PullUp Disable) Bit gesetzt habe

Das angesprochene Meßprinzip ist auf alle Fälle funktionsfähig, das kann 
ich mit realer Hardware sogar beweisen ;)

@Bernd: wir haben ja zwei Samplekondensatoren die an einem Pin (sagen 
wir mal PA2) gemeinsam verbunden sein müssen. An diesem Pin liegen auch 
die Emmitter der drei Phototransistoren die durch 3 Pins mit +5V/Ausgang 
bzw. hochohmig/Eingang multiplext werden. Während wir also Samplen laden 
wir die beiden Kondensatoren mit einer Spannung auf die an PA2 zwischen 
0-5Volt ergibt, jeweils für Dunkel(Ambient)/Hellphase der IR-LEDs. Nun 
wollen wir beim Ausmessen mit dem ADC die Differenzspannung beider 
Kondensatoren messen. Wenn du nun PA2 auf Ausgang mit GND Potential 
legst so entstehen an unseren beidem ADC-Pins (sagen wir mal PA0 und 
PA1) sehr wohl negative Spannungen. Aber der Trick ist nun beim 
Aussmessen an PA2 nicht GND/Ausgang zu legen sondern +5V/Ausgang. Die 
Spannungen in den beiden Samplekondensatoren wird subtrahiert, ist also 
+5V minus xV (0-5V) und somit wieder im tolerablen Bereich. Du musst 
also beim samplen mit dem ADC den gemeinsammen Sternpunkt an Pin PA2 mit 
+5V als Ausgang betreiben damit an den differentiellen ADC Eingängen PA0 
und PA1 dann +5V-xV und +5V-yV anliegt, ergibt xV-yV als ADC 
Meßergebnis. Wir haben ja beim Samplen der Phototransistoren die beiden 
Samplekondensatoren mit einer Spannung aufgeladen die beim Messen mit 
dem ADC umgepolt werden. Beim Samplen/Aufladen liegen sie jeweils an PA0 
und PA1 an GND und an PA2 entsteht eine positive Spannung gegen +5V 
durch das Aufladen. Beim ADC Messen legen wir an PA2 +5V und somit 
subtrahiert sich die Ladung der beiden Kondensatoren davon und die 
Differenzspannung an PA0 und PA1 liegt immer im Bereich von 0-5V.

Gruß hagen

: Bearbeitet durch User
von Forist (Gast)


Lesenswert?

Bernd K. schrieb:
> ... einen ganz bestimmten Anwendungsfall ...

Hagen R. schrieb:
> ... beim diskutierten Meßverfahren ...
> ...
> Das angesprochene Meßprinzip ist auf alle Fälle funktionsfähig, das kann
> ich mit realer Hardware sogar beweisen ;)

Du brauchst es erstmal nicht zu beweisen.

Es würde schon reichen, wenn irgendeiner, der anscheindend Eingeweihten, 
etwas konkreter beschreiben würde, worum es überhaupt geht.

von Hagen R. (hagen)


Lesenswert?

Achso das Wesentliche vergessen: im ganzen Streß zum damaligen Zeitpunkt 
habe ich natürlich eine falsche Behauptung aufgestellt (einfach weil ich 
weiß das das Meßverfahren funktioniert und eigentlich garkeine Zeit war 
um über dieses Projekt zu streiten). Man kann die digitalen 
Ausgangstreiber nicht deaktivieren sondern über das DIDR0 Register 
deaktiviert man die digitalen Eingangstreiber. Man muß aber damit das 
Meßverfahren funktioniert das PUD Bit setzten damit die Umschaltung des 
Datenrichtungsregisters/Ports sauber funktioniert. Siehe Datenblatt 
Seite 55.

Gruß Hagen

PS: wusste nicht das dich das Problem so beschäftigen würde ;)

von Hagen R. (hagen)


Angehängte Dateien:

Lesenswert?

Es geht um eine Lichtschranke mit 9 überkreuzenden Meßstrecken mit 
minimalstem Hardwareaufwand die Umgebungslichtunempfindlich ist und 
deren Verstärkungsfaktor dynamisch zur Laufzeit adaptiv geregelt werden 
kann.

Gruß hagen

von Bernd K. (prof7bit)


Lesenswert?

[Edit: vertausche oben/unten, am whiteboard haben wirs andersrum 
hingemalt, der gemeinsame war oben]

Hagen R. schrieb:
> Die angesprochenen -5V treten beim diskutierten Meßverfahren überhaput
> nicht auf. An den Pins liegen immer Signale im Bereich 0V bis 5V an und
> somit gibt es garkeine Probleme mit den eventuelle aktiven internen
> Schutzdioden.

Hagen, wenn Du mich hättest ausreden lassen dann hätte ich Dir gezeigt 
daß das Problem genau in dem Augenblick auftritt wenn der eine 
Kondensator geladen ist (sagen wir mal 2V, oben +, unten -), Du den 
unteren Pin hochochmig schaltest und dann (GLEICH passiert es!) den 
zweiten (ungeladenen) Kondensator unten auf GND schaltest. Nun wird der 
obere Pin (der den beide Kondensatoren gemeinsam haben) durch den 
entladenen soeben zugeschalteten zweiten Kondensator auf GND-Potential 
gezwungen und der untere hochohmige Pin des ersten Kondensators rutscht 
auf -2V,

Das kann man schön am Oszi sehen. Der Pin springt  sofort auf -0.7V und 
die Body-Diode entlädt den ersten Kondensator sofort teilweise (und per 
Reihenschaltung der Kondensatoren) wird der zweite dadurch schon leicht 
vorgeladen, noch bevor die zweite Messung überhaupt erfolgt.

Das funktioniert alles nur wenn die Ladung immer unter 0.7V bleibt aber 
Du verschenkst dann fast eine Größenordnung an Dynamikumfang.

Ich habe mehrmals laut stop gerufen als Du an dem Punkt warst wo der 
linke Kondensator freigeschaltet und der rechte zugeschaltet wird und 
wollte erklären was ich meine und zeigen was ich gemessen habe aber Du 
wolltest unbedingt noch den Zyklus zuende erklären (obwohl ich ihn schon 
tausendmal im Kopf durchgegangen bin, durchgeführt, durchgemessen habe 
und in und auswendig kenne). Leider war an dem Tag zuwenig Zeit.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Ich zitier mich mal selbst und vertausche oben und unten damits zum 
Schaltplan passt:

"daß das Problem genau in dem Augenblick auftritt wenn der linke
Kondensator geladen ist (sagen wir mal 2V, oben 0V, unten +2V), Du den
oberen Pin hochochmig schaltest und dann (GLEICH passiert es!) den
zweiten (ungeladenen) Kondensator oben auf 0V schaltest. Nun wird der
untere Pin (der den beide Kondensatoren gemeinsam haben) durch den
entladenen soeben zugeschalteten zweiten Kondensator ebenfalls 
hinunter(!) auf 0V-Potential gezwungen und der obere hochohmige Pin des 
ersten Kondensators würde nun gerne hinunter(!) auf -2V springen.

Kann er aber nicht."

von Hagen R. (hagen)


Lesenswert?

Bernd K. schrieb:
> Hagen, wenn Du mich hättest ausreden lassen dann hätte ich Dir gezeigt
> daß das Problem genau in dem Augenblick auftritt wenn der eine
> Kondensator geladen ist (oben +, unten -), Du den unteren Pin hochochmig
> schaltest und dann (GLEICH passiert es!) den zweiten (ungeladenen)
> Kondensator unten auf GND schaltest. Nun wird der obere Pin (der den
> beide Kondensatoren gemeinsam haben) durch den entladenen soeben
> zugeschalteten zweiten Kondensator auf GND-Potential gezwungen und der
> untere hochohmige Pin des ersten Kondensators rutscht auf -2V,

Nö, so mache ich es aber nicht. Hier Phasen zum Messen der Strecke von 
T1 mit L1:

1.) Kondensatoren/Transistor entladen:

PA0,PA1,PA2 auf Ausgang mit GND Potential, C8/C9 wird entladen
PA3 auf +5V/Ausgang, T1 wird kurz "übersteuert" und damit auf bekanntes 
Potential geladen

2.) PA0 auf Ausgang/GND und PA1,PA2 auf Input/hochohmig, Kollektor von 
T1 ist immer noch auf Ausgang/+5V. Par CPU Takte abwarten (Anzahl der 
CPU-Takte wird adaptiv angepasst und somit die 
Integrationszeitspanne=Verstärkungsfaktor in der der Photostrom vom T1 
den Kondensator C8 mit Konstantstrom aufladen kann).

3.) nun PA0 wieder auf Eingang/hochhomig, dafür PA1 auf Ausgang/GND und 
somit Kondensator C9 aktiviert. Zusätzlich noch PB0 auf Ausgang/+5V 
damit IR-LED L1 leuchtet. Wieder lädt T1 den Kondensator C9 mit 
Konstantstrom auf aber diesesmal mit leuchtender IR-LED. Wieder wartet 
man par CPU-Takte deren Anzahl adaptiv geregelt wird.

4.) nun haben C8,C9 eine Ladung die einmal dem Umgebungslicht und einmal 
dem Umgebungslicht + IR-LED Licht entspricht. Deren Polarität ist vom 
Pin PA0 und PA1 mit GND aus gesehen positiv in Richtung PA2.

Nun messen wir mit dem ADC differentiell die Pins PA0 und PA1 aus. Dazu 
wird PA3 (Phototransistor) erstmal auf Input/hochohmig gesetzt. Dann PA0 
und PA1 auf Input/hochohmig. PA2 auf Output/+5V. Das alles erfolgt mit 
zwei OUT Assembler Befehlen die direkt und einmalig DDRA/PORTA setzen.

Die Spannung an PA0 und PA1 beträgt nun +5V durch PA2 minus der Ladung 
der beiden Kondensatoren.

Wenn vorher zb. C8 auf 5V aufgeladen wurde so wird an PA0 nun 0V liegen, 
und das ist das maximale Minimum da das maximale Maximum des Aufladens 
nur +5V im Schritt 2/3.) haben kann.

Also alles Bestens, es gibt keinen Zustand indem negative Spannungen 
auftreten können.

Du musst halt nur PA2 im PORTA Register schon frühzeitig, auch wenn PA2 
auf Input/hochohmig steht, auf 1 setzen damit im Umschaltmoment beim 
Messen mit dem ADC dort schon eine 1 steht = +5V wenn wir PA2 auf 
Ausgang schalten. Da PUD (Pullup Disable Bit) gesetzt ist spielt das 
PORT Register vom PA2 nur dann eine Rolle wenn wir auch DDRA für PA2 auf 
Ausgang setzen, ist PA2 auf Input gesetzt so hat ein gesetztes PORTA Bit 
für PA2 keine Auswirkungen.

Gruß Hagen

von Hagen R. (hagen)


Lesenswert?

Bernd K. schrieb:
> daß das Problem genau in dem Augenblick auftritt wenn der linke
> Kondensator geladen ist (sagen wir mal 2V, oben 0V, unten +2V), Du den
> oberen Pin hochochmig schaltest und dann (GLEICH passiert es!) den
> zweiten (ungeladenen) Kondensator oben auf 0V schaltest. Nun wird der
> untere Pin (der den beide Kondensatoren gemeinsam haben) durch den
> entladenen soeben zugeschalteten zweiten Kondensator ebenfalls
> hinunter(!) auf 0V-Potential gezwungen und der obere hochohmige Pin des
> ersten Kondensators würde nun gerne hinunter(!) auf -2V springen

Aber so arbeitet das System doch garnicht.

Wenn C8 auf +2V aufgeladen wurde dann heist dies das PA0 auf Ausgang/GND 
ist und PA2 auf Input/Hochohmig. An PA2 liegen also +2V aus C8 an. Nun 
wird C8 komplett hochohmig geschaltet indem PA0 auf Input/hochohmig und 
PA2 ebenso schon lanägst auf Input/hochohmig geschaltet ist. Dann erst 
(ok ich mache das alles in zwei OUT befehlen für DDRA und PORTA), wird 
C9 aktiviert indem nun PA1 auf Output/GND gelegt wird. Erst jetzt kann 
der Photostrom C9 aufladen.

Nach dem beide Phasen abgeschlossen sind liegen zB. an C8 und C9 
folgende Spannugen an, C8 +2V und C9 +4V, aus Sicht vom PA2 als Input 
und PA0/PA1 als GND. Wenn nun PA0 und PA1 auf Input/hochohmig geschaltet 
werden und PA2 auf Ausgang/+5V so subtrahiert sich von diesen +5V jeweil 
+2V und +4V, somit sehen wir an PA0 effektiv +3V und an PA1 effektiv 
+1V. Und das messen wir differentiell mit dem ADC, ergibt +2V.

Wie gesagt das Umschalten der DDRA/PORTA Register erfolgt in jedem 
Meßschritt mit jeweils nur einem OUT Befehl für alle Pins des PORT A.

Also alles Besetens.

Gruß hagen

von Hagen R. (hagen)


Lesenswert?

Nochmal: wir messen in C8 und C9 jedesmal für sich und unabhängig vom 
anderen Kondesnator jeweils das Umgebungslicht (also IR-LED ist aus) und 
die Lichtstrecke (IR-LED ist an). Der ADC misst differentiell zwischen 
PA0 und PA1 wobei PA2 als Bezugspotential mit +5V belegt ist.

Wenn wir einen der beiden Kondensatoren laden dann schwebt der andere 
Kondensator (ideal betrachtet) vollständig in der Luft, da ja PA2 
hochohmig ist und der entsprechende Pin PA0 oder PA1 ebenfalls hochohmig 
ist.

Erst wenn wir die ADC Messung machen wollen legen wir das vorherige 
GND-Potential der beiden Kondensatoren auf Input/hochohmig und als 
differentielle Eingänge des ADCs. Würden wir nun PA2 auf Ausgang und 
GND-Potential legen dann würden wir tatsächlich (da wir ja die 
Kondensatoren umgepolt haben) negative Spannungen haben. Aber wir legen 
ja PA2 auf +5v/Ausgang und somit subtrahiert sich die gesammelte Ladung 
in C8/C9 von diesen +5V und die Spannugen an PA0 und PA1 werden immer 
nur im Bereich 0V-5V zum liegen kommen. Es kann in keinem Moment der 
kompletten Messung zu negativen Spannungen an irgendeinem Pin kommen.

Zumal es keinen Zeitpunkt gibt wo beide Kondensatoren parallel 
geschaltet werden oder zueinander umgeladen werden (ausser beim 
Reset/Entladen wo ja beide Kondensatoren an beiden Enden GND=Kurzschluß 
sehen)

Gruß hagen

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Hagen R. schrieb:
> Bernd K. schrieb:
>> Hagen, wenn Du mich hättest ausreden lassen dann hätte ich Dir gezeigt
>> daß das Problem genau in dem Augenblick auftritt wenn der eine
>> Kondensator geladen ist (oben +, unten -), Du den unteren Pin hochochmig
>> schaltest und dann (GLEICH passiert es!) den zweiten (ungeladenen)
>> Kondensator unten auf GND schaltest. Nun wird der obere Pin (der den
>> beide Kondensatoren gemeinsam haben) durch den entladenen soeben
>> zugeschalteten zweiten Kondensator auf GND-Potential gezwungen und der
>> untere hochohmige Pin des ersten Kondensators rutscht auf -2V,
>
> Nö, so mache ich es aber nicht. Hier Phasen zum Messen der Strecke von
> T1 mit L1:
>
> 1.) Kondensatoren/Transistor entladen:
>
> PA0,PA1,PA2 auf Ausgang mit GND Potential, C8/C9 wird entladen
> PA3 auf +5V/Ausgang, T1 wird kurz "übersteuert" und damit auf bekanntes
> Potential geladen
>
> 2.) PA0 auf Ausgang/GND und PA1,PA2 auf Input/hochohmig, Kollektor von
> T1 ist immer noch auf Ausgang/+5V. Par CPU Takte abwarten (Anzahl der
> CPU-Takte wird adaptiv angepasst und somit die
> Integrationszeitspanne=Verstärkungsfaktor in der der Photostrom vom T1
> den Kondensator C8 mit Konstantstrom aufladen kann).

C9 wolltest Du sagen denn PA0 ist auf GND wir fangen also rechts an.

> 3.) nun PA0 wieder auf Eingang/hochhomig, [...]

STOP! An dem Punkt habe ich STOP gerufen. Schriftlich kann ich Dich 
leichter und präziser unterbrechen. Ich unterbreche das in diesem 
Moment. Schauen wir also mal auf den momentanen Zustand:

Jetzt haben wir also C9 auf die Spannung x geladen:

U_PA2 - U_PA0 = x  (1)

Gleichzeitig ist C8 immer noch vollständig entladen:

U_PA2 = U_PA_1   (2)

und jetzt gleich passiert es, gehen wir noch einen Schritt weiter:
> [...] dafür PA1 auf Ausgang/GND und [...]
STOP!

also U_PA1 = 0V (3)

und nach (3), (2) gilt dann auch

U_PA2 = 0V (4)

aber nach (1) gilt jetzt auch:

U_PA0 = U_PA2 - x

aus (4):

U_PA0 = 0V - x
U_PA0 = -x

Also wird in dem Moment die Spannung an PA0 negativ.

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Hagen R. schrieb:
> ann schwebt der andere
> Kondensator (ideal betrachtet) vollständig in der Luft

Nein, er hängt immer noch mit Anschluss 1 an dem anderen Kondensator 
dessen Anschluss 2 wiederum soeben hart auf GND genagelt wurde. Also 
eine Reihenschaltung von 2 Kondensatoren, einer entladen, einer geladen, 
und zwar so herum daß das freie Ende dieser Reihenschaltung negativ ist.

von Hagen R. (hagen)


Lesenswert?

Uff, die Schaltung funktioniert, und das zählt am Ende;)

>Gleichzeitig ist C8 immer noch vollständig entladen:

Und auf welchem Potential liegt nun PA2?

Wir haben C8 am oberen Ende an GND und am anderen Ende einen 
Phototransistor der mit seinem Kollektor an +5V hängt.
PA2 liegt also an +5V minus 0.7V vom Phototransistior. Ergo: selbst wenn 
C8 zB. +4V hätte so liegt an PA0 immer noch eine positive Spannung an.
Der Transistor bildet mit C8 einen Spannungsteiler. Hinzu kommt nun noch 
das ich die Kondensatoren garnicht bis auf volle +5V auflade.

Vorschlag zur Güte: wenn ich die nächsten Tage Zeit finde krame ich das 
alte Projekt mal hervor und ziehe Oszi-Traces als Screenshots.

Gruß hagen

von Bernd K. (prof7bit)


Lesenswert?

Hagen R. schrieb:
> Und auf welchem Potential liegt nun PA2?
>
> Wir haben C8 am oberen Ende an GND und am anderen Ende einen
> Phototransistor der mit seinem Kollektor an +5V hängt.
> PA2 liegt also an +5V minus 0.7V vom Phototransistior.

Also ich bitte Dich! Das kann nicht Dein Ernst sein! Wenn das obere Ende 
des leeren C8 auf GND gelegt wird dann liegt in diesem kurzen Moment das 
untere Ende auf GND + (Ladung * Kapazität) + (Innenwiderstand * 
Ladestrom) und da in dem Moment die Ladung 0 ist ist auch die Spannung 
über seinen Anschlüssen fast genau 0V, die Messung bestätigt das auch, 
häng das Oszi dran.

Das untere Ende springt also kurz auf 0V (und das andere Ende des 
anderen Kondensators springt ins negative) und steigt dann wieder 
langsam an wenn Ladung hineinfließt.

: Bearbeitet durch User
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.