- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: Daten aus Zeichenatz lesen+als Scrolltext ausgeben (Max7221)

  1. #1

    Daten aus Zeichenatz lesen+als Scrolltext ausgeben (Max7221)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi
    ich habe ein 5*7 DotMatrix LED-Display über einen Max7221 an mein RN-Minicontrol-Board angeschlossen. (Anmerkung: Im Code steht Max7219, ich habe die Bezeichnung nur nicht geändert)
    Das ganze funktioniert soweit auch, über eine etwas umständliche Spielerei habe ich es auch hinbekommen den Buchstaben "A" vertikal runter zu scrollen.
    Mein Code steht ganz unten im Beitrag (das ist aber nicht der Code für das Scrollen)

    Meine Bascon-Fähigkeiten begrenzen sich bis jetzt darauf bestehenden Code abzuändern, ich arbeite mich erst langsam ein. Mithilfe der Bascom Language Reference und Beispielen klappt es aber einigermaßen.

    Kurz zur Erklärung des Max7221 falls er nicht bekannt ist. Das ist ein ganz praktischer Display-Driver für bis zu 64 LEDs der das ganze Multiplexing übernimmt. 64 einzelnde LEDs oder alternativ z.b. 8 7-Segmende-Anzeigen. Dazu hat er noch ein paar Zusatzfunktionen wie eine Einstellbare Displayhelligkeit, ist Kaskadierbar und anderes ... steht im Datenblatt schön beschrieben.

    Programmiert wird er über eine 16-Bit Folge. Die ersten 8 Bit sind für die Adressierung, die zweiten 8 Bit für die Daten. (Wenn man zwei oder mehrere Max7221 Kaskadiert muss man jeweils 16Bit pro Chip mehr ausgeben.)

    In dem Code ganz unten sieht man wie der Max vor der Do-Loop-Schleife initialisiert wird. In der Do-Loop-Schleife wird dann das "A" ausgegeben.


    Was ich machen möchte: Ich habe in einem anderen Beispiel so einen Zeichensatz gefunden (habe die Werte jetzt nicht auf ihre Richtigkeit getestet). Ich habe mir den gesamten Code zwar durchgelesen aber nicht herausfinden können wie man es, wenn man z.b. Ein "A" ausgeben möchte, in Bascon Programmiert. Bzw. ich habe es schlicht nicht kapiert, die Schaltung dazu war auch ganz anderes. (Schieberegister anstatt Max)

    Letzendlich möchte ich einen scrollenden (nach links/rechts) Text ausgeben.

    Vom Prinzip her weiß ich wie das alles funktionieren soll.
    Horizontales Scrollen indem man das erste Byte der 16-Bit-Folge pro Durchgang ein Bit addiert/subtrahiert (Mit einem Maximalen Wertebereich von 1-5, denn dann ist ja das Display "ende")
    Vertikales Scrollen indem man das zweite Byte einfach mit ROTATE nach links/rechts verschiebt.

    Ich kann das ganze nur von meiner Programmierfähigkeit her nicht sinnvoll in Verbindung mit sowas wie so einem Zeichensatz verbinden.
    Und am schönsten wäre es natürlich wenn man das ganze über einen String machen könnte. Sprich man hat einen String in dem etwas steht und der soll dann automatisch zerlegt werden und auf dem Display ausgegeben und gescrollt werden ...

    Kolpililziart.... find isch des.

    Schonmal Danke

    Code:
    Zeichensatz:
    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
    ...

    Code:
    $regfile "m168def.dat"
    $crystal = 16000000
    
     Config Portd.5 = Output                                    ' load(cs)
     Config Portd.4 = Output                                    ' clk
     Config Portb.2 = Output                                    ' din
    
     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
    
    
     Dim Led_operation As Word
     Declare Sub Max7219datenout(d As Word)
    
    
      Led_operation = &B0000110000000001                        ' normal operation mode
     Call Max7219datenout(led_operation)
      Led_operation = &B0000100100000000                        ' decode mode none
     Call Max7219datenout(led_operation)
      Led_operation = &B0000101000001100                        ' led intensity
     Call Max7219datenout(led_operation)
      Led_operation = &B0000101100000111                        ' scan limit digit 0-7
     Call Max7219datenout(led_operation)
    
     Do                                                                              ' Gibt "A" auf dem Display aus
       Led_operation = &B0000000101111111
      Call Max7219datenout(led_operation)
      Led_operation = &B0000000101010101
      Call Max7219datenout(led_operation)
       Led_operation = &B0000000101111111
      Call Max7219datenout(led_operation)
       Led_operation = &B0000000101010101
      Call Max7219datenout(led_operation)
       Led_operation = &B0000000101111111
      Call Max7219datenout(led_operation)
     Loop
    
     Sub Max7219datenout(d As Word)
      Max_cs = 0
      Shiftout Max_din , Max_clk , D , 1 , 16             
      Max_cs = 1
     End Sub
    nit resigniert nur reichlich desillusioniert
    e bessje jet hann ich kapiert

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Rückfrage: das in dem DO..LOOP gibt tatsächlich ein "A" aus ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    ich sehe gerade der code oben ist falsch ... der dürfte nur in der ersten Zeile etwas ausgeben

    Die Bitfolgen müssten für ein A so aussehen:
    00000001 00111111
    00000010 01001000
    00000011 01001000
    00000100 01001000
    00000101 00111111
    Ich habe den Code versehentlich aus einer älteren Datei kopiert.


    Ich habe mir inzwischen den Code zu dem Zeichensatz nochmal anschauen können. Total verstehen kann ich ihn noch nicht,aber er funktioniert.

    Warum die Zeilen
    Bz = Ez - 32
    Beginn_zeichen = Bz * 6
    Ende_zeichen = Beginn_zeichen + 5

    So könnt ich das Zeichensatzproblem zumindestens lösen

    Code:
    Dim A As Word , B 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(1530) As Byte
    Dim Ze(8) As Byte
    Dim Text As String * 255
    Dim Einzelzeichen As String * 1
    
    Text = "TA"                                                 'max. 255 Zeichen
    
    Tl = Len(text)
    B = 1
    
    For A = 1 To Tl
     Einzelzeichen = Mid(text , A , 1)
     Ez = Asc(einzelzeichen)
     Bz = Ez - 32
     Beginn_zeichen = Bz * 6
     Ende_zeichen = Beginn_zeichen + 5
     For Db_zeiger = Beginn_zeichen To Ende_zeichen
      Dat(b) = Lookup(db_zeiger , Zeichensatz)
      Print Dat(b)
      Dat(b) = 255 - Dat(b)
      Incr B
     Next Db_zeiger
    Next A
    
    End
    
    Zeichensatz:
    Data 0 , 126 , 9 , 9 , 9 , 126                              'A
    Data 0 , 127 , 73 , 73 , 73 , 54                            'B
    Data 0 , 62 , 65 , 65 , 65 , 34                             'C
    nit resigniert nur reichlich desillusioniert
    e bessje jet hann ich kapiert

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Spät, aber doch:
    1)
    Ez - 32

    An sich ist ja ein Zeichen in einem Text ein ASCII-Code von 0 - 255
    davon sind aber die ersten 32 Steuerzeichen und nicht lesbar.
    Also definiert man die Zeichensatztabelle nur mit den Zeichen von 32 aufwärts.
    Damit der ZugriffsIndex aber trotzdem mit 0 beginnen kann, zieht der Kollege im Beispiel "32" ab.

    aaaaaaaber:
    Du hast in deiner Tabelle als kleinstes Zeichen ein "A", das hat den ASCII-Code "65".
    Also mußt du "65" abziehen. Bz = Ez - 65
    klaro ?

    2)
    In der Tabelle werden für jedes Zeichen 6 Byte verbraten.
    Für dein "A" also 0, 1, 2, 3, 4, 5
    das "B" beginnt dann bei 6
    Diese 6 Byte in der Tabelle findest du daher --> Beginn-zeichen = Bz * 6

    Für "A" ergibt das eben 0 (das erste in der Tabelle)
    Für "B" (ascii-code = 66, (- 65) --> 1) 1 * 6 = Beginn Tabelle,sechstes Byte


    3) "A" belegt in der Tabelle (Beginn)
    Byte_0, 1, 2, 3, 4, 5 (6 Stück)
    Also Ende Zeichen (=letzes byte des Zeichens) Beginn + 5

    *lufthol*


    Verwirrend ist, das jede "normal"Tabelle mit "0" beginnt (z.B. bei Lookup(index, tabelle) )
    Bascom und andere Basic beginnen aber mit "1"

    Frag nicht, warum, das hat wohl der liebe Gott so bestimmt.


    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Danke soweit

    ich war die Tage auch fleißig und habe etwas weitergearbeitet.
    Ich habe die Software inzwischen soweit dass der Atmel die Zeichen aus einem beliebig* langem String ausließt und nacheinander auf der Matrix anzeigt**.

    * beliebig: max.255 Zeichen (zu je 6 Byte = 1530 Byte). Wenn ich dem Array Dat() 1530 Byte zuweise sagt Bascom mir "out of SRAM space". Der Speicher reicht wohl nicht. Deswegen sind es bei mir im Code momentan max. 62 Zeichen.
    Im Zeichensatz sind pro Zeile 6 Byte. Das Erste Byte ist eigentlich immer unnötig da bei einer 5*7Matrix nur 5 Byte interessieren. Deswegen ist das erste Byte (bis auf einmal, weiß nicht wieso) immer null. Wenn man die weglässt könnte man 255Byte einsparen. Richtig?

    ** Obwohl der Zeichensatz wohl ein Standardzeichensatz zu sein scheint spinnen ein paar Zeichen. Alle werden angezeigt, einige stehen aber auf dem Kopf (z.b. B,C,D,E,K), andere (z.b p,q) sind nur halb drauf. Den Zeichensatz habe ich noch nicht überprüft, soweit funktioniert es ja.



    Die eigentliche Frage ist jetzt ja: Wie bekomme ich das zum scrollen?
    Eine Idee habe ich schon. Müsste ja irgendwie über das Array Dat() zu lösen sein ...



    Und hier noch der komplette (funktionierende) Code zum schmökern
    Code:
    $regfile "m168def.dat"
    $crystal = 16000000
    
     Config Portd.5 = Output                                    ' load(cs)
     Config Portd.4 = Output                                    ' clk
     Config Portb.2 = Output                                    ' din
    
     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
    
     Dim Led_operation As Word
     Declare Sub Max7221datenout(d As Word)
     Declare Sub Max7221init
    
     Dim A As Word , B As Word , C As Word , Adressbyte 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 Ze(8) As Byte
     Dim Text As String * 255
     Dim Einzelzeichen As String * 1
    
    
     Call Max7221init
    
    
    Do
    Text = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"       'max. 62 Zeichen da dat(372). 255zeichen mit dat(1530)
    
    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                                    'Je 6 Byte pro Eintrag im Zeichensatz
     Ende_zeichen = Beginn_zeichen + 5
    
     Adressbyte = 0                                             ' = &B0000000000000000    
    
     For Db_zeiger = Beginn_zeichen To Ende_zeichen
      Dat(b) = Lookup(db_zeiger , Zeichensatz)                  'db_zeiger: position im Zeichensatz
      Print "Zeichensatz Data " ; Dat(b)
    
      C = Adressbyte + Dat(b)
      Print C                                                   
      Call Max7221datenout(c)
    
      Incr B
      Adressbyte = Adressbyte + &B0000000100000000
    
     Next Db_zeiger
     Waims 500                                                   '500ms Pause
    Next A
    
    Loop
    End
    
    
    
     Sub Max7221init
       Led_operation = &B0000110000000001                       ' shutdown mode  normal operation
      Call Max7221datenout(led_operation)
       Led_operation = &B0000100100000000                       ' decode mode code b for digit 7-0
      Call Max7221datenout(led_operation)
       Led_operation = &B0000101000001100                       ' intensity | &H0A01 = 2/16 | &H0A09 = 10/16 | &H0A0F = 15/16(max on)
      Call Max7221datenout(led_operation)
       Led_operation = &B0000101100000111                       ' scan limit digit 0-7
      Call Max7221datenout(led_operation)
     End Sub
    
    
     Sub Max7221datenout(d As Word)
      Max_cs = 0
      Shiftout Max_din , Max_clk , D , 1 , 16                   ' , 250
      Max_cs = 1
      Print "Max7221datenout: " ; D
     End Sub
    
    
    
    
    
    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                                  '
    nit resigniert nur reichlich desillusioniert
    e bessje jet hann ich kapiert

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests