Display und Timer vertragen sich nicht

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

    • Display und Timer vertragen sich nicht

      oder : Was hab ich da wieder versaubeutelt ?

      Erstens : Ich freu mich richtig das geniale freundlich kompetente "Sammelsorium" ( Echt nett gemeint) an Leuten wiedergefunden zu haben .
      Hab auch schon wieder viel gelesen und so manchen Schlag an die Stirn ausgeführt mit dem Gedanken --- Hätteste auch selber drauf kommen können . Danke dafür !

      Zu meinem Problem hab ich leider nichts gefunden . Also die Frage :

      Hab nen 16*2 Display am Arduino nano V3 , der steuert ne menge sachen unter anderem auch ne 8Kanal Relaisplatine . Nu hab ich viel gefunden das die Störungen verursacht und viel in diese Richtung gearbeitet - nix , das Problem ist , das nach ner gewissen Zeit ,manchmal nach 5 MIn manchmal nach ner halben Stunde auf dem Display nur noch sinnloser Zeichenwirrwar erscheint . Alle Funktionen laufen aber perfekt weiter .

      Verschidene Displays - keine Änderung .

      Irgendwann hab ich mal den Timer rausgeworfen und die Zeit mit ner Schleife hochgezählt ( Zeit muss nur die Laufzeit anzeigen , also keine Uhrzeit ) und oh Wunder , alles geht perfekt .
      Da das mein erster Einsatz eines Timers ist , denk ich das ich da was nicht begriffen habe was im Buch steht . Falls das doch richtig ist was ich im Code geschrieben habe , kann es Hardwareprobleme geben ? Mit nem Uno passiert genau das gleiche , aber es sind beides Chinas .
      Habe bei diesen ganzen Tests auch mal alles rausgenommen was nicht mit der Anzeige zu tun hat , auch da tritt das Phänomen auf .

      Hier mal der Minicode zum Test der Zeitanzeige

      BASCOM-Quellcode

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 40
      4. $swstack = 16
      5. $framesize = 32
      6. $lib "DateTime.lbx"
      7. On Timer1 Timer0serv
      8. Config Timer1 = Timer , Prescale = 1024
      9. Enable Timer1
      10. Enable Interrupts
      11. Dim Preload As Word
      12. Preload = 49800
      13. Timer1 = Preload
      14. 'Timertest
      15. Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portd.5 , Rs = Portd.6
      16. Config Lcd = 16 * 2
      17. Config Portd.2 = Output
      18. Config Portd.3 = Output
      19. Config Portd.4 = Output
      20. Config Portc.5 = Output
      21. Config Portb.3 = Output
      22. Config Portb.4 = Output
      23. Config Portb.5 = Output
      24. Config Pinc.2 = Input
      25. Config Pinc.3 = Input
      26. Config Pinc.4 = Input
      27. Dim Azeit As Word
      28. Dim Sekunden As Long
      29. Dim Strtime As String * 8
      30. Portd.2 = 1
      31. Portd.3 = 1
      32. Portd.4 = 1
      33. Portb.3 = 1
      34. Portb.4 = 1
      35. Portc.5 = 1
      36. Portb.5 = 1
      37. Cursor Off
      38. Cls
      39. Pinc.2 = 1
      40. Pinc.3 = 1
      41. Pinc.4 = 1
      42. Dim Zahl As Integer
      43. Dim Zeit$ As String * 9
      44. Zahl = 0
      45. Los:
      46. Cls
      47. Locate 1 , 1 : Lcd "A-zeit:"
      48. Locate 2 , 1 : Lcd "Bildnummer :"
      49. Do
      50. Cursor Off
      51. Sekunden = Azeit
      52. Strtime = Time(sekunden)
      53. Locate 1 , 9 : Lcd Strtime
      54. Zahl = Zahl + 1
      55. Waitms 500
      56. Locate 2 , 14 : Lcd Zahl
      57. If Zahl >= 9999 Then Zahl = 0
      58. Loop
      59. Timer0serv:
      60. Timer1 = Preload
      61. Azeit = Azeit + 1
      62. Return
      63. End
      Alles anzeigen

      Besten Dank schonmal ...

      Gruß Bernd
      gestartet mit KC Basic ... angekommen bei BASCOM
    • Vorweg, sei vorsichtig mit Arduino Nano und Timer, die 16MHz sind nicht sicher:
      Arduino Nano V3 Taktfrequenz

      Der Arduino Nano hat aus eigener Erfahrung gerne noch einen Kondensator an seiner Versorgung.
      Displays steigen aus, wenn sie Störungen einfangen.
      Das hat aber nicht wirklich was mit dem Interrupt zu tun.
      Schlechte Masseführung und lange Kabel oder fehlende Kondensatoren oder auch zu lange Kabel, die Liste ist lang.
      Zeig doch mal ein Bild von deinem Aufbau.
    • Probier doch mal 'initlcd'
      aus der Hilfe:
      Action
      Initializes the LCD display.
      Syntax
      INITLCD
      Remarks
      The LCD display is initialized automatic at start up when LCD statements are used by your code.
      This is done by a call to _LCD_INIT.
      If you include the INITLCD statement in your code, the automatic call is disabled and the _LCD_INIT is called at the place in your code where you put the INITLCD statement. (initlcd is translated into a call to _init_lcd).
      Why is this useful?
      In an environments with static electricity, the display can give strange output.

      You can initialize the display then once in a while. When the display is initialized, the display content is cleared also.
      The LCD routines depend on the fact that the WR pin of the LCD is connected to ground. But when you connect it to a port pin, you must first set the logic level to 0 and after that you can initialize the display by using INITLCD

      Xmega chips need a stable oscillator. This is done with some CONFIG statements. The INITLCD should be placed after these commands. And since the Xmega by default has a slow internal oscillator, without using INITLCD at the proper location, your application would start slow. See the explanation below.

      So in short you have more control when the LCD is initialized.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo

      Hier mal der Aufbau , Display sitzt genau unter dem Uno.Ich habe schon Cat7 Netzwerkkabel zum Display verwendet , unter dem Uno ist es auch komplett mit Schirm und allem ....unodisplay.jpg ok der >Heißkleberknickschutz is nich so toll , aber geht erstmal . Und wie gesagt , ohne Timer läuft das Tagelang problemlos ..

      Danke
      gestartet mit KC Basic ... angekommen bei BASCOM
    • Hallo Cable , erwischt ... stammt noch aus dem Ursprungscode , da ist ein 20*4 Display dran . Das verschieben ist zum Test kein Problem , aber es kommt tatsächlich nur noch eine Ansammlung sinnloser Muster auf dem Display an ... aber wie gesagt , wenn ich die Sekunden per Schleife zähle läuft alles perfekt .

      Der Beastmaster
      gestartet mit KC Basic ... angekommen bei BASCOM
    • Ein paar zeichen LCD mehr machen normalerweise nichts aus, intern sind die oft als 2x20 oder 2x40 verschaltet.
      Der initLCD sollte auch auf jeden fall sein.

      Aber nun zum eigentlichen problem: Du schreibst in deiner Schleife kontinuierlich alle 500milisekunden dein Display. Währ ich schlau könnt ich ausrechnen wann sich dein interrupt und deine "500millisekunden-schleife mit LCD schreiben" treffen. Die Displays mögen es meist nicht wenn während der Ansteuerung ein Interrupt kommt und damit das Timing durcheinanderbringt. Musst also Dein Programm und/oder Timer so umbauen das das Display nur nach einem interrupt beschrieben wird, und natürlich bevor der Interrupt nochmal kommt. Vorher ändert sich ja deine Displayanzeige eh nicht. Also im interrupt nen Flag setzen, das in deiner Hauptschleife auswerten.

      Tobias
    • Ich habe das mal ein bischen aufgedrösselt.Los: sollte auch mit return abgeschlossen werden ist aber Offen.
      Deshalb ausgeblendet.Pinc2-pinc4 sind eingänge werden jedoch auf 1 gesetzt,oder soll der Pullup eineschaltet
      werden? Wäre dann aber portc.2 -portc.4 = 1. Preloadwert für 1 Sek = 49911 bei pres.1024
      Software

      BASCOM-Quellcode

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 40
      4. $swstack = 16
      5. $framesize = 32
      6. $lib "DateTime.lbx"
      7. '$sim
      8. On Timer1 Timer0serv
      9. Config Timer1 = Timer , Prescale = 1024
      10. Enable Timer1
      11. Enable Interrupts
      12. Dim Preload As Word
      13. Preload = 49800
      14. Timer1 = Preload
      15. 'Timertest
      16. Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portd.5 , Rs = Portd.6
      17. Config Lcd = 16 * 2
      18. Initlcd
      19. Cursor Off
      20. Cls
      21. Config Portd.2 = Output
      22. Config Portd.3 = Output
      23. Config Portd.4 = Output
      24. Config Portc.5 = Output
      25. Config Portb.3 = Output
      26. Config Portb.4 = Output
      27. Config Portb.5 = Output
      28. Config Pinc.2 = Input
      29. Config Pinc.3 = Input
      30. Config Pinc.4 = Input
      31. Dim Azeit As Word
      32. Dim Sekunden As Long
      33. Dim Strtime As String * 8
      34. Dim Zahl As Integer
      35. Dim Zeit$ As String * 9
      36. Portd.2 = 1
      37. Portd.3 = 1
      38. Portd.4 = 1
      39. Portb.3 = 1
      40. Portb.4 = 1
      41. Portc.5 = 1
      42. Portb.5 = 1
      43. Pinc.2 = 1
      44. Pinc.3 = 1
      45. Pinc.4 = 1
      46. Zahl = 0
      47. 'Los:
      48. Cls
      49. Locate 1 , 1 : Lcd "A-zeit:"
      50. Locate 2 , 1 : Lcd "Bildnummer :"
      51. Do
      52. Cursor Off
      53. Sekunden = Azeit
      54. Strtime = Time(sekunden)
      55. Locate 1 , 9 : Lcd Strtime
      56. Zahl = Zahl + 1
      57. Waitms 500
      58. Locate 2 , 13 : Lcd Zahl
      59. If Zahl >= 9999 Then Zahl = 0
      60. Loop
      61. Timer0serv:
      62. Timer1 = Preload
      63. Azeit = Azeit + 1
      64. Return
      65. End
      Alles anzeigen

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

    • Das 'los:' braucht kein 'return'. Es ist ja ein label, ob es angesprungen wird oder nicht, ist erst mal egal. Label kann man überall im Programm verteilen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Danke für die Tips , wenn ich das so lese wird das Probem wohl genau da sein das sich das mal Überschneidet,insbesondere da das Problem ja mit ner anderen Zählweise nicht mehr auftritt . Das eigentliche komplette Programm hat dann jedoch den Haken das es ausschließlich durch einen externen Taster gesteuert wird . Der zweite input ist ein Fehlersicherheitsschalter und Nr3 nutze ich zum Start/Stop . Das alles hab ich zum Zeitanzeigetest mal weggelassen .

      Den Preload hab ich mit ner Stopuhr an den Arduino angepasst , hat ganz nette Abweichungen der kleine ....

      ok , mit dem InitLCD werde ich mich mal als erstes befassen da ich am Timing des kompletten Programms nicht viel ändern kann , das wird von der MAschine bestimmt .

      Ich weis , Geheimnisskrämerei ...... Ich werd mal einpaar Textsachen entfernen und den kompletten Code reistellen ..... Abgesehen vom Display läuft das Ding perfekt .

      Besten Dank vom Beastmaster
      gestartet mit KC Basic ... angekommen bei BASCOM
    • Du kannst ja mal versuchen den interrupt vor dem lcd-Schreiben zu disablen und danach wieder zu enablen. Wenn der interrupt in längeren Abständen kommt, als dein Lcd braucht, dann geht ja auch nix verloren. Der int wird ja nur aufgeschoben.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • So hier mal der "geheimnissvolle" Code . Mit Sicherheit alles andere als Perfekt , aber funktioniert . Der Input kommt ca alle 2,3 Sekunden .

      Quellcode

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 64 '40
      4. $swstack = 32 '16
      5. $framesize = 32
      6. $lib "DateTime.lbx"
      7. On Timer1 Timer0serv
      8. Config Timer1 = Timer , Prescale = 1024
      9. Enable Timer1
      10. Enable Interrupts
      11. Dim Preload As Word
      12. Preload = 49800
      13. Timer1 = Preload
      14. Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2 , E = Portd.5 , Rs = Portd.6
      15. Config Lcd = 20 * 4
      16. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      17. Config Portd.2 = Output
      18. Config Portd.3 = Output
      19. Config Portd.4 = Output
      20. Config Portc.5 = Output
      21. Config Portb.3 = Output
      22. Config Portb.4 = Output
      23. Config Portb.5 = Output
      24. Config Pinc.2 = Input
      25. Config Pinc.3 = Input
      26. Config Pinc.4 = Input
      27. Dim Azeit As Word
      28. Dim Sekunden As Long
      29. Dim Strtime As String * 8
      30. Dim Neuschreib As Byte
      31. Neuschreib = 0
      32. Portd.2 = 1
      33. Portd.3 = 1
      34. Portd.4 = 1
      35. Portb.3 = 1
      36. Portb.4 = 1
      37. Portc.5 = 1
      38. Portb.5 = 1
      39. Cursor Off
      40. Cls
      41. Locate 1 , 1 : Lcd " Bootinformation"
      42. Locate 2 , 1 : Lcd " starte -----"
      43. Locate 3 , 1 : Lcd " ------maschine"
      44. Locate 4 , 1 : Lcd " Software V 2,01"
      45. Wait 3
      46. Cls
      47. Locate 1 , 1 : Lcd "Check Temperatur"
      48. Waitms 500
      49. Locate 1 , 18 : Lcd "OK"
      50. Waitms 500
      51. Locate 2 , 1 : Lcd "Reset Zaehler"
      52. Waitms 500
      53. Locate 2 , 18 : Lcd "OK"
      54. Waitms 500
      55. Locate 3 , 1 : Lcd "Motoren Check"
      56. Waitms 500
      57. Toggle Portb.4
      58. Waitms 200
      59. Toggle Portb.4
      60. Waitms 200
      61. Toggle Portb.5
      62. Waitms 200
      63. Toggle Portb.5
      64. Waitms 200
      65. Locate 3 , 18 : Lcd "OK"
      66. Waitms 500
      67. Locate 4 , 1 : Lcd "Systemtest beendet"
      68. Wait 3
      69. Cls
      70. Locate 1 , 1 : Lcd "-----------system "
      71. Locate 2 , 1 : Lcd "ist betriebsbereit"
      72. Locate 4 , 1 : Lcd "--- Software V 2,01"
      73. Wait 3
      74. Pinc.2 = 1
      75. Pinc.3 = 1
      76. Pinc.4 = 1
      77. Start Adc
      78. Dim A As Byte
      79. Dim Zahl As Integer
      80. Dim T1 As Byte
      81. Dim T2 As Byte
      82. Dim Temp As Single
      83. Dim Mass$ As String * 4
      84. Dim Zeit$ As String * 9
      85. Dim Messung$ As String * 9
      86. Dim T11 As Byte
      87. Dim T12 As Byte
      88. Dim T111 As Word
      89. Dim T112 As Word
      90. Dim Zustand As Byte
      91. Zahl = 0
      92. Azeit = 0
      93. Los1:
      94. Cls
      95. Locate 1 , 1 : Lcd "System bereit"
      96. Locate 2 , 1 : Lcd "warte auf Beginn "
      97. Locate 3 , 1 : Lcd "Starttaste druecken"
      98. Locate 4 , 1 : Lcd "zum ---------------"
      99. Do
      100. If Pinc.3 = 0 Then
      101. Waitms 250
      102. End If
      103. If Pinc.3 = 0 Then Goto Einlegen
      104. Loop
      105. Einlegen:
      106. Cls
      107. Locate 1 , 1 : Lcd "--------------- "
      108. Locate 2 , 1 : Lcd "-----------licht"
      109. Locate 3 , 1 : Lcd "wird "
      110. Locate 4 , 1 : Lcd "eingeschaltet"
      111. Portb.3 = 0
      112. Wait 2
      113. Cls
      114. Locate 1 , 1 : Lcd "System bereit"
      115. Locate 2 , 1 : Lcd "warte auf Beginn "
      116. Locate 3 , 1 : Lcd "Starttaste druecken"
      117. Locate 4 , 1 : Lcd "zum -----start"
      118. Do
      119. If Pinc.3 = 0 Then
      120. Waitms 250
      121. End If
      122. If Pinc.3 = 0 Then Goto Geraetstart
      123. Loop
      124. Cls
      125. Los:
      126. Cls
      127. Locate 1 , 1 : Lcd "Antriebsmot: Grad"
      128. Locate 2 , 1 : Lcd "Wickelmotor: Grad"
      129. Locate 3 , 1 : Lcd "Arbeitszeit:"
      130. Locate 4 , 1 : Lcd "Bildnummer :"
      131. Do
      132. Cursor Off
      133. Sekunden = Azeit
      134. Strtime = Time(sekunden)
      135. T1 = Getadc(0) 'Motortemp Antrieb
      136. T2 = Getadc(1) 'Motortemp Friktion
      137. ' Temparaturen berechnen
      138. T11 = T1 - 387
      139. T111 = T11 / 2
      140. T12 = T2 - 387
      141. T112 = T12 / 2
      142. If T111 > 60 Then Goto Fehler1
      143. If T112 > 60 Then Goto Fehler1
      144. ' schalter prüfen
      145. If Pinc.4 = 0 Then Goto Fehler
      146. ' Temperaturen ausgeben
      147. Locate 3 , 13 : Lcd Strtime
      148. Locate 4 , 14 : Lcd Zahl : Print Zahl
      149. Locate 1 , 14 : Lcd T111
      150. Locate 2 , 14 : Lcd T112
      151. Neuschreib = Neuschreib + 1
      152. If Neuschreib >= 50 Then
      153. Cls
      154. Locate 1 , 1 : Lcd "Antriebsmot: Grad"
      155. Locate 2 , 1 : Lcd "Wickelmotor: Grad"
      156. Locate 3 , 1 : Lcd "Arbeitszeit:"
      157. Locate 4 , 1 : Lcd "Bildnummer :"
      158. Neuschreib = 0
      159. End If
      160. ' Startstoptaste abfragen
      161. If Pinc.3 = 0 Then
      162. Waitms 250
      163. End If
      164. If Pinc.3 = 0 Then Goto Anhalten
      165. ' Impuls abfragen
      166. If Pinc.2 = 1 Then Goto Keinbild
      167. Zahl = Zahl + 1
      168. If Zahl >= 20000 Then Goto Fehler2
      169. Portd.2 = 0 : Waitms 500 : Portd.2 = 1
      170. Keinbild:
      171. Loop
      172. Goto Los
      173. Fehler:
      174. Cls
      175. Locate 1 , 1
      176. Lcd "-------schalter"
      177. Locate 2 , 1
      178. Lcd "ausgeloest"
      179. Locate 4 , 1 : Lcd "System angehalten"
      180. Portc.5 = 0
      181. Portd.3 = 1
      182. Portd.4 = 1
      183. Portb.3 = 1
      184. Portb.4 = 1
      185. Portb.5 = 1
      186. Wait 10
      187. Goto Fehler
      188. Fehler1:
      189. Cls
      190. Locate 1 , 1
      191. Lcd "Motortemparatur"
      192. Locate 2 , 1
      193. Lcd "Schutz ausgeloest"
      194. Locate 3 , 1
      195. Lcd "Antrieb :" ; T111 ; " Grad"
      196. Locate 4 , 1
      197. Lcd "Wickel :" ; T112 ; " Grad"
      198. Portb.3 = 1
      199. Portb.4 = 1
      200. Portb.5 = 1
      201. Portd.4 = 1
      202. Portc.5 = 0
      203. T1 = Getadc(0) 'Motortemp Antrieb
      204. T2 = Getadc(1) 'Motortemp Friktion
      205. ' Temparaturen berechnen
      206. T11 = T1 - 387
      207. T111 = T11 / 2
      208. T12 = T2 - 387
      209. T112 = T12 / 2
      210. If T111 < 40 And T112 < 40 Then
      211. Portb.3 = 0
      212. Portb.4 = 0
      213. Portb.5 = 0
      214. Portd.4 = 0
      215. Portc.5 = 1
      216. Goto Los
      217. End If
      218. Wait 10
      219. Goto Fehler1
      220. Fehler2:
      221. Cls
      222. Locate 1 , 1
      223. Lcd " zu viele "
      224. Locate 2 , 1
      225. Lcd "Ausloesungen"
      226. Portb.3 = 1
      227. Wait 10
      228. Goto Fehler2
      229. Timer0serv:
      230. Timer1 = Preload
      231. Azeit = Azeit + 1
      232. Return
      233. Geraetstart:
      234. Azeit = 0
      235. Cls
      236. Locate 1 , 1 : Lcd "------start "
      237. Locate 2 , 1 : Lcd "-------strom"
      238. Locate 3 , 1 : Lcd "wird "
      239. Locate 4 , 1 : Lcd "eingeschaltet"
      240. Portd.3 = 0
      241. Wait 1
      242. Cls
      243. Locate 1 , 1 : Lcd " ------start "
      244. Locate 2 , 1 : Lcd "--------licht"
      245. Locate 3 , 1 : Lcd "wird "
      246. Locate 4 , 1 : Lcd "eingeschaltet"
      247. Portb.3 = 0
      248. Wait 1
      249. Cls
      250. Locate 1 , 1 : Lcd "------start "
      251. Locate 2 , 1 : Lcd "Oilpumpe"
      252. Locate 3 , 1 : Lcd "wird "
      253. Locate 4 , 1 : Lcd "eingeschaltet"
      254. Portd.4 = 0
      255. Wait 1
      256. Cls
      257. Locate 1 , 1 : Lcd "-----start "
      258. Locate 2 , 1 : Lcd "Wickelmotor"
      259. Locate 3 , 1 : Lcd "wird "
      260. Locate 4 , 1 : Lcd "eingeschaltet"
      261. Portb.4 = 0
      262. Wait 1
      263. Cls
      264. Locate 1 , 1 : Lcd "-----start "
      265. Locate 2 , 1 : Lcd "Hauptmotor"
      266. Locate 3 , 1 : Lcd "wird "
      267. Locate 4 , 1 : Lcd "eingeschaltet"
      268. Portb.5 = 0
      269. Zustand = 1
      270. Wait 1
      271. Goto Los
      272. Return
      273. Anhalten:
      274. Cls
      275. Locate 1 , 1 : Lcd " System stoppt"
      276. Locate 2 , 1 : Lcd " alles ausschalten"
      277. Portc.5 = 1
      278. Portd.3 = 1
      279. Portd.4 = 1
      280. Portb.3 = 1
      281. Portb.5 = 1
      282. Portb.4 = 1
      283. Wait 3
      284. Locate 3 , 1 : Lcd " fertig "
      285. Locate 4 , 1 : Lcd " Software V 2.01"
      286. Wait 10
      287. Goto Los1
      288. End
      Alles anzeigen
      mit Neuschreib hab ich versucht das Display alle 50 Zyclen zu aktualisieren , also den kompletten INhalt neu zu schreiben , hat aber auch nix gebracht .

      Der Beastmaster
      gestartet mit KC Basic ... angekommen bei BASCOM

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

    • Puah, das ist mal ein Spagetticode.
      Ich fürchte fast dir läuft damit irgendwann einfach der Stack über. Schau mal ob du nicht besser mit subs arbeitest und immer erst aus der sub zurückkommst bevor du ne neue aufrufst. Das ergebnis einer sub lässt sich ja als bit variable speichern und in deiner hauptschleife auswerten.
      So mach ich es und es macht die sache wesentlich übersichtlicher. Hab seit anfang in meinen Programmen kein goto verwendet, man kann wunderbar ohne leben. Aber dazu gibts ja hier im Forum nen netten (!?) thread, ich halt mich aber davon fern, verwirrt mich zu sehr a_71_f9c57bbe
      In deinem letzten Programm sieht man sehr viele waits, die sorgen dafür das je nach benutzung dein Timer interrupt wieder mit dem Display schreiben kollidiert. Aus einer Hauptschleife gesteuert lässt sich sowas wesentlich besser steuern.

      Aber zurück zu deinem ersten Versuchsprogramm, das ist zum testen viel besser:
      Du willst ja das Display alle 0,5s aktualisieren, da gibts eine (von mir) ungeliebte methode: Das Display im Timer interrupt aktualisieren a_446_12de8e52 musst dafür deinen Timer preload (aktuelle 1 sek) halbieren, d.h. dein timer kommt alle 0,5s , die Zähleranzeige fürs Display muss dann mit einer extra Variable erzeugt werden für die dein Zähler vorher durch 2 geteilt wird. Temperatur könnte man auch in der isr holen....more :evil:

      Probier doch das einmal.

      Tobias