LED Matrix Uhr (48x8) mit BASCOM

mnsp2

Neues Mitglied
16 Aug 2009
33
0
0
Sprachen
Hallo zusammen

ich habe mir eine LED Matrix 48 x 8 mit blauen Leds gebaut
(384 x Leds + 6x HEF4094BP + 6x ULN2803 + 48x 33Ohm + 8x BD140 + ....)
Schaltplan siehe PDF im Anhang





mein großes Ziel ist es eine Uhr zu programmieren wie sie hier im Video zusehen ist
http://www.youtube.com/watch?v=YOMkQsLEACI&feature=related

ich realisiere das mit einem Atmega 32 (ich hoffe das reicht !?)

für die LED Matrix (8x48) benötig ich
8 Ausgänge --> 1-8 Zeilen
1 Ausgänge --> Data
1 Ausgänge --> Stobe
1 Ausgänge --> Clock
1 Ausgänge --> Enable Output für PWM

für die Temperatur habe ich 2 x DS18B20
für den anfang reicht eine Temperatur ( Raumtemperatur)

Das wichtigste die Uhrzeit:

ich wolle einen DS1307 einsetzen weil so die zeit auch bei Strom-/Spannungsausfall
erhalten bleibt und man sich auch ein wenig Rechenzeit spart

leider gibt es ja immer das Genauigkeitsproblem

und da habe ich noch eine DCF77 von Pollin (3,3V) zur Synchronisation <-- das ist aber erst mal nicht so wichtig

ich weiß ich habe mir da ganzschön was vor genommen :stoned:

Mein Problem
ich versucht mir das ansteuern der Schieberegler selber bei zubringen
habe aber keine guten Erfolge gehabt

ich habe mich an :
http://www.roboternetz.de/community/showthread.php?35291-LED-Laufschrift-mit-Bascom-ATMega32-und-Pollin-Displays

Orientiert und eine schöne Laufschrift hin bekommen

Progamm siehe Anhang

aber wenn man nur kopiert und auf seine Hardware anpassen lehrt man nicht wie man eine Uhr realisiert

ich habe versucht das Programm nach zu vollziehen und für die Uhr anzupassen mit wenig Erfolg

ich bitte um Hilfe
vielleicht hat jemand so was schon mal gebaut und hat Anregungen und Tipps

ich bedanke mich schon mal im Voraus für das Ansehen des Themas und die Hilfe :adore:
 

Anhänge

Cassio

Aktives Mitglied
29 Okt 2008
4.027
17
38
Region Hannover
Sprachen
BascomAVR
Hallo mnsp2!

Einsicht ist der erste Weg zu Besserung...... und in deinem Fall zum eigenen Programm. ;)

Wenn ich das nun richtig verstanden habe, dann hast du das Projekt nachgebaut und es funktioniert!

Nun möchtest du aber keine Laufschrift mit festem Text sondern es soll die Uhrzeit angegeben werden.

Ich habe das Programm nur mal überflogen...... aber es müsste doch reichen, wenn du jede Sekunde die "Time$"-Variable in die "Text"-Variable kopierst (sind beides String-Variablen).
Damit hättest du schon mal die Uhrzeit auf dem Display. ;)

War das dein Problem? :hmmmm:



Wenn du wirklich den ganzen "Rest" mit Scrollen und Co, wie es in dem Video zu sehen ist, ebenfalls noch realisieren möchtest, dann wirst du wohl nicht umhin kommen ein ganz neues Programm zu schreiben. :cool:

Auf Grund der verschiedenen Funktionen und der daraus resultierenden "Größe" des Programms, ist es für einen Anfänger vielleicht ein wenig heftig.

An deiner Stelle würde ich das Programm neu aufbauen und dann in kleinen Schritten erweitern.
Am Ende kommt dann ggf. so etwas wie auf dem Video heraus. :)


Grüße,
Cassio
 

dino03

Aktives Mitglied
27 Okt 2008
6.716
16
38
Sprachen
BascomAVR, Assembler
Hallo,

also zuerst solltest du mit den Basisroutinen anfangen. Das ist bei ner Anzeige
natürlich die Routinen damit man was sieht. Bau es modular auf. Dann ist es
besser zu überschauen und man findet Fehler besser.

Als erstes mal eine Routine bauen die Daten in die Schieberegister bringt.
Dann eine Routine bauen die mit der vorigen Routine einen Text/Muster auf
dem Display anzeigen kann. Dann ist schonmal die Hauptarbeit erledigt.

Ob du jetzt deine Uhrzeit/Temperatur auf nem LCD, nem 7Segment oder auf
deiner LED-Anzeige ausgibst. Du hast grundsätzlich 2 Teile. Deine Routinen
für die Anzeige (LCD, 7Segm, LEDmatrix, ....) und deine Routinen für die
Erzeugung der Daten die angezeigt werden sollen. Merkst du wie sich dein
Programmproblem modular zerlegen läßt ?

1. Anzeige
1.1 Daten in Schieberegister
1.2 Muster anzeigen
1.3 Muster aus Text erzeugen
2. Datenerzeugung
2.1 Text aus Uhrzeit erzeugen
2.2 Text aus Temperatur erzeugen

Das ist mal ne grobe Zerlegung. Also immer modular programmieren. Das geht
einfacher.

Gruß
Dino
 

mnsp2

Neues Mitglied
16 Aug 2009
33
0
0
Sprachen
Hallo Cassio

Wenn ich das nun richtig verstanden habe, dann hast du das Projekt nachgebaut und es funktioniert!
kann man so hart vorformulieren ein wenig Gehirnschmalz steckt auch drin ;)

Nun möchtest du aber keine Laufschrift mit festem Text sondern es soll die Uhrzeit angegeben werden.
absolute richtig ;)

Ich habe das Programm nur mal überflogen...... aber es müsste doch reichen, wenn du jede Sekunde die "Time$"-Variable in die "Text"-Variable kopierst (sind beides String-Variablen).
Damit hättest du schon mal die Uhrzeit auf dem Display.
genau das habe ich auch gedacht als ich mir das Programm an gesehen habe
aber dafür muss Text = Time$ und alles was noch da zu gehört (Umwandung des String in Einzelbuchstaben,...) immer aktualisiert werden

An deiner Stelle würde ich das Programm neu aufbauen und dann in kleinen Schritten erweitern.
Am Ende kommt dann ggf. so etwas wie auf dem Video heraus.
genau so sehe ich das auch
ich weil Schritt für Schritt lehren um am Ende zum Erfolg zu kommen
ich bitte nur um Unterstützung

http://www.youtube.com/watch?v=HjPcpbhX3ts
ein Video der Matrix in Aktion
 

Cassio

Aktives Mitglied
29 Okt 2008
4.027
17
38
Region Hannover
Sprachen
BascomAVR
genau das habe ich auch gedacht als ich mir das Programm an gesehen habe
aber dafür muss Text = Time$ und alles was noch da zu gehört (Umwandung des String in Einzelbuchstaben,...) immer aktualisiert werden
Hallo !

Nun ja....
ohne die Umwandlung und das Rausschieben der Daten wird das natürlich auch nichts. :rolleyes:

OK... dann gebe ich mal den nächsten Hinweis.

Du schaffst dir eine Routine, in der jede Sekunde EINMAl die Variable "Time$" in die Variable "Text" kopiert wird.

Das Zählen der Zeichen (For A = 1 to Tl) kannst du dir eigentlich sparen, da der String von Uhrzeit und Datum immer 8 Zeichen lang ist.

Damit einhergehend könnte man auch das Selektieren der Zeichen und das Umwandeln der einzelnen Zeichen in die ASCII-Nummern via "Overlay" optimieren..... dass lassen wir aber jetzt mal.
Ergo, du verwendest die Umwandlung so wie sie ist (mittels Mid() ).
Auch das Lesen der Datentabelle würde ich erst mal so lassen.

Nun musst du nur noch alles in eine Endlosschleife packen, die nach Ablauf der Anzeigeroutine, die ggf. neuen Daten zum Anzeigen verwendet.

Ich denke, dass sollte doch zu machen sein..... oder? ;)


Gruß,
Cassio

PS:
Ich habe mir das Programm nun mal etwas gründlicher angesehen......
Natürlich kann man das so machen, aber für deine Idee (oder die vom Video) würde ich das ganze Programm verwerfen.:eek:
OK..... die Datentabelle kann man gebrauchen und manch anderen Hinweis auch......
Letztlich kommst du aber um den Neuaufbau nicht herum.
 

mnsp2

Neues Mitglied
16 Aug 2009
33
0
0
Sprachen
Hallo
Ich habe mir das Programm nun mal etwas gründlicher angesehen......
Natürlich kann man das so machen, aber für deine Idee (oder die vom Video) würde ich das ganze Programm verwerfen.
OK..... die Datentabelle kann man gebrauchen und manch anderen Hinweis auch......
Letztlich kommst du aber um den Neuaufbau nicht herum.
Ich danke auch das um das Neuaufbauen nicht herum kommen
Aber man kann aus dem Programm teile übernehmen z.B. Datentabelle (muss ich aber alles Invertieren)
Ich will ja auch lehren wie ich meine LED Matrix ansteuern kann

ich muss aber zugeben das ich nicht richtig weiß wie/wo ich anfangen soll

es gibt z.b mehrer Möglichkeiten die Schieberegler anzusteuern /an zuschließen

Hartware SPI oder Software SPI

Was ist die einfachere/bessere Variante für das Projekt
 

Cassio

Aktives Mitglied
29 Okt 2008
4.027
17
38
Region Hannover
Sprachen
BascomAVR
Ich will ja auch lehren wie ich meine LED Matrix ansteuern kann

Hallo!

Ich denke mal, dafür ist es noch ein weiter Weg.......
erst mal musst du lernen eine LED-Matrix anzusteuern. ;)


Wie schon mal erwähnt.... es gibt auch noch "Shiftout", um Daten in die Schieberegister zu befördern.
Vielleicht solltest du damit erst einmal beginnen?

An deiner Stelle würde ich mir ein neues Programm schreiben in dem erst mal nur A + B + C auf der Matrix dargestellt wird.

Wenn das klappt, kommen mehr Zeichen als auf die Anzeige passen hinzu und du kannst an den Optionen arbeiten.

Wenn das auch funktioniert dann......


So baut sich das Programm langsam auf und du lernst nebenbei noch etwas. :)

Grüße,
Cassio
 

mnsp2

Neues Mitglied
16 Aug 2009
33
0
0
Sprachen
Hallo

ich habe mir mal das Tutorial
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister
zu Gemüte geführt leider alles Assembler
da stand:

Die Programmierung eines 74xxx595 Schieberegisters gestaltet sich sehr einfach. Im Grunde gibt es 2 Möglichkeiten:
• Mittels SPI kann der AVR das Schieberegister direkt und autark ansteuern. Das ist sehr schnell und verbraucht nur wenig CPU-Leistung
• Sind die entsprechenden SPI-Pins am AVR nicht frei, so ist auch eine softwaremässige Ansteuerung des Schieberegisters mit einfachen Mitteln durchführbar.
ist das mit BASCOM auch so einfach möglich und ist das für meine zwecke nötig (die SPI Pins habe ich frei!!)

ich habe mit dem befehle "Shiftout" noch nicht gearbeitet und auch die BASCOM-Hilfe war nicht so aufschlussreich
wie wende ich den Befehle für meine zwecke an

ich habe mal das Programm geleert:
Code:
'*******************************************************************************
'                              LED Matix Uhr
'*******************************************************************************

' µC Deklarationen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 30
$framesize = 40

' Ein-/Ausgänge ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Config Porta = Output
Config Portb = Output
Config Portd.5 = Output                                     '<-- für PWM

Dataout Alias Portb.2
Strobeout Alias Portb.1
Clockout Alias Portb.0
Enableout Alias Portd.5                                     '<-- für PWM

Zeile Alias Porta

' Timer und Config +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1
Enable Timer1

' Variablen ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Dim Ze(8) As Byte
Dim Helligkeitswert As Long

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

Helligkeitswert = 400



'*******************************************************************************
' Hauptschleife
'*******************************************************************************

Do


Pwm1a = Helligkeitswert

Loop

'*******************************************************************************
' SUB ,Gosub
'*******************************************************************************


'*******************************************************************************
' Timer0 --> Anzeige Prozess
'*******************************************************************************


'*******************************************************************************
' Zeichen Tabelle
'*******************************************************************************

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 48 , 64 , 64 , 64 , 63 , 0                             '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 , 0 , 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                                  '
 

Cassio

Aktives Mitglied
29 Okt 2008
4.027
17
38
Region Hannover
Sprachen
BascomAVR
Hallo !

Es stimmt natürlich, was dort im Mikrocontoller-Forum steht.... wie eigentlich immer. ;)

Natürlich kannst du SPI verwenden!
Da du laut Schaltplan aber die Pins für den Hardware SPI nicht verwendet hast, bleibt dir nur software SPI, oder Shiftout, oder die Verbindungen umlöten. ;)

Was "Shiftout" und die 74HC595 angeht, da kannst du dich ja HIER mal schlau machen.

SPI funktioniert aber ähnlich simpel!

Auf Grund der vielen Daten, die du immer wieder rausschieben musst, würde ich wohl auch zu SPI greifen......
Trotzdem solltest du dich mit dem Shiftout erst mal vertraut machen. Letztlich ist die Funktionsweise mittels SPI ähnlich.


Grüße,
Cassio
 

dino03

Aktives Mitglied
27 Okt 2008
6.716
16
38
Sprachen
BascomAVR, Assembler
Hi,

grundsätzlich sollte man eine Unterstützung durch die Hardware immer einer
Softwarelösung vorziehen. Man sollte also bereits bei der Planung einers
Projektes nachdenken was man evtl später mal benötigt und die Hardware
dann so verteilen das man die externe Beschaltung dann an den entsprechenden
Pins liegen hat. Ob man nun zuerst mit der Softwareversion spielt und dann
später auf die Hardwareversion umstellt ist ja erstmal egal.

Also ...

- Bei der Planung bereits eine hardwareunterstützung einplanen

Wenn man mit der Softwareversion spielt dann verwendet man einfach die
normalen Portpins wo der externe Kram dranhängt. Beim Mega32 zB die
Pins PB5 (Daten zum Schieberegister),PB6 (Daten vom Schieberegister),
PB7 (Datentakt).

Wenn man dann später auf Hardwareunterstützung umstellen will dann liegt
die Hardware gleich an den richtigen Pins ...
PB5 (MOSI), PB6(MISO), PB7(SCK)
... für die Hardware-SPI-Schnittstelle.

Man kann also das verwenden was man gerne möchte ohne nochmal an der
Beschaltung was ändern zu müssen.

Gruß
Dino
 

Cassio

Aktives Mitglied
29 Okt 2008
4.027
17
38
Region Hannover
Sprachen
BascomAVR
- Bei der Planung bereits eine hardwareunterstützung einplanen

Hi Dino!

Wenn das doch immer nur so einfach wäre.......
und die ATMEL-Entwickler einem das Leben nicht noch schwerer machen würden. :rolleyes:

Ich habe mich vor ein paar Tagen erst wieder über den ATMega128 aufgeregt. :mad:
Wie können die Herren Designer bei ATMEL nur so "dämlich" sein und so eine Pinbelegung erschaffen:
PinD.0 ist auch INT0, aber auch SCL (für I2C)
PinD.1 ist auch INT1, aber auch SDA (für I2C)
PinD.2 ist auch INT2, aber auch RxD1
PinD.3 ist auch INT3, aber auch TxD1

Schöner Mist, wenn man ein oder zwei externe Interrupts benutzen möchte,
aber auch zwingend I2C und COM1 benötigt. :mad:

Boah... hab ich mich aufgeregt! :cool:


OK... Sorry.... war ein wenig :offtopic:


Soviel aber zu dem Thema: Hardware vor der Softwareentwicklung prüfen. ;)

Grüße,
Cassio
 

dino03

Aktives Mitglied
27 Okt 2008
6.716
16
38
Sprachen
BascomAVR, Assembler
Wie können die Herren Designer bei ATMEL nur so "dämlich" sein und so eine Pinbelegung erschaffen:
PinD.0 ist auch INT0, aber auch SCL (für I2C)
PinD.1 ist auch INT1, aber auch SDA (für I2C)
PinD.2 ist auch INT2, aber auch RxD1
PinD.3 ist auch INT3, aber auch TxD1

Schöner Mist, wenn man ein oder zwei externe Interrupts benutzen möchte,
aber auch zwingend I2C und COM1 benötigt. :mad:
Wenn du nicht grade die externen Pins des Timer3 benötigst hast du doch
immer noch INT4..7 zur Verfügung :D
Das ewige Leid beim Planen der Controllerpins :rolleyes:
OK ... genug :offtopic:

Gruß
Dino
 

mnsp2

Neues Mitglied
16 Aug 2009
33
0
0
Sprachen
Hallo
Danke Cassio und dino03 für die Hinweise
das ist nicht mein erstes Projekt
und ich habe vorhergesehen das es wahrscheinlich es zu um bau maßnahmen kommt
daher habe ich die Pins des Atmega32 mit einer steck Möglichkeit versehen (kann ich nur weiter empfehlen wenn man nich so viel Erfahrung hat)

siehe Bild:


als es ist absolut keine Problem auf Hardware-SPI-Schnittstelle um zu schwenken

ich habe ein wenig mit Shiftout rum gespielt
hab aber keine Idee wie ich es hin bekomme das aus der Datentabelle die
Bestandteile einer/eines Zahl/Zeichens in die einzelnen Zeilen
schiebe.

auf Aufbau der Datentabelle am Beilspiel "J"

Code:
Data 48 , 64 , 64 , 64 , 63 , 0                             'J
48--> 00110000
64--> 01000000
64--> 01000000
64--> 01000000
63--> 00111111
0 --> 00000000

ich bitte um Hilfe
liebe grüße Mnsp2
 

HinterBlauenAugen

Neues Mitglied
28 Dez 2009
310
0
0
Sprachen
Hallo mnsp2,
ich bin mir nicht sicher, ob ich deinen Aufbau richtig verstanden habe. Ich denke du hast die 48 Spalten an 6 Schieberegistern, die 8 Zeilen über einen Treiber an Pins des µC.
Wenn das so richtig ist, dann wäre der Ablauf folgendermaßen:
Du schiebst die unterste Zeile jedes Zeichens in die Schieberegister und schaltest dann die unterste Zeile ein. Dieser Zustand bleibt für eine gewisse Zeit, dann schiebst du die Daten der zweit untersten Zeile rein und schaltest diese ein. Usw. und so fort.
Ich denke mal, dass die Darstellung deines J-Zeichens aber eher Spaltenweise ist, d.h. wenn du die Daten der untersten Zeile des J haben willst, dann sind das die letzten Bits der sechs Spalten. Das passt natürlich nicht so gut zusammen.

Spalte
1 2 3 4 5 6
-----------
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
1 0 0 0 1 0
1 0 0 0 1 0
0 1 1 1 0 0 zweitunterste Zeile
0 0 0 0 0 0 unterste Zeile

Du müsstest die Zeichen also entsprechend der Zeilen definiert haben und nicht nach den Spalten. Dabei hast du allerdings das Problem, dass die Zeichen 7*5 (bzw. 8*6 mit Abstand) groß sind.
Da es hier bestimmt auf Geschwindigkeit beim Ausgeben ankommt, würde ich es so machen, dass die Ausgabe möglichst einfach stattfinden kann, während die Umwandlung eines neuen Zeichens ruhig etwas dauern darf.
Wenn du dein Display z.B. so anlegst, dass du 3 Word Variablen in der Breite hast, hast du damit 3*16 = 48 Bit. Passt. 8 Word Variablen in einem Array sind dann der erste Block von 16*8 Pixeln. 3 Blöcke nebeneinander sind dann dein ganzes Display.
Was hälst du davon?

HBA
 

dino03

Aktives Mitglied
27 Okt 2008
6.716
16
38
Sprachen
BascomAVR, Assembler
Hallo,

ich hab mir mal ein wenig deine Schaltung angesehen ...

Du schaltest eine Zeile mit BD140 an. Die können 1,5A maximal ab.
An einer Spalte hängt über nen ULN2803 ein Bit des Schieberegisters dran.

Du schiebst also eine komplette Zeile in die Schieberegister laden und dann
mit dem BD140 die entsprechende Zeile aktivieren (wenn er es vom Strom
abkann)

Du hast 48 Spalten verteilt auf 6 Schieberegister und 8 Zeilen. Eine LED ist
mit 33 Ohm von 5V versorgt. Nach nem Datenblatt einer blauen LED von
Kingbright ist die Durchlaßspannung etwa 3,8V. Für die Sättigungsspannung
des BD140 und des ULN2803 nehme ich mal jeweils 0,5V an. Also müßte ein Strom von ...
( 5 - 3,8 - 2 x 0,5 ) / 33 = 6mA fließen.
Also sind bei einer komplett leuchtenden Zeile 48 x 6mA = 288mA Strom
durch den BD140 am fließen.

So ungefähr sieht es elektrisch aus. Also haben wir kein Problem, wenn
wir eine komplette Zeile anschalten.

Nun zur Software ...................... =>>

Du mußt also die Daten für eine komplette Zeile in das Schieberegister laden
und dann über den BD140 die entsprechende Zeile anschalten.

Beispiel :
Du hast deine Muster der Zeichen so abgelegt wie HBA es schon gesagt hat.
Also das Zeichen von oben nach unten in Bytes abgelegt ...

Spalte
1 2 3 4 5 6
-----------
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
1 0 0 0 1 0
1 0 0 0 1 0
0 1 1 1 0 0 zweitunterste Zeile
0 0 0 0 0 0 unterste Zeile

Wenn du also deinen Text "Hallo!" hast dann mußt du zuerst die oberste Zeile
aller Zeichen
in die Schieberegister laden und dann den BD140 der obersten
Zeile für eine gewisse Zeit anschalten. Danach wird die zweite Zeile aller
Zeichen
in das Schieberegister geladen und der BD140 für die zweite Zeile
für eine gewisse Zeit angeschaltet. Und so weiter. Du arbeitest dich also bei
ALLEN Zeichen von der obersten bis zur untersten Zeile durch und fängst
dann wieder von oben an.

In etwa verstanden ? ;)

Gruß
Dino
 

mnsp2

Neues Mitglied
16 Aug 2009
33
0
0
Sprachen
Hallo

Danke dino03 und HinterBlauenAugen für eure Hinweise

Du hast 48 Spalten verteilt auf 6 Schieberegister und 8 Zeilen. Eine LED ist
mit 33 Ohm von 5V versorgt. Nach nem Datenblatt einer blauen LED von
Kingbright ist die Durchlaßspannung etwa 3,8V. Für die Sättigungsspannung
des BD140 und des ULN2803 nehme ich mal jeweils 0,5V an. Also müßte ein Strom von ...
( 5 - 3,8 - 2 x 0,5 ) / 33 = 6mA fließen.
Also sind bei einer komplett leuchtenden Zeile 48 x 6mA = 288mA Strom
durch den BD140 am fließen.

So ungefähr sieht es elektrisch aus. Also haben wir kein Problem, wenn
wir eine komplette Zeile anschalten.
kommt so ungefähr hin !!
ich habe die Matrix bewusst so dimensioniert ,weil ich sie auch Invertiert benutzen möchte
und bei den Blauen LEDs ist die Helligkeit ausreichend
siehe Video
http://www.youtube.com/watch?v=HjPcpbhX3ts

wann das die Sache auch für die Programmierung leichter macht ist das ein positiver Nebeneffekt

Spalte
1 2 3 4 5 6
-----------
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
1 0 0 0 1 0
1 0 0 0 1 0
0 1 1 1 0 0 zweitunterste Zeile
0 0 0 0 0 0 unterste Zeile
ich muss also die Datentabelle neu machen (schabe aber ok)

In etwa verstanden ?
das Prinzip habe ich verstanden

hier mein Versuch:
Code:
'*******************************************************************************
'                              LED Matix Uhr
'*******************************************************************************

' µC Deklarationen +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 30
$framesize = 40

' Ein-/Ausgänge ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Config Porta = Output
Config Portb = Output
Config Portd.5 = Output                                     '<-- für PWM

Dataout Alias Portb.2
Strobeout Alias Portb.1
Clockout Alias Portb.0
Enableout Alias Portd.5                                     '<-- für PWM

Zeile Alias Porta

' Timer und Config +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Config Timer0 = Timer , Prescale = 64
On Timer0 Timer_0
Enable Timer0
Start Timer0

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1
Enable Timer1

Enable Interrupts
' Variablen ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Dim Ze(8) As Byte
Dim Helligkeitswert As Long
Dim X1 As Byte , X2 As Byte , X3 As Byte , X4 As Byte , X5 As Byte , X6 As Byte , X7 As Byte , X8 As Byte
Dim Z1 As Byte
Dim Zeilen_case As Byte

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

Helligkeitswert = 20

X1 = &B000010
X2 = &B000010
X3 = &B000010
X4 = &B000010
X5 = &B100010
X6 = &B100010
X7 = &B011100
X8 = &B000000

'*******************************************************************************
' Hauptschleife
'*******************************************************************************

Do

Pwm1a = Helligkeitswert

Loop

'*******************************************************************************
' SUB ,Gosub
'*******************************************************************************



'*******************************************************************************
' Timer0 --> Anzeige Prozess
'*******************************************************************************

Timer_0:

If Zeilen_case = 9 Then Zeilen_case = 1

Select Case Zeilen_case

Case 1:
      Zeile = 255
      Strobeout =0
      Shiftout Dataout , Clockout , X1 , 0 , 6
      Zeile = Ze(1)
      Strobeout = 1

Case 2:

      Zeile = 255
      Strobeout = 0
      Shiftout Dataout , Clockout , X2 , 0 , 6
      Zeile = Ze(2)
      Strobeout = 1

Case 3:

      Zeile = 255
      Strobeout = 0
      Shiftout Dataout , Clockout , X3 , 0 , 6
      Zeile = Ze(3)
      Strobeout = 1

Case 4:

      Zeile = 255
      Strobeout = 0
      Shiftout Dataout , Clockout , X4 , 0 , 6
      Zeile = Ze(4)
      Strobeout = 1


Case 5:

      Zeile = 255
      Strobeout = 0
      Shiftout Dataout , Clockout , X5 , 0 , 6
      Zeile = Ze(5)
      Strobeout = 1

Case 6:

      Zeile = 255
      Strobeout = 0
      Shiftout Dataout , Clockout , X6 , 0 , 6
      Zeile = Ze(6)
      Strobeout = 1

Case 7:

      Zeile = 255
      Strobeout = 0
      Shiftout Dataout , Clockout , X7 , 0 , 6
      Zeile = Ze(7)
      Strobeout = 1

Case 8:

      Zeile = 255
      Strobeout = 0
      Shiftout Dataout , Clockout , X8 , 0 , 6
      Zeile = Ze(8)
      Strobeout = 1

End Select

Incr Zeilen_case

Return

Probleme:
wenn ich bei " Shiftout Dataout , Clockout , X1 , 0 , 6" hinten die 6 scheibe
fehlen hinten bei dem Zeichen "J" zwei spalten (die spalten 5 und 6)
ich weiß das liegt daran das Bascom die fehlenden zwei 0 anfügt.

wie bekomme ich es hin das ich aus mehreren Buchstaben ein Wort zu bilden??
 

dino03

Aktives Mitglied
27 Okt 2008
6.716
16
38
Sprachen
BascomAVR, Assembler
Hi,

Probleme:
wenn ich bei " Shiftout Dataout , Clockout , X1 , 0 , 6" hinten die 6 scheibe
fehlen hinten bei dem Zeichen "J" zwei spalten (die spalten 5 und 6)
ich weiß das liegt daran das Bascom die fehlenden zwei 0 anfügt.

wie bekomme ich es hin das ich aus mehreren Buchstaben ein Wort zu bilden?
Also in dem Beitrag auf Roboternetz wo in diesem Thread ein Link drauf gesetzt
ist wurde die Schiebeoperation selber programmiert. Also ohne SPI oder
Shiftout.

Das ganze mußt du folgendermaßen aufbauen ...
Du hast einen String mit dem Text. Dann hast du auch eine Tabelle mit den
Musterdaten für die Zeichen und natürlich einen Zähler für die Displayzeile.

Du setzt den Zähler zB auf Zeile1. Der Zähler aktiviert nicht nur die entsprechende
Zeile des Displays sondern zeigt auch gleichzeitig auf die richtige Zeile in der
Tabelle mit den Musterdaten.

Dann machst du noch einen weiteren Zähler der über die Stringvariable läuft.
Also vom ersten anzuzeigenden Zeichen bis zum letzten. Wenn dieser Zähler
zB auf das erste Zeichen zeigt dann holst du den Character-Wert dieses
Zeichens. Dieser Wert zeigt auf die Anfangsadresse in der Mustertabelle.
Zu dieser Anfangsadresse addierst du den Zähler für die Display-/Zeichenzeile.
Dieser Wert der dadurch adressiert wird den schiebst du raus. Danach wird
von dem Zähler das nächste Zeichen in der Stringvariable angegangen.

Deine Musterdaten sehen also folgendermaßen aus ...
( c=Characterwert , z=Zeile )

c45/z5 , c45/z6 , c45/z7 , c46/z0 , c46/z1 , ... , c46/z6 , c46/z7 , c47/z0 , ...

c45 ist dabei zB "-" , c46 ist "." und c47 "/"

Also mit einem Zeichen-Zähler über den Text laufen und zuerst alle ersten
Zeilen (die vom Zeilenzähler adressiert werden) ausgeben. Danach den
Zeilenzähler auf die nächste Zeile und wieder mit dem Zeichenzähler über alle
Zeichen des Textes laufen.

Du hast dabei also einen Pointer/Zeiger der in der Mustertabelle auf folgende
Weise deine Musterdaten adressiert ...
Adresse = (Zeichenwert * 8) + Zeilennummer
Da du die Steuerzeichen wohl nicht benötigst sondern nur die darstellbaren
der ASCII-Tabelle brauchst du bei deinen Musterdaten ja nicht beim Zeichen
Nummer 0 anfangen sondern beim Leerzeichen (CHR 32). Und da eine Tabelle
bei Bascom glaube ich bei 1 anfängt mußt du das auch noch beachten. Also
läuft deine Adressierung so ...
Musteradresse = ( (Zeichenwert - 32) * 8) + Zeilennummer + 1

So ... ich hoffe mal das es dir bei der Umsetzung deines Programms
weiterhilft ... ;)

Gruß
Dino
 

HinterBlauenAugen

Neues Mitglied
28 Dez 2009
310
0
0
Sprachen
Hallo mnsp2,
wenn du eine solche Sache planst, ist es enorm wichtig, sich ein Datenmodell zu überlegen, welches die Aufgaben des µC möglichst gut unterstützt.
Ich sehe hier hauptsächlich 2 Aufgaben:
1. Im Multiplex Verfahren eine ziemlich große Anzahl an LEDs zu schalten
2. Einen neuen Text für die Anzeige bereitstellen

Die 1. Aufgabe ist zeitkritisch, die zweite nicht. Außerdem muss die 1. Aufgabe wesentlich öfter ausgeführt werden als die 2. Bei der Uhrzeit lädst du z.B. nur einmal pro Sekunde eine neue Zeit, hast aber in der Zwischenzeit schon hunderte Male die Daten rausgeschickt. Daher würde ich die beiden Aufgaben vollkommen voneinander trennen.
Es ist also wichtig, dass die 1. Aufgabe mit so wenig Befehlen wie nur eben geht stattfinden kann.
Dazu ist ein Select Case, wie du es benutzt hast, eher ungeeignet. Um zum letzten Case zu kommen, müssen alle anderen verglichen werden, während beim ersten Case es relativ schnell geht. Dadurch kann es dir auch leicht passieren, dass die Zeichen, Zeilen oder Spalten unterschiedlich hell werden.
Besser wäre es, wenn deine Timer Routine ganz stumpf die Werte ausgeben könnte, ohne irgendwelche Abfragen.
Stell dir vor, du hättest so etwas definiert:

Dim Block1(8) as Word
Dim Block2(8) as Word
Dim Block3(8) as Word

wobei dein 48x8 Display so abgebildet würde

---------Block1-------------Block2-------------Block3------
7. 5432109876543210 5432109876543210 5432109876543210
6. 5432109876543210 5432109876543210 5432109876543210
5. 5432109876543210 5432109876543210 5432109876543210
4. 5432109876543210 5432109876543210 5432109876543210
3. 5432109876543210 5432109876543210 5432109876543210
2. 5432109876543210 5432109876543210 5432109876543210
1. 5432109876543210 5432109876543210 5432109876543210
0. 5432109876543210 5432109876543210 5432109876543210

Wenn du jetzt Zeile 0 ausgeben willst, wäre dies einfach
Timer_0:
PortA.Zeile=1 'schaltet die vorherige Zeile aus
Incr Zeile
If Zeile = 8 Then Zeile = 0
Shiftout Dataout , Clockout , Block1(Zeile+1) , 0 , 16
Shiftout Dataout , Clockout , Block2(Zeile+1) , 0 , 16
Shiftout Dataout , Clockout , Block3(Zeile+1) , 0 , 16
PortA.Zeile=0 'schaltet die neue Zeile ein
Return

Sieht wirklich ziemlich einfach aus.
Bleibt die 2. Aufgabe, das Bereitstellen der neuen Zeichen.

HBA
 

mnsp2

Neues Mitglied
16 Aug 2009
33
0
0
Sprachen
hallo zusammen

sorry das ich jetzt erst wieder schriebe

Ich sehe hier hauptsächlich 2 Aufgaben:
1. Im Multiplex Verfahren eine ziemlich große Anzahl an LEDs zu schalten
2. Einen neuen Text für die Anzeige bereitstellen
richtig ich denke das sind erst mal die großen Aufgaben

Besser wäre es, wenn deine Timer Routine ganz stumpf die Werte ausgeben könnte, ohne irgendwelche Abfragen.
ich danke auch das im Timer Routine nicht so viel Abfragen/Aufgaben laufen sollte um die Anzeige möglichst oft zu aktualisieren

Dim Block1(8) as Word
Dim Block2(8) as Word
Dim Block3(8) as Word

wobei dein 48x8 Display so abgebildet würde

---------Block1-------------Block2-------------Block3------
7. 5432109876543210 5432109876543210 5432109876543210
6. 5432109876543210 5432109876543210 5432109876543210
5. 5432109876543210 5432109876543210 5432109876543210
4. 5432109876543210 5432109876543210 5432109876543210
3. 5432109876543210 5432109876543210 5432109876543210
2. 5432109876543210 5432109876543210 5432109876543210
1. 5432109876543210 5432109876543210 5432109876543210
0. 5432109876543210 5432109876543210 5432109876543210
ich habe keine Idee wie ich dann die 2. Aufgabe (das erzeugen der Buchstaben/zahlen ) funktionieren soll , da ja ein Zeichen so auf gebaut ist

Spalte
5 4 3 2 1 0
-----------
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
1 0 0 0 1 0
1 0 0 0 1 0
0 1 1 1 0 0 zweitunterste Zeile
0 0 0 0 0 0 unterste Zeile

also eine Zeichen ist immer 6 Spalte breit

ist es nicht besser das irgendwie so aufzuteilen

---Block1--Block2--Block3--Block4--Block5--Block6---Block7--Block8
7. 543210 543210 543210 543210 543210 543210 543210 543210
6. 543210 543210 543210 543210 543210 543210 543210 543210
5. 543210 543210 543210 543210 543210 543210 543210 543210
4. 543210 543210 543210 543210 543210 543210 543210 543210
3. 543210 543210 543210 543210 543210 543210 543210 543210
2. 543210 543210 543210 543210 543210 543210 543210 543210
1. 543210 543210 543210 543210 543210 543210 543210 543210
0. 543210 543210 543210 543210 543210 543210 543210 543210

das Problem ist das einen Byte immer 76543210 ist
Timer_0:
PortA.Zeile=1 'schaltet die vorherige Zeile aus
Incr Zeile
If Zeile = 8 Then Zeile = 0
Shiftout Dataout , Clockout , Block1(Zeile+1) , 0 , 16
Shiftout Dataout , Clockout , Block2(Zeile+1) , 0 , 16
Shiftout Dataout , Clockout , Block3(Zeile+1) , 0 , 16
PortA.Zeile=0 'schaltet die neue Zeile ein
Return

Sieht wirklich ziemlich einfach aus.
so richtig habe ich nicht verstanden wie das funktionieren soll :cray:
es muss doch " Strobeout = 1 " noch irgendwie noch mit rein damit die Bits ausgegeben werden

ich bitte um Hilfe
lg mnsp2
 

Anhänge

HinterBlauenAugen

Neues Mitglied
28 Dez 2009
310
0
0
Sprachen
es muss doch " Strobeout = 1 " noch irgendwie noch mit rein damit die Bits ausgegeben werden
Ja, genauso wie bei dir oben, Strobeout=0 vorher und =1 nachher.

Definiere dir mal ein paar Zeichen in der "Quer"-Version, also zeilenweise, nicht spaltenweise.
Lies dann die Werte ein und setze sie in das Block1 Array, aber an die richtige Stelle.

HBA
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)