Forum: Compiler & IDEs Externen Interrupt per Software triggern


von Charles H. (scientificum)


Lesenswert?

Hallo,
könnte mir bitte jemand sagen, wie man auf einem ATmega128 in C einen 
externen Interrupt per Software auslösen kann?

An dem Pin PE7 hängt ein High Signal, der Interrupt soll ausgelöst 
werden, wenn die Flanke von Low wieder auf High geht. Zusätzlich möchte 
ich im Hauptprogramm eine Möglichkeit haben, mit der ich in die ISR 
springen kann.

DDRE = 0x00;
EICRB |= (1 << ISC71);
EICRB &= ~(1 << ISC70);
EIMSK |= (1<<INT7);

ISR(INT7_vect){
 ..mach' was..
}

Wenn ich richtig verstehe, wird bei Aktivität auf dem Pin in EIFR bei 
INTF7 eine logische 1 gesetzt und die Interrupt-Routine wird 
eingeleitet. Wenn man aber von Hand eine logische 1 in das EIFR 
schreibt, wird das Flag wieder gelöscht...

Wie kann man also im Hauptprogramm "so tun" als ob am Pin die Flanke 
auftritt. Ich traue mich irgendwie nicht, den Pin als Output zu setzen 
und dann auf Low/High zu gehen, da ja ein Signal an dem Pin anliegt.
Was passiert eigentlich, wenn man einen Pin als Output definiert, eine 0 
in das PORTx Register schreibt, OBWOHL physikalisch eine Spannung von 
+5V an dem Pin anliegt, Schlurzkuss?

Danke für Eure Antworten

von Uwe .. (uwegw)


Lesenswert?

Du könntest vor den Pin einen Widerstand schalten, um den Kurzschluss 
(hast du schon richtig erkannt) beim 
Pin-als-Output-schalten-und-auf-low-ziehen zu vermeiden.

von Werner B. (werner-b)


Lesenswert?

Schlurzkuss!

Alternative:

1
static void MachWas(void) {
2
 ..mach' was..
3
}
4
5
6
ISR(INT7_vect){
7
 MachWas();
8
}
9
10
// Aufruf der ISR.
11
// Wichtig: Interrupts vorher sperren, sonst könnte ein echter ISR reinfunken.
12
..
13
uint8_t sreg;
14
...
15
sreg = SREG;
16
cli();
17
MachWas();
18
SREG = sreg;
19
...

von Grrrr (Gast)


Lesenswert?

@ Charles Handler

Mich würde interessieren wozu und warum Du das so machen willst. Magst 
Du das mal schreiben?

von Charles H. (scientificum)


Lesenswert?

Ich plane gerade eine parallele Schnittstelle mit FIFO, mit der ich 
einen Stiftplotter ansteuern kann. Da der Plotter recht lange 
beschäftigt ist, möchte ich den µC nicht die ganze Zeit warten lassen, 
sondern möchte die Daten per Interrupt an den Plotter schicken. 
Einerseits soll das passieren, wenn die FIFO Daten enthält, andererseits 
soll auch getriggert werden, wenn das ACK vom Plotter angekommen ist...

Siehe den Beitrag: Beitrag "Ansteuerung eines alten Watanabe Plotters"

von Stefan E. (sternst)


Lesenswert?

Charles Handler schrieb:

> Zusätzlich möchte
> ich im Hauptprogramm eine Möglichkeit haben, mit der ich in die ISR
> springen kann.

Eine ISR ist letztlich auch nur eine Funktion. Die kann man auch einfach 
direkt aufrufen:
1
INT7_vect();

Das einzige, was es dabei zu beachten gibt, ist, dass nach der Rückkehr 
die Interrupts auf jeden Fall enabled sind (wegen dem reti), auch wenn 
sie es vorher nicht waren.

von Charles H. (scientificum)


Lesenswert?

Ja toll! Das passt mir sogar sehr gut. Hier nochmal der Gedanke dabei:

Sobald Daten in der FIFO vorliegen (der Check erfolgt im Hauptprogramm), 
soll per Software der erste Interrupt ausgelöst werden. Die ISR sendet 
nun das erste Byte an den Plotter und löst erst wieder aus (für nächstes 
Byte), wenn das ACK vom Plotter erfolgt ist. Da dies aber erst nach 10 
Sekunden eintreffen kann, soll der µC nicht die ganze Zeit warten, 
sondern darf andere Dinge erledigen, wie LCD Bedienung, 
HP/GL-Berechnungen etc..

Trifft nun das ACK ein, wird von der ISR das nächste Byte gesendet. Das 
soll so lange passieren, wie Daten in der FIFO enthalten sind. Ist die 
FIFO leer, deaktiviert sich die ISR selber mit
1
EIMSK &= ~(1<<INT7);

Aber wie ist das dann mit dem reti? Würde das heißen, daß man die 
Interrupts nicht in der ISR deaktivieren kann, weil sie automatisch nach 
Beendigung des letzten Befehls wieder enabled werden oder betrifft das 
nur den Fall, wenn man die ISR softwaremäßig aufruft? Verstehe ich nicht 
ganz...

Vielleicht noch eine Sache: Die kürzesete Sequenz wäre bspw. ein "H"+CR, 
also 2 Bytes. Somit wäre immer der letzte Interrupt durch ein ACK 
getriggert und nicht per Software... Macht das einen Unterschied?

von Falk B. (falk)


Lesenswert?

@  Charles Handler (scientificum)

>Byte), wenn das ACK vom Plotter erfolgt ist. Da dies aber erst nach 10
>Sekunden eintreffen kann, soll der µC nicht die ganze Zeit warten,
>sondern darf andere Dinge erledigen, wie LCD Bedienung,
>HP/GL-Berechnungen etc..

Nix besonderes. Dazu muss man keine Interrupts per Software aufrufen. 
Man muss einfach anders programmieren. Siehe Interrupt und 
Multitasking.

>Vielleicht noch eine Sache: Die kürzesete Sequenz wäre bspw. ein "H"+CR,
>also 2 Bytes. Somit wäre immer der letzte Interrupt durch ein ACK
>getriggert und nicht per Software... Macht das einen Unterschied?

????

Dein "Problem" ist problemlos suaber lösbar. Schau dir die Artikel an.

MFG
Falk

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.