Interrups verhält sich merkwürdig

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Interrups verhält sich merkwürdig

      Guten Morgen,

      habe ein kleines Code um den Interrupts zu testen
      Sobald Daten über UART empfangen wird, spring es in die Datenempfang routine.

      Doch, in die Schleife geht es nicht mehr zurück

      Warum?

      BASCOM Source Code

      1. $regfile = "m8adef.dat"
      2. $crystal = 7372800
      3. $baud = 115200
      4. $hwstack = 64
      5. $swstack = 86
      6. $framesize = 86
      7. On Urxc Datenempfang 'Bei Empfang eines Asciizeichens über UART zur ISR Datenempfang springen
      8. Enable Urxc
      9. Enable Interrupts
      10. Config Portc.1 = Output
      11. Green_led Alias Portc.1
      12. Green_led = 1
      13. Config Portc.2 = Output
      14. Blue_led Alias Portc.2
      15. Config Portc.4 = Output
      16. Red_led Alias Portc.4
      17. Do
      18. Toggle Red_led
      19. Waitms 150
      20. Loop
      21. Datenempfang:
      22. Toggle Blue_led
      23. Return
      Display All
    • Wie viele Zeichen sendest du denn an den AVR?
      Wenn du permanent Daten sendest, wird ein Interrupt nach dem anderen ausgeführt. Der Controller hat dann möglicherweise keine Taktreserve mehr, noch etwas an der Hauptschleife abzuarbeiten. Ein Wait mit 150ms verlängert sich um die Ausführungsdauer des Interrupts.

      Der Simulator ist auch ein gutes Werkzeug zum schauen, wo das Programm hängen könnte.
    • Oder sah es im Simulator nur so aus? Geduld-er muß die Schritte des Wait simulieren und das dauert. Da seine Anzeige immer nur zum Beginn eines Befehls springt , das wait aber "mittendrin" ist sieht es aus als würde er beim Return steckenbleiben.
      In der Realität sollte die rote kaum erkennbar langsamer werden die blaue bei Dauertext halbhell sein.
      (115kbaud - ca 11.500xDatemempfang - ca 1,4M Takte ca 20% CPU Auslastung)

      Ein einziger heißt das der Pin high ist und für <100µs low war?
      Versuch mal viele.
    • Hallo Zusammen,
      ich bin mal einen Schritt weiter gegangen und habe den Beispiel von Stefan in mein ATMEGA8A implementiert.


      BASCOM Source Code

      1. $regfile = "m8adef.dat"
      2. $crystal = 7372800
      3. $baud = 115200
      4. $hwstack = 64
      5. $swstack = 86
      6. $framesize = 86
      7. 'On Urxc Datenempfang 'Bei Empfang eines Asciizeichens über UART zur ISR Datenempfang springen
      8. 'Enable Urxc
      9. 'Enable Interrupts
      10. Config Portc.1 = Output
      11. Green_led Alias Portc.1
      12. Green_led = 1
      13. Config Portc.2 = Output
      14. Blue_led Alias Portc.2
      15. Config Portc.4 = Output
      16. Red_led Alias Portc.4
      17. Dim Eingabestring As String * 10
      18. Print " "
      19. Print "------------------------------"
      20. Print "Steuerung des ATTMEGA8A vom PC"
      21. Print "------------------------------"
      22. Do
      23. Print " " 'Leerzeile
      24. Print "Befehl eingeben: "
      25. Input Eingabestring
      26. Print "Empfangen: " ; Eingabestring
      27. Select Case Eingabestring
      28. Case "blau an" : Set Blue_led
      29. Case "blau aus" : Reset Blue_led
      30. Case "rot an" : Set Red_led
      31. Case "rot aus" : Reset Red_led
      32. Case Else : Print "Befehl unbekannt!"
      33. End Select
      34. Loop
      Display All
      Im Simulation verhält sich das anders als auf dem HW

      test.PNG

      Und zudem noch, in der Hilfebeschreibung wird nichts davon erwähnt, das die Schleife bei Input wartet.

      VG
      Katip