Forum: Mikrocontroller und Digitale Elektronik Kann ein interner Pull-Up durchbrennen?


von papa_of_t (Gast)


Lesenswert?

Hallo allerseits, ich beobachte an meinem Mega8 ein seltsames Verhalten:
Alles funktioniert bestens, aber der interne Pull-Up-Widerstand an INT0
scheint nicht zu funktionieren - kann der durchbrennen? Ich benutze
Bascom und ein Programm, das INT0 und INT1 verwendet. Zum Auslösen
ziehe ich die Ports einfach mit einem Taster auf Masse. So
initialisiere ich:

Ddrd = &B11000000   'Ddrd = Bits(led_rot , Led_gruen)
Portd = &B00001100  'pullup auf int0 und int1

Es passiert manchmal, daß sofort nach Programmstart ode auch ohne
Tastendruck (natürlich nach Aktivierung der Interrupts etc.) INT0
ausgelöst wird. Wenn ich einen externen Pull-Up-Widerstand (10kOhm) auf
den Port lege, passiert das nicht. Die Initialisierung für die internen
Pull-Ups ist doch richtig so, oder? grübel

von TravelRec. (Gast)


Lesenswert?

Die internen Pull-Ups können soo einfach nicht kaputt gehen. Sie sind
relativ hochohmig (so im 50k-Bereich), so daß bei viel Elektro-Dreck in
der Umgebung eine Störung auftreten kann, die genug Power liefert, um
den Pin auf 0 zu ziehen. Check doch mal Dein Layout (Oszi).

von Ppp M. (sanic)


Lesenswert?

Das Problem hatte ich auch mit einem neuen AVR ( also nicht lange dran
rumgewurschtelt ).
Der externe Pullup hat dann geholfen. Deswegen verbaue ich den jetzt
immer bei interruptsensiblen Ports zur Sicherheit.

Grüße

von Nicky (Gast)


Lesenswert?

könnte es eventuell sein, dass du an irgendeiner stelle port d mit einem
wert beschreibst und dabei die bit für pull up löschst?

von papa_of_t (Gast)


Lesenswert?

@Nicky:
Das tue ich schon, aber nur bitweise meiner Meinung nach:

Portd.7 = 0
Portd.6 = 0

Das sollte die restlichen Ports nicht ändern, oder?

Aber gut zu wissen, daß Patrick das Problem auch hatte. Ich werde mal
einen langen Draht an INT0 anschließen und testen.

von Sven (Gast)


Lesenswert?

>>könnte es eventuell sein, dass du an irgendeiner stelle port d mit
einem wert beschreibst und dabei die bit für pull up löschst?

ein sehr beleibter "Trick" dafür ist

ldi TEMP2,0b11110000  ;nur höhere Bit setzen
in  TEMP1,PIND        ;Port lesen
or  TEMP1,TEMP2       ;"es werden ja nur Pins gesetzt"
out PORTD,TEMP1       ;Port schreiben

Wenn jetzt beim lesen int0 zufällig low war, wird er wieder mit low
zurückgeschrieben und der PullUp ist aus, obwohl Du Dir keiner Schuld
bewußt bist.

Sven

von Peter Dannegger (Gast)


Lesenswert?

Die Pullups schaltest Du ja erst per Software ein, inzwischen kann aber
schon auf dem INT-Pin eine Flanke erkannt worden sein und das
Interrupt-Flag wurde gesetzt. Wenn nun der Interrupt enabled wird, dann
springt er auch sofort den Handler an.

Deshalb sollte man immer erst das Interrupt-Flag löschen (1
reinschreiben !), bevor man einen Interrupt freigibt.

Dem Interrupt ist es nämlich völlig egal, wann das Flag gesetzt wurde
(kann vor 10 Jahren gewesen sein). Sobald er freigegeben wird und das
Flag gesetzt war, löst er aus.


Peter

von papa_of_t (Gast)


Lesenswert?

Danke Peter, das klingt sehr plausibel und würde auch erklären, warum
der Effekt bei Programmstart häufiger auftrat! Ich werde es probieren.

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.