moin moin
Ich bin mal wieder mit meinen DotMatrix-LED-Matrizen da.
Für die, die die letzten Threads nicht gelesen haben, hier nochmal schnell ein überblick:

Ich steuere vier 5*7 LED-Matrizen mit vier Max7221 über eine 64-Bitfolge (Pro Max 16 Bit) an. (Sub Max7221datenout)

String "Text" wird gelesen, die Einzelzeichen werden aus der Datenbank (mit 6 Bytes / Eintrag) gelesen. Jedes Byte wird zum Array dat(372) hinzugefügt. Sprich ein Zeichen benötigt 6 Plättze im Array.
Beispiel: String "Hallo" beginnt H(Ascii : 72). Abzüglich 32 ist das die 40. Zeile in der Datenbank.
Usw... naja ihr wisst ja schon wie das funktioniert


Ich habe 3 Taster angeschlossen. Zwei Taster verändern ein Byte zwischen den Werten 32 und 127. Das steht für die Ascii-Werte die auch in der Datenbank vorhanden sind.
Das funktioniert über die Variable "Zeichen" als Byte die durch einen Taster um 1 erhöht (Sub Schalten3), durch den anderen Taster um 1 verringert wird (Sub Schalten2). ("Zeichen" kleiner als 32 bzw. größer als 127 habe ich mit den if-funktionen vermieden).

Mit dem dritten Taster wird das "Zeichen" über string(1,zeichen) an den String Text angehängt. (Sub Schalten1).
[ Wird der dritte taster nochmals gedrückt wird "Text" zurückgesetzt, d.h. die Anzeige gelöscht. (Damit man sieht obs funktioniert wird sie im Code zu Text = "x" zurückgesetzt). ]
Nach dem Anhängen des neuen Zeichens wird Text erneut gelesen, die Zeichen aus der Datenbank übernommen und dann beginnt das anzeigen auf den Matritzen von neuem.
D.h. dass während man ein Zeichen mit Taster1 und Taster2 auch nichts auf den Matrizen ausgegeben wird. (Ich hatte das ganze schon versucht parallel zueinander laufen zu lassen, nur irgendwie ging das mit der Datenausgabe und dem Debounce schief und hat nicht immer geklappt.)

Also im Prinzip ists ja eine einfache Sache. Zwei Taster wählen ein Zeichen aus, der dritte fügt es einem String hinzu.


Jetzt das Problem: Das Programm resettet sich regelmäßig. Nach ca. 20-25 mal drücken der Taster hängt das LCD kurz, Zeigt etwas Mist an. Dannach läuft das Programm wieder von vorne durch.

Ich habe schon alles mögliche getestet.
Hängt es vielleicht mit goto und gosub zusammen? Ich hatte anfänglich fast nur gosub geschrieben, dann hat es sich noch schneller resettet.
Oder liegt es an dem Debounce?

Ansonsten verstehe ich nicht warum sich das Programm resettet.
Das ganze ist vermutlich nicht super intelligent programmiert, aber ich bin ja auch AVR-Neuling und froh dass ich es soweit geschafft habe.


So... also lange Rede, noch längerer Code.
Ich hoffe ihr erbarmt auch aber trotzdem.


Code:
 $regfile "m168def.dat"
 $crystal = 16000000

 Config Portd.5 = Output                                    ' load(cs)
 Config Portd.4 = Output                                    ' clk
 Config Portb.2 = Output                                    ' din

 Config Portc.1 = Output                                    ' led
 Config Portc.0 = Input                                     ' taster
 Config Portd.2 = Input                                     ' taster
 Config Portb.1 = Input                                     ' taster

 Led Alias Portc.1

 Max_cs Alias Portd.5
 Max_din Alias Portb.2
 Max_clk Alias Portd.4

 Set Max_cs                                                 ' cs, din, clk = high
 Set Max_din
 Set Max_clk

 Set Led
 Set Portc.0
 Set Portd.2
 Set Portb.1

 Config Debounce = 35

 Config Lcd = 16 * 1a                                      
 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.5 , Db6 = Portc.3 , Db7 = Portb.3 , E = Portd.7 , Rs = Portd.6
 Initlcd
 Cls
 Lcd "BAP"

 Declare Sub Max7221datenout(d As Word , E As Word , F As Word , G As Word)
 Declare Sub Max7221init
 Declare Sub Textlesen
 Declare Sub Schreiben
 Declare Sub Schalten
 Declare Sub Schalten1
 Declare Sub Schalten2
 Declare Sub Schalten3

 Dim Led_operation As Word $prog &HFF , &HFF , &HD7 , &HF9  ' generated. Take care that the chip supports all fuse bytes.
 Dim Zeichen As Byte
 Dim Text As String * 62
 Dim Loeschen As Byte
 Dim A As Word , B As Word , C As Word , D As Word , E As Word , F As Word
 Dim Beginn_zeichen As Word , Ende_zeichen As Word , Db_zeiger As Word
 Dim Bz As Word
 Dim Tl As Byte
 Dim Ez As Byte
 Dim Dat(372) As Byte
 Dim Einzelzeichen As String * 1

 Zeichen = 32
 Loeschen = 0
 Text = "BAP"

 Declare Function Reversed(source As Byte) As Byte


 Gosub Max7221init


 Goto Textlesen                                             'call

''''''''''''''''''''''''''''''''''

Sub Schreiben
 Do
  For A = 1 To B

  C = &B0000000000000000
  D = &B0000000000000000
  E = &B0000000000000000
  F = &B0000000000000000
  Call Max7221datenout(c , D , E , F)

  C = &B0000000100000000 + Dat(a + 1)
  D = &B0000000100000000 + Dat(a + 6)
  E = &B0000000100000000 + Dat(a + 12)
  F = &B0000000100000000 + Dat(a + 17)
  Call Max7221datenout(c , D , E , F)

  C = &B0000001000000000 + Dat(a + 2)
  D = &B0000001000000000 + Dat(a + 7)
  E = &B0000001000000000 + Dat(a + 13)
  F = &B0000001000000000 + Dat(a + 18)
  Call Max7221datenout(c , D , E , F)

  C = &B0000001100000000 + Dat(a + 3)
  D = &B0000001100000000 + Dat(a + 8)
  E = &B0000001100000000 + Dat(a + 14)
  F = &B0000001100000000 + Dat(a + 19)
  Call Max7221datenout(c , D , E , F)

  C = &B0000010000000000 + Dat(a + 4)
  D = &B0000010000000000 + Dat(a + 9)
  E = &B0000010000000000 + Dat(a + 15)
  F = &B0000010000000000 + Dat(a + 20)
  Call Max7221datenout(c , D , E , F)

  C = &B0000010100000000 + Dat(a + 5)
  D = &B0000010100000000 + Dat(a + 10)
  E = &B0000010100000000 + Dat(a + 16)
  F = &B0000010100000000 + Dat(a + 21)
  Call Max7221datenout(c , D , E , F)

  Waitms 100
  Debounce Pinc.0 , 0 , Schalten1                           ', Sub
  Debounce Pind.2 , 0 , Schalten2                           ', Sub
  Debounce Pinb.1 , 0 , Schalten3                           ', Sub
  Next A

 Loop

End Sub


Sub Textlesen
  Tl = Len(text)
  B = 1

  For A = 1 To Tl
   Einzelzeichen = Mid(text , A , 1)
   Ez = Asc(einzelzeichen)

   Bz = Ez - 32                                             'ASCII-Table ohne die ersten 32 Eintraege

   Beginn_zeichen = Bz * 6                                  '*6 da je 6 datensätze pro eintrag
   Ende_zeichen = Beginn_zeichen + 5

   For Db_zeiger = Beginn_zeichen To Ende_zeichen
    Dat(b) = Lookup(db_zeiger , Zeichensatz)                'db_zeiger: position im Zeichensatz
    Dat(b) = Reversed(dat(b))
    Incr B
   Next Db_zeiger
  Next A

  Print "lesen done - " ; "Text: " ; Text

  Goto Schreiben                                            'gosub
 End Sub


 Sub Max7221init
   Led_operation = &B0000110000000000                       ' shutdown mode  normal operation
  Call Max7221datenout(led_operation , Led_operation , Led_operation , Led_operation)
   Led_operation = &B0000110000000001                       ' shutdown mode  normal operation
  Call Max7221datenout(led_operation , Led_operation , Led_operation , Led_operation)
   Led_operation = &B0000100100000000                       ' decode mode code b for digit 7-0
  Call Max7221datenout(led_operation , Led_operation , Led_operation , Led_operation)
   Led_operation = &B0000101000001100                       ' intensity | &H0A01 = 2/16 | &H0A09 = 10/16 | &H0A0F = 15/16(max on)
  Call Max7221datenout(led_operation , Led_operation , Led_operation , Led_operation)
   Led_operation = &B0000101100000111                       ' scan limit digit 0-7
  Call Max7221datenout(led_operation , Led_operation , Led_operation , Led_operation)

  Print "init done"
 Return
 End Sub


 Sub Max7221datenout(d As Word , E As Word , F As Word , G As Word)
  Max_cs = 0
  Shiftout Max_din , Max_clk , G , 1 , 16
  Shiftout Max_din , Max_clk , F , 1 , 16
  Shiftout Max_din , Max_clk , E , 1 , 16
  Shiftout Max_din , Max_clk , D , 1 , 16
  Max_cs = 1
 End Sub

 '''''''''''''''''''''''''''''''''''''''''


  Sub Schalten
  Toggle Led

  If Loeschen = 2 Then
    Text = "x"                         '"x" damit man weiterhin sieht ob die Matrizen noch angesteuert werden. 
    Cls                                ' Im fertigen Programm soll hier Text = "" sein. 
    Lcd "text geloescht"
    Print "text geloescht"
    Loeschen = 0
    Print Text
    Goto Textlesen
   Else
    Goto Textlesen
   End If

 End Sub


 Sub Schalten1
  Text = Text + String(1 , Zeichen)
  Incr Loeschen
  Goto Schalten
 End Sub


 Sub Schalten2
 Loeschen = 0
   If Zeichen > 32 Then
    Decr Zeichen
   Else
    Zeichen = 127
   End If
    Cls
    Lcd "add: " ; Chr(zeichen) ; " (" ; Zeichen ; ")"
    'Waitms 100
    Do
 Debounce Pinc.0 , 0 , Schalten1 , Sub
 Debounce Pind.2 , 0 , Schalten2 , Sub
 Debounce Pinb.1 , 0 , Schalten3 , Sub
   Waitms 45
   Loop
 End Sub


 Sub Schalten3
 Loeschen = 0
   If Zeichen < 127 Then
    Incr Zeichen
   Else
    Zeichen = 32
   End If
    Cls

    Lcd "add: " ; Chr(zeichen) ; " (" ; Zeichen ; ")"
    'Waitms 100
    Do
 Debounce Pinc.0 , 0 , Schalten1 , Sub
 Debounce Pind.2 , 0 , Schalten2 , Sub
 Debounce Pinb.1 , 0 , Schalten3 , Sub
   Waitms 45
   Loop
 End Sub


 '''''''''''''''''''''''''''''''''''''''''




 Function Reversed(byval Source As Byte) As Byte
   Local Dest As Byte
   Dest.0 = Source.6
   Dest.1 = Source.5
   Dest.2 = Source.4
   Dest.3 = Source.3
   Dest.4 = Source.2
   Dest.5 = Source.1
   Dest.6 = Source.0
   Dest.7 = Source.7
   Reversed = Dest
 End Function

''''''''''''''''''''''''''''''''''

End                                                         'end program




Zeichensatz:                                                'ASCII-Table ohne die ersten 32 Eintraege
Data 0 , 0 , 0 , 0 , 0 , 0                                  'Leerzeichen
Data 0 , 0 , 6 , 95 , 6 , 0                                 '!
Data 0 , 7 , 3 , 0 , 7 , 3                                  '""
Data 0 , 36 , 126 , 36 , 126 , 36                           '#
Data 0 , 36 , 43 , 106 , 18 , 0                             '$
Data 0 , 6 , 9 , 9 , 6 , 0                                  '%
Data 0 , 54 , 73 , 86 , 32 , 80                             '&
Data 0 , 0 , 7 , 3 , 0 , 0                                  ''
Data 0 , 0 , 62 , 65 , 0 , 0                                '
Data 0 , 0 , 65 , 62 , 0 , 0                                '
Data 0 , 8 , 62 , 28 , 62 , 8                               '*
Data 0 , 8 , 8 , 62 , 8 , 8                                 '+
Data 0 , 0 , 224 , 96 , 0 , 0                               ',
Data 0 , 8 , 8 , 8 , 8 , 8                                  '-
Data 0 , 0 , 96 , 96 , 0 , 0                                '.
Data 0 , 32 , 16 , 8 , 4 , 2                                '/
Data 0 , 62 , 81 , 73 , 69 , 62                             '0
Data 0 , 0 , 66 , 127 , 64 , 0                              '1
Data 0 , 98 , 81 , 73 , 73 , 70                             '2
Data 0 , 34 , 73 , 73 , 73 , 54                             '3
Data 0 , 24 , 20 , 18 , 127 , 16                            '4
Data 0 , 47 , 73 , 73 , 73 , 49                             '5
Data 0 , 60 , 74 , 73 , 73 , 48                             '6
Data 0 , 1 , 113 , 9 , 5 , 3                                '7
Data 0 , 54 , 73 , 73 , 73 , 54                             '8
Data 0 , 6 , 73 , 73 , 41 , 30                              '9
Data 0 , 0 , 108 , 108 , 0 , 0                              ':
Data 0 , 0 , 236 , 108 , 0 , 0                              ';
Data 0 , 8 , 20 , 34 , 65 , 0                               '<
Data 0 , 36 , 36 , 36 , 36 , 36                             '=
Data 0 , 0 , 65 , 34 , 20 , 8                               '>
Data 0 , 2 , 1 , 89 , 9 , 6                                 '?
Data 0 , 62 , 65 , 93 , 85 , 30                             '@
Data 0 , 126 , 9 , 9 , 9 , 126                              'A
Data 0 , 127 , 73 , 73 , 73 , 54                            'B
Data 0 , 62 , 65 , 65 , 65 , 34                             'C
Data 0 , 127 , 65 , 65 , 65 , 62                            'D
Data 0 , 127 , 73 , 73 , 73 , 65                            'E
Data 0 , 127 , 9 , 9 , 9 , 1                                'F
Data 0 , 62 , 65 , 73 , 73 , 122                            'G
Data 0 , 127 , 8 , 8 , 8 , 127                              'H
Data 0 , 0 , 65 , 127 , 65 , 0                              'I
Data 0 , 63 , 64 , 64 , 64 , 48                             'J
Data 0 , 127 , 8 , 20 , 34 , 65                             'K
Data 0 , 127 , 64 , 64 , 64 , 64                            'L
Data 0 , 127 , 2 , 4 , 2 , 127                              'M
Data 0 , 127 , 2 , 4 , 8 , 127                              'N
Data 0 , 62 , 65 , 65 , 65 , 62                             'O
Data 0 , 127 , 9 , 9 , 9 , 6                                'P
Data 0 , 62 , 65 , 81 , 33 , 94                             'Q
Data 0 , 127 , 9 , 9 , 25 , 102                             'R
Data 0 , 38 , 73 , 73 , 73 , 50                             'S
Data 0 , 1 , 1 , 127 , 1 , 1                                'T
Data 0 , 63 , 64 , 64 , 64 , 63                             'U
Data 0 , 31 , 32 , 64 , 32 , 31                             'V
Data 0 , 63 , 64 , 60 , 64 , 63                             'W
Data 0 , 99 , 20 , 8 , 20 , 99                              'X
Data 0 , 7 , 8 , 112 , 8 , 7                                'Y
Data 0 , 97 , 81 , 73 , 69 , 67                             'Z
Data 0 , 0 , 127 , 65 , 65 , 0                              '[
Data 0 , 2 , 4 , 8 , 16 , 32                                '\
Data 0 , 0 , 65 , 65 , 127 , 0                              ']
Data 0 , 4 , 2 , 1 , 2 , 4                                  '^
Data 128 , 128 , 128 , 128 , 128 , 128                      '
Data 0 , 0 , 3 , 7 , 0 , 0                                  '`
Data 0 , 32 , 84 , 84 , 84 , 120                            'a
Data 0 , 127 , 68 , 68 , 68 , 56                            'b
Data 0 , 56 , 68 , 68 , 68 , 40                             'c
Data 0 , 56 , 68 , 68 , 68 , 127                            'd
Data 0 , 56 , 84 , 84 , 84 , 8                              'e
Data 0 , 8 , 126 , 9 , 9 , 0                                'f
Data 0 , 24 , 164 , 164 , 164 , 124                         'g
Data 0 , 127 , 4 , 4 , 120 , 0                              'h
Data 0 , 0 , 0 , 125 , 64 , 0                               'i
Data 0 , 64 , 128 , 132 , 125 , 0                           'j
Data 0 , 127 , 16 , 40 , 68 , 0                             'k
Data 0 , 0 , 0 , 127 , 64 , 0                               'l
Data 0 , 124 , 4 , 24 , 4 , 120                             'm
Data 0 , 124 , 4 , 4 , 120 , 0                              'n
Data 0 , 56 , 68 , 68 , 68 , 56                             'o
Data 0 , 252 , 68 , 68 , 68 , 56                            'p
Data 0 , 56 , 68 , 68 , 68 , 252                            'q
Data 0 , 68 , 120 , 68 , 4 , 8                              'r
Data 0 , 8 , 84 , 84 , 84 , 32                              's
Data 0 , 4 , 62 , 68 , 36 , 0                               't
Data 0 , 60 , 64 , 32 , 124 , 0                             'u
Data 0 , 28 , 32 , 64 , 32 , 28                             'v
Data 0 , 60 , 96 , 48 , 96 , 60                             'w
Data 0 , 108 , 16 , 16 , 108 , 0                            'x
Data 0 , 156 , 160 , 96 , 60 , 0                            'y
Data 0 , 100 , 84 , 84 , 76 , 0                             'z
Data 0 , 8 , 62 , 65 , 65 , 0                               '{
Data 0 , 0 , 0 , 119 , 0 , 0                                '|
Data 0 , 0 , 0 , 0 , 0 , 0                                  '}
Data 0 , 2 , 1 , 2 , 1 , 0                                  '~
Data 0 , 0 , 0 , 0 , 0 , 0                                  '