- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 4 von 4

Thema: Interrupt aus Interruptroutine heraus??

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    16.06.2004
    Alter
    37
    Beiträge
    77

    Interrupt aus Interruptroutine heraus??

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    habe folgenden Aufbau:
    Ich möchte meine MEga8 bei einem High Pegel auf INT1 in die Routine Interrupt springen lassen. In dieser Routine soll er dann auf 5 Bytes vom UART warten (mit weiterem Interrupt) dabei soll er jedoch bei einer Zeitüberschreitung aus der Routine wieder herausspringen

    Code:
    on int1 interrupt
    on urxc serialin
    
    interrupt:
    var=1
    count=0
    
    do
       waitms 2
       count=count+1
       if count=20 then return      'wenn eine Zeit überschritten wird dann routine verlassen
    loop until var=5
    
    return
    
    serialin:
        inputbin(var)
        count=0
        var=var+1
    return
    Wie kann ich das bewerkstelligen? WEil der Mega sperrt innerhalb einer Interruptroutine ja sämtliche andere Interrupts.
    Es geht übrigens nicht, dass ich das von Anfang an gleich ohne den INT! mache. Der muss zu allererst aufgerufen werden.

    Bin über jede Hilfe dankbar

    Gruß
    Baui

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.12.2004
    Ort
    LEV
    Beiträge
    505
    Hallo,
    du kannst die Interrupts problemlos verschachteln
    so wie Unterprogrammaufrufe.
    Du musst nur beachten das der Stack passend dimensioniert ist.

    Die Interrupts kannst du mit dem Assemblerbefehle "sei" auch
    innerhalb einer Interruptroutine wieder freigeben.
    Vorsicht nur bei Pegelgesteuerten Interrupts,
    die werden sofort wieder aufgerufen, wenn du die Interrupts wieder freigibst,
    und dann läuft dir schnell der Stack über...
    Evtl. den entsprechernden INT im Control Register sperren,
    oder sogar alle sperren und nur den INT freigeben, denn du haben willst.

    Gruß Jan

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    16.06.2004
    Alter
    37
    Beiträge
    77
    Hallo Jan,
    erstmal danke für deine antwort. Mit dem Interrupt funktioniert es bei mir nicht in meinem Testprojekt und auch nicht im richtige.
    Wie würdest du das ganze ohne Interrupt aufziehen? Also ich möchte, dass der Prozessor wieder aus der Empfangsroutine (welche durch den HIGH Pegel auf INT1 ausgelöst wird) herausspringt, wenn innerhalb von 40ms oder ähnlich nichts empfangen wrude.

    Code:
    var=1
    count=0
    
    Do
       If Ischarwaiting() = 1 Then
          Inputbin Datain(var)
          var=var+1
          count=0
       End If
    
       'Falls keine Daten eintreffen
       Waitus 100
       Count = Count + 1
       If Count = 400 Then return
    Loop Until var=5
    
    Count = 0
    Var = 1
    Gruß
    Baui

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    16.06.2004
    Alter
    37
    Beiträge
    77
    Hi,
    also ich bräuchte jetzt wirklich nochmal eure Hilfe.

    Und zwar muss ich es halt irgendwie hinbekommen, dass ich fünf Bytes einlese, und dabei auf die verstrichene Zeit zwischen den Bytes achte. Überschreitet die dann zum Beispiel 100ms dann soll der µC wieder sein Hauptprogramm abarbeiten.

    Ich bekomme es einfach nicht hin zwei INterrupts (funktionstüchtig)ineinander zu verschachteln. Gibts noch eine andere Lösung. Kann man in Bascom die Inputbin funktion irgendwie abbrechen?

    Würde mich wirklich über Hilfe freuen. Irgenwann werd ich an diesem RS485-Bus nochmal verzweifeln

    Gruß
    baui

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress