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
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).
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
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?
@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.
>>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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.