Bascom 32x16 Bi-Color LED-Matrix von SURE electronics (Ansteuerung und Beispielprogramm)

Cassio

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

Bevor sich das Jahr dem Ende neigt und wir alle in den Stress der Vorweihnachtszeit gelangen,
möchte ich noch schnell meine Entwicklung der Ansteuerung für die o.g. LED-Matrix hier einstellen.

User Roto hatte mich zum Sommer dabei schon um Hilfe gebeten und mir dann auch die Hardware zur Verfügung gestellt.
Durch ein Entgegenkommen von Roto habe ich die Ansteuerung hier ohne seine Zustimmung natürlich nicht veröffentlich!

Die Ansteuerung ist zwar nun schon seit Juli fertig, aber Roto hat sich bei mir leider nicht mehr gemeldet. :hmmmm:
Aus dem Grunde veröffentliche ich jetzt einfach die Ansteuerroutinen mit ein paar kurzen Worten.



Es geht also um eine Rot-Grün-LED-Matrix mit 32x16 Duo-LEDs, von SURE electronics.

Die 32x16 werden durch 8 einzelne Duo-LED Matrixanzeigen realisiert,
bei der sich in zwei Zeilen jeweils vier Module nebeneinander befinden.
Je zwei Module werden über ein IC, dem HT1632C angesteuert.

Hier mal eine bildliche Übersicht der gesamten Anzeige:

von vorn...
RG_Matrix_vorn.jpg

von hinten...
RG_Matrix_hinten.jpg


Wie auf den Bildern zu erkennen ist, gibt es zu den vier HT1632C noch ein Schieberegister.
Dieses Schieberegister steuert die CS-Pins der vier HT1632C..... aber dazu später etwas mehr.
Im Datenblatt zur Anzeige steht zwar etwas von SPI-ähnlicher Ansteuerung, aber das würde ich so nicht bezeichnen.


Hier beginnen dann auch schon die Probleme....
Der HT1632C hat viele nette Eigenschaften, wie zum Beispiel SPI und Master/Slave Betrieb.
Leider werden diese Eigenschaften durch den SURE electronics Aufbau "vernichtet".

Ein Master/Slave-Betrieb ist nicht vorgesehen und auch die SPI-Ansteuerung wird "zerstückelt".
Mangels Master/Slave-Betrieb muss z.B. auf das Blinken der Anzeige verzichtet werden und durch die geänderte Datenübertragung ist der READ-Modus nicht mehr möglich. :(


Was wurde also getan....
SURE electronics hat einfach vier HT1632C datentechnisch parallel geschaltet, die CS-Leitung über ein (8bit !!) Schieberegister geführt und NUR die WRITE-Leitung kontaktiert. :mad:

Alles in Allem hat mich das relativ unzufrieden gemacht, aber darum geht es hier nur bedingt. :wink:



Um das Ganze aber etwas abzukürzen.....
Zwei Matrix-Anzeigen gehören immer zu einem HT1632C.
Jede Matrix-Anzeige hat zwei Farben, rot und grün.
Es werden also insgesamt 32x8 LEDs von einem HT1632C angesteurt!
Wem die genaue Aufteilung der LEDs mit den Speicheradressen des HT1632C interessiert, der besorgt sich bitte das Datenblatt. :cool:

Soweit so "gut".....
Nun kommt aber noch ein 8bit-Schieberegister hinzu, welches die CS-Leitung der vier HT1632C steuert.

Bei der Ansteuerung muss man also per Schieberegister ein oder mehrere HT1632C ansprechen und bedenken, dass es sich leider um ein 8bit-Schieberegister handelt. :p
Damit also die CS-Leitungen nach der Datenübertragung auch alle wieder deaktiviert werden, muss man Ende zuzüglich ein mehrmaliges "Leerschieben" berücksichtigen. :(



Das ist aber noch nicht alles....
Die Ansteuerung wäre ja nun schon nervig genug, wenn man nun mit den vier Matrix-Anzeigen nebeneinander auskommen würde. :cool:
Möchte man aber eine simple Uhr mit Stunden und Minuten darstellen, bekommt man schon ein Platzproblem.
Die einfache Uhrzeit-Anzeige von 12:34 benötigt durch die Doppelpunkte aber schon fünf Stellen!
Ergo muss die gesamte Matrix umgerechnet werden.

Ich habe dafür also extra eine eigene Datentabelle mit 6x8 Zeichen (incl. Leerspalte rechts) erstellt.
Auf diese Weise passen nun fünf Zeichen nebeneinander (5 x 6 = 30 Spalten) und es sind (leider) noch zwei Spalten frei.
Damit der Text (oder die Ziffern) nachher aber auch mittig angezeigt werden, wird immer die erste und die letzte Spalte frei gelassen! :D

Das ganze sieht dann so aus:
RG_Matrix_Aufteilung.jpg

Zum besseren Verständnis habe ich auf dem Bild die 8x8 Matrixen extra noch mal farblich eingerahmt.


Später kann nun auch eine Uhr (und Daum) angezeigt werden:
RG_Matrix_Uhr.jpg



Meine Ansteuerung ist dabei auch so geschrieben, dass man im Programm ruhig einen 10 Zeichen String eingeben kann.
Die Ansteuerroutinen berücksichtigen dann den Zeilenumbruch nach dem Fünften Zeichen zzgl. der Leerspalten, um die Anzeige mittig zu halten. :)


Soweit also erst mal alles im Groben zur 32x16 Bi-Color Anzeige.



Ansteuerungen, Beispielprogramm und besondere Anmerkungen folgen dann in den nächsten Beiträgen. :ciao:

Grüße,
Cassio
 
Hallo!

Da ich gerade mal wieder etwas Zeit habe, möchte ich das nun auch mal zu Ende bringen.


Damit jeder Interessierte nicht extra einen Blick in das dürftige Datenblatt der SURE-Anzeige werfen muss, stelle ich hier mal eine kleine Übersicht der Speicherverwaltung ein.
Matrix-Speicher.gif

Wie man recht gut erkennen kann sind die Anschlüsse am HT1632C leider nicht so gewählt worden, dass sich eine rot-grün Matrix im Speicher "durchnummerieren" lässt. :(
Dieses ärgert einen beim Erstellen der Routinen noch zusätzlich, gerade wenn man meine 5x7 Zeichen (6x8 mit Leerstellen) verwendet.



Nun aber genug der Jammerei........
kommen wir zu den Ansteueroutinen. :wink:

Mit meinen Routinen lässt sich nun folgendes sehr einfach realisieren:
  • Initialisieren der gesamten Matrix
  • Kommandos zur Anzeige senden, z.B. On/Off
  • Einfachdes Einstellen des 15 stufigen Dimmers für die gesamte Anzeige
  • CLS für die gesamte Matrix
  • CLS für nur eine Farbe (rot oder grün)
  • Darstellen von Buchstaben, Ziffern und Sonderzeichen in drei verschiedenen Farben (rot / grün / orange)
  • Direkte Ausgabe von Byte-Werten (in drei Farben)
  • Direkte Ausgabe von Word-Werten (in drei Farben)
  • Direkte Ansteuerung jeder einzelnen LED und Farbe


Wie eben schon erwähnt, kann z.B. beim Text direkt die Farbe mit angegeben werden.
Die Anweisung dafür sieht dann wie folgt aus:
Code:
'Led G , 1 , "1234567890"
'    |   |      |
'    |   |      '- 10 Zeichen String maximal
'    |   '-------- Zeichenstelle (1 - 10)
'    '------------ Farbe (G=grün, R=rot, O=orange)


Den Dimmer kann man mit einer Zahl zwischen 0 und 15 ansteuern, wobei 15 volle Helligkeit bedeutet.
Es reicht also folgendes im Programm anzugeben:
Code:
Dimmer 8
und schon wird die gesamte Anzeige auf die halbe Helligkeit eingestellt.


Möchte man an einer bestimmten Stelle eine LED leuchten lassen, gibt es dafür eine spezielle Anweisung:
Code:
Ht_mem 4 , &H3D , 6
Auf diese Weise kann man auch die LEDs in der ersten und letzten Spalte leuchten lassen, obwohl sie sonst durch das mittige Darstellen von Texten oder Zahlen übersprungen werden. :cool:
Wer sich dieses Bild noch einmal genau ansieht wird bemerken.....
RG_Matrix_Uhr.jpg

dass der Punkt hinter dem Monat genau auf diese Weise erstellt wurde. :wink:




Nun aber genug der vielen Zeilen.....
kommen wir zu den Routinen und dem Beispielprogramm. :D

Die fertigen Ansteueroutinen befinden sich in zwei separten Dateien:
Einmal die Datei zum Dimensionieren der Variablen und den Deklarationen der Subroutinen.... die RGM_dec.inc
und eine weitere Datei mit allen Subroutinen..... die RGM_subs.inc

Beide Dateien müssen später in einem Programm nur per $INCLUDE mit eingebunden werden (siehe Beispielprogramm) und schon ist alles fertig eingestellt. :D


Hier nun erst mal die RGM_dec.inc
Matrix_declare.gif
 
Hallo!

Kommen wir nun in den nächsten Beiträgen zur wichtigeren Datei......
der RGM_subs.inc !

In dieser Datei sind dann alle Ansteuerungen in separaten Subroutinen ungebracht.


Weitreichende Erklärungen zu den Subroutinen erspare ich mir jetzt erst einmal......
Es sind schließlich genug Erklärungen im Programmcode vorhanden. :cool:

Sollte jemand doch noch Fragen haben, dann darf er die natürlich gerne stellen. :)


sub_01.gif


sub_02.gif


sub_03.gif


subs_5.gif


subs_6.gif


....geht gleich weiter....
 
....weiter geht es mit den Subroutinen der RGM_subs.inc !


subs_7.gif


subs_8.gif


subs_9.gif


subs_10.gif


sub_11-12.gif



Soweit zu den INCLUDE-Dateien!



Nun folgt noch ein Programmbeispiel und dann ist alles komplett! :D
Dort kann man auch sehen, an welchen Stellen die INC-Dateien eingebunden werden sollten.


Hier nun ein kleines Beispielprogramm:
Code:
' #############################################################################
' #############################################################################

'SURE electronics
'32x16 Bicolor Matrixanzeige
'
'by Cassio at AVR-Praxis.de

' #############################################################################
' #############################################################################


'Hier AVR-Typ und Systemfrequenz angeben!
$regfile = "m1284pdef.dat"                                  'ATMega 1284
$crystal = 12000000                                         '12 MHz


' #############################################################################
' #############################################################################



$hwstack = 128
$swstack = 128
$framesize = 128


'(
----AVR44DL-M-----
ATMega1284 @ 12MHz
-----------
PB0       |--o
PB1       |--o
PB2       |--o
PB3       |--o
PB4       |--o
PB5/MOSI  |--o
PB6/MISO  |--o
PB7/SCK   |--o
PD0/RxD   |--o
PD1/TxD   |--o
PD2/INT0  |--o
PD3/INT1  |--o
PD4       |--o
PD5       |--o
PD6       |--o
PD7       |--o
PC0/SCL   |--o
PC1/SDA   |--o
PC2       |--o
PC3       |--o
PC4       |--o
PC5       |--o
PC6       |--o
PC7       |--o
PA7       |--o
PA6       |--o
PA5       |--o Taster
PA4       |--o
PA3       |--o DATA
PA2       |--o WR
PA1       |--o CLK
PA0       |--o CS
          |
AVcc      |--o
Vcc       |--o
GND       |--o
-----------
')



' ==============================================================================

' Bestimme die Ein und Ausgänge
Ddra = &B_0000_1111                                         '1 ist Ausgang 0 ist Eingang
Porta = &B1111_0000                                         'auf Hi oder Low setzen

Ddrb = &B_1011_1111                                         '1 ist Ausgang 0 ist Eingang
Portb = &B0100_0000                                         'auf Hi oder Low setzen

Ddrc = &B_0000_0011                                         '1 ist Ausgang 0 ist Eingang
Portc = &B1111_1100                                         'auf Hi oder Low setzen

Ddrd = &B_1111_0010                                         '1 ist Ausgang 0 ist Eingang
Portd = &B0000_1101                                         'auf Hi oder Low setzen

' #############################################################################



' #############################################################################
' #############################################################################
' #############################################################################
' #############################################################################


'HIER nur noch die eigenen Port-Pin`s angeben !
Cs Alias Porta.0                                            'Matrix CS (Serial-In A)
Clk Alias Porta.1                                           'Matrix CLK (Schieberegister Clock)
Wr Alias Porta.2                                            'Matrix WR (HT1632C Clock)
Daten Alias Porta.3                                         'Matrix DATA (HT1632C Daten)


Taster Alias Pina.5
' #############################################################################
' #############################################################################
' #############################################################################
' #############################################################################


Waitms 500

$include "RGM_dec.inc"                                      'Variablen und Deklarationen

' #############################################################################


Enable Interrupts                                           'Nur für Uhr notwendig, nicht für die Matrix !

'Softclock dient nur als Beispiel
Config Date = Dmy , Separator = .
Config Clock = Soft

Time$ = "12:34:00"                                          'Start-Uhrzeit vorgeben
Date$ = "17.07.13"                                          'Start-Datum vorgeben


' #############################################################################
'Variablen für das Programm

Dim Z1 As Word                                              'Zähler 1, 16bit breit
Dim Z2 As Byte                                              'Zähler 2, 8bit breit


Dim Sec_old As Byte                                         'Sekunde zur Ausführung merken
Dim Ftemp As String * 5                                     'formatierte Variable, temporär
Dim Uhr As String * 5                                       'Uhrzeit 12:34
Dim Datum As String * 5                                     'Datum 17.07


' #############################################################################
' #############################################################################
'Erster Start
Init_matrix                                                 'RG-Matrix initialisieren

Dimmer 4                                                    'Helligkeit einstellen


' #############################################################################
'Programmschleife
Gosub Start_anzeige                                         'Einige Programm-Beispiele


Do

'Beispiel einer zweistelligen Uhr ( & Datum)
If Sec_old <> _sec Then                                     'Nur Ausführen wenn ungleich!
   Uhr = Str(_hour) : Uhr = Format(uhr , "00")              'Stunden in String und formatieren
   Uhr = Uhr + ":"                                          'Doppelunkte hinzu
   Ftemp = Str(_min) : Ftemp = Format(ftemp , "00")         'Minuten in String und formatieren
   Uhr = Uhr + Ftemp                                        'Minuten hinzufügen

      Datum = Str(_day) : Datum = Format(datum , "00")
      Datum = Datum + "."
      Ftemp = Str(_month) : Ftemp = Format(ftemp , "00")
      Datum = Datum + Ftemp

         Led G , 1 , Uhr                                    'Uhr in grün ausgeben
         Led R , 6 , Datum                                  'Datum in rot ausgeben
         Ht_mem 4 , &H3D , 6                                '4.HT1632-Chip, Speicher 3D_hex , Wert = 6
         Ht_mem 4 , &H3F , 6                                '4.HT1632-Chip, Speicher 3F_hex , Wert = 6
   Sec_old = _sec                                           'Variable gleichsetzen
Else
End If



Loop


End


' #############################################################################
Start_anzeige:
Led O , 1 , "HalloUser!"                                    'Schrift orange
Wait 2
Bitwait Taster , Set


Cls_r                                                       'Lösche rot
Wait 1
Bitwait Taster , Set

Cls_g                                                       'Lösche grün
Wait 1
Bitwait Taster , Set


Led G , 1 , "RG-  "                                         'Schrift grün
Led R , 4 , "Ma"                                            'Schrift rot
Led R , 6 , "trix!"                                         'Schrift rot
Waitms 200

For Z2 = 1 To 6
   Matrix Led_off                                           'RG-Matrix aus
   Waitms 100
   Matrix Led_on                                            'RG-Matrix ein
   Waitms 200
Next Z2
Wait 3
Bitwait Taster , Set


Cls_matrix
Dimmer 0

Led G , 1 , "Dimm."                                         'automatischer Dimmer
Led G , 7 , "="                                             'mit Wertanzeige
Led R , 9 , "0"                                             'Startwert
Wait 1
For Z2 = 0 To 15                                            'voller Dimmbereich
   Dimmer Z2                                                'Dimmwert ausführen
   Ledb R , 9 , Z2                                          'aktuelle Dimmstufe anzeigen
   Wait 1
Next Z2


Wait 1
Dimmer 4



Cls_matrix                                                  'Clear Screen (rot & grün)
Led G , 1 , "Uhr &Datum"
Wait 3

Cls_matrix
Led G , 1 , "12:34"
Led R , 6 , "17.07"
Ht_mem 4 , &H3D , 6                                         '4.HT1632-Chip, Speicher 3D_hex , Wert = 6
Ht_mem 4 , &H3F , 6                                         '4.HT1632-Chip, Speicher 3F_hex , Wert = 6
Wait 3



Cls_matrix
Led R , 1 , "BYTE-Zahl"
Wait 3

Led R , 6 , "     "
For Z2 = 0 To 255                                           'Zähler von 0 bis 255
   Ledb R , 6 , Z2                                          'LEDb = Byte ausgeben
Waitms 10
Next Z2

Wait 3
Bitwait Taster , Set


Cls_matrix
Led G , 1 , "WORD-Zahl"
Wait 3

Led G , 6 , "     "
For Z1 = 0 To 10000                                         'Zähler von 0 bis 10000
   Ledw G , 6 , Z1                                          'LEDw = WORD ausgeben
Waitms 1
Next Z1
Wait 1
Led G , 6 , "u.s.w"
Wait 3
Bitwait Taster , Set


Cls_matrix
Led G , 1 , "auto ABC.."
Wait 2

Cls_matrix
For Z1 = 65 To 90                                           'CHR() 65 bis 90 (A-Z) anzeigen
   Txt = Chr(z1)                                            'Bytezahl in Charakter wandeln
   For Z2 = 1 To 10 Step 2                                  'jede zweite Stelle verwenden
      Led G , Z2 , Txt                                      'String ausgeben
   Next Z2
Waitms 500
Next Z1

Wait 3


Cls_matrix

Return



' #############################################################################
$include "RGM_subs.inc"



Grüße,
Cassio


PS: Ach so....
gegen eine kleine Spende, gibt es den Code natürlich auch wieder als Datei. :cool:
 
Hi Atari!

Yes, i know!
I think about it. :wink:

Best regards,
Cassio
 
Cassio: Please answer because I have to look for another solution then..
 

Ü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)