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.