Grafikanzeige fehlerhaft

    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!

    • Grafikanzeige fehlerhaft

      Hallo, nachdem ich erfolgreich das Powerdown-Problem (Siehe Thread "Powerdown verbessern")gemeistert habe, ergibt sich ein neues Problem. Daher dieser neue Thread.
      Sporadisch tritt nun diese fehlerhafte Anzeige auf ( hier bei 37min43sek) , bleibt auch so bis zum Ende. Meine Vermutung ist, das die Anzeige zu schnell hintereinander Daten kriegt.
      Aber wo ? Oder ist es etwas anderes?
      Dateien
      • oled.jpg

        (381,18 kB, 13 mal heruntergeladen, zuletzt: )
    • Ist das ein Rest einer früheren Anzeige? Hast du ein Programm zu deinem Problem? ;)

      Die thread-Überschrift macht zwar neugierig, aber ob der thread später mal bei einem ähnlichen Problem hilft, ist fraglich. Eine präzisere Überschrift ist hilfreicher für andere Hilfesuchenden nach dir.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Änderung ok, ich wußte es nicht besser zu beschreiben. Ist immer noch der selbe Code.

      BASCOM-Quellcode

      1. '----- Küchentimer--20180915----
      2. $regfile = "m168pdef.dat"
      3. $crystal = 8000000
      4. $hwstack = 100
      5. $swstack = 32
      6. $framesize = 40
      7. '$sim
      8. '*******************************************************************************
      9. $lib "glcdSSD1306-I2C.lib"
      10. Waitms 100
      11. Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
      12. '---------------------------
      13. Config Scl = Portc.5 'Hardw. i2c pins
      14. Config Sda = Portc.4
      15. Config Twi = 400000
      16. I2cinit
      17. '----------------------------
      18. Config Portd.2 = Input
      19. T_stop Alias Pind.2
      20. Portd.2 = 1
      21. On Int0 _stop Nosave
      22. Config Int0 = Falling
      23. Enable Int0
      24. Config Portb.1 = Input 'Minute stellen
      25. T_min Alias Pinb.1
      26. Portb.1 = 1 'H setzen
      27. Config Portb.1 = Input 'Stunde stellen
      28. T_std Alias Pinb.2
      29. Portb.2 = 1 'H setzen
      30. '------------------------------
      31. Config Timer1 = Timer , Prescale = 256
      32. On Timer1 Timer1_isr
      33. Enable Timer1
      34. Timer1 = 34286
      35. Stop Timer1
      36. Enable Interrupts
      37. Stop Watchdog
      38. Cls
      39. '---------------------------
      40. Dim Sekunde As Byte
      41. Dim Minute As Byte
      42. Dim Stunde As Byte
      43. Dim _zeige As Byte 'Anzeige aktualisieren
      44. _zeige = 1
      45. Dim _neu As Bit
      46. _neu = 0
      47. 'für lcd in string wandeln
      48. Dim Sekstring As String * 2
      49. Dim Mstring As String * 2
      50. Dim Stdstring As String * 2
      51. Dim Z_string As String * 5
      52. '***************************** Programm *********************
      53. Main:
      54. Powerdown 'schlafen
      55. Cls
      56. Setfont Arial_12x15
      57. Lcdat 1 , 1 , "los geht´s"
      58. Wait 1
      59. Disable Int0
      60. Do
      61. If _neu = 1 Or T_stop = 0 Then Gosub _stellen
      62. If _neu = 0 And Sekunde = 0 And Minute = 0 And Stunde = 0 Then 'ausschalten
      63. Stop Timer1
      64. Cls
      65. Enable Int0
      66. Setfont Arial_12x15
      67. Lcdat 4 , 5 , "Ende"
      68. Waitms 500
      69. Cls
      70. Goto Main
      71. End If
      72. '---- Anzeige --------------
      73. If Sekunde > 59 Then
      74. Sekunde = 59
      75. Decr Minute
      76. End If
      77. If Minute > 59 Then
      78. Minute = 59
      79. Decr Stunde
      80. End If
      81. If _zeige = 1 Then 'display Aktualisieren
      82. _zeige = 0
      83. Gosub _anzeige
      84. End If
      85. Loop
      86. '------------------------------------------------------
      87. $include "Arial_12x15.font"
      88. $include "test.font"
      89. '------------------------------------------------------
      90. Timer1_isr:
      91. Timer1 = 34286
      92. Decr Sekunde
      93. If Sekunde = 0 And Minute = 0 And Stunde = 0 Then Stop Timer1
      94. _zeige = 1
      95. Return
      96. _stop:
      97. _neu = 1
      98. Return
      99. _stellen:
      100. Stop Timer1
      101. 'Setfont Arial_12x15
      102. 'Lcdat 4 , 4 , "stellen"
      103. Bitwait T_stop , Set
      104. Do
      105. If T_min = 0 Then
      106. Sekunde = 0
      107. Incr Minute
      108. If Minute > 10 Then Minute = 0
      109. Gosub _anzeige
      110. End If
      111. If T_std = 0 Then
      112. Incr Stunde
      113. If Stunde > 3 Then Stunde = 0
      114. Gosub _anzeige
      115. End If
      116. Loop Until T_stop = 0
      117. Waitms 80
      118. Bitwait T_stop , Set
      119. Waitms 80
      120. _neu = 0
      121. Cls
      122. Setfont Arial_12x15
      123. Lcdat 2 , 4 , "START " ; _neu
      124. Wait 1
      125. Cls
      126. Start Timer1
      127. Return
      128. _anzeige:
      129. Sekstring = Str(sekunde)
      130. Sekstring = Format(sekstring , "00")
      131. Mstring = Str(minute)
      132. Mstring = Format(mstring , "00")
      133. Stdstring = Str(stunde)
      134. Stdstring = Format(stdstring , " 0")
      135. If Stunde > 0 Then
      136. Z_string = Stdstring + ":" + Mstring
      137. Else
      138. Z_string = Mstring + ":" + Sekstring
      139. End If
      140. Setfont Test
      141. Lcdat 1 , 1 , Z_string
      142. Return
      143. End
      Alles anzeigen
    • Diese Kettenrechnungen beim Zusammensetzen von z_string hätte ich mir nicht getraut. Dass das bei strings geht, wusste ich bislang nicht. Ich hätte das in mehreren Zeilen gemacht. Ob das jetzt die Ursache ist, weiß ich nicht. Sende doch einfach mal vor dem z_string 6 Leerzeichen an die gleiche Stelle, zB
      z_string="(hier sollen 6 Leerzeichen stehen)":lcdat at 1,1,z_string
      danach den string aus den Zeiten zusammen setzen und anzeigen lassen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Was die Ursache sein könnte: du decrementierst die Sekunden in einem interrupt. In der main wird die Sekunde geprüft, wenn die kleiner 0 ist, wird sie auf 59 gesetzt. Wenn sie jetzt 0 ist und nach dieser Prüfung kommt der interrupt, dann ist sie zur Anzeige 3-stellig (255). Dann könnte dieser rechte 5er in der Anzeige bleiben.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Danke erst mal

      tschoeatsch schrieb:

      Was die Ursache sein könnte: du decrementierst die Sekunden in einem interrupt. In der main wird die Sekunde geprüft, wenn die kleiner 0 ist, wird sie auf 59 gesetzt. Wenn sie jetzt 0 ist und nach dieser Prüfung kommt der interrupt, dann ist sie zur Anzeige 3-stellig (255). Dann könnte dieser rechte 5er in der Anzeige bleiben.
      Nach dem ich mal die Anzeige schon in Zeile 85 aktualisiert habe, trat genau dieses ein.
      Ich habe doch aber hier den String auf 2 Stellen begrenzt oder

      daja schrieb:

      Sekstring = Str(sekunde)
      Sekstring = Format(sekstring , "00")

      Sooo.
      Nun habe ich die Sekunden Korrektur mal in den Timer Interrupt gesetzt. Die fehlerhafte Anzeige is Geschichte.
      Aber jetzt ist die Anzeige für z.B. 23:00 sehr kurz, die abgelaufene Zeit ist auch nicht mehr real.
      Also ist diese Änderung auch nicht das Wahre.
    • daja schrieb:

      Ich habe doch aber hier den String auf 2 Stellen begrenzt oder
      Also ich bin der Meinung, ein 'dim text as string*2' legt nur einen Platz für 2 Buchstaben im ram fest, verhindert aber nicht, dass man text größer als 2 Buchstaben macht. Es wird zwar beim Compilieren darauf geachtet, dass man nicht 'text="abc" schreibt, aber ich kann ja zur Laufzeit einen string zusammensetzen oder mit Funktionen generieren, der dann länger als der voreingestellte ist. Ich denke daher, dass durch das Sekstring = Str(sekunde) ein 3-stelliger string erzeugt werden kann und auch trotz format 3-stellig ausgegeben wird.

      Zu deinem Programm: du musst einfach verhindern, dass Sekundenwerte >59 angezeigt werden kann. Deine isr gibt alle Sekunde die Aktualisierung der Anzeige frei. Dabei ist in der isr die Sekunde schon manipuliert worden und kann jetzt Werte>59 angenommen haben. Also muss vor der Anzeige das korrigiert werden. Probier mal diese Programmversion:

      BASCOM-Quellcode

      1. '----- Küchentimer--20180915----
      2. $regfile = "m168pdef.dat"
      3. $crystal = 8000000
      4. $hwstack = 100
      5. $swstack = 32
      6. $framesize = 40
      7. '$sim
      8. '*******************************************************************************
      9. $lib "glcdSSD1306-I2C.lib"
      10. Waitms 100
      11. Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
      12. '---------------------------
      13. Config Scl = Portc.5 'Hardw. i2c pins
      14. Config Sda = Portc.4
      15. Config Twi = 400000
      16. I2cinit
      17. '----------------------------
      18. Config Portd.2 = Input
      19. T_stop Alias Pind.2
      20. Portd.2 = 1
      21. On Int0 _stop Nosave
      22. Config Int0 = Falling
      23. Enable Int0
      24. Config Portb.1 = Input 'Minute stellen
      25. T_min Alias Pinb.1
      26. Portb.1 = 1 'H setzen
      27. Config Portb.1 = Input 'Stunde stellen
      28. T_std Alias Pinb.2
      29. Portb.2 = 1 'H setzen
      30. '------------------------------
      31. Config Timer1 = Timer , Prescale = 256
      32. On Timer1 Timer1_isr
      33. Enable Timer1
      34. Timer1 = 34286
      35. Stop Timer1
      36. Enable Interrupts
      37. Stop Watchdog
      38. Cls
      39. '---------------------------
      40. Dim Sekunde As Byte
      41. Dim Minute As Byte
      42. Dim Stunde As Byte
      43. Dim _zeige As Byte 'Anzeige aktualisieren
      44. _zeige = 1
      45. Dim _neu As Bit
      46. _neu = 0
      47. 'für lcd in string wandeln
      48. Dim Sekstring As String * 2
      49. Dim Mstring As String * 2
      50. Dim Stdstring As String * 2
      51. Dim Z_string As String * 5
      52. '***************************** Programm *********************
      53. Main:
      54. Powerdown 'schlafen
      55. Cls
      56. Setfont Arial_12x15
      57. Lcdat 1 , 1 , "los geht´s"
      58. Wait 1
      59. Disable Int0
      60. Do
      61. If _neu = 1 Or T_stop = 0 Then Gosub _stellen
      62. If _neu = 0 And Sekunde = 0 And Minute = 0 And Stunde = 0 Then 'ausschalten
      63. Stop Timer1
      64. Cls
      65. Enable Int0
      66. Setfont Arial_12x15
      67. Lcdat 4 , 5 , "Ende"
      68. Waitms 500
      69. Cls
      70. Goto Main
      71. End If
      72. '---- Anzeige --------------
      73. If _zeige = 1 Then 'display Aktualisieren
      74. _zeige = 0
      75. If Sekunde > 59 Then
      76. Sekunde = 59
      77. Decr Minute
      78. End If
      79. If Minute > 59 Then
      80. Minute = 59
      81. Decr Stunde
      82. End If
      83. Gosub _anzeige
      84. End If
      85. Loop
      86. '------------------------------------------------------
      87. $include "Arial_12x15.font"
      88. $include "test.font"
      89. '------------------------------------------------------
      90. Timer1_isr:
      91. Timer1 = 34286
      92. Decr Sekunde
      93. If Sekunde = 0 And Minute = 0 And Stunde = 0 Then Stop Timer1
      94. _zeige = 1
      95. Return
      96. _stop:
      97. _neu = 1
      98. Return
      99. _stellen:
      100. Stop Timer1
      101. 'Setfont Arial_12x15
      102. 'Lcdat 4 , 4 , "stellen"
      103. Bitwait T_stop , Set
      104. Do
      105. If T_min = 0 Then
      106. Sekunde = 0
      107. Incr Minute
      108. If Minute > 10 Then Minute = 0
      109. Gosub _anzeige
      110. End If
      111. If T_std = 0 Then
      112. Incr Stunde
      113. If Stunde > 3 Then Stunde = 0
      114. Gosub _anzeige
      115. End If
      116. Loop Until T_stop = 0
      117. Waitms 80
      118. Bitwait T_stop , Set
      119. Waitms 80
      120. _neu = 0
      121. Cls
      122. Setfont Arial_12x15
      123. Lcdat 2 , 4 , "START " ; _neu
      124. Wait 1
      125. Cls
      126. Start Timer1
      127. Return
      128. _anzeige:
      129. Sekstring = Str(sekunde)
      130. Sekstring = Format(sekstring , "00")
      131. Mstring = Str(minute)
      132. Mstring = Format(mstring , "00")
      133. Stdstring = Str(stunde)
      134. Stdstring = Format(stdstring , " 0")
      135. If Stunde > 0 Then
      136. Z_string = Stdstring + ":" + Mstring
      137. Else
      138. Z_string = Mstring + ":" + Sekstring
      139. End If
      140. Setfont Test
      141. Lcdat 1 , 1 , Z_string
      142. Return
      143. End
      Alles anzeigen
      Raum für Notizen

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

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