Manchmal kryptische Zeichen auf dem Display

    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!

    • erwischt, ich hab zwar mal in die Lib reingeschaut, sie aber nicht verstanden. ?(
      Aber nochmal, ich schalte nur den "externen Interrupt" während des Schreibens aus und es funktioniert, Störungen bringt der nicht mit, ist lt. Oszi ein einwandfreies Signal.
      (kommt über Optokoppler)
      Die internen tragen demnach nicht zum Kryptobild bei.
      Gruß
      Hans

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

    • BASCOM-Quellcode

      1. 'Version 16.11.21
      2. 'Bascom ATmega 8
      3. 'LCD 16 x 4
      4. '
      5. '
      6. $regfile = "m8def.dat"
      7. $crystal = 16000000
      8. $hwstack = 40
      9. $swstack = 32
      10. $framesize = 60
      11. Baud = 9600
      12. '---------------------------------------------------------------------------------
      13. 'Definition LCD
      14. '---------------------------------------------------------------------------------
      15. Config Lcd = 16x4
      16. Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.5 , Rs = Portc.4
      17. Cls
      18. Cursor Off
      19. Config Dcf77 = Pinb.1 , Inverted = 1 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
      20. Enable Interrupts
      21. '---------------------------------------------------------------------------------
      22. 'Definition der Ein- und Ausgänge
      23. '---------------------------------------------------------------------------------
      24. Portb.1 = 1
      25. Pind.2 = 1
      26. Config Portb.2 = Output
      27. Config Portd.2 = Input
      28. Signal_control_led Alias Portb.2
      29. Config Date = Dmy , Separator = Dot
      30. Dim Neue_sekunde As Bit
      31. Dim Flag As Byte
      32. Dim Timeu As String * 8
      33. Signal_control_led = 1
      34. '--------------------------------
      35. 'Portb.6 Quarz
      36. 'Portb.7 Quarz
      37. '-----------------------------------
      38. '---------------------------------------
      39. 'Definition Interrupt's
      40. '---------------------------------------
      41. On Int0 Es_blinkt 'Pin D.2
      42. Config Int0 = Falling
      43. '---------------------------------------
      44. 'Hauptschleife
      45. '---------------------------------------
      46. Locate 1 , 1
      47. Do
      48. Signal_control_led = Dcf_status.0
      49. If Neue_sekunde = 1 Then
      50. Neue_sekunde = 0
      51. Disable Int0
      52. Gosub Anzeige
      53. Timeu = Time$
      54. Enable Int0
      55. End If
      56. Loop
      57. End
      58. Sectic:
      59. Neue_sekunde = 1
      60. Return
      61. Anzeige:
      62. If Dcf_status.7 = 0 Then
      63. Locate 1 , 1
      64. Lcd "warten.."
      65. Locate 2 , 1
      66. Lcd Time$
      67. Else
      68. Locate 1 , 1
      69. Lcd Date$
      70. Locate 2 , 1
      71. Lcd Time$
      72. End If
      73. Return
      74. Es_blinkt:
      75. If Flag = 0 Then
      76. Flag = 1
      77. Locate 3 , 1
      78. Lcd Timeu
      79. End If
      80. Locate 4 , 1
      81. Lcd Timeu
      82. Locate 4 , 9
      83. Lcd " " 'nur für den Fall, dass die Störung hier auftritt und die Zeile vollmüllt
      84. Return
      Alles anzeigen
      Gruß
      Hans
    • Grundsätzlich treten unerwünschte Effekte nicht nur beim Display auf, wenn man aus dem Programm und aus einem Interrupt heraus darauf zugreift.
      Das Betrifft alle Arten von Peripherie am Controller, auch die interne wie UART, I2S, SPI, Timer etc.
      Auch ein Ausgabepin würde ich als Peripherie dazu zählen.

      Man könnte ja auf die Idee kommen und ein Testpin z.B. PortC.0 als Ausgang anzulegen, um mit dem Oszi festzustellen, wie lange ein Code-Teil in der Hauptschleife für die Abarbeitung in Anspruch nimmt. Anso setzt man den Testpin vor dem Codeteil und löscht ihn wieder danach. Am Oszi lösst sich nun anhand der Pulsbreite ermitteln, wie lange die Ausführungsdauer ist.

      Nun kommt ein Interrupt hinzu und man möchte sehen, ob der überhaupt angesprungen wird. Und jetzt nimmt man den selben Testpin und lässt den immer toggeln, wenn die ISR angesprungen wird. Man kann sich vorstellen, dass dann das am Oszi sichtbare Signal vom Testpin nichts mehr zur Analyse taugt. So in etwa kann man sich das auch beim Display und anderen Peripherien vorstellen.

      Am besten man entscheidet sich für eine Zugriffsart, entweder die aus dem Programm oder die aus dem Interrupt, aber nie beides.
      (Ausnahmen bestätigen hier wieder die Regel, wenn man z.B. eine Zugriffskontrolle verwendet)
      So vermeidet man schon vieles an Problemen.

      Am besten ist es aber, wenn man den Zugriff aus dem Programm macht und im Interrupt nur ein Flag setzt, auf das man im Programm reagiert.
      Ein Interrupt sollte so kurz wie möglich sein (Ausnahmen bestätigen die Regel), weil sie das Programm in soweit blockieren, dass kein anderer Interrupt in der Zeit abgearbeitet werden kann (Auch hier gibt es Möglichkeiten, das sind aber auch Ausnahmen und ist was für Freaks).

      Auf diese weise klappt's in der Regel.
    • In dem Fall vielleicht den Interrupt ganz weg lassen. Leider akzeptiert Bascom kein If Int0 = 1, daher der Direktweg über Gifr

      Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 1600000
      3. $hwstack = 40
      4. $swstack = 32
      5. $framesize = 60
      6. $baud = 9600
      7. $version 16 , 11 , 22
      8. '---------------------------------------------------------------------------------
      9. 'Definition LCD
      10. '---------------------------------------------------------------------------------
      11. Config Lcd = 16x4
      12. Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.5 , Rs = Portc.4
      13. Cls
      14. Cursor Off
      15. Config Dcf77 = Pinb.1 , Inverted = 1 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
      16. Enable Interrupts
      17. '---------------------------------------------------------------------------------
      18. 'Definition der Ein- und Ausgänge
      19. '---------------------------------------------------------------------------------
      20. Portb.1 = 1
      21. Pind.2 = 1
      22. Config Portb.2 = Output
      23. Config Portd.2 = Input
      24. Signal_control_led Alias Portb.2
      25. Config Date = Dmy , Separator = Dot
      26. Dim Neue_sekunde As Bit
      27. Dim Flag As Byte
      28. Dim Timeu As String * 8
      29. Signal_control_led = 1
      30. '--------------------------------
      31. 'Portb.6 Quarz
      32. 'Portb.7 Quarz
      33. '-----------------------------------
      34. '---------------------------------------
      35. 'Definition Interrupt's
      36. '---------------------------------------
      37. 'On Int0 Es_blinkt 'Pin D.2
      38. Config Int0 = Falling
      39. '---------------------------------------
      40. 'Hauptschleife
      41. '---------------------------------------
      42. Locate 1 , 1
      43. Do
      44. Signal_control_led = Dcf_status.0
      45. If Neue_sekunde = 1 Then
      46. Neue_sekunde = 0
      47. ' Disable Int0
      48. Gosub Anzeige
      49. Timeu = Time$
      50. ' Enable Int0
      51. End If
      52. If Gifr.intf0 = 1 Then
      53. Gosub Es_blinkt
      54. Set Gifr.intf0 'Flag löschen
      55. End If
      56. Loop
      57. End
      58. Sectic:
      59. Neue_sekunde = 1
      60. Return
      61. Anzeige:
      62. If Dcf_status.7 = 0 Then
      63. Locate 1 , 1
      64. Lcd "warten.."
      65. Locate 2 , 1
      66. Lcd Time$
      67. Else
      68. Locate 1 , 1
      69. Lcd Date$
      70. Locate 2 , 1
      71. Lcd Time$
      72. End If
      73. Return
      74. Es_blinkt:
      75. If Flag = 0 Then
      76. Flag = 1
      77. Locate 3 , 1
      78. Lcd Timeu
      79. End If
      80. Locate 4 , 1
      81. Lcd Timeu
      82. Return
      Alles anzeigen