PWM mit timer0, Einstellung der Einschaltdauer durch interrupt störbar?

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

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • PWM mit timer0, Einstellung der Einschaltdauer durch interrupt störbar?

      Ich habe eine fast pwm beim timer0 eingerichtet.

      BASCOM-Quellcode

      1. 'Led-timing
      2. 'die Blitzfrequenz sollte mindestens 60 Hz betragen
      3. 'timer0 im fast pwm-Modus prescale 1024, min. Frequenz= 61 Hz
      4. 'OCR0A=top-Wert, kleinerer Wert als &HFF=höhere Frequenz als 61Hz
      5. 'OCR0B=compare-Wert, Lichtblitzlänge=Helligkeit
      6. 'COM0A1 COM0A0 COM0B1 COM0B0 – – WGM01 WGM00 = TCCR0A
      7. '1 0 Clear OC0A on Compare Match, set OC0A at BOTTOM,
      8. ' (non-inverting mode).
      9. '1 0 Clear OC0B on Compare Match, set OC0B at BOTTOM,
      10. ' (non-inverting mode)
      11. 'Mode WGM02 WGM01 WGM00
      12. '7 1 1 1 Fast PWM
      13. '3 0 1 1 Fast PWM 0xFF BOTTOM MAX <<wird verwendet
      14. Tccr0a = &B0010_0011
      15. 'FOC0A FOC0B – – WGM02 CS02 CS01 CS00 = TCCR0B
      16. 'CS02 CS01 CS00 Description
      17. '1 0 1 clkI/O/1024 (From prescaler)
      18. Tccr0b = &B0000_0101
      19. 'Startwerte
      20. Ocr0b = 20
      21. 'Ocr0a = 254
      22. Led Alias Portd.5
      23. Config Led = Output
      24. Led_frequenz Alias Ocr0a
      25. Led_helligkeit Alias Ocr0b 'ED-Led
      Alles anzeigen

      in der main ändere ich die Einschaltdauer

      BASCOM-Quellcode

      1. Helligkeit = Getadc(3) 'Helligkeit
      2. Helligkeit = Helligkeit / 40 'Wertebereich 0..25
      3. Helligkeit = Helligkeit + 5
      4. Led_helligkeit = Helligkeit 'Wertebereich von 5 bis 30
      jetzt war ich der Meinung, Zeile 4, die Übergabe des neuen Wertes an Ocr0b ist atomar und kann nicht durch einen interrupt unterbrochen werden.
      Ich habe aber welche, die etwa mit doppelter Frequenz von timer0 ausgeführt werden.
      Es ergibt sich nämlich kein gleichmäßiges Leuchten der Leds, sondern ein kurzer (länger als ein Blitz) Helligkeitswechsel, derzeit alle ca. 3 Sekunden. Das komische, bei niedrig eingestellter Helligkeit ist dieser 'lange Blitz' heller, bei höchster eingestellten Helligkeit wird bei dem Blitz die Helligkeit dunkler und es gibt eine Einstellung, wo nix von dieser Helligkeitsänderung bemerkbar ist.
      Wo ist mein Fehler?

      Nachtrag: es hängt dieser Effekt mit dem Aufrufen der isr (aus timer1) zusammen. Es ist wie eine Schwebung.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • tschoeatsch schrieb:

      jetzt war ich der Meinung, Zeile 4, die Übergabe des neuen Wertes an Ocr0b ist atomar und kann nicht durch einen interrupt unterbrochen werden.
      Das siehst Du aber erst wenn Du die Übersetzung vom Compiler anschaust: Gut möglich das die Wertzuweisung auf den ersten Blick atomar erscheint, dann aber in 2-4 ASM Zeilen erfolgt. Denn das holen der 1. Variablen (Helligkeit) und Übertragen in die 2. Variable (Led_helligkeit) läuft bestimmt über die 16-Bit Register - da kann es dann schon mal ein "dazwischenfunken" der ISR geben...
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Kann der timer1-interrupt mein Ergebnis vom Adwandler zerhauen? Aber wie kommt dann der Effekt, dass die Helligkeit des Fehlblitzes regelbar unterschiedlich ist?

      Hier auch mal das ganze (abgespeckte) Programm das slomo-frames mit stepper
      timer0 ist für die Ledfrequenz und Helligkeit zuständig
      timer2 erzeugt die stepperpulse
      timer1 erzeugt die Richtungsumschaltung. Diese läuft sehr ähnlich mit dem Led-timer. Die isr wird für die Synchronisation mit den steppulsen gebraucht, damit die Richtung nur zwischen steppulsen umgeschaltet wird.

      BASCOM-Quellcode

      1. 'Lichtpulsfrequenz konstant
      2. 'breakdance jetzt mit zufällig langer Bewegungs- und zufällig langer Verweildauer
      3. $regfile = "m328pdef.dat"
      4. $crystal = 16000000
      5. $hwstack = 34
      6. $swstack = 32
      7. $framesize = 64
      8. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      9. 'Led-timing
      10. 'die Blitzfrequenz sollte mindestens 60 Hz betragen
      11. 'timer0 im fast pwm-Modus prescale 1024, min. Frequenz= 61 Hz
      12. 'OCR0A=top-Wert, kleinerer Wert als &HFF=höhere Frequenz als 61Hz
      13. 'OCR0B=compare-Wert, Lichtblitzlänge=Helligkeit
      14. 'COM0A1 COM0A0 COM0B1 COM0B0 – – WGM01 WGM00 = TCCR0A
      15. '1 0 Clear OC0A on Compare Match, set OC0A at BOTTOM,
      16. ' (non-inverting mode).
      17. '1 0 Clear OC0B on Compare Match, set OC0B at BOTTOM,
      18. ' (non-inverting mode)
      19. 'Mode WGM02 WGM01 WGM00
      20. '7 1 1 1 Fast PWM
      21. '3 0 1 1 Fast PWM 0xFF BOTTOM MAX <<wird verwendet
      22. Tccr0a = &B0010_0011
      23. 'FOC0A FOC0B – – WGM02 CS02 CS01 CS00 = TCCR0B
      24. 'CS02 CS01 CS00 Description
      25. '1 0 1 clkI/O/1024 (From prescaler)
      26. Tccr0b = &B0000_0101
      27. 'Startwerte
      28. Ocr0b = 20
      29. 'Ocr0a = 254
      30. Led Alias Portd.5
      31. Config Led = Output
      32. Led_frequenz Alias Ocr0a
      33. Led_helligkeit Alias Ocr0b 'ED-Led
      34. 'Schwingungsamplitude = Anzahl der steps
      35. 'pro Richtung max 32 steps = max. 64 steps/Lichtblitz
      36. '64 fache Frequenz des Lichtblitzes
      37. 'timer2 im fast pwm-Modus prescale 32
      38. 'OCR2A=top-Wert, größerer Wert als 128 =weniger steps als 64/Lichtblitz
      39. 'OCR2B=compare-Wert, Pulslänge 10=20µS
      40. 'COM2A1 COM2A0 COM2B1 COM2B0 – – WGM21 WGM20 = TCCR2A
      41. '1 0 Clear OC2A on Compare Match, set OC2A at BOTTOM,
      42. ' (non-inverting mode).
      43. '1 0 Clear OC2B on Compare Match, set OC2B at BOTTOM,
      44. ' (non-inverting mode)
      45. 'Mode WGM22 WGM21 WGM20
      46. '7 1 1 1 Fast PWM
      47. Tccr2a = &B0010_0011
      48. 'FOC2A FOC2B – – WGM22 CS22 CS21 CS20 = TCCR2B
      49. 'CS22 CS21 CS20 Description
      50. '0 1 1 clkT2S/32 (From prescaler)
      51. Tccr2b = &B0000_1011
      52. 'Startwerte
      53. Ocr2a = 128
      54. Ocr2b = 40
      55. Steppuls Alias Portd.3
      56. Config Steppuls = Output
      57. Amplitude Alias Ocr2a
      58. 'Richtungsumkehr=stehendes Bild bei 2x Umkehr innerhalb des Lichtblitzes, Drehung wenn ED<>50%
      59. 'timer1 im fast pwm-Modus prescale 8
      60. 'OCR1A=top-Wert Frequenz ähnlich Ledfrequenz
      61. 'OCR1B=Richtungswechsel etwa 50% ED
      62. 'COM1A1 COM1A0 COM1B1 COM1B0 – – WGM11 WGM10 = TCCR1A
      63. '1 0 Clear OC1A/OC1B on Compare Match, set Oc1a / Oc1b At Bottom(non -inverting Mode)
      64. 'Mode WGM13 WGM12 WGM11 WGM10
      65. '15 1 1 1 1 Fast PWM
      66. Tccr1a = &B0010_0011
      67. 'ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10 = TCCR1B
      68. 'CS12 CS11 CS10 Description
      69. '0 1 0 clkI/O/8 (From prescaler)
      70. 'FOC1A FOC1B – – – – – – = TCCR1C
      71. Tccr1b = &B0001_1010
      72. 'Startwerte
      73. Ocr1a = 32700 '32759
      74. Ocr1b = 16379
      75. On Compare1a Comp1a_isr
      76. Enable Compare1a
      77. On Compare1b Comp1b_isr
      78. Enable Compare1b
      79. Stepdir Alias Portd.7
      80. Config Stepdir = Output
      81. Motorfrequenz Alias Ocr1a
      82. Richtungsumschaltung Alias Ocr1b
      83. Enable Interrupts
      84. Dim Motor_frequenz_start As Word
      85. Motor_frequenz_start = 250
      86. Dim Dir_links As Word , Dir_rechts As Word
      87. Dim M_frequenz As Word
      88. M_frequenz = 32640
      89. Dim Frequenz As Word , Frequenz_m As Byte
      90. Dim Amp As Word
      91. Dim Helligkeit As Word
      92. Dim Drehzahl As Word
      93. Dim Versatz_ist As Word , Versatz_soll As Word , Zufall As Word
      94. Dim Versatz_ist_ As Word
      95. Dim Zeit As Word , Zeit1 As Word
      96. Dim Countdown As Word
      97. Versatz_ist = 10
      98. Versatz_soll = 10
      99. Do
      100. Zufall = Rnd(50)
      101. Frequenz_m = Motor_frequenz_start - 20
      102. Amp = Getadc(0)
      103. Amp = Amp / 8
      104. Amplitude = 255 - Amp
      105. Drehzahl = Getadc(2)
      106. Dir_links = M_frequenz / 2
      107. Dir_links = Dir_links - 512
      108. Dir_links = Dir_links + Drehzahl
      109. Richtungsumschaltung = Dir_links
      110. Helligkeit = Getadc(3) 'Helligkeit
      111. Helligkeit = Helligkeit / 40 'Wertebereich 0..
      112. Helligkeit = Helligkeit + 5
      113. Led_helligkeit = Helligkeit
      114. If Helligkeit < 11 Then 'Ausschalten
      115. Else
      116. End If
      117. If Countdown > 0 Then Decr Countdown
      118. Loop
      119. End
      120. Comp1a_isr:
      121. Comp1b_isr:
      122. Bitwait Steppuls , Reset
      123. Toggle Stepdir
      124. Return
      Alles anzeigen
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • deine PWM ist konstant in der Frequenz und deine Änderung der PWM ist auch konstant. So gibt es zwangsläufig mal den Moment, wo die PWM nicht mit dem neuen PWM Wert mithalten kann, wenn der aktuelle Puls schon vorbei ist und der gewünschte länger sein soll oder umgekehrt. Dann bleibt die PWM oft auf dem Pegel bis zur nächsten Periode, was halt als Blitz oder Aussetzer oder Flackern wahrgenommen wird.
      Denk ich, wenn ich meiner Erinnerung ans Datenblatt glauben soll a_27_b277ca12
    • Das wäre nach dem Erreichen von top erledigt, danach läuft die Pwm mit dem neuen Pulsweitenverhältnis. Bei mir gibt's die 'Blitze', die deutlich länger dauern, als 1/60tel Sekunde, regelmäßig. Und zwar immer an der gleichen Stelle, wenn ich ein Objekt mit einer Schwebung bewegen lasse. Ich werde mal das Einlesen des Adwandlers raus nehmen, ich werde berichten.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Auch wenn ich 'Led_helligkeit=5' schreibe, also den ADwandler nicht benutze, kommt es zu dem unschönen Effekt. Als nächstes werde ich mit dem Oszi mal die PWM von timer0 betrachten, ob sich die ED ändert, oder die Betriebsspannung der Led, wie auch immer das gehen mag.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hi Tschoeatsch

      Was mit auffällt ist das Bitwait in der ISR-Routine.
      Solange auf das bit gewartet wird, wird kein Code ausgeführt und andere Interrupts blokiert.

      Vielleicht ist das die Ursache.

      Ein Interrupt, sofern alle Register gesichert und wieder hergestellt werden, verhagelt keine anderen Dinge - auch keine ADC-Messung.

      Und wo hast du die LED angeschlossen? Ich sehe kein Config für einen LED-Ausgang.
      Wird die LED über den OC0 Ausgang geschaltet?
    • Hallo Tschoeatsch,
      eigentlich sollte es kein Problem mit der PWM geben, da OCR0B ja doppelt gepuffert ist.
      Außerdem geht deine Fast-PWM immer bis TOP Wert 255, also kann OCR0B nie größer werden.

      Eine andere Stelle macht mich aufmerksam. Du willst scheinbar, dass für beide Timer1 Compares die gleiche ISR aufgerufen wird und hast dazu beide Label hintereinander geschrieben.
      Nun denke ich, dass der Compiler sofort hinter das Label die Register pushed, also evtl. zweimal.
      Nun ist die Frage, ob er zweimal popped, da nur ein Return kommt.
      Schreibe die ISRs doch mal getrennt hin.
    • Hallo Mitch,
      das fehlende Config ist glaube ich ein Punkt.
      Normalerweise macht das der Config Timer Befehl automatisch, aber Tschoeatsch setzt ja die Register direkt.
      Das Bitwait würde ich für die Timer0-PWM aber als unkritisch ansehen, da die ja unabhängig von irgendwelchen Interrupts läuft.
      Ein Bitwait in der ISR ist natürlich sowieso mit Vorsicht zu genießen.
    • tschoeatsch schrieb:

      Comp1a_isr:
      Comp1b_isr:
      Bitwait Steppuls , Reset
      Toggle Stepdir
      Return
      Es ist immer nur ein Interrupt, der abgearbeitet wird. Das Konstrukt ist zwar unüblich aber da wird nichts doppelt an Register gepushed.

      Den Config habe ich entdeckt (wer lesen kann ist klar im Vorteil a_45_132ca9f5 ) , Pin ist korrekt als Ausgang konfiguriert und LED an OC0B angeschlossen. Also auch korrekt.

      @Guenther
      Du hast recht, wenn die ISR-Routine durch Bitwait blokiert wird, geht der PWM trotzdem weiter. Nur wird dann halt in der Zeit das OC0B-Register nicht aktualisiert. Flackern darf es daher nicht.

      Den Fehler habe ich bisher nicht gefunden. Aber vielleicht ist da was bei der direkten Register-Konfiguration nicht in Ordnung. Das habe ich jetzt nicht geprüft.
      Vielleicht finde ich den Fehler noch.

      Nachtrag.
      Die Register-Konfiguration für Timer0 ist auch OK. Hab ich mit Mega 168 geprüft.

      Jetzt wird es schwierig.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mitch64 ()

    • Es wird nachweislich der Einschaltpuls der Led breiter, daher heller.
      Ich weiß jetzt grad' nicht, wo ich weiter suchen soll. Ocr0b ist ja jetzt testhalber fix, aber, gerade mal probiert, wenn ich ' Led_helligkeit = 10 ' aus der loop raus nehme und vor das do einmalig ausführen lasse, dann ist alles ok. Fast alles, ab und an gibt es einen kurzen Blitz.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Wenn ich das in der loop drin lass und auch regelbar und die loop mit einem waitms 200 einbremse, dann gibt es ein Doppelflackern. a_28_2c02f089
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Lasse dir mal die Werte seriell ausgeben, bevor du sie dem OCR0B zuweist.
      Und lasse die Zuweisung in der Loop aktiv.

      Wenn dann ein Flackern auftritt, siehst du vielleicht bei den Werten, ob da ein Sprung drin ist.
      Also eine Unregelmäßigkeit von der Variablen "Helligkeit".

      Vielleicht solltest du zum Probieren mal Helligkeit als Integer dimensionieren und bei der Zuweisung
      OCR0B=LowByte(Helligkeit) angeben.

      An etwas ganz banalem wird's wieder liegen - wie meistens.
    • Mitch64 schrieb:

      Lasse dir mal die Werte seriell ausgeben, bevor du sie dem OCR0B zuweist.
      Ich hab' das ja schon mit einer Konstanten probiert, Zuweisung innerhalb der loop, es ändert sich trotzdem die Pulsweite.
      Mir scheint einfach das Schreiben auf Ocr0b wird durch die interrupts gestört. Aber wenn ich immer daselbe schreibe, bei einem byte, wo kann da was kaputt gehen. Ich könnte mal die main mit einem bitwait auf das Beenden der isr warten lassen, dann dürfte ja nix mehr flackern.
      Mach ich gleich mal, nach dem Einheizen, es ist recht kühl geworden.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Du hast recht. Aber unsere Logik ist eben oft anders als bei einem Compiler

      Bei Bascom weiß man nie. Hab schon die dollsten Sachen erlebt was das betrifft.

      Probiers einfach aus.
      1. Variable Helligkeit als Integer (nicht als Word) dimensionieren. Wenn das nicht ist, kannste wieder zurück ändern
      2. Bei Zuweisen mal nur explizit das Lowbyte zuweisen. Auch hier, wenns keinen Effekt bringt wieder zurück ändern.
      3. Dann machst du da eine Berechnung Helligkeit = Helligkeit / 40. Schreibe mal Helligkeit = Helligkeit \ 40 (Ganzzahldivision)
      4. Wenn alle Stricke reißen, lasse dir mal die Werte ausgeben, die du dem Register OCR0B zuweist. Vielleicht siehst du da, dass Werte > 255 in der Variable stehen.
      Mehr Tips habe ich im Moment nicht.
    • Ich meine das hier:

      BASCOM-Quellcode

      1. 118: Comp1a_isr:
      2. +00000128: 920F PUSH R0 Push register on stack
      3. +00000129: 921F PUSH R1 Push register on stack
      4. 118: Comp1a_isr:
      5. +0000012A: 922F PUSH R2 Push register on stack
      6. +0000012B: 923F PUSH R3 Push register on stack
      7. 118: Comp1a_isr:
      8. +0000012C: 924F PUSH R4 Push register on stack
      9. +0000012D: 925F PUSH R5 Push register on stack
      10. 118: Comp1a_isr:
      11. +0000012E: 927F PUSH R7 Push register on stack
      12. +0000012F: 92AF PUSH R10 Push register on stack
      13. 118: Comp1a_isr:
      14. +00000130: 92BF PUSH R11 Push register on stack
      15. +00000131: 930F PUSH R16 Push register on stack
      16. 118: Comp1a_isr:
      17. +00000132: 931F PUSH R17 Push register on stack
      18. +00000133: 932F PUSH R18 Push register on stack
      19. 118: Comp1a_isr:
      20. +00000134: 933F PUSH R19 Push register on stack
      21. +00000135: 934F PUSH R20 Push register on stack
      22. 118: Comp1a_isr:
      23. +00000136: 935F PUSH R21 Push register on stack
      24. +00000137: 936F PUSH R22 Push register on stack
      25. 118: Comp1a_isr:
      26. +00000138: 937F PUSH R23 Push register on stack
      27. +00000139: 938F PUSH R24 Push register on stack
      28. 118: Comp1a_isr:
      29. +0000013A: 939F PUSH R25 Push register on stack
      30. +0000013B: 93AF PUSH R26 Push register on stack
      31. 118: Comp1a_isr:
      32. +0000013C: 93BF PUSH R27 Push register on stack
      33. +0000013D: 93CF PUSH R28 Push register on stack
      34. 118: Comp1a_isr:
      35. +0000013E: 93DF PUSH R29 Push register on stack
      36. +0000013F: 93EF PUSH R30 Push register on stack
      37. 118: Comp1a_isr:
      38. +00000140: 93FF PUSH R31 Push register on stack
      39. +00000141: B78F IN R24,0x3F In from I/O location
      40. 118: Comp1a_isr:
      41. +00000142: 938F PUSH R24 Push register on stack
      42. 122: Comp1b_isr:
      43. +00000143: 920F PUSH R0 Push register on stack
      44. +00000144: 921F PUSH R1 Push register on stack
      45. 122: Comp1b_isr:
      46. +00000145: 922F PUSH R2 Push register on stack
      47. +00000146: 923F PUSH R3 Push register on stack
      48. 122: Comp1b_isr:
      49. +00000147: 924F PUSH R4 Push register on stack
      50. +00000148: 925F PUSH R5 Push register on stack
      51. 122: Comp1b_isr:
      52. +00000149: 927F PUSH R7 Push register on stack
      53. +0000014A: 92AF PUSH R10 Push register on stack
      54. 122: Comp1b_isr:
      55. +0000014B: 92BF PUSH R11 Push register on stack
      56. +0000014C: 930F PUSH R16 Push register on stack
      57. 122: Comp1b_isr:
      58. +0000014D: 931F PUSH R17 Push register on stack
      59. +0000014E: 932F PUSH R18 Push register on stack
      60. 122: Comp1b_isr:
      61. +0000014F: 933F PUSH R19 Push register on stack
      62. +00000150: 934F PUSH R20 Push register on stack
      63. 122: Comp1b_isr:
      64. +00000151: 935F PUSH R21 Push register on stack
      65. +00000152: 936F PUSH R22 Push register on stack
      66. 122: Comp1b_isr:
      67. +00000153: 937F PUSH R23 Push register on stack
      68. +00000154: 938F PUSH R24 Push register on stack
      69. 122: Comp1b_isr:
      70. +00000155: 939F PUSH R25 Push register on stack
      71. +00000156: 93AF PUSH R26 Push register on stack
      72. 122: Comp1b_isr:
      73. +00000157: 93BF PUSH R27 Push register on stack
      74. +00000158: 93CF PUSH R28 Push register on stack
      75. 122: Comp1b_isr:
      76. +00000159: 93DF PUSH R29 Push register on stack
      77. +0000015A: 93EF PUSH R30 Push register on stack
      78. 122: Comp1b_isr:
      79. +0000015B: 93FF PUSH R31 Push register on stack
      80. +0000015C: B78F IN R24,0x3F In from I/O location
      81. 122: Comp1b_isr:
      82. +0000015D: 938F PUSH R24 Push register on stack
      83. Bitwait Steppuls , Reset
      84. +0000015E: 995B SBIC 0x0B,3 Skip if bit in I/O register cleared
      85. +0000015F: CFFE RJMP PC-0x0001 Relative jump
      86. 124: Toggle Stepdir
      87. +00000160: E880 LDI R24,0x80 Load immediate
      88. +00000161: B989 OUT 0x09,R24 Out to I/O location
      89. 125: Return
      90. +00000162: 918F POP R24 Pop register from stack
      91. +00000163: BF8F OUT 0x3F,R24 Out to I/O location
      92. 125: Return
      93. +00000164: 91FF POP R31 Pop register from stack
      94. +00000165: 91EF POP R30 Pop register from stack
      95. 125: Return
      96. +00000166: 91DF POP R29 Pop register from stack
      97. +00000167: 91CF POP R28 Pop register from stack
      98. 125: Return
      99. +00000168: 91BF POP R27 Pop register from stack
      100. +00000169: 91AF POP R26 Pop register from stack
      101. 125: Return
      102. +0000016A: 919F POP R25 Pop register from stack
      103. +0000016B: 918F POP R24 Pop register from stack
      104. 125: Return
      105. +0000016C: 917F POP R23 Pop register from stack
      106. +0000016D: 916F POP R22 Pop register from stack
      107. 125: Return
      108. +0000016E: 915F POP R21 Pop register from stack
      109. +0000016F: 914F POP R20 Pop register from stack
      110. 125: Return
      111. +00000170: 913F POP R19 Pop register from stack
      112. +00000171: 912F POP R18 Pop register from stack
      113. 125: Return
      114. +00000172: 911F POP R17 Pop register from stack
      115. +00000173: 910F POP R16 Pop register from stack
      116. 125: Return
      117. +00000174: 90BF POP R11 Pop register from stack
      118. +00000175: 90AF POP R10 Pop register from stack
      119. 125: Return
      120. +00000176: 907F POP R7 Pop register from stack
      121. +00000177: 905F POP R5 Pop register from stack
      122. 125: Return
      123. +00000178: 904F POP R4 Pop register from stack
      124. +00000179: 903F POP R3 Pop register from stack
      125. 125: Return
      126. +0000017A: 902F POP R2 Pop register from stack
      127. +0000017B: 901F POP R1 Pop register from stack
      128. 125: Return
      129. +0000017C: 900F POP R0 Pop register from stack
      130. +0000017D: 9518 RETI Interrupt return
      Alles anzeigen
      Das kann meiner Meinung nach nicht gutgehen. Alle Register doppelt pushen, aber nur einmal poppen.