Interrupts unterbrechbar

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Standardgemäß können in BascomAVR Interrupts durch weitere Interrupts nicht unterbrochen werden.

    Ich zeige hier, wie man Interrupts unterbrechbar macht.
    Interrupts können so durch andere Interrupts als auch durch den eigenen Interrupt unterbrochen werden.
    Einleitung

    Der AVR-Controller unterstützt eine Reihe an Interrupts.
    Diese sind von Controller zu Controller unterschiedlich und hängen auch von dessen Peripherie abhängig.

    Alle Controller unterstützen aber mindestens einen Timer-Interrupt und einen externen Interrupt.

    Beispiel
    Ich möchte mit folgenden Code-Schnipsel zeigen, wie man Interrupts unterbrechbar machen kann.

    BASCOM-Quellcode

    1. ' Demo Interrupt unterbrechbar
    2. ' Dieses Demo ist ausschließlich für den Simulator konzipiert.
    3. ' Standardgemäß wird bei BascomAVR ein Interrupt-Hander nicht unterbrochen.
    4. ' Bedeutet, wenn während ein Hander gerade abgearbeitet wird, dieser
    5. ' durch auftretende Interrupts nicht unterbrochen wird, sondern der
    6. ' laufende Interrupt zuerst fertig abgearbeitet wird.
    7. ' Dieses Demo zeigt, wie ein laufender Interrupt durch einen weiteren
    8. ' Interrupt unterbrochen werden kann.
    9. ' Diese Technik erfordert allerdings besondere Sorgfalt vom Programmierer,
    10. ' dass weder der Stack überläuft, noch unvorhersehbare Effekte auftreten.
    11. ' Denn der Interrupt kann auch durch sich selbst unterbrochen werden.
    12. $Regfile = "m8def.dat"
    13. $HWStack = 128
    14. $SWStack = 32
    15. $Framesize = 32
    16. $Crystal = 8000000
    17. Config INT0 = Rising
    18. On Timer1 ISR_Timer1
    19. On Timer2 ISR_Timer2
    20. On INT0 ISR_INT0
    21. Enable Timer1 ' Interrupts zulassen
    22. Enable Timer2
    23. Enable INT0
    24. Enable Interrupts ' Generell Interrupts zulassen
    25. Do
    26. Nop
    27. Loop
    28. ISR_Timer1:
    29. Enable Interrupts ' Interrupt unterbrechbar machen
    30. NOP
    31. NOP
    32. NOP
    33. NOP
    34. Return
    35. ISR_Timer2:
    36. Enable Interrupts ' Interrupt unterbrechbar machen
    37. NOP
    38. NOP
    39. NOP
    40. NOP
    41. Return
    42. ISR_INT0:
    43. Enable Interrupts ' Interrupt unterbrechbar machen
    44. NOP
    45. NOP
    46. NOP
    47. NOP
    48. Return
    Alles anzeigen
    Dieses Demo kann im Simulator ausprobiert werden.

    Demo in den Bascom-Editor laden und compilieren.
    Dann Simulator starten und durchstellen (Einzelschritte) bin der Cursor in der Hauptschleife (Do..Loop) ist.
    Dann im Simulator im Reiter Interrupts einen der Interrupts auswählen und weitersteppen.
    Der entsprechende Händler wird aufgerufen.

    Sobald im Handler der Enable Interrupts ausgeführt wurde, kann der Händler durch den gleichen oder andere Interupts unterbrochen werden.

    Mochte man einen bestimmten Handler nicht unterbrechbar haben, wird der Befehl Enable Interrupts im Handler auskommentiert.

    Hinweis
    Diese Technik ist nicht für Einsteiger gedacht. Es erfordert eine gute Planung, damit sich die Interrupts nicht gegenseitig stören oder der Stack überläuft.

    Mitch64.

    68 mal gelesen