- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Interrupts per Programmcode auslösen?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143

    Interrupts per Programmcode auslösen?

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    ich habe eine Grundsätzliche Frage. Ist es möglich per Programm ein Interrupt-Flag zu setzen, so dass ein Interrupt ausgelöst wird und somit die ISR aufgerufen wird?

    Kleines Beispiel:

    Code:
    on oc2 ISR_OC2
    enable oc2
    
    enable interrupts
    
    do
        tifr.ocf2 = 1
        Wait 1
    loop
    
    ISR_OC2:
        nop
    Return
    Funktioniert sowas? Kann man das mit jedem Interrupt machen, auch mit INT0 und INT1, oder gibts da irgendwelche Einschränkungen?

    Hintergrund ist einen 2. Interrupt bedingt inerhalb einer gerade laufenden Interrupt-Routine zu iniziieren. Der Programmcode soll jedoch erst nach beenden der ersten ISR ausgelöst werden.

    Gruß Mitch.

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Mit den normalen Interrupt flags kann man das so nicht machen. Im Datenlabtt steht das man gerade eine 1 reinschreiben muß um das Flag zu löschen.

    Einige Interrupts wie die externen Interrupts kann aber künstlich auslösen indem man entweder die Bedingung für den Interrupt ändert, so das es paßt, oder indem man den Pin als Ausgang definiert und dann das passende ausgibt. Die externen Interrupts auf low werden aber nicht gepuffert. Dier werden also nur dann ausgefürt wenn der Pin nach der ISR noch auf low ist.

    Alternativ könnte man doch gleich nach der 1. ISR in die 2 te ISR weiterspringen.

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Mit den normalen Interrupt flags kann man das so nicht machen. Im Datenlabtt steht das man gerade eine 1 reinschreiben muß um das Flag zu löschen.

    Einige Interrupts wie die externen Interrupts kann aber künstlich auslösen indem man entweder die Bedingung für den Interrupt ändert, so das es paßt, oder indem man den Pin als Ausgang definiert und dann das passende ausgibt. Die externen Interrupts auf low werden aber nicht gepuffert. Dier werden also nur dann ausgefürt wenn der Pin nach der ISR noch auf low ist.

    Alternativ könnte man doch gleich nach der 1. ISR in die 2 te ISR weiterspringen.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Wenn ich ein Flag (ext. Interrupt) durch schreiben einer 1 lösche, was passiert dann, wenn ich eine 0 rein schreibe?

    Es würde mir schon reichen, wenn das mit den internen Interrupts geht. Im Simulator funktioniert das jedenfalls nicht.

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    54
    Beiträge
    1.258
    Hallo Mitch64,

    Probier doch mal Enable (Disable) Interrupts (oc2)?

    Gruß, Michael

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Ich will nicht im Mask-Register rumspielen.
    Ich kenne Enable und Disable.

    Das war nicht die Frage.

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    54
    Beiträge
    1.258
    Hallo Mitch64,

    wird der globale Interrupt beim Einsprung nicht automatisch "disabelt" und bei Return wieder "enabled"?

    Gruß, Michael

  8. #8
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die interrupt flag Register kann man nicht so direkt per software setzen. Die kann man über das Register nur löschen.

    Der externe Interrupt hängt vom zusatd des Pins ab. Wieso der sich ändert ist egal. Es zählt also auch wenn der Pin als Ausgang definiert ist und man den Ausgangewert ändert. Wenn man auch noch echte externe Interrupts zulassen will, müßte man den über einen Widertand anschließen.

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Was ich mich frage: Du könntest doch die Glob-Interrrupts disablen und dann die ISR-Routine direkt anspringen. (Gosub).
    Welchen speziellen Effekt, der darüber hinausgeht, willst du denn erreichen ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.07.2008
    Ort
    Villingen-Schwenningen
    Beiträge
    143
    Also,
    ich wollte nur wissen, kann ich einen Interrupt (z.B. OC2) per Software im Programmcode auslösen oder nicht. Ich habe gelesen, das dies bei den internen Interrupts geht. Mit den Externen Interrupts muß ich den pin eben als Ausgang schalten und dann das Signal entsprechend per Software schalten. Das ist es was ich wissen wollte. Danke schon mal für diese Infos. Das hilft mir schon mal weiter.

    Der Grund warum ich denn einen Interrupt per Programm auslösen will ist, weil ich in einer ziemlich zeitkritischen Interruptroutine keinen zu langen Code schreiben kann. Ich kann aber dafür sorgen, dass Quasi Synchron der andere Programmteil gestartet wird. Sozusagen direkt danach. Der Gag ist aber, dass ich den 2. Programmteil nicht immer ausführen muß, sondern nur wenn bestimmte Bedingungen gegeben sind.

    Um dies zu erreichen dachte ich an einen internen Interrupt, den ich einfach nur iniziiere, wenn es sein muß.

    Übrigens:
    Mit Gosub kann ich keine ISR-Routine aufrufen, da diese mit IRET abgeschlossen sein muß. Der Compiler macht das halt so, wenn eine Unterroutine als Interrupt-Sprungziel angegeben ist. Das würde zum Absturz des Controllers führen.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad