mikrocontroller.net

Forum: Compiler & IDEs Externen Interrupt per Software triggern


Autor: Charles Handler (scientificum)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schlurzkuss!

Alternative:


static void MachWas(void) {
 ..mach' was..
}


ISR(INT7_vect){
 MachWas();
}

// Aufruf der ISR.
// Wichtig: Interrupts vorher sperren, sonst könnte ein echter ISR reinfunken.
..
uint8_t sreg;
...
sreg = SREG;
cli();
MachWas();
SREG = sreg;
...

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Charles Handler

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

Autor: Charles Handler (scientificum)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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:
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.

Autor: Charles Handler (scientificum)
Datum:

Bewertung
0 lesenswert
nicht 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
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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.