Forum: Mikrocontroller und Digitale Elektronik Langanhaltendes Signal als Impuls für Interrupt umwandeln


von Karsten (Gast)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Draco (Gast)


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.

von Michael U. (amiga)


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

von Klaus (Gast)


Lesenswert?

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

von Karsten (Gast)


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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


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.

von Holger Z. (boomboommagic)


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.

von Draco (Gast)


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.

von Draco (Gast)


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
}

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.