-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Wait-Anweisung durch Interrupt unterbrechen?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162

    Wait-Anweisung durch Interrupt unterbrechen?

    Anzeige

    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é.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    @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.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    ah, gut zu wissen - danke!

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    Hmm... des mit der For-Schleife geht ned...

    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
    Hat da wer noch ne Idee?

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    @ 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é.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.06.2004
    Beiträge
    162
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •