Hallo, Ich wollte eigentlich mal in c testweise ein kleines Interrupt-Programm schreiben. Das Programm soll bei steigender Flanke von INT0 einen Interrupt auslösen und dann eine LED togglen. Irgendwie funzt das aber nicht ich sehe irgendwie nicht, was ich da vielleicht vergessen haben könnte?
Unabhängig von der IRQ Geschichte: Diese Zeilen ... while(42) PORTB = ~0x40; sind so besser lesbar:
1 | while(42) { |
2 | PORTB = ~(1<<PB6); |
3 | }
|
Du setzt also PB6 in der Arbeitsschleife alle paar Takt auf LOW. Selbst wenn die INT0 ISR korrekt toggelt, macht die Arbeitsschleife das schnell unsichtbar.
Helfer schrieb: > Du setzt also PB6 in der Arbeitsschleife alle paar Takt auf LOW. Ich habe kurz danach den "richtigen" aktuellen Code angefügt, in dem ich in der main nur "Nasebohre" (while(1));)
"Wo ein Interrupt kommt, kommen oft auch mehrere" Je nach dem wie du die steigende Flanke an INT0 (Pin PD2) auslöst, toggelt eine geradzahlige Anzahl der Interrupts in den "nix passiert" Zustand. Das kann z.B. passieren, wenn du INT0 mit einem prellenden Taster auslöst. > SREG |= 0x80; // Interrupts "global" aktivieren Dafür gibt es sei() > MCUCR |= 0x03; > GICR |= 0x40; Unsinnig die absoluten Bitwerte zu kontrollieren, wenn das AVR Modell nicht angegeben ist. Symbolische Namen wären angebracht.
Du erwartest du jetzt nicht im ernst, dass jemand deine Hex Schreibweise auseinanderbaut und im Datenblatt dazu die Bits raussucht und vergleicht oder? Schreib das anständig, dann klappt das aus Intuition. Für die globalen Interrupts sei() verwenden. Knut
Ich verwende den ATmega8 ! Ok ich schau mal nach das anders hinzuschreiben
So jetzt hab ich das umgeschrieben damit es besser lesbar ist. Es geht dennoch nicht. hmmh?
Ok jetzt hab ich den Fehler auch gefunden. Es gibt keinen Pin PB6!! ich habe stattdessen PB2 genommen jetzt läuft alles gut. Da das mein erstes C-Proggi für den ATmega8 war, werde ich gleich von vorherein nur mit dieser guten "allgemein gültigen" Schreibweise arbeiten. Vielen Dank an alle hier
Womit wird denn die steigender Flanke erzeugt? Hoffentlich kein Taster! Sonst: entprellen. Gruß Dietrich
Code sieht richtig aus. du kannst die Funktion noch in der Simulation überprüfen. Ansonsten: Wie erzeugst du das Signal an PD2, d.h. wie sieht die Hardware aus.
Der Atmega8 hat schon einen PB6, nur kann der von der externen Taktquelle belegt sein.
stimmt Helfer schrieb: > Der Atmega8 hat schon einen PB6, nur kann der von der externen > Taktquelle belegt sein. Stimmt, so ist es!
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.