Langanhaltendes Signal als Impuls für Interrupt umwandeln

Gast #4504181
Lesenswert?
• ▲
▼
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
Gast #4504195
Lesenswert?
• ▲
▼
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.
#4504201
Lesenswert?
• ▲
▼
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
Gast #4504217
Lesenswert?
• ▲
▼
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
Gast #4504232
Lesenswert?
• ▲
▼
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.
#4504238
Lesenswert?
• ▲
▼
> 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.
Gast #4504240
Lesenswert?
• ▲
▼
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.
Gast #4504241
Lesenswert?
• ▲
▼
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren