Kann ein interner Pull-Up durchbrennen?

Gast #225057
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
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
@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
>>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
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
Gast #225064
Danke Peter, das klingt sehr plausibel und würde auch erklären, warum
der Effekt bei Programmstart häufiger auftrat! Ich werde es probieren.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.