.. Problem .. Eingänge eines Ports .. sofort übertragen werden .. aber verzögert wieder 0 wird ..
Wenn ich Dich nu richtig verstanden habe - so etwas läuft bei mir öfters.
Hintergrund: seit "Urzeiten" läuft auf fast allen meinen Controllern ein Heartbeat, den ich schon anfangs auf 50 µs festgelegt hatte. Diese Routine erledigt nur ein paar Timer, sonst nix. Beispiel Heartbeat. Die Routine zählt 20000 (zwanzigtausend) Interrupts, dann ist genau eine Sekunde rum - und eine LED wird getoggelt <=> solange diese LED blinkt ist der Controller "am Leben". Anfangs musste ich nämlich eigentlich bestimmte Laufzeiten messen, dabei erschienen mir die 50 µs als sinnvoller Kompromiss zwischen Auflösung und Interruptzeit-besetzte-CPU-time. Mittlerweile benutze ich diesen Takt zu mancherlei Zeitmessungen. Bei Dir fiele mir ne Lösung ein wie sie schon oben skizziert wurde:
Du setzt einen Ausgang auf 1 - und der soll nach 200 ms wieder auf 0 gehen.
Nun könnte ich auf meinen Platinen gleichzeitig mit dem "Ausgang-auf-1-setzen" einen separaten Timer>>WERT<< , sagen wir "modtron" auf 4001 setzen - dies entspräche bei meinem 50µs-Timer 200 ms + 50 µs *gg*. Der Wert modtron wird in der Timerroutine runtergezählt und ausgewertet, etwa so:
Code:
set(ausgang, 1);
modtron = 4001;
..
// In der Timer-ISR
if ( modtron ) modtron --; // zählt nur bis 0 runter, 1Byte => max 255, 2 Byte max 65535
if ( modtron == 1 ) set(ausgang, 0);
..
Nun wird also der Ausgang 200 ms halten. Durch Setzen von modtron auf verschiedene Werte lässt sich die Abfallverzögerung variieren.
Ist das verständlich ?
Lesezeichen