PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED-Laufschrift mit Bascom, ATMega32 und Pollin-Displays



digitali
03.04.2008, 16:23
Hallo,

hier im Forum konnte man auch wieder die Frage lesen, ob es moeglich ist in Bascom eine LED-Laufschrift zu programmieren. Und das interessierte mich auch.
Vor einiger Zeit hatte ich mir mal testhalber zehn dieser 5x8 DotMatrix-Anzeigen von Pollin mit bestellt. Naja, und nun hatte ich mal etwas Zeit fuer eine solche Bastelei.
Sieben 74HC595, einen ATMega32, acht BD140, ein Haufen Widerstaende, Loetstreifenrasterplatinen und ein paar Kleinteile auf den Tisch, die Datenblaetter ausgedruckt, Loetkolben angeheizt und los ging's.

http://www.elektronik-web.de/images/projekt5/bild2_k.jpg

Die ganze Loetarbeit an dieser Laufschrift war doch schon etwas muehselig. Ich hatte aber auch keine Lust mir eine Platine aetzen zu lassen. Das waere mir zu aufwaendig und zu teuer geworden. Zumindest fuer diese (erste) Laufschrift. Es ging mir nur um die Machbarkeit.
Nachdem ich die ganzen Bauteile aufgeloetet hatte und es auch alles messtechnisch soweit funktionierte, ging es an's Programmieren. Und das war schon 'ne Ecke kniffliger.
Unter Bascom gibt es die wunderschoene Befehle shiftout und spiout. Damit hatte ich zunaechst gespielt. Es ging auch ansatzweise. Aber hier schiebt man die ganzen Bits byteweise heraus. Und da gab es immer wieder irgendwelche Probleme die Bits auch so zu positionieren das wieder lesbare Zeichen daraus wurden. Daraufhin habe ich mich entschieden die Bits ueber eine eigene Routine einzeln herauszuschieben. Da weiss man wenigstens was da passiert. :)

Die Daten von einem 6x8 Font fuer ein KS108-Display habe ich so uebernommen. Sie bilden die Grundlage von dem Zeichensatz (nicht vollstaendig im Beispielcode) fuer die Laufschrift. Die einzelnen Bytes werden hier zerlegt und entsprechend den Anforderungen neu zusammengesetzt. Dann werden die Daten bitgenau in die 74HC595-Kette geschoben. Der entsprechende Zeilen-Transistor schaltet die dazugehoerige Zeile. Das zerlegen des Textes, der auf der Laufschrift angezeigt werden soll, geschieht zunaechst "in aller Ruhe". Ist der Datensatz komplett, wird ein Timer gestartet in dessen mit jedem Durchlauf ein Datensatz rausgeschoben und die Zeile umgeschaltet wird. In der Haupt Do-Loop veraendere ich lediglich alle paar Millisekunden den Bereich der angezeigt werden soll. Man schaut also wie durch ein Fenster auf den Ausgabetext. Und durch Veraenderung entsprechender Variablen verschiebe ich das "Fenster".
Das ganze ist sicherlich nicht optimal und es verbraucht auch 'ne Menge an Speicher von dem ATMega32. Aber ich wollte auch erstmal nur ergruenden ob es ueberhaupt moeglich ist. Auch der Ausgabetext ist noch fest im Programm integriert (eine serielle Eingabe waere hier eine Moeglichkeit).

Zumindest hat man wieder eine Menge Erfahrungen mit einer solchen Bastelei gesammelt. Und die Freude ist doch wieder gross, wenn es schlussendlich funktioniert. :)

http://www.elektronik-web.de/images/projekt5/ls.jpg

Hier eine Seite (http://www.elektronik-web.de/images/projekt5) mit weiteren Bildern und einem kleinen Video.

Der Bascom-Code (undokumentiert):



$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 30
$framesize = 40
Config Porta = Output
Config Portb = Output
Config Timer0 = Timer , Prescale = 64
On Timer0 Timer_isr
Enable Timer0
Enable Interrupts
Stop Timer0

Dout Alias Portb.2
Ss Alias Portb.1
Clock Alias Portb.0
Zeile Alias Porta

Dim A As Word , B As Word
Dim A1 As Word , A2 As Word , A3 As Word
Dim Beginn_zeichen As Word , Ende_zeichen As Word , Db_zeiger As Word
Dim Bz As Word
Dim Ti As Byte , Tl As Byte , Tl2 As Word , Tl3 As Word
Dim Ez As Byte
Dim Dat(1530) As Byte
Dim Ze(8) As Byte
Dim Text As String * 255
Dim Einzelzeichen As String * 1

Ze(1) = 127
Ze(2) = 191
Ze(3) = 223
Ze(4) = 239
Ze(5) = 247
Ze(6) = 251
Ze(7) = 253
Ze(8) = 254

Text = " LED-Laufschrift mit Bascom, ATMega32 und Pollin Display " 'max. 255 Zeichen

Tl = Len(text)
B = 1

For A = 1 To Tl
Tl2 = Tl * 6
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)
Dat(b) = 255 - Dat(b)
Incr B
Next Db_zeiger
Next A

A2 = 1
Tl3 = Tl2 - 50
Start Timer0

Do
A3 = A2 + 50
Waitms 60
Incr A2
If A2 = Tl3 Then A2 = 1
Loop

End

Timer_isr:
If Ti = 9 Then Ti = 1
Select Case Ti
Case 1:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).0
Clock = 0
Next A1
Ss = 1
Zeile = Ze(1)
Case 2:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).1
Clock = 0
Next A1
Ss = 1
Zeile = Ze(2)
Case 3:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).2
Clock = 0
Next A1
Ss = 1
Zeile = Ze(3)
Case 4:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).3
Clock = 0
Next A1
Ss = 1
Zeile = Ze(4)
Case 5:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).4
Clock = 0
Next A1
Ss = 1
Zeile = Ze(5)
Case 6:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).5
Clock = 0
Next A1
Ss = 1
Zeile = Ze(6)
Case 7:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).6
Clock = 0
Next A1
Ss = 1
Zeile = Ze(7)
Case 8:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).7
Clock = 0
Next A1
Ss = 1
Zeile = Ze(8)
End Select
Incr Ti
Return

Zeichensatz:
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 '



Mit freundlichen Gruessen
Digitali

Bluesmash
03.04.2008, 16:32
Schönes Projekt! Sieht gut aus!
aber leider funktioniert das Video auf deiner Seite niacht...

gruss bluesmash

dremler
03.04.2008, 17:00
bei mir geht das video

xeno
03.04.2008, 17:05
Schönes Projekt! Sieht gut aus!
aber leider funktioniert das Video auf deiner Seite niacht...

gruss bluesmash

Da kann ich dir nur zustimmen.
Aber das Video geht bei mir, geh mal mit Rechter Maustaste auf Bild Anzeigen.

@digitali

Kannst Du noch ein Schaltplan rein stellen wie du das ganze mit dem Mega32 verbunden haste bzw. den ganzen aufbau? Das wäre echt Super.

digitali
03.04.2008, 19:18
Schönes Projekt! Sieht gut aus!
aber leider funktioniert das Video auf deiner Seite niacht...

gruss bluesmash

Da kann ich dir nur zustimmen.
Aber das Video geht bei mir, geh mal mit Rechter Maustaste auf Bild Anzeigen.

@digitali

Kannst Du noch ein Schaltplan rein stellen wie du das ganze mit dem Mega32 verbunden haste bzw. den ganzen aufbau? Das wäre echt Super.


Ich habe gerade im Bascom-Code den Zeichensatz in meinem ersten Posting vervollstaendigt und ein paar Kleinigkeiten optimiert.

@xeno

Geht im Grunde schon aus dem Listing hervor:

DATEN an Portb.2
LOAD an Portb.1
CLOCK an Portb.0
Zeile 1 an Porta.0 bis Zeile 8 an Porta.7

Und der Rest ist einfach nur Grundschaltung ATMega32/16. Deshalb hatte ich es mir erspart hier noch einen Schaltplan zu zeichnen.

Mit freundlichen Gruessen
Digitali

Dnerb
03.04.2008, 20:25
Erst mal Respekt, ist toll geworden.

Wie wäre es jetzt mit etwas mehr Farbe, sprich rot/grün-Matrix-Anzeigen? :-)

Ich frage mich aber was immer diese Fragen sollen wie "geht das mit Bascom?"
Wieso sollte sowas denn nicht gehen?

xeno
03.04.2008, 20:39
Geht im Grunde schon aus dem Listing hervor:

DATEN an Portb.2
LOAD an Portb.1
CLOCK an Portb.0
Zeile 1 an Porta.0 bis Zeile 8 an Porta.7

Und der Rest ist einfach nur Grundschaltung ATMega32/16. Deshalb hatte ich es mir erspart hier noch einen Schaltplan zu zeichnen.

Mit freundlichen Gruessen
Digitali

Alles klar ok :)

//EDIT

Hab noch paar fragen:
- Wie groß sind die Widerstände(R1-R8)
- Kann man nicht auch für die 8 Leitungen (wo die Widerstände sind) ein 74HC959 nehmen? Und somit noch mehr Ports einsparenß

alex007
26.05.2008, 14:54
hallo,

ich habe gerade mal testweise deinen code verwendet, für eine matrix 5x5!

die led´s leuchten wild auf! immerhin tut sich was! :-)

wie bekomm ich das hin, das die led´s so ne art lauflicht machen? immer reihenweise?

was muss am code geändert werden?

gruss alex

digitali
26.05.2008, 21:00
Hallo,

fertigen Code kann ich Dir nicht praesentieren.
Wenn Du verstehst wie hier die Datenausgabe geschieht, dann ist es leicht die LED's beliebig aufleuchten zu lassen.

Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).0
Clock = 0
Next A1
Ss = 1
Zeile = Ze(1)


Was mache ich hier? Zunaechst wird die Load-Leitung (Ss) auf 0 gesetzt. In der For-Next wird dann das Datenwort, zusammen mit einem Clock-Impuls, heraus geschoben. Durch Load =1 werden die Daten im 74H595 an die Ausgaenge geschaltet. Zu guter Letzt wird die entsprechende Zeile noch aktiviert.
Im naechsten Durchgang passiert dasselbe mit anderen Daten und einer anderen aktivierten Zeile. Und das ganze wiederholt sich permanent.

Bei einer 5x5 Matrix braucht das Datenwort natuerlich nur 5 Bit breit sein. Und es gibt auch nur 5 Zeilen. Du kannst logischerweise meinen Code da nicht so 1:1 uebernehmen.

Mit freundlichen Gruessen
Digitali

alex007
26.05.2008, 21:19
vielen dank für die info!

ich werde das nachher mal probieren!

gruss alex

FoFi
01.06.2008, 22:30
Moin,
ich bin auch grad dabei die Reichelt-Bestellung fertig zu machen, weil ich auch noch die Matrizzen von Pollin hier rumliegen habe.
Sicherheitshalebr wollte ich nocheinmal nachfragen, ob ich mit meiner Annahme richtig liege, dass
R1-R8 = 1kOhm
und
R9-R58 =27Ohm
sind?

Zum Rumtesten wollte ich ersteinmal 180Ohm Widerstände für R9-R58 nehmen, falls das Programm mal stehen bleibt oder so, damit die LEDs net zerschießen.

Wäre prima, wenn mir jemand sagen könnte, ob das richtig ist und/oder mich korrigieren kann.

Gurß, Markus

digitali
02.06.2008, 18:36
Hallo,

das ist richtig.
Ich habe hier fuer R1-R8 1 kOhm genommen und fuer den Rest 180 Ohm.

Mit freundlichen Gruessen
Digitali

FoFi
02.06.2008, 21:21
cool, danke *g*
also hast du garnicht versucht die LEDs heller zu bekommen, durch die weitaus größer möglichen Puslströme etc.?

dkaserer
28.12.2010, 21:47
So ich werde das Thema wieder mal auferwecken.

und zwar wenn ich statt den BD140 transistoren N-Channel Fets verwende, würde das dann auch funktionieren, muss halt im quellcode die Zeilenansteuerung ändern.?
warum hast du überhaupt pnp transistoren genommen, und keine npn die mit +5V zu schalten gingen?

und ich möchte gerne vor die FETs eine LM317 - Konstantstromquelle geben, damit ich die ca 300 mA für die LEDs zusammenbringe.
macht das dauernde Ein- und Ausschalten dem LM keine Probleme?

eija und man muss auf die richtung beim aufbau aufpassen oder?
laut diesem schaltplan würde der text jetzt von links nach rechts laufen oder?
http://www.elektronik-web.de/images/projekt5/Laufschrift.png

lg dkaserer

Schräubchen
15.01.2012, 12:04
Hallo,

Entschuldigt, dass ich dieses Thema ausgrabe.
Ich habe gerade diese Schaltung aufgebaut. Ich habe 130Ohm Widerstände genommen für die LED‘s. Die Ansteuerung hat auch gleich wunderbar funktioniert, aber irgendwie sind die LED's ziemlich dunkel. Wenn ich die 7x5 Matrix aus der Fassung nehme und einen Punkt leuchten lasse (mit Widerstand versteht sich) dann leuchtet der Punkt viel kräftiger.
Ich hab hier was gelesen, dass man die Pulsströme erhöhen muss. Wie geh ich da vor, dass die LED's heller werden?

mfg

Jan

Accenter
16.01.2012, 12:23
Verstehe ich das richtig, dass ich pro 3 Stück Dotmatrixmodule 2 Stück 74HC595N benötige?
Wie hier zu sehen?
http://www.elektronik-web.de/images/projekt5/Laufschrift.html
Der PIN 7 (QH) bei IC2 ist absichtlich freigelassen und wird dann auch bei IC 4,6 usw. freigelassen?
Falls jemand eine günstige Quelle für die Dotmatrixmodule kennt bitte bescheid geben. Freu mich schon aufs nachbauen! Tolles Projekt.

Schräubchen
22.01.2012, 12:10
Hi,

weiß keiner, wie man das Dot Matrix Modul Softwaremäßig heller bekommt?

mfg

Jan

Sungod
28.03.2016, 15:30
Hallo,

hier im Forum konnte man auch wieder die Frage lesen, ob es moeglich ist in Bascom eine LED-Laufschrift zu programmieren. Und das interessierte mich auch.
Vor einiger Zeit hatte ich mir mal testhalber zehn dieser 5x8 DotMatrix-Anzeigen von Pollin mit bestellt. Naja, und nun hatte ich mal etwas Zeit fuer eine solche Bastelei.
Sieben 74HC595, einen ATMega32, acht BD140, ein Haufen Widerstaende, Loetstreifenrasterplatinen und ein paar Kleinteile auf den Tisch, die Datenblaetter ausgedruckt, Loetkolben angeheizt und los ging's.

http://www.elektronik-web.de/images/projekt5/bild2_k.jpg

Die ganze Loetarbeit an dieser Laufschrift war doch schon etwas muehselig. Ich hatte aber auch keine Lust mir eine Platine aetzen zu lassen. Das waere mir zu aufwaendig und zu teuer geworden. Zumindest fuer diese (erste) Laufschrift. Es ging mir nur um die Machbarkeit.
Nachdem ich die ganzen Bauteile aufgeloetet hatte und es auch alles messtechnisch soweit funktionierte, ging es an's Programmieren. Und das war schon 'ne Ecke kniffliger.
Unter Bascom gibt es die wunderschoene Befehle shiftout und spiout. Damit hatte ich zunaechst gespielt. Es ging auch ansatzweise. Aber hier schiebt man die ganzen Bits byteweise heraus. Und da gab es immer wieder irgendwelche Probleme die Bits auch so zu positionieren das wieder lesbare Zeichen daraus wurden. Daraufhin habe ich mich entschieden die Bits ueber eine eigene Routine einzeln herauszuschieben. Da weiss man wenigstens was da passiert. :)

Die Daten von einem 6x8 Font fuer ein KS108-Display habe ich so uebernommen. Sie bilden die Grundlage von dem Zeichensatz (nicht vollstaendig im Beispielcode) fuer die Laufschrift. Die einzelnen Bytes werden hier zerlegt und entsprechend den Anforderungen neu zusammengesetzt. Dann werden die Daten bitgenau in die 74HC595-Kette geschoben. Der entsprechende Zeilen-Transistor schaltet die dazugehoerige Zeile. Das zerlegen des Textes, der auf der Laufschrift angezeigt werden soll, geschieht zunaechst "in aller Ruhe". Ist der Datensatz komplett, wird ein Timer gestartet in dessen mit jedem Durchlauf ein Datensatz rausgeschoben und die Zeile umgeschaltet wird. In der Haupt Do-Loop veraendere ich lediglich alle paar Millisekunden den Bereich der angezeigt werden soll. Man schaut also wie durch ein Fenster auf den Ausgabetext. Und durch Veraenderung entsprechender Variablen verschiebe ich das "Fenster".
Das ganze ist sicherlich nicht optimal und es verbraucht auch 'ne Menge an Speicher von dem ATMega32. Aber ich wollte auch erstmal nur ergruenden ob es ueberhaupt moeglich ist. Auch der Ausgabetext ist noch fest im Programm integriert (eine serielle Eingabe waere hier eine Moeglichkeit).

Zumindest hat man wieder eine Menge Erfahrungen mit einer solchen Bastelei gesammelt. Und die Freude ist doch wieder gross, wenn es schlussendlich funktioniert. :)

http://www.elektronik-web.de/images/projekt5/ls.jpg

Hier eine Seite (http://www.elektronik-web.de/images/projekt5) mit weiteren Bildern und einem kleinen Video.

Der Bascom-Code (undokumentiert):



$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 30
$framesize = 40
Config Porta = Output
Config Portb = Output
Config Timer0 = Timer , Prescale = 64
On Timer0 Timer_isr
Enable Timer0
Enable Interrupts
Stop Timer0

Dout Alias Portb.2
Ss Alias Portb.1
Clock Alias Portb.0
Zeile Alias Porta

Dim A As Word , B As Word
Dim A1 As Word , A2 As Word , A3 As Word
Dim Beginn_zeichen As Word , Ende_zeichen As Word , Db_zeiger As Word
Dim Bz As Word
Dim Ti As Byte , Tl As Byte , Tl2 As Word , Tl3 As Word
Dim Ez As Byte
Dim Dat(1530) As Byte
Dim Ze(8) As Byte
Dim Text As String * 255
Dim Einzelzeichen As String * 1

Ze(1) = 127
Ze(2) = 191
Ze(3) = 223
Ze(4) = 239
Ze(5) = 247
Ze(6) = 251
Ze(7) = 253
Ze(8) = 254

Text = " LED-Laufschrift mit Bascom, ATMega32 und Pollin Display " 'max. 255 Zeichen

Tl = Len(text)
B = 1

For A = 1 To Tl
Tl2 = Tl * 6
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)
Dat(b) = 255 - Dat(b)
Incr B
Next Db_zeiger
Next A

A2 = 1
Tl3 = Tl2 - 50
Start Timer0

Do
A3 = A2 + 50
Waitms 60
Incr A2
If A2 = Tl3 Then A2 = 1
Loop

End

Timer_isr:
If Ti = 9 Then Ti = 1
Select Case Ti
Case 1:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).0
Clock = 0
Next A1
Ss = 1
Zeile = Ze(1)
Case 2:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).1
Clock = 0
Next A1
Ss = 1
Zeile = Ze(2)
Case 3:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).2
Clock = 0
Next A1
Ss = 1
Zeile = Ze(3)
Case 4:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).3
Clock = 0
Next A1
Ss = 1
Zeile = Ze(4)
Case 5:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).4
Clock = 0
Next A1
Ss = 1
Zeile = Ze(5)
Case 6:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).5
Clock = 0
Next A1
Ss = 1
Zeile = Ze(6)
Case 7:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).6
Clock = 0
Next A1
Ss = 1
Zeile = Ze(7)
Case 8:
Ss = 0
For A1 = A2 To A3
Clock = 1
Dout = Dat(a1).7
Clock = 0
Next A1
Ss = 1
Zeile = Ze(8)
End Select
Incr Ti
Return

Zeichensatz:
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 '



Mit freundlichen Gruessen
Digitali

Hallo,

schöner Code...

wie bzw. wann kann ich sehen wenn einmal der ganze Text "durchgelaufen" ist,
möchte das das Programm dann wieder zum Anfang springt und einen anderen Text anzeigt...

Danke schonmal

radbruch
28.03.2016, 16:30
Hallo

Wenn hier A2 wieder auf 1 gesetzt wird, wurde der komplette Text ausgegeben:

If A2 = Tl3 Then A2 = 1

Weil es mir immer wieder Spass macht fremden Code zu deuten:

Dim Dat(1530) As Byte ist das Bitmuster des Textes (255 Zeichen x 6 Bytes pro Zeichen=1530)

A1 ist der Index in DAT() der in der ISR hochgezählt wird
A2 ist der Index des ersten Byte vom Zeichen das als erstes (ganz links) dargestellt wird
A3 ist der Index des ersten Byte vom letzten Zeichen das dargestellt wird
T13 sind alle Bytes des Textes (T12) minus der Bytes, die in der Zeile dargestellt werden können (50). Wenn A2 den Wert von T13 erreicht hat, wurden alle Zeichen in Text auf der Matrix gezeigt.

Um einen neuen Text anzuzeigen muss man den Timer stoppen, den neuen Text der Variablen Text zuweisen und die Initialisierung nochmals durchlaufen:


Tl = Len(text)
B = 1

For A = 1 To Tl
Tl2 = Tl * 6
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)
Dat(b) = 255 - Dat(b)
Incr B
Next Db_zeiger
Next A

A2 = 1
Tl3 = Tl2 - 50
Start Timer0

Ich hoffe, das passt so ungefähr.

Gruß

Micha

Sungod
30.03.2016, 14:30
Ahh ja, Vielen Dank, Super

Das mit wenn A2 = 1 ist das dann einmal durch ist hatte ich auch schon mir gedacht....ging nur leider nicht, weil ich den Timer nicht gestoppt hatte.

Also jetzt funktioniert es super.