Problem mit Encoder und Dot Matrix Display

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

    • Problem mit Encoder und Dot Matrix Display

      Hallo Zusammen,
      ich habe mir hier eine Zeitschaltuhr gebaut. Das Layout habeich gleich 2x fertigen lassen. Der erste Aufbau und die Inbetriebnahme inclmeines Bascom Programmes waren kein Problem.
      In der 2. Ausführung gibt es jetzt ein Problem :
      Die Alarmzeiten werden über einen Drehencoder eingestellt.Wenn ich diesen betätige um Werte rauf bzw. runter zu verändern verstellen sichdie Werte eigenständig (so, als ob ein Ereigniszähler angeschlossen ist) DieAnzeige lässt sich nur selten wieder beruhigen.
      Ich habe daraufhin eine eigenes kleines Testprogrammgeschrieben. In diesem Programm verhält sich die Anzeige ebenso falsch. Manschaltet ein, und die LCD Anzeige des Wertes des Encoder verändert sich ständig(zählt hoch mit geschätzt > 250 Hz). Ich hab mir die Signale an Kanal A + Bvom Encoder per Oszi angesehen. Die sind i.o. Ich hab die Verbindung zwischenuC und Dot Matrix Display mehrere Male durchgemessen, alles i.o.Das Displayhabe ich auch getauscht und den uC auch brachte alles keine Verbesserung
      Das Dot Matrix Display ist ein Electronic Assembly EAW164B-NLW ; Der uC ein ATMega 328p; Der Drehencoder ist von Alps 30 Rastungen /15 Pulse(Teilenummer weiss ich eben nicht)
      Wer kann mir hier mal bitte raten, was man noch machen kann;wo man den Fehler noch suchen kann. Ich bin nämlich mit „meinem Latein am Ende“.
      Untenstehend das kleine Testprogramm das ich mir geschriebenhabe.
      Herlichen Dank schon mal für Eure Mühe!
      Gruss
      Theo

      Source Code

      1. $regfile = "m328pdef.dat" ' Prozessor AVR Mega 328P
      2. $crystal = 8000000 '8Mhz ohne Quarz
      3. $swstack = 40
      4. $hwstack = 40
      5. $framesize = 60
      6. 'Subs declarieren
      7. Declare Sub Drehencoder_auswerten()
      8. Declare Sub Anzeige_pruefen()
      9. Declare Sub Zeile_leeren()
      10. Declare Sub Taster_schreiben()
      11. '######## Anschluss LCD Display (in 4 Bit Mode)
      12. Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , Rs = Portd.7
      13. Config Lcd = 16 * 4
      14. Wait 1
      15. Initlcd
      16. Cls
      17. Cursor off Noblink
      18. '##########################
      19. Config Portb.1 = Output
      20. Sync_out Alias Portb.1 'zeigt Synchronisierung der DCF77 Uhr (ggf. für Testzwecke)
      21. Sync_out = 0
      22. Config PinC.2 = Input 'Eingangspin von Taster in Drehimpulsgeber
      23. Auswahl Alias PinC.2
      24. Auswahl = 1 'ist für den ausgewählten Zeitbereich (hh oder mm bei T-ein und Taus)
      25. '######### Drehimpulsgeber
      26. Config Pinc.1 = Input 'Eingangspin für Drehimpulsgeber (Kanal A)
      27. Portc.1 = 1
      28. Config Pinc.0 = Input 'Eingangspin für Drehimpulsgeber (Kanal B)
      29. Portc.0 = 1
      30. Dim Flag_re As Byte , Flag_li As Byte
      31. Flag_re = 0 : Flag_li = 0
      32. Dim Zustand as Byte
      33. Dim Wert as Byte
      34. Wert = 0
      35. Dim Wert_alt as Byte
      36. Wert_alt = 0
      37. '#################################
      38. Dim flag_A as Byte
      39. flag_A = 0
      40. Dim Zeile as Byte
      41. Dim Anzahl as Byte
      42. Anzahl = 0
      43. Dim Anzahl_alt as Byte
      44. Anzahl_alt = 0
      45. Dim I As Byte , J As Byte , K As Byte
      46. Dim Flag_B as Byte
      47. Flag_B = 0
      48. '######################## Beginn Hauptprogramm ###########################
      49. Do
      50. if flag_A = 0 then
      51. Anzeige_pruefen
      52. End if
      53. Debounce Auswahl , 0 , Drehimp_taster , Sub
      54. Zustand = Encoder(pinC.1 , Pinc.0 , Ccw , Cw , 0) 'Encoder Befehl aus Bascom
      55. Drehencoder_auswerten
      56. if Flag_B = 0 then
      57. Locate 1 , 1
      58. Lcd "Drehencoder Wert :"
      59. Waitms 100
      60. Flag_B = 1
      61. end if
      62. 'if Wert <> wert_alt then 'bringt nichts
      63. Locate 2 , 1
      64. Lcd Wert
      65. 'Wert_alt = wert
      66. 'End if
      67. if Anzahl <> Anzahl_alt then
      68. Taster_schreiben
      69. End if
      70. Loop
      71. End
      72. '################### Ende Hauptprogramm #####################
      73. Sub Drehencoder_auswerten()
      74. If Zustand <> 0 And Zustand <> 3 Then
      75. Flag_li = 0 : Flag_re = 0
      76. Waitms 5
      77. Exit Sub
      78. End If
      79. If Zustand = 0 Or Zustand = 3 Then
      80. If Flag_re > 0 Then
      81. Incr Wert
      82. End If
      83. If Flag_li > 0 Then
      84. Decr Wert
      85. End If
      86. End If
      87. End Sub
      88. Ccw:
      89. Flag_li = 1
      90. Return
      91. Cw:
      92. Flag_re = 1
      93. Return
      94. Sub Anzeige_pruefen()
      95. Locate 1 , 1
      96. LCD "Zeile 1"
      97. Locate 2 , 1
      98. Lcd "Zeile 2"
      99. Locate 3 , 1
      100. LCD "Zeile 3"
      101. Locate 4 , 1
      102. Lcd "Zeile 4"
      103. Wait 5
      104. Zeile = 2
      105. Zeile_leeren
      106. Zeile = 3
      107. Zeile_leeren
      108. Zeile = 4
      109. Zeile_leeren
      110. flag_A = 1
      111. End Sub
      112. Sub Zeile_leeren()
      113. For i = 1 to 16
      114. Locate Zeile , i
      115. Lcd " "
      116. Waitms 10
      117. next i
      118. End Sub
      119. Drehimp_taster:
      120. Incr Anzahl
      121. Return
      122. Sub Taster_schreiben()
      123. Locate 3 , 1
      124. Lcd "Taster"
      125. Locate 4 , 1
      126. Lcd Anzahl
      127. Anzahl_alt = Anzahl
      128. End sub
      Display All


    • Ich würde am encoder suchen. Mal dessen Taster von der Drehung mit einem kleinen C überbrücken. 100nF oder so.

      Der 'com' vom encoder ist an gnd?

      Wenn hochgezählt wird, scheint ja das flag nicht gelöscht zu werden. Funktioniert es nicht, wenn du in der sub cw bzw ccw den Wert erhöhst/erniedrigst?
      Raum für Notizen

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

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

      The post was edited 3 times, last by tschoeatsch ().

    • Hallo Tschoeatsch,
      was meinst Du mit Com vom Encoder ? Der Encoder hat 3 Anschüsse Kanal A Kanal B und in der Mitte genau dazwischen einen Masse Anschluss; ist das der COM von dem Du oben sprichst ? Wenn ja, dann hab ich den natürlich an Gnd liegen, sonst würds ja gar nicht gehen. Es gibt auch noch2 Lötfahnen ganz aussen, die sind aber wohl mehr zur mechanischen Stabilität gedacht wenn man das Ding in eine Platine einlötet.
      dann gibt's noch 2 Pins, das ist der Taster im Encoder. Angeschlossen wie ein normaler Taster am uC ein Bein auf Gnd das andere Bein an den "Debounce Eingang"
      So, den Kanal A + Kanal B habe ich mal mit je 100nF nach Gnd gelegt ---> bringt gerade gar nichts

      Ich wird jetzt mal die Sache mit dem Flag weiter verfolgen.

      Herzlichen Dank erstmal.
      Gruss
      Theo
    • oder so:
      If Zustand = 0 Or Zustand = 3 Then
      If Flag_re > 0 Then
      Incr Wert
      flag_re=0
      End If
      If Flag_li > 0 Then
      Decr Wert
      flag_li=0
      End If
      End If
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo Tschoeatsch, Hallo Mitch 64
      ja , das mit den Flags wars. Ich hatte schon ein "bedanke mich" an Tschoeatsch geschriebn, aber das ist nicht durchgereicht worden, auch mit erweiterer Antwort nicht.
      Also nochmal herzlichen Dank Tschoeatsch!
      Eigentlich scheint es mir jetzt auch lögisch das man die flags auf 0 zwingt, aber ich hab schon in einigen Anwendungen Encoder verwendet aber da gings immer ohne.

      Nochmals herzlichen Dank!
      Gruss
      Theo