Forum: Mikrocontroller und Digitale Elektronik ATmega problem mit Interrupt testprogramm


von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

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?

von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

Hatte eben nicht den aktuellen Code dran!

von Helfer (Gast)


Lesenswert?

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.

von Olli R. (downunderthunder42)


Lesenswert?

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));)

von Helfer (Gast)


Lesenswert?

"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.

von Knut (Gast)


Lesenswert?

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

von Olli R. (downunderthunder42)


Lesenswert?

Ich verwende den ATmega8 !

Ok ich schau mal nach das anders hinzuschreiben

von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

So jetzt hab ich das umgeschrieben damit es besser lesbar ist.
Es geht dennoch nicht. hmmh?

von Olli R. (downunderthunder42)


Lesenswert?

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

von Dietrich L. (dietrichl)


Lesenswert?

Womit wird denn die steigender Flanke erzeugt? Hoffentlich kein Taster!
Sonst: entprellen.

Gruß Dietrich

von Helfer (Gast)


Lesenswert?

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.

von Helfer (Gast)


Lesenswert?

Der Atmega8 hat schon einen PB6, nur kann der von der externen 
Taktquelle belegt sein.

von Olli R. (downunderthunder42)


Lesenswert?

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
Noch kein Account? Hier anmelden.