PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten aus Zeichenatz lesen+als Scrolltext ausgeben (Max7221)



BoondockDuck
19.06.2008, 10:49
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. :-s

Schonmal Danke :D


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
...



$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

PicNick
19.06.2008, 11:27
Rückfrage: das in dem DO..LOOP gibt tatsächlich ein "A" aus ?

BoondockDuck
19.06.2008, 19:14
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


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

PicNick
20.06.2008, 19:51
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.


:-)

BoondockDuck
21.06.2008, 21:49
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 8-[

$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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789" '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 '