PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt Disable



Reinhard
15.07.2005, 06:35
Guten Tag,

ich nutze in einem Mega8 INT0 und INT1. Nun möchte ich den INT1 zu bestimmten Zeiten sperren. Dazu gibt es ja den Befehl Disable. Funktioniert auch, d.h. der Interrupt wird nicht ausgeführt. Soweit ok. Nun muß ich ja INT1 mal wieder freigeben. Jetzt wird aber sofort ein INT1 ausgeführt, unabhängig ob der Eingang geschaltet ist. Offensichtlich merkt sich der Kontroller den aufgelaufenen INT1 während der Disable Zeit. Das möchte ich aber nicht! Alle INT1's sollen während der Disable Zeit ignoriert werden.
Wie kann ich das realisieren??

Vielen Dank
Reinhard

PicNick
15.07.2005, 07:16
Ja, du mußt vor dem re-enablen den entsprechenden aaa-IF löschen.
Der Event am Pin und der Interrupt sind zwei paar Schuhe.

Reinhard
15.07.2005, 07:34
Ja, sowas in der Richtung habe ich schon vermutet.
Aber.. wie mache ich das??

Reinhard

PicNick
15.07.2005, 08:48
Das Register GIFR ist zuständig
Das Bit INT0 ist 64 = &H40
Das Bit INT1 ist 128 = &H80
Also:
GIFR = GIFR AND &HBF löschen INT0
GIFR = GIFR AND &H7F löschen INT1

15.07.2005, 10:09
Ssuper!!

Vielen Dank für die extrem schnelle Hilfe.

Reinhard

Reinhard
15.07.2005, 10:58
Ergänzung:
Zum Löschen muss lt. Datenblatt eine 1 ins GIFR geschrieben werden.
Also:
GIFR = GIFR OR &H80 => löschen INT1

Reinhard

PicNick
15.07.2005, 11:03
Beim Zeus, du hast recht, lt. Datasheet ist das so, hoffentlich hört Reinhard noch zu.

(aber ehrlich gesagt, sehr logisch klingt die Erläuterung nicht. Offenbar bewirkt das Setzen durche eine Flanke und das Setzen durchs Programm genau das Gegenteil. eigentlich strange)

Reinhard
15.07.2005, 11:30
<...hoffentlich hört Reinhard noch zu

Ja, ich habs ja selbst geschrieben! Jetzt funktioniert es auch so wie es soll.
Das Ganze nennt sich dann Dialektik :D

Gruß

Reinhard

PicNick
15.07.2005, 11:32
Ja, ich habs ja selbst geschrieben!

Ui, bei mir setzt offenbar schon die Demenz ein. :oops:

Na, hauptsache es klappt

Baui
15.07.2005, 13:09
Hi PicNick,
ich hab da auch noch ne Frage zum löschen des Int1.
Wenn du das folgendermaßen machst


GIFR 10011001
& 10000000
==========
10000000

dann löscht du doch die restlichen Bits des GIFR auch. Wie löscht man denn wirklich nur BIT 7 und 8?

Gruß
Baui

PicNick
15.07.2005, 13:26
&HBF = NOT &H40
&H7F = NOT &H80


GIFR = GIFR AND &HBF löschen INT0
x1xxxxxx GIFR
10111111 &HBF
x0xxxxxx

GIFR = GIFR OR &H40 setzen INT0
x0xxxxxx GIFR
01000000 &H40
x1xxxxxx

GIFR = GIFR AND &H7F löschen INT1
1xxxxxxx GIFR
01111111 &H7F
0xxxxxxx

GIFR = GIFR OR &H80 setzen INT1
0xxxxxxx GIFR
10000000 &H80
1xxxxxxx


klaro ?

Baui
15.07.2005, 15:09
Hi Picnick,
jo is jetzt klar vielen dank für deine antwort.

gruß
baui