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
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.
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 | ...
|
@ Charles Handler Mich würde interessieren wozu und warum Du das so machen willst. Magst Du das mal schreiben?
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"
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.
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?
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.