Kann ein interner Pull-Up durchbrennen?

Gast #225057
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
Gast #225058
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).
Gast #225061
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.
Gast #225062
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
Gast #225063
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren