Bascom Adafruit I2C 4-fach 7-Segment LED-Anzeigen -> Beispielprogramm

Cassio

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

Nachdem mir Grandpa freundlicherweise einer der
Adafruit I2C 4-fach 7-Segment LED-Anzeigen zum Testen zur Verfügung gestellt hat, möchte ich hier mal kurz ein kleines Beispielprogramm einstellen.


Anfänglich habe ich etwas mit der Inbetriebnahme gekämpft, obwohl das INIT von den Werten her richtig war......
Dirk hat mich dann aber darauf hingewiesen, dass jede einzelne INIT-Anweisung auch EINZELN an den HT16K33 übertragen werden MUSS!
Man kann das INIT, bestehend aus vier Bytes, also NICHT am Stück zum Chip senden!

Nachdem diese Hürde genommen war, funktionierte die Anzeige auch sofort problemlos. :cool:


Nun noch ein kurzer Hinweis zum nachfolgenden Programm:
Das Programm ist lediglich ein Beispielprogramm und soll verschiedene Möglichkeiten aufzeigen, wie man die LED-Anzeige via I2C ansteuern kann!

Das folgende Programm enthält:
  • Daten im String verarbeiten
  • Senden einzelner Bytes an ein definiertes Digit
  • Einstellen der Dimmfunktion
  • Display Ein/Aus schalten
  • Die drei Blinkfrequenzen einstellen
  • Den HT16K33 in den StandBy-Mode schalten und zurück holen


Die wichtigsten Funktionen habe ich in separate Subroutinen geschrieben.
So kann jeder schauen, was er gebrauchen kann..... oder modifizieren möchte. :wink:

Ach so....
Die Zeichentabelle habe ich absichtlich mit 31 "Leerstellen" gefüllt!
Man kann das natürlich auch entfernen und in der zugehörigen Sub einfach ein "-32" verwenden!
Das kann aber jeder machen, wie er es mag. :cool:


Nun aber genug der vielen Worte.....
Hier mal das Beispielprogramm:
Code:
'
'Adafruit I2C 7-Segment LED-Anzeige
'CASSIO by AVR-Praxis.de
'Beispielprogramm zur Ansteuerung
'
'
$regfile = "m8adef.dat"
$crystal = 16000000


$hwstack = 128
$swstack = 128
$framesize = 128
'$baud = 38400

'                    ATMega8
'                   +---v---+
'       (RESET) PC6 |1    28| PC5 (SCL)
'         (RXD) PD0 |2    27| PC4 (SDA)
'         (TXD) PD1 |3    26| PC3
'        (INT0) PD2 |4    25| PC2
'        (INT1) PD3 |5    24| PC1
'      (XCK/T0) PD4 |6    23| PC0
'               VCC |7    22| GND
'               GND |8    21| AREF
'       (XTAL1) PB6 |9    20| AVCC
'       (XTAL2) PB7 |10   19| PB5 (SCK)
'               PD5 |11   18| PB4 (MISO)
'               PD6 |12   17| PB3 (MOSI/OC2)
'               PD7 |13   16| PB2
'               PB0 |14   15| PB1
'                   +-------+


'(        CASSIOs AVR32pin Modul
       ----------------------------
       -----AVR32pinMSL-Modul------
       ----------------------------
       o--PD5       |        PD4--o
       o--PD6       |   INT1/PD3--o
       o--PD7       |   INT0/PD2--o
       o--PB0-------|    TxD/PD1--o
       o--PB1/OC1A  |----RxD/PD0--o
       o--PB2/OC1B  |    SCL/PC5--o SCL
       o--PB3/MOSI  |    SDA/PC4--o SDA
       o--PB4/MISO  |        PC3--o
       o--PB5/SCK   |        PC2--o
       o--PB6/XTAL1 |        PC1--o
       o--PB7/XTAL2-|--------PC0--o
       o--Vcc     8/16MHz   ADC7--o
       o--Vcc    Resonator  Aref--o
       o--GND       |       ADC6--o
       ----------------------------
')

Ddrd = &B_000000_10
Portd = &B111111_01

Ddrc = &B_11_0000
Portc = &B00_1111

Ddrb = &B_000
Portb = &B111


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


' I2C-Config
Config Scl = Portc.5                                        'I2C SCL
Config Sda = Portc.4                                        'I2C SDA

$lib "i2c_twi.lbx"
Config Twi = 400000                                         'BUS-Takt,

Const 16k33 = &HE0                                          'Standardadresse des LED-Moduls

'         HT16K33/28pin
'              ___
'      Vss  -o|1  |o-  Vdd
'  COM0/AD  -o|   |o-  SDA
' COM1/KS0  -o|   |o-  SCL
' COM2/KS1  -o|   |o-  ROW0/A2
' COM3/KS2  -o|   |o-  ROW1/A1
'     COM4  -o|   |o-  ROW2/A0
'     COM5  -o|   |o-  ROW3
'     COM6  -o|   |o-  ROW4
'     COM7  -o|   |o-  ROW5
'ROW15/INT  -o|   |o-  ROW6
'    ROW14  -o|   |o-  ROW7
'    ROW13  -o|   |o-  ROW8
'    ROW12  -o|   |o-  ROW9
'    ROW11  -o|_15|o-  ROW10


' #############################################################################
Dim Segmente(11) As Byte                                    'Segmente-Speicher

Dim Text As String * 5                                      'Textstring
Dim Ascii(5) As Byte At Text Overlay                        'ASCII-Werte des Teststrings
Dim Z As Byte                                               'Ziffernzähler für den String

Dim I As Byte , J As Byte                                   'interne Zählvariablen


Declare Sub Led_cmd(byval Command As Byte)                  'Sub zum Senden von Kommandos
Declare Sub Led_(byval Ram_addr As Byte , Byval Anzeige As String * 5)       'Sub für Strings
Declare Sub Led_bin(byval Addr As Byte , Byval Wert As Byte)       'Sub für binäre Werte

Const Blink05 = &H83                                        'Blinken 0,5Hz
Const Blink1 = &H85                                         'Blinken 1Hz
Const Blink2 = &H87                                         'Blinken 2Hz
Const Display_on = &H81                                     'Display ein / Blinken aus
Const Display_off = &H80                                    'Display aus

Const Standy_mode = &H20                                    'Standby Mode aktivieren
Const Run_mode = &H21                                       'Standby Mode beenden


' #############################################################################
Dim Temp As Byte                                            'Temporäre Variable für das Programm
Dim Zaehler As Byte                                         'Zählervariable für Dimmeranzeige

' #############################################################################
Gosub Led_init                                              'Zu Beginn erst mal ein INIT ausführen!
Wait 1


Do

Led_ 1 , "12:34"                                            'String 12:34 anzeigen
Wait 2
Led_ 1 , "56 78"                                            'String 56 78 anzeigen
Wait 2

Led_bin 1 , &H80                                            'DP an Digit 1 hinzufügen!
Wait 1
Led_bin 2 , &H80                                            'DP an Digit 2 hinzufügen!
Wait 1
Led_bin 4 , &H80                                            'DP an Digit 4 hinzufügen!
Wait 1
Led_bin 5 , &H80                                            'DP an Digit 5 hinzufügen!
Wait 1
Led_bin 3 , &H02                                            'Doppelpunkte (Digit 3) einschalten
Wait 1


' automatischer Dimmer
Zaehler = 15                                                'Zähler für Dimmstufe zur Anzeige
Led_ 1 , "D- "                                              'D- als Info für Dimmerfunktion
For Temp = 239 To 224 Step -1                               'Dimmestufe &HEF bis &HE0 durchlaufen
   Text = Str(zaehler) : Text = Format(text , "00")         'Formatieren der Zähleranzeige
   Led_ 4 , Text                                            'Dimmer-Zählwert anzeigen
   Led_cmd Temp                                             'Dimmstufe als Kommando senden
   Waitms 500
   Decr Zaehler
Next Temp
Wait 1

Led_ 1 , "B- 05"                                            'Blinken 0,5Hz
Led_cmd Blink05
Wait 3

Led_ 1 , "B-  1"                                            'Blinken 1Hz
Led_cmd Blink1
Wait 3

Led_ 1 , "B-  2"                                            'Blinken 2Hz
Led_cmd Blink2
Wait 4

Led_cmd Display_on                                          'Blinken aus, Display ein
Led_ 1 , "00 00"
Waitms 500
Led_cmd Display_off                                         'Display aus
Wait 1

Led_ 1 , "FF:FF"
Led_cmd Display_on                                          'Display ein
Wait 1


Led_ 1 , "     "                                            'Anzeige "löschen"
Wait 1
Led_cmd &HEF                                                'Display/Dimmer volle Helligkeit

Loop


End                                                         'end program


' #############################################################################
Led_init:

Temp = &H21
I2csend 16k33 , Temp , 1
Waitms 1

Temp = &HA0
I2csend 16k33 , Temp , 1
Waitms 1

Temp = &HEF
I2csend 16k33 , Temp , 1
Waitms 1

Temp = &H81
I2csend 16k33 , Temp , 1
Waitms 1


For I = 1 To 11
   Segmente(i) = &H00
Next I
I2csend 16k33 , Segmente(1) , 11

Return


' #############################################################################
Sub Led_cmd(byval Command As Byte)
   I2csend 16k33 , Command , 1
End Sub


' #############################################################################
Sub Led_(byval Ram_addr As Byte , Byval Anzeige As String * 5)
Text = Anzeige
Z = Len(text)

J = Ram_addr
J = J + J

Segmente(1) = &H00

For I = 1 To Z
   Segmente(j) = Lookup(ascii(i) , Tabelle)
   Incr J
   Incr J
Next I

I2csend 16k33 , Segmente(1) , 11

End Sub


' #############################################################################
Sub Led_bin(byval Addr As Byte , Byval Wert As Byte)

J = Addr
J = J + J

Segmente(j) = Segmente(j) + Wert
I2csend 16k33 , Segmente(1) , 11

End Sub



' #############################################################################
' #############################################################################
Tabelle:
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00

Data &H00                                                   'Space (32)
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H40                                                   '-     (45)
Data &H00                                                   'Leer
Data &H00                                                   'Leer
' Ziffern
Data &H3F                                                   '0     (48)
Data &H06                                                   '1
Data &H5B                                                   '2
Data &H4F                                                   '3
Data &H66                                                   '4
Data &H6D                                                   '5
Data &H7D                                                   '6
Data &H07                                                   '7
Data &H7F                                                   '8
Data &H6F                                                   '9
' Symbol
Data &H02                                                   ':
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
Data &H00                                                   'Leer
' Buchstaben
Data &H77                                                   'A      (65)
Data &H7C                                                   'B
Data &H39                                                   'C
Data &H5E                                                   'D
Data &H79                                                   'E
Data &H71                                                   'F


Viel Spaß damit,
Cassio :ciao:
 
Hallo zusammen,

wir haben uns ja beim Stammtisch noch den Kopf zerbrochen wie das denn nun am IC angeschlossen ist.
Hier ist was zu finden ...
>> Downloads
- Schematic and PCB files are available from Github - in Eagle 6 format.
- The backpacks all use the HT16K33 chip solely for LED driving - the mini 8x8's use the 24 pin version and the others use the 28 pin vesion

Dafür muß ich aber erstmal die Eagle-Version 6.x runterladen :rolleyes:

Gruß
Dino
 
Hi Cassio,

erstrmal Danke für die Mühe und das schnelle Ergebnis.
Morgen kommt das aktuelle Bascom drauf und dann probier ich's aus.
 
- Schematic and PCB files are available from Github - in Eagle 6 format.

Hi Dino!

Jepp... hatte ich Sonntag dann auch gefunden.

Allerdings kann man die Dateien nicht einfach durch anklicken speichern, sondern muss die Seite aufrufen und den Inhalt von Hand in entsprechende Dateien kopieren.

Etwas umständlich, aber es geht! :wink:

Hier mal der Verdrahtungsplan:
Adafruit_7-Seg_Plan.png

und das Platinen-Layout:
Adafruit_7-Seg_Board.png


Grüße,
Cassio
 
Allerdings kann man die Dateien nicht einfach durch anklicken speichern, sondern muss die Seite aufrufen und den Inhalt von Hand in entsprechende Dateien kopieren.

Etwas umständlich, aber es geht! :wink:
Einfacher geht es wenn du auf der Seite auf "RAW" klickst. Dann hast du direkt die XML-Datei für Eagle und kannst sie ohne Klimmzüge runterladen ;)

Gruß
Dino
 
Hallo Cassio!

Dankeschön für deinen Bascom-Beispielcode zu den Adafruit I2C 4-fach 7-Segment LED Anzeigen. :cool:

Die 7-Segment LED Anzeige gibt es übrigens nicht nur in blau, sondern auch in rot, grün und gelb.

Ich werde hierzu meine C-Lösung (GCC) noch ein bisschen bearbeiten und auch online stellen. Für diejenigen, die sich mit Arduino beschäftigen, empfehle ich das Tutorial von Ladyada, was wie immer sehr gut ist!

Dirk :ciao:
 
Hallo Zusammen,

cool!:dirol: Funktioniert super. Laßt es mal im dunklen Raum leuchten...


- Cassio:
Es lag tatsächlich an meiner Bascom- Version, daß ich nichts angezeigt bekam. Da hätte ich noch lange probieren können. Mit der Aktuellen ist alles schön.

- Dino:
ich habe die Vollversion drübergebügelt, wie immer. Ist übrigens 2.0.7.5!
 
- Cassio:
Es lag tatsächlich an meiner Bascom- Version, daß ich nichts angezeigt bekam.

Hallo Michael!

Ich hätte im Beispielcode wohl erwähnen sollen, dass ich die BASCOM-Version 2.0.7.4 verwendet habe! :wink:


Dann hat sich dein Update ja nun sogar doppelt gelohnt.
Endlich wieder ein aktuelles BASCOM-Programm und obendrein nun auch eine funktionierende Adafruit-Anzeige. :D


Viele Grüße,
Cassio

PS:
Danke dir noch mal für die Leihgabe. :flowers:
Deine Anzeige liegt nun auch zur Abholung bereit. :hello:
 
Hi Cassio,

Hallo Michael!

Ich hätte im Beispielcode wohl erwähnen sollen, dass ich die BASCOM-Version 2.0.7.4 verwendet habe! :wink:
Yip, hätte mir ein paar Stunden erspart...

Dann hat sich dein Update ja nun sogar doppelt gelohnt.
Endlich wieder ein aktuelles BASCOM-Programm und obendrein nun auch eine funktionierende Adafruit-Anzeige. :D
Stimmt. Und das Adafruit wird jetzt einiges vereinfachen...

Viele Grüße,
Cassio

PS:
Danke dir noch mal für die Leihgabe. :flowers:
Danke für die Blumen, keine Ursache. War doch reiner Eigennutz:lollypop:
Deine Anzeige liegt nun auch zur Abholung bereit. :hello:
 

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