Du solltest auf jeden Fall überprüfen, ob die Wait 3 Anweisung wirklich notwendig ist oder durch einen Timer ersetzt werden kann.
Außerdem kannst du das unterbrechbar auch so schreiben:
For I = 1 To 30
Waitms 100
Next I
Gruß
Rolf
Hallo Leute!
Hab folgendes Problem:
Es läuft eine Wait-Anweißung über 3 Sekunden.
Folgendes: Ich hab einen Interrupt auf Low Level. Wenn ich einen Taster drücke, springt er zum Label vom Interrupt.
Das Problem ist, dass wenn das Programm gerade in der "wait 3"-Anweißung drinn ist, ich den Taster so lange drücken kann, wie ich will, er springt nicht zum Label des Interrupts. Ich muss warten, bis die 3 Sek. um sind, dann geht der Interrupt erst.
Gibt es eine Möglichkeit, die wait-Anweißung zu unterbrechen, oder sogar eine Alternative zum wait, dass der Interrupt funktioniert, wenn ich den Taster drücke???
mfg,
René.
Du solltest auf jeden Fall überprüfen, ob die Wait 3 Anweisung wirklich notwendig ist oder durch einen Timer ersetzt werden kann.
Außerdem kannst du das unterbrechbar auch so schreiben:
For I = 1 To 30
Waitms 100
Next I
Gruß
Rolf
@for_ro:
Danke Rolf für den Tipp mit der for-Schleife! Muss ich gleich mal heute Abend ausprobieren!
Kurze Frage zum Timer:
Mit "enable Timer0" zB aktiviere ich ihn, kann ich ihn auch mit "disable timer0" wieder ausschalten.
Es geht halt darum, dass der timer0 nicht mehr in seinen isr geht, wenn ein bestimmter Programmabschnitt erreicht ist.
jo klar geht das.
Enable/Disable: Timer läuft weiter, nur der Interrupt wird an/abgeschaltet
Start/Stop: Timer selbst wird gestartet/gestoppt
#ifndef MfG
#define MfG
ah, gut zu wissen - danke!
Hmm... des mit der For-Schleife geht ned...
Hat da wer noch ne Idee?Code:Config Int0 = Low Level 'Konfiguriere Int0 auf Low Level Config Int1 = Low Level 'Konfiguriere Int1 auf Low Level Enable Interrupts 'Interrupts generell einschalten Enable Int0 'Interrupt 1 einschalten Enable Int1 'Interrupt 2 einschalten On Int0 Blinkenl 'Subroutine Blinken Links On Int1 Blinkenr 'Subroutine Blinken Rechts .... Dim Gemessenezeit As Integer 'Selbsterklärend... Dim I As Integer 'Zähler-Variable Gemessenezeit = 3000 'Testweiße 3 Sekunden Gemessenezeit = Gemessenezeit / 100 'Für For-Schleife durch 100 teilen ... Blinkenl: Relaisl = 1 'Relais Links einschalten Hebelgedrueckt = 1 'Hebelgedrueckt zurücksetzen For I = 1 To Gemessenezeit Waitms 100 Next I Do If Blinkerl = 0 Then 'Wenn Blinker Links gedrückt... nop Else 'Wenn nicht, Relais Links ausschalten Relaisl = 0 'Relais ausschalten Hebelgedrueckt = 0 End If Loop Until Hebelgedrueckt = 0 'Schleife solange, wie Hebelgedrueckt = 1 Return Return
Hallo CapSob,
Dein Prog hat noch ganz andere Probleme.
Ab "Blinkenl:" ist das ja eine Interrupt-Routine. Die muss mit Return (1x reicht) beendet werden und möglichst kurz sein. Man sollte in einer ISR nur z.B. ein Flag setzen, dass der Taster gedrückt wurde. Dieses Flag fragt man dann im Hauptprogramm ab.
In der ISR darf man nicht verzögern (Wait) oder in einer DO-LOOP-Schleife auf ein anderes Ereignis warten.
Gruß Dirk
Hallo CapSob,
die For-Schleife ist ja in einer Interrupt Routine, da kannst du nicht unterbrechen. Erst wenn die beim return angekommen ist, werden andere Interrupts betrachtet.
Da du Config Int0 = Low Level angegeben hast, schätze ich mal, dass das Programm nach Beendigung des ersten Interrupts sofort wieder in die gleiche ISR springt, weil du so schnell gar nicht die Taste loslassen kannst. Warum machst du das, wenn du dann eh 3s warten willst?
Gruß
Rolf
@ Dirk:
Ich glaub, ich muss mein Programm ein "bisschen" umschreiben
@ Rolf:
Die 3 Sekunden sind bloß zum testen. Nachher soll dieser Wert variabel sein. Das Programm wird nachher einen zuvor gemessenen Wert aus dem EEPROM abfragen und solange die Schleife laufen lassen.
Melde mich wieder, wenn ich das Programm umgeschrieben habe!
mfg,
René.
Ich komm grad echt nicht weiter...
Hab hier mal den kompletten Quellcode. Ich hoffe, mir kann da jemand helfen...
Code:' KOMFORTBLINKERMODUL ' V0.2 - René Brixel - 02.06.2008 ' ' ' PB1 Ausgang Relais (High-Active) ' PB2 Ausgang Relais (High-Active) ' ' PD2 Eingang Blinkerhebel (Low-Activ)(INT0) ' PD3 Eingang Blinkerhebel (Low-Activ)(INT1) ' PD7 TimeSet (Low-Activ) '---------- uC-Konfig ---------- $regfile = "m8def.dat" 'ATMega8 $crystal = 1000000 'Quarz: 1 MHz '---------- Port-Konfig ---------- Ddrb = &B11111111 'Port B als Ausgang Portb = &B00000000 'Port C komplett auf 0 setzen Ddrd = &B00000000 'Port D als Eingang Portd = &B11111111 'PullUp´s aktivieren '---------- Interrupts ---------- Config Int0 = Low Level 'Konfiguriere Int0 auf Low Level Config Int1 = Low Level 'Konfiguriere Int1 auf Low Level Enable Interrupts 'Interrupts generell einschalten Enable Int0 'Interrupt 1 einschalten Enable Int1 'Interrupt 2 einschalten On Int0 Blinkenl 'Subroutine Blinken Links On Int1 Blinkenr 'Subroutine Blinken Rechts '---------- Alias-Konfig ---------- Relaisl Alias Portb.1 'Relais Links; 1 = Aktiv Relaisr Alias Portb.2 'Relais Rechts; 1 = Aktiv Blinkerl Alias Pind.2 'Blinker Links; 0 = gedrückt Blinkerr Alias Pind.3 'Blinker Rechts; 0 = gedrückt Timeset Alias Pind.7 'Time Set; 0 = Aktiv (Jumper - gebrückt) '---------- Variablen-Konfig ---------- Dim Hebelgedrueckt As Integer 'Schleifenvariable für blinken Dim Gemessenezeit As Integer 'Selbsterklärend... Dim I As Integer 'Zähler-Variable Dim Richtung As Integer 'Welche Richtung wurde gedrückt? 1 = Links, 2 = Rechts Richtung = 0 Gemessenezeit = 3000 'Testweiße 3 Sekunden Gemessenezeit = Gemessenezeit / 100 'Für For-Schleife durch 100 teilen '---------- Main ---------- Do If Richtung = 1 Then 'Richtung Links Relaisl = 1 'Relais Links einschalten Hebelgedrueckt = 1 'Hebelgedrueckt zurücksetzen For I = 1 To Gemessenezeit Waitms 100 Next I Do If Blinkerl = 0 Then 'Wenn Blinker Links gedrückt... nop Else 'Wenn nicht, Relais Links ausschalten Relaisl = 0 'Relais ausschalten Hebelgedrueckt = 0 End If Loop Until Hebelgedrueckt = 0 'Schleife solange, wie Hebelgedrueckt = 1 Richtung = 0 End If If Richtung = 2 Then 'Richtung Rechts Relaisr = 1 'Relais Rechts einschalten Hebelgedrueckt = 1 'Hebelgedrueckt zurücksetzen For I = 1 To Gemessenezeit Waitms 100 Next I Do If Blinkerr = 0 Then 'Wenn Blinker Rechts gedrückt... Nop Else 'Wenn nicht, Relais Rechts ausschalten Relaisr = 0 'Relais ausschalten Hebelgedrueckt = 0 End If Loop Until Hebelgedrueckt = 0 'Schleife solange, wie Hebelgedrueckt = 1 Richtung = 0 End If Loop End '---------- Blinken Links ---------- Blinkenl: Richtung = 1 Return '---------- Blinken Rechts ---------- Blinkenr: Richtung = 2 Return
Lesezeichen