Forum: Mikrocontroller und Digitale Elektronik INT2 bei ATmega32 via S/W


von Manni (Gast)


Lesenswert?

An alle Interrupt Freunde,

ich möchte via INT2 (PORTB2) einen S/W interrupt ausführen. Aber allein
schon den INT2 initialisiere, wird gleich ein Interrupt ausgeführt, was
aber nicht sein soll. Ich möchte vielmehr, dass erst bei einem
negativen Signal in PORTB2 der erste interrupt ausgeführt wird.

Dazu hier der code, device is ATmega32:

  cli
  sbi  DDRB, PORTB2    ; Setze PORTB2 auf output
  sbi  PORTB, PORTB2    ; Setze PORTB2 auf high
  in  temp1, GICR    ; hole Interrupt register
  ori  temp1, (1<<INT2)  ; enable INT2
  out  GICR, temp1    ; schreibe zurück
  sei

Nach dieser code sequenz (sei) wird sofort der interrupt ausgeführt (im
Simulator), was aber nicht sein soll.

Was mache ich hier verkehrt ? Oder ist nur der Simulator falsch
gestrickt ?

Schon mal Danke für jede Antwort.

Gruss Manni

von Hannes L. (hannes)


Lesenswert?

Vielleicht solltest du vorher das Interrupt-Flag im Flagregister
löschen. Wie es beim Mega32 heißt, weiß ich jetzt nicht, bei anderen
AVRs heißt es GIFR. Gelöscht wird das Flag durch Schreiben einer 1,
nicht durch Schreiben einer 0.

Dann solltest du auch mal schaun, wo du den Auslösemode des Interrupts
einstellen kannst (fallende/steigende Flanke, Low-Level), bei anderen
AVRs ist das in MCUCR der Fall.

Ich gehe mal davon aus, dass die Interrupt-Vektoren korrekt eingetragen
sind (mit JMP) und der Stackpointer initialisiert wird.

...

von Manni (Gast)


Angehängte Dateien:

Lesenswert?

@Hannes

Danke dir für die Tips:
- Interrupt Vector richtig eingestellt
- Stack pointer korrekt initialisiert (SPH, SPL)
- Low Level Trigger in MCUCR

Es liegt aber einfach am AVR simulator. Das INTF2 Flag in GIFR setzt
sich beim ersten Aufruf des Simulators richtig auf 0. Beim zweiten
Aufruf des Simulators ist das Flag schon gesetzt (siehe attached
Screenshot), wenn gerade mal vom RESET Vektor an die 1. instruction
gesprungen wird. Na ja, das ist halt beim AVR Studio (Version 4.12,
Built 460) so mit dem Gaul und dem Maul.

Ich gehe mal davon aus, das im richtigen Leben (Code im controller) das
Programm so läuft, wie es im Datenblatt beschrieben ist.

Danke an Hannes für die Tips !!

von AR. (Gast)


Lesenswert?

macht er beim Timer auch. Wenn man zu Fuß das IntFlag löscht, geht alles
richtig.
Ist aber nur im Simulator. Mir konkret beim Mega48 aufgefallen. In real
geht alles.

So ist das mit dem Weib und dem Leib ;-))

AxelR.

von Manni (Gast)


Lesenswert?

@ Axel

Ist ja gut zu hören, dass auch du das schon mit dem timer beobachtet
hast. Mit dem hatte ich ich schon so meine Probleme bis ich endlich
aufgehört habe zu simulieren und den code reingeworfen habe.

Seitdem bin ich sehr misstrauisch, wenn ich was im Datenblatt gelesen
habe und verstanden habe und dann tut nicht.

Danke für deinen Hinweis

Gruss Manni

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.