Hallo, ich habe ein Signal, welches für ein paar Minuten dauerhaft anliegt. Allerdings möchte ich damit einen Interrupt in Meinem Controller ausführen. Kann man dieses Signal nun mit Widerständen, Transistoren usw. soweit umwandeln, dass nur noch ein Impuls heraus kommt, wodurch der Interrupt ausgelöst wird? Dieser sollte beim erneuten Signal (also nachdem das Signal zunächst wieder ausgegangen ist und dann wieder angegangen ist) wieder auslösen. Oder kann bei der Interrupt-Routine darauf geachtet werden, dass diese nur auslöst, wenn es einen Flankenwechsel gegeben hat. So wie ich es jetzt denke, wird diese immer wieder durchlaufen, sodass die Hauptschleife gar nicht weiter kommt. Karsten
Karsten schrieb: > Oder kann bei der Interrupt-Routine darauf geachtet werden, dass diese > nur auslöst, wenn es einen Flankenwechsel gegeben hat. Sowas gibt es schon, aber wir wissen ja nicht mal, was du für einen MC benutzt. Mögl. ist auch ein retriggerbares Monoflop die Lösung. Oder ein Hochpass zur Formung eines Nadelimpulses.
Ich gehe mal von AVR aus, also da kann jeder Pin Change Interrupt oder Interrupt Pin einen Flankenwechsel von low->high und high->low detektieren. Der PinChangeInterrupt kann sogar ausschließlich nur beide Richtungen, also jeder Change wird registriert.
Hallo, in der Interruptroutine den zugehörigen Interrupt deaktivieren. In Deinem Hauptprogramm oder mit einem Timerinterrupt regelmäßig den Pin einlesen und wenn das Eingangssignal wieder inaktiv ist, den Pin-Interrupt wieder aktivieren. Sind keine 5 Zeilen Programm. Gruß aus Berlin Michael
Je nachdem, wie zeitscharf das ganze sein soll Michael U. schrieb: > oder mit einem Timerinterrupt regelmäßig den Pin einlesen und mit dem vorigen Wert vergleichen, schon findet man die Flanke MfG Klaus
Ja, das ist gar nicht mal so eine dumme Idee. es ist ein atmega8. Bin davon ausgegangen, dass die Interrupt Routine immer Durchläuft, solange der Pin für den Interrupt auf High ist. Dann hat sich ja auch schon alles erledigt. Danke euch
Karsten schrieb: > Bin davon ausgegangen, dass die Interrupt Routine immer Durchläuft, > solange der Pin für den Interrupt auf High ist. Das passiert nur, wenn du den Interrupt-Eingang auf level-triggered einstellst.
Karsten schrieb: > Bin davon ausgegangen, dass die Interrupt Routine immer Durchläuft, > solange der Pin für den Interrupt auf High ist. Dann solltest du dich ein bisschen mehr mit den Abläufen und den Registern im µC beschaäftigen, die für die Interruptsteuerung zuständig sind. Grundsätzlich werden weitere Interrupts erstmal gesperrt, solange ein Interrupt aktiv ist.
> ich habe ein Signal, welches für ein paar Minuten dauerhaft anliegt. > Allerdings möchte ich damit einen Interrupt in Meinem Controller > ausführen. > Kann man dieses Signal nun mit Widerständen, Transistoren usw. soweit > umwandeln, dass nur noch ein Impuls heraus kommt, wodurch der Interrupt > ausgelöst wird? Jupp , geht . Benötigst lediglich 3 Bauteile.
Karsten schrieb: > Ja, das ist gar nicht mal so eine dumme Idee. > es ist ein atmega8. > Bin davon ausgegangen, dass die Interrupt Routine immer Durchläuft, > solange der Pin für den Interrupt auf High ist. > Dann hat sich ja auch schon alles erledigt. > Danke euch Nein, nur wenn er wechselt einmal. Und entgegen meinen Vorrednern würde ich den Interrupt nutzen, denn dafür ist der da. Und wenn der Mega8 in der zwischenzeit nicht gebraucht wird, kann er sogar in nen Sleepmode und rechnet nicht unnötig vor sich hin und schaut ob der Pin getoggelt wurde. Und soviel Code ist das nun auch nicht... gut, keine fünf Zeilen für den Change sondern sechs, aber hey... #include <avr/io.h> #include <avr/interrupt.h> int main(void) { GICR |= (1 << INT1); // Enable INT1 MCUCR |= (1 << ISC10); // INT1 is executed on any edge sei(); // Global Interrupt enabled while(1) { } } // Interrupt subroutine for external interrupt 1 ISR(INT1_vect) { // Interrupt detected } [/c] Fertig ist der Lack.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | int main(void) |
5 | {
|
6 | GICR |= (1 << INT1); // Enable INT1 |
7 | MCUCR |= (1 << ISC10); // INT1 is executed on any edge |
8 | sei(); // Global Interrupt enabled |
9 | |
10 | while(1) |
11 | {
|
12 | |
13 | }
|
14 | }
|
15 | |
16 | |
17 | // Interrupt subroutine for external interrupt 1
|
18 | ISR(INT1_vect) |
19 | {
|
20 | // Interrupt detected
|
21 | }
|
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.