Renteneintritts-countdown mit einem Tischrechner, Fragen über Fragen

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!

  • six1 schrieb:

    Du lädst einen Timer mit dem Wert für eine Ziffer vor und lässt den loslaufen bei einem Trigger. Wenn der Timer abgelaufen ist, "haut er die Ziffer raus" und beendet sich. Evtl. setzt er noch ein Flag, damit du wißt, dass du die nächste Ziffer raushauen kannst
    So in der Art war auch meine grobe Vorstellung. Da beim trigger der timer =0 gesetzt wird, setze ich einen compare-Wert. Beim zugehörigem interrupt ziehe ich die passende Spalte auf low, warte 0,1 ms und wieder auf high. Der Rest, wie du schrobst.
    Raum für Notizen

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

    -----------------------------------------------------------------------------------------------------
  • Noch mal das Tastaturlesen verbessert. Jetzt bekomme ich die aufgedruckten Zeichen der Tasten als Ausgabe. Ausreisser gibt es gerade keine, das "x" machte Probleme, da die Zeile, mit dem es verknüpft ist, als Startzeile für den timer verwendet wird. Es könnte sein, das der pcint bisschen vor dem int0 kommt, und ihn so verzögert. Der timer läuft dadurch länger. Jetzt kommt das "x" halt nochmal am Schluß der data vor und alles passt.

    BASCOM-Quellcode

    1. 'Rentneruhr-Tastaturtest
    2. 'Variante 3
    3. $regfile = "m328pdef.dat"
    4. $Crystal=16000000
    5. $hwstack=64
    6. $swstack=128
    7. $framesize=30
    8. $baud = 9600
    9. Config Int0 = Falling 'Zeile , wird als Startsignal für timer1 verwendet
    10. On Int0 Zeile_isr
    11. Pcicr.1 = 1
    12. Pcmsk1 = &B11 'pinc.0 + pinc.1
    13. On Pcint1 Spalte_isr
    14. Spalte1 Alias Pinc.0 'Spalte 1
    15. Spalte2 Alias Pinc.1 'Spalte 2
    16. Config Timer1 = Timer , Prescale = 8
    17. ' Timer value explination
    18. ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
    19. ' The AVR is running at 16000000Hz, the prescaler is 8
    20. ' Each tick is 0,0005 ms - (1 / CPUSpeed in KHz ) * Prescaler
    21. ' The timer needs 391 ticks to reach the required time ( 391 * 0,0005 = 0,1955ms)
    22. ' The start value for the timer must be set to 65145 so that it will overflow at 65536 after 391 ticks
    23. Dim Zeichen_da As Byte 'flag, =1 wenn Zeichen empfangen wurde
    24. Dim Timerlaufzeit As Word , Timerlaufzeit_ As Word 'enthält Spalten- und Zeilenbit
    25. Dim Spalte As Byte , Spalte_ As Byte
    26. Dim Tz As Byte , Tz1 As Byte
    27. Dim Intervall_ As Word , Intervall As Word
    28. Dim Zeilenpuls As Word , Zeilenpuls_h As Word
    29. Dim Zeilennummer As Word
    30. Dim Zeichen As String * 2
    31. Enable Interrupts
    32. Wait 1
    33. Enable Int0
    34. Enable Pcint1
    35. Print "los geht's"
    36. Do
    37. If Zeichen_da = 1 Then
    38. Gosub Zeilenpuls_bestimmen
    39. Timerlaufzeit = Timerlaufzeit + Zeilenpuls_h
    40. Zeilennummer = Timerlaufzeit / Zeilenpuls
    41. If Spalte = 1 Then
    42. Zeichen = Lookupstr(zeilennummer , Zeichentabelle_ziffern)
    43. Else
    44. Zeichen = Lookupstr(zeilennummer , Zeichentabelle_steuerzeichen)
    45. End If
    46. Print Zeichen ; " " ; Timerlaufzeit ; " " ; Intervall ; " " ; Zeilenpuls
    47. Waitms 200
    48. Zeichen_da = 0
    49. End If
    50. Enable Pcint1
    51. Loop
    52. End
    53. Zeilenpuls_bestimmen:
    54. Zeilenpuls = Intervall / 16
    55. Zeilenpuls_h = Zeilenpuls / 2
    56. Return
    57. Zeile_isr: 'int0, wird ausgelöst, wenn irgend eine Zeilenpuls kommt
    58. Intervall_ = Timer1 'Zählweite bis zum nächsten Puls
    59. Timer1 = 0
    60. Intervall = Intervall_
    61. If Tz1 < 100 Then Incr Tz1
    62. Return
    63. Spalte_isr: 'wird ausgelöst, wenn auf einer Spalte ein Zeilenpuls kommt
    64. Timerlaufzeit_ = Timer1
    65. Spalte_ = Pinc And &B11
    66. If Spalte_ < 3 And Tz = 3 Then 'fallende Flanke, mind. eine Spalte wird low
    67. Timerlaufzeit = Timerlaufzeit_
    68. Spalte = 3 - Spalte_
    69. Zeichen_da = 1
    70. Disable Pcint1
    71. Tz = 0
    72. End If
    73. If Spalte_ < 3 And Tz < 3 Then 'fallende Flanke, mind. eine Spalte wird low
    74. Incr Tz
    75. End If
    76. Tz1 = 0
    77. Return
    78. Zeichentabelle_ziffern:
    79. Data "_" , "_" , "_" , "_" , "_" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "0" , "_" , "_"
    80. Zeichentabelle_steuerzeichen:
    81. Data "x" , "/" , "%" , "CA" , "_" , "CK" , "+" , "-" , "CM" , "RM" , "EX" , "CS" , "_" , "_" , "->" , "." , "x"
    Alles anzeigen
    Raum für Notizen

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

    -----------------------------------------------------------------------------------------------------
  • Auf die Schnelle: tz1 ist noch 'under construction'. Damit möchte ich die autorepeat-Funktion, die mein Programm nocht hat, aber nicht der Tischrechner abwürgen. Tz1 zählt hoch, soll aber mit dem Spalteninterrupt immer wieder =0 gesetzt werden. Bleibt der tz1 klein, dann drücke ich die Taste, erreicht er einen Wert, hab' ich eine Zeit lang nicht gedrückt. Mit größeren Endwerten kann ich auch damit die 'Nichtnutzzeit' bestimmen, also die Zeit nach dem letzten Tastendruck, um dann den countdown anzuzeigen.
    Deinen Vorschlag schau' ich mir morgen an, jetzt muss ich meine Kräfte auffrischen und meinen Flüssigkeitsverbrauch ausgleichen trinkende-smileys-211
    Raum für Notizen

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

    -----------------------------------------------------------------------------------------------------
  • Mal ein Filmchen für die Zauderer a_58_b54cfdb4

    So kompliziert ist es jetzt doch nicht. Natürlich auch Dank der intensiven Mitdenkerei der hiesigen Forumsmitglieder.
    Der code zum Film:

    BASCOM-Quellcode

    1. 'Rentneruhr-Tastaturtest-Ausgabetest
    2. 'Variante 4
    3. $regfile = "m328pdef.dat"
    4. $Crystal=16000000
    5. $hwstack=64
    6. $swstack=128
    7. $framesize=30
    8. $baud = 9600
    9. 'ports
    10. 'pind.2 =int0 Zeile
    11. 'pinc.0 =pcint Spalte 1
    12. 'pinc.1 =pcint Spalte 2
    13. Config Portc.2 = Output 'Spalte 1
    14. Spalte_1_out Alias Portc.2
    15. Config Portc.3 = Output 'Spalte 2
    16. Spalte_2_out Alias Portc.3
    17. Spaltenport Alias Portc
    18. Config Int0 = Falling 'Zeile , wird als Startsignal für timer1 verwendet
    19. On Int0 Zeile_isr
    20. Pcicr.1 = 1
    21. Pcmsk1 = &B11 'pinc.0 + pinc.1
    22. On Pcint1 Spalte_isr
    23. Spalte1 Alias Pinc.0 'Spalte 1
    24. Spalte2 Alias Pinc.1 'Spalte 2
    25. Config Timer1 = Timer , Prescale = 8
    26. On Compare1a Taste_druecken 'zieht im interrupt eine Spalte auf low
    27. Compare1a = 8000
    28. ' Timer value explination
    29. ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
    30. ' The AVR is running at 16000000Hz, the prescaler is 8
    31. ' Each tick is 0,0005 ms - (1 / CPUSpeed in KHz ) * Prescaler
    32. ' The timer needs 391 ticks to reach the required time ( 391 * 0,0005 = 0,1955ms)
    33. ' The start value for the timer must be set to 65145 so that it will overflow at 65536 after 391 ticks
    34. Declare Sub Ausgabe(byval Zeichen_ As String * 2 )
    35. Const Zahl = &B1000
    36. Const Steuerzeichen = &B0100
    37. Dim Zeichen_da As Byte 'flag, =1 wenn Zeichen empfangen wurde
    38. Dim Timerlaufzeit As Word , Timerlaufzeit_ As Word 'enthält Spalten- und Zeilenbit
    39. Dim Spalte As Byte , Spalte_ As Byte
    40. Dim Tz As Byte , Tz1 As Word
    41. Dim Intervall_ As Word , Intervall As Word
    42. Dim Zeilenpuls As Word , Zeilenpuls_h As Word
    43. Dim Zeilennummer As Word
    44. Dim Zeichen As String * 2
    45. Dim Gedrueckt As Byte
    46. Dim Spalte_a As Byte
    47. Enable Interrupts
    48. Spaltenport = &B1100 'Spalten frei geben
    49. Disable Compare1a
    50. Wait 1
    51. Tz1 = 0
    52. Enable Int0
    53. Enable Pcint1
    54. Print "los geht's"
    55. Do
    56. If Zeichen_da = 1 Then
    57. Gosub Zeilenpuls_bestimmen
    58. Timerlaufzeit = Timerlaufzeit + Zeilenpuls_h
    59. Zeilennummer = Timerlaufzeit / Zeilenpuls
    60. If Spalte = 1 Then
    61. Zeichen = Lookupstr(zeilennummer , Zeichentabelle_ziffern)
    62. Else
    63. Zeichen = Lookupstr(zeilennummer , Zeichentabelle_steuerzeichen)
    64. End If
    65. Print Zeichen ; " " ; Timerlaufzeit ; " " ; Intervall ; " " ; Zeilenpuls
    66. Waitms 200
    67. Zeichen_da = 0
    68. End If
    69. Enable Pcint1
    70. If Tz1 > 2000 Then 'Wartezeit nach dem letzten Tastendruck abgelaufen
    71. Print "Ausgabe startet"
    72. Call Ausgabe( "CA") : Waitms 200
    73. Call Ausgabe( "1") : Waitms 100
    74. Call Ausgabe( "2") : Waitms 100
    75. Call Ausgabe( "3") : Waitms 100
    76. Call Ausgabe( "4") : Waitms 100
    77. Call Ausgabe( "5") : Waitms 100
    78. Call Ausgabe( "+") : Waitms 200
    79. Do
    80. Call Ausgabe( "1") : Waitms 500
    81. Call Ausgabe( "-") : Waitms 500
    82. Loop Until Tz1 < 2000
    83. End If
    84. Loop
    85. End
    86. Sub Ausgabe(byval Zeichen_ As String * 2 )
    87. Local Z As Byte , Z1 As Word
    88. Disable Pcint1
    89. Select Case Zeichen_
    90. Case "0"
    91. Spalte_a = Zahl
    92. Z = 14
    93. Case "1"
    94. Spalte_a = Zahl
    95. Z = 5
    96. Case "2"
    97. Spalte_a = Zahl
    98. Z = 6
    99. Case "3"
    100. Spalte_a = Zahl
    101. Z = 7
    102. Case "4"
    103. Spalte_a = Zahl
    104. Z = 8
    105. Case "5"
    106. Spalte_a = Zahl
    107. Z = 9
    108. Case "6"
    109. Spalte_a = Zahl
    110. Z = 10
    111. Case "7"
    112. Spalte_a = Zahl
    113. Z = 11
    114. Case "8"
    115. Spalte_a = Zahl
    116. Z = 12
    117. Case "9"
    118. Spalte_a = Zahl
    119. Z = 13
    120. Case "+"
    121. Spalte_a = Steuerzeichen
    122. Z = 6
    123. Case "-"
    124. Spalte_a = Steuerzeichen
    125. Z = 7
    126. Case "CA"
    127. Spalte_a = Steuerzeichen
    128. Z = 3
    129. End Select
    130. Gosub Zeilenpuls_bestimmen 'aktuelle Pulsbreite ermitteln
    131. Z1 = Zeilenpuls * Z 'Stellung des timers, wann die betreffende Zeile ansteht
    132. Compare1a = Z1 'der interrupt wird früher ausgelöst, als der Druck auf eine Taste an Timerwert zurück gibt
    133. Gedrueckt = 0
    134. Enable Compare1a
    135. While Gedrueckt < 8 : Wend 'mehrmaliger Durchlauf der isr = 'längerer Tastendruck'
    136. Disable Compare1a 'einmaliger Vorgang
    137. Enable Pcint1
    138. ' Print Compare1a
    139. End Sub
    140. Taste_druecken:
    141. Spaltenport = Spalte_a 'entsprechende Spalte muss auf low gezogen werden
    142. Waitus 200 'der Puls uberlappt die Zeilenpulsweiterschaltung, damit bei Zeilenpulsanfang auch sicher die Spalte auf low ist
    143. Spaltenport = &B1100 'alle Spalten wieder auf high
    144. Incr Gedrueckt
    145. Return
    146. Zeilenpuls_bestimmen:
    147. Zeilenpuls = Intervall / 16
    148. Zeilenpuls_h = Zeilenpuls / 2
    149. Return
    150. Zeile_isr: 'int0, wird ausgelöst, wenn irgend eine Zeilenpuls kommt
    151. Intervall_ = Timer1 'Zählweite bis zum nächsten Puls
    152. Timer1 = 0
    153. Intervall = Intervall_
    154. If Tz1 < &HFFFF Then Incr Tz1
    155. Return
    156. Spalte_isr: 'wird ausgelöst, wenn auf einer Spalte ein Zeilenpuls kommt
    157. Timerlaufzeit_ = Timer1
    158. Spalte_ = Pinc And &B11
    159. If Spalte_ < 3 And Tz = 3 Then 'fallende Flanke, mind. eine Spalte wird low
    160. Timerlaufzeit = Timerlaufzeit_
    161. Spalte = 3 - Spalte_
    162. Zeichen_da = 1
    163. Disable Pcint1
    164. Tz = 0
    165. End If
    166. If Spalte_ < 3 And Tz < 3 Then 'fallende Flanke, mind. eine Spalte wird low
    167. Incr Tz
    168. End If
    169. Tz1 = 0
    170. Return
    171. Zeichentabelle_ziffern:
    172. Data "_" , "_" , "_" , "_" , "_" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "0" , "_" , "_"
    173. Zeichentabelle_steuerzeichen:
    174. Data "x" , "/" , "%" , "CA" , "_" , "CK" , "+" , "-" , "CM" , "RM" , "EX" , "CS" , "_" , "_" , "->" , "." , "x"
    Alles anzeigen
    Die benötigte hw hält sich mit 6 Widerständen, 2 Dioden und ein Arduino in Grenzen.
    hw-Ergänzung am Tischrechner.jpg
    Raum für Notizen

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

    -----------------------------------------------------------------------------------------------------
  • Danke, aber
    a: ich bin noch nicht fertig.
    b: bei den tollen Mitdenkern, Anregungsgebern und Helfern hier aus dem Forum ist das alles halb so schwer.
    c: bei der Hitze konnte man ja fast nix anderes machen.
    Raum für Notizen

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

    -----------------------------------------------------------------------------------------------------
  • Pluto25 schrieb:

    Tz1?
    Wie wärs mit:
    zeile 27 Dim Taste_los as Byte
    zeile 35 Timerlaufzeit=30
    zeile 53 ersetzen mit do loop until taste_los=1
    Zeile 69a if timerlaufzeit = 0 then
    Zeile 69b taste_los=1
    Zeile 69c else
    Zeile 69d taste_los=0
    Zeile 69e end if
    Zeile 69f timerlaufzeit=0
    Zeile 79 entfernen
    das autorepeat hab' ich jetzt anders unterdrückt. Ich hab' ja meinen Zähler tz1, der bei jedem Duck auf eine Taste bei 0 beginnt. Jetzt hab' ich einfach
    if tz1=20 then taste_da=1
    in die isr eingefügt. Das wird erst beim Loslassen der Taste true und dann werden auch die Daten aus der 'Spalte_isr' ausgewertet. Das geht jetzt gut.
    Was grad' nicht geht, das 'Drücken' der 'x' durch den AVR. compare1a wäre ja =0, löst also keinen interrupt aus. Paar Takte dazu zählen, klappt auch nicht, weil dann die Zeile unter der Spalte vorbei zieht. Wenn ich denn ja das 'x' bräuchte, müsste ich eine andere Zeile als Startzeile verwenden, das "%" würde sich anbieten.
    Raum für Notizen

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

    -----------------------------------------------------------------------------------------------------
  • Genau dieser Punkt; zwischen CA und CK ist aber nicht als Leitung herausgeführt. Aber du hast auch Recht, Compare verträgt paar ticks. Wo mein Fehler war, ich hab' nicht lange genug die Taste 'gedrückt'. Paar Durchläufe mehr mit der 'Taste_druecken'isr und bisschen mehr Wartezeit zwischen den Tastendrücken, dann geht auch die Multiplikation :thumbsup: .
    Der nächste Schritt wäre jetzt das Erkennen von Steuerzahlen und Empfang von Daten. Was wäre den sinnvoll? Datum des letzten Arbeitstages und Uhrzeit vom Feierabend? Das aktuelle Datum und Uhrzeit will ich per Dcf holen. Ich hab' ja eine NT-Versorgung und das Rechenwerk einen Einschalter. Ist der Rechner aus, wird es beim Dcf keine Störungen geben, ist der Rechner unter Strom, kommt die Zeit aus einer Rtc.
    Raum für Notizen

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

    -----------------------------------------------------------------------------------------------------
  • Du überschätzt mich! 2 Tasten gleichzeitig erfordert eine neue Tastenerkennung. Ich wollte einen Puffer füllen, ist er mit der richtigen Zahl voll, dann weiter und die nächste Pufferfüllung sind meine Daten. So in etwa.
    Die Hochspannungserzeugung mit wahrscheinlich einem Sperrschwinger, oder wie die Dinger heißen, stören sicherlich Dcf. Was stört eigentlich nicht Dcf? :/
    Wlan? Esp? Sind das auch Bahnhöfe?
    Raum für Notizen

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

    -----------------------------------------------------------------------------------------------------
  • Mit dem Puffer geht das gut, hier ein Test. Als Erkennungsmerkmal wird vom AVR die Steuerzahl einfach gelöscht.

    BASCOM-Quellcode

    1. 'Rentneruhr-Tastaturtest-Ausgabetest
    2. 'Variante 5
    3. $regfile = "m328pdef.dat"
    4. $Crystal=16000000
    5. $hwstack=64
    6. $swstack=128
    7. $framesize=30
    8. $baud = 9600
    9. 'ports
    10. 'pind.2 =int0 Zeile
    11. 'pinc.0 =pcint Spalte 1
    12. 'pinc.1 =pcint Spalte 2
    13. Config Portc.2 = Output 'Spalte 1
    14. Spalte_1_out Alias Portc.2
    15. Config Portc.3 = Output 'Spalte 2
    16. Spalte_2_out Alias Portc.3
    17. Spaltenport Alias Portc
    18. Config Int0 = Falling 'Zeile , wird als Startsignal für timer1 verwendet
    19. On Int0 Zeile_isr
    20. Pcicr.1 = 1
    21. Pcmsk1 = &B11 'pinc.0 + pinc.1
    22. On Pcint1 Spalte_isr
    23. Spalte1 Alias Pinc.0 'Spalte 1
    24. Spalte2 Alias Pinc.1 'Spalte 2
    25. Config Timer1 = Timer , Prescale = 8
    26. On Compare1a Taste_druecken 'zieht im interrupt eine Spalte auf low
    27. Compare1a = 8000
    28. ' Timer value explination
    29. ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
    30. ' The AVR is running at 16000000Hz, the prescaler is 8
    31. ' Each tick is 0,0005 ms - (1 / CPUSpeed in KHz ) * Prescaler
    32. ' The timer needs 391 ticks to reach the required time ( 391 * 0,0005 = 0,1955ms)
    33. ' The start value for the timer must be set to 65145 so that it will overflow at 65536 after 391 ticks
    34. Declare Sub Ausgabe(byval Zeichen_ As String * 2 )
    35. Const Zahl = &B1000
    36. Const Steuerzeichen = &B0100
    37. Dim Zeichen_da As Byte 'flag, =1 wenn Zeichen empfangen wurde
    38. Dim Timerlaufzeit As Word , Timerlaufzeit_ As Word 'enthält Spalten- und Zeilenbit
    39. Dim Spalte As Byte , Spalte_ As Byte
    40. Dim Tz As Byte , Tz1 As Word
    41. Dim Intervall_ As Word , Intervall As Word
    42. Dim Zeilenpuls As Word , Zeilenpuls_h As Word
    43. Dim Zeilennummer As Word
    44. Dim Zeichen As String * 2
    45. Dim Gedrueckt As Byte
    46. Dim Spalte_a As Byte
    47. Dim Puffer As String * 12 'Eingabepuffer fifo
    48. Dim Puffer_1 As String * 12
    49. Enable Interrupts
    50. Spaltenport = &B1100 'Spalten frei geben
    51. Disable Compare1a
    52. Wait 1
    53. Tz1 = 21
    54. Puffer = " " '12 Leerzeichen
    55. Enable Int0
    56. Enable Pcint1
    57. Print "los geht's"
    58. Do
    59. If Zeichen_da = 1 Then
    60. Gosub Zeilenpuls_bestimmen
    61. Timerlaufzeit = Timerlaufzeit + Zeilenpuls_h
    62. Zeilennummer = Timerlaufzeit / Zeilenpuls
    63. If Spalte = 1 Then
    64. Zeichen = Lookupstr(zeilennummer , Zeichentabelle_ziffern)
    65. Else
    66. Zeichen = Lookupstr(zeilennummer , Zeichentabelle_steuerzeichen)
    67. End If
    68. Puffer_1 = Right(puffer , 11) 'linke Zeichen entfernen
    69. Puffer = Puffer_1 + Zeichen 'rechts das neue Zeichen anhängen
    70. Print Puffer
    71. If Puffer = "999999999992" Then
    72. Call Ausgabe( "A")
    73. Tz1 = 21
    74. End If
    75. Zeichen_da = 0
    76. End If
    77. Enable Pcint1
    78. If Tz1 > 2000 Then 'Wartezeit nach dem letzten Tastendruck abgelaufen
    79. Print "Ausgabe startet"
    80. Call Ausgabe( "A") : Waitms 200
    81. Call Ausgabe( "1") : Waitms 20
    82. Call Ausgabe( "2") : Waitms 20
    83. Call Ausgabe( "3") : Waitms 20
    84. Call Ausgabe( "4") : Waitms 20
    85. Call Ausgabe( "5") : Waitms 20
    86. Call Ausgabe( "+") : Waitms 100
    87. Do
    88. Call Ausgabe( "1") : Waitms 20
    89. Call Ausgabe( "-") : Waitms 980
    90. Loop Until Tz1 < 2000
    91. End If
    92. Loop
    93. End
    94. Sub Ausgabe(byval Zeichen_ As String * 2 )
    95. Local Z As Byte , Z1 As Word
    96. Disable Pcint1
    97. Select Case Zeichen_
    98. Case "0"
    99. Spalte_a = Zahl
    100. Z = 14
    101. Case "1"
    102. Spalte_a = Zahl
    103. Z = 5
    104. Case "2"
    105. Spalte_a = Zahl
    106. Z = 6
    107. Case "3"
    108. Spalte_a = Zahl
    109. Z = 7
    110. Case "4"
    111. Spalte_a = Zahl
    112. Z = 8
    113. Case "5"
    114. Spalte_a = Zahl
    115. Z = 9
    116. Case "6"
    117. Spalte_a = Zahl
    118. Z = 10
    119. Case "7"
    120. Spalte_a = Zahl
    121. Z = 11
    122. Case "8"
    123. Spalte_a = Zahl
    124. Z = 12
    125. Case "9"
    126. Spalte_a = Zahl
    127. Z = 13
    128. Case "+"
    129. Spalte_a = Steuerzeichen
    130. Z = 6
    131. Case "-"
    132. Spalte_a = Steuerzeichen
    133. Z = 7
    134. Case "/"
    135. Spalte_a = Steuerzeichen
    136. Z = 1
    137. Case "x"
    138. Spalte_a = Steuerzeichen
    139. Z = 0
    140. Case "A"
    141. Spalte_a = Steuerzeichen
    142. Z = 3
    143. End Select
    144. Gosub Zeilenpuls_bestimmen 'aktuelle Pulsbreite ermitteln
    145. Z1 = Zeilenpuls * Z 'Stellung des timers, wann die betreffende Zeile ansteht
    146. Compare1a = Z1 + 40 'der interrupt wird früher ausgelöst, als der Druck auf eine Taste an Timerwert zurück gibt
    147. Gedrueckt = 0
    148. Enable Compare1a
    149. While Gedrueckt < 10 : Wend 'mehrmaliger Durchlauf der isr = 'längerer Tastendruck'
    150. Disable Compare1a 'einmaliger Vorgang
    151. Enable Pcint1
    152. ' Print Compare1a
    153. End Sub
    154. Taste_druecken:
    155. Spaltenport = Spalte_a 'entsprechende Spalte muss auf low gezogen werden
    156. Waitus 180 'der Puls uberlappt die Zeilenpulsweiterschaltung, damit bei Zeilenpulsanfang auch sicher die Spalte auf low ist
    157. Spaltenport = &B1100 'alle Spalten wieder auf high
    158. Incr Gedrueckt
    159. Return
    160. Zeilenpuls_bestimmen:
    161. Zeilenpuls = Intervall / 16
    162. Zeilenpuls_h = Zeilenpuls / 2
    163. Return
    164. Zeile_isr: 'int0, wird ausgelöst, wenn irgend eine Zeilenpuls kommt
    165. Intervall_ = Timer1 'Zählweite bis zum nächsten Puls
    166. Timer1 = 0
    167. Intervall = Intervall_
    168. If Tz1 < &HFFFF Then Incr Tz1
    169. If Tz1 = 20 Then Zeichen_da = 1
    170. Return
    171. Spalte_isr: 'wird ausgelöst, wenn auf einer Spalte ein Zeilenpuls kommt
    172. Timerlaufzeit_ = Timer1
    173. Spalte_ = Pinc And &B11
    174. If Spalte_ < 3 And Tz = 3 Then 'fallende Flanke, mind. eine Spalte wird low
    175. Timerlaufzeit = Timerlaufzeit_
    176. Spalte = 3 - Spalte_
    177. Disable Pcint1
    178. Tz = 0
    179. End If
    180. If Spalte_ < 3 And Tz < 3 Then 'fallende Flanke, mind. eine Spalte wird low
    181. Incr Tz
    182. End If
    183. Tz1 = 0
    184. Return
    185. Zeichentabelle_ziffern:
    186. Data "_" , "_" , "_" , "_" , "_" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "0" , "_" , "_"
    187. Zeichentabelle_steuerzeichen:
    188. Data "x" , "/" , "%" , "A" , "_" , "K" , "+" , "-" , "m" , "M" , "X" , "S" , "_" , "_" , "->" , "." , "x"
    189. 'A=CA K=CK m=CM M=RM X=EX S=CS >=->
    Alles anzeigen
    Jetzt muss ich nur entsprechende flags setzen, den Puffer löschen und die folgende Eingabe aufzeichnen. Jetzt könnte ich der Einfachheit die Zeichen mit zählen und nach der Eingabe von 8 Ziffern das als Datum DDMMJJJJ übernehmen.
    Raum für Notizen

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

    -----------------------------------------------------------------------------------------------------
  • Es ist zum fertigen Projekt gereift und hier zu sehen.
    Ein Renteneintritts-countdown mit einem alten Tischrechner
    Bei dieser Gelegenheit nochmals ein Danke an die Mitdenker a_14_3ef964b0
    Raum für Notizen

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

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