Atmega2560 i2C => IS31FL3731Board

RoTo

Mitglied
18. Juli 2010
51
0
6
In der nahe von Kassel
Sprachen
  1. BascomAVR
Hallo,

ich möchte gerne dies hier zu kommunizieren bringen
led_matrix.jpg

Datenblatt 31FL3731.pdf

Leider was ich bis jetzt geschafft habe die Adresse auszulesen 74h

Meine Anfängliche Code:


CodeBox BascomAVR

'################### Config LCD #####################
Config Lcd = 24 * 2 , Chipset = Ks077
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Cls
Initlcd
Cursor Off                                                  'off Blink
cls
  Locate 1 , 2 : Lcd "HALLO"
  wait 3
  Cls

$lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI
Config Scl = Portd.0                                        ' we need to provide the SCL pin name
Config Sda = Portd.1                                        ' we need to provide the SDA pin name


Config Twi = 400000
TWCR = &B00000100
I2cinit

Const ADDRESSE = &H74                                       '&B0111 0100   I2C Adresse des IS31FL3731
Const COMM_REG = &HFD                                       '&B1110 1101 = &HFD - Befehlsregister
Const REG_CONFIG = &H00
Const PICTUREMODE = &H00
Const AUTOPLAYMODE = &H08
Const AUDIOPLAYMODE = &H18
Const PICTURE_MODE = &H01
Const AUTOFRAMEMODE = &H04
Const AUDIOMODE = &H08
Const PICTUREFRAME = &H01
Const SHUTDOWN = &H0A
Const AUDIOSYNC = &H06
Const BANK1 = &H0B


 '##########Variable#############################################
Dim Hbyte As Byte , Lbyte as byte , I as byte
Dim Ca As Byte , Cb As Byte
Dim y as Byte , x as Byte
Dim Spalte As Byte
Dim Zeile As Byte , Vor as Byte , A as byte
Dim REG_PWM As Byte
Dim PWM As Byte
dim Frem8 as Byte
Dim Busaddress As Byte
Dim Busaddress_read As Byte
Dim Chipaddress As Byte

Ca = &B1111_1111
Cb = &B1111_1111
Zeile = &B00000000
REG_PWM = 36
PWM = 255
Frem8 = &B00000111
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
x = 1
y = 1

For Busaddress = 0 To 254 Step 2
     I2cstart
     I2cwbyte Busaddress
     If Err = 0 Then
        Locate 1 , 1 : Lcd "Slave at : " ; Busaddress ; "d,  =  " ; Hex(busaddress) ; "hex"
        Chipaddress = Busaddress \ 2
        Locate 2 , 1 : Lcd " with chip address " ; Hex(chipaddress) ; "h“"
     End if
     I2cstop
Next
wait 2


I2cstart
I2cwbyte ADDRESSE
if Err =1 Then
 Locate 1 , 1 : Lcd "1" ; Err   '<=  Err = 1
End if
I2cstop
wait 2


Do

I2cstart
I2cwbyte ADDRESSE
     I2cwbyte COMM_REG                                     '&B1110 1101 = &HFD - Befehlsregister
     I2cwbyte REG_CONFIG
     I2cwbyte Zeile                                 'LED Control Register
     I2cwbyte Ca                
     incr Zeile   
     I2cwbyte Zeile                                 'LED Control Register
     I2cwbyte Cb
     I2cwbyte &H12
     I2cwbyte &B00000000
     I2cwbyte &H13
     I2cwbyte &B00000000
     I2cwbyte REG_PWM
     For REG_PWM = 36 to 51
          'PWM = PWM + 3
           I2cwbyte PWM
     next REG_PWM
          I2cwbyte BANK1
           I2cwbyte REG_CONFIG
           I2cwbyte &B00000000
           I2cwbyte PICTUREMODE
           I2cwbyte &B00000111
           I2cwbyte SHUTDOWN
           I2cwbyte &B00000001
           I2cwbyte &H07
       I2cstop
    waitms 500
  Zeile = 0
Loop
End

Ich würde mich SEHR freuen, wenn jemand mir Erklären könnte wie ich die Kommunikation aufbauen muss. Leider bin ich kein Englisch Könner:(

Bedanke mich im voraus.
 

Anhänge

  • 31FL3731.pdf
    737,9 KB · Aufrufe: 16
Zuletzt bearbeitet:
Was verstehst du unter "Kommunizieren"?
Willst ihn wahrscheinlich sagen, welche LED´s an bzw. aus geschaltet werden sollen, richtig?
In Bascom kenne ich mich jetzt nicht so gut aus...
Erst mal erstellst du Routinen, die im Endeffekt für dich die ganze Arbeit erledigen. Du brauchst später nur die Funktionen aufrufen und Parameter übergeben.
Parameter sind dann z.B welche LED(s) leuchten sollen...

Wenn du die Adresse schon richtig auslesen konntest, suchst du dir jetzt die ganzen Register zusammen die du brauchst um LED´s an zu steuern.
Hast du diese? Kannst die Register beschreiben...

Also Schritt für Schritt...

1 / Die benötigten Register raus suchen.
 
Hallo RoTo
kenne dieses Teil nicht. Sieht recht kompliziert aus. Kenne aber den HT16k33 dazu. Macht scheinbar das selbe, ist aber viel einfacher und ist ebenfalls über den I2C Bus anzusteuern. Habe den HT 16 K 33 mehrfach verwendet und bin sehr zufrieden mit dem Teil. Bauart ist fast identisch zu deinem Teil. Arbeite aber mit C.
achim
 
Hallo,
danke für deine Antwort,
Ja was Registern betrifft habe ich schon Verstanden mehr oder weniger, dennoch funktioniert es nicht, ich habe einen denk b.z.w Verständnis Fehler was Register / Bascom Code beschreiben angeht ( Allgemein Verständnis?)


Schau doch mal auf Seite 9, dort findest du eine Übersicht der vorhanden Register...

Fangen wir mal mit dem ersten Register an (LED Control Register)...
Dort hast du die möglichkeit deine 18 LED´s ( 0x00 (erste LED) - 0x12 Hex.) zu konfigurieren ob an oder aus.
Sagen wir mal die erste LED (0x00) soll an sein... Also schreibst du jetzt an Register Adresse "0x00" eine "0x01" (Kann natürlich auch "0x00" sein, kommt drauf an wie die LED´s verdrahtet sind!)..
Das gleiche Spiel machst du jetzt für die anderen LED´s...

Das zweite Register ist dafür da, die LED´s zum blinken zu bringen... Wo 0x12 deine erste LED repräsentiert...

So würde ich jetzt erstmal vorgehen... Schalte erstmal alle LED´s an und wieder aus...
 
Hallo Janiiix3,
soweit habe ich es auch verstanden glaube ich.
Es liegt mit Sicherheit an meinem Programm!:confused:



CodeBox BascomAVR
Const ADDRESSE = &HE8                                       'Slave Adresse                                                          
Const COMM_REG = &HFD                                       '&HFD - Befehlsregister
Const REG_CONFIG = &H00                                     'Frame 1 Register
Ca = &B1111_1111                                            'LED von 1 bis 8 alle an
Cb = &B1111_1111                                            'LED von 9 bis 16 alle an
PWM = 0
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

For Busaddress = 0 To 254 Step 2
     I2cstart
     I2cwbyte Busaddress
     If Err = 0 Then
        Locate 1 , 1 : Lcd "Slave at : " ; Busaddress ; "d,  =  " ; Hex(busaddress) ; "hex"    '<= Busadresse hE8
        Chipaddress = Busaddress \ 2
        Locate 2 , 1 : Lcd " with chip address " ; Hex(chipaddress) ; "h“"
     End if
     I2cstop
Next
wait 10
cls

I2cstart
I2cwbyte ADDRESSE
I2cwbyte COMM_REG                                           '&B1110 1101 = &HFD - Befehlsregister
I2cwbyte REG_CONFIG                                         '&B0000 0000 = &H00 - Befehlsregister Page 1
I2cwbyte &H00                                               'LED Control Register  CA1
I2cwbyte Ca
I2cwbyte &H01                                               'LED Control Register  CB1
I2cwbyte Cb
I2cwbyte &H12                                               'Blink Control Register  CA1
I2cwbyte &B00000000                                         ' AUS
I2cwbyte &H13                                               'Blink Control Register  CB1
I2cwbyte &B00000000                                         'AUS
I2cstop
waitms 10

Do

I2cstart
I2cwbyte ADDRESSE
I2cwbyte COMM_REG                                           '&B1110 1101 = &HFD - Befehlsregister
I2cwbyte REG_CONFIG                                         '&B0000 0000 = &H00 - Befehlsregister Page 1
  For REG_PWM = 36 to 51
        I2cwbyte REG_PWM
        I2cwbyte PWM
  NEXT REG_PWM
 I2cstop
wait 2
 PWM = PWM + 5
 if PWM = 255 then PWM = 0
  loop
End


Ich kriege keine LED zum leuchten, was mache ich Falsch?
 
Hardware
Passt hier alles? Richtig verdrahtet? Spannungen alle vorhanden?
Hast du mal statische Pegel an die LED´s angelegt? leuchten sie?

Software
Leute die kein BASCOM (wie ich) kennen oder können, haben ein wenig Verständniss Probleme sich dort einzulesen.
Wo genau versuchst du denn die LED´s zu "Konfigurieren"?
Poste doch mal bitte nur diesen Ausschnitt.
 
Also,
Spannung liegt an, SCL und SDA sind auch richtig Verkabelt.

Zeile 23: Adresse von Slave
Zeile 24: HFD - Befehlsregister
Zeile 25: Befehlsregister Page 1
Zeile 26: LED Control Register CA1 (h00) Matrix A
Zeile 27: Alle LED An Bin 1111_1111
Zeile 28: LED Control Register CB1 (h01) Matrix B
Zeile 29: Alle LED An Bin 1111_1111
Zeilen 30 bis 33: Blinkregister Aus
Zeilen 40 bis 46: PWM Register Matrix A (h24 bis h2B) / Matrix B (h2C bis h33)
PWM mit 0 starten und bei jedem Durchlauf vor der do Loop schleife erhöhen um 5

Ich hoffe das es so für dich verständlich ist.
 
** OFFTOPIC **

Hallo RoTo!

Das ist ja eine Freude, dass du hier wieder aktiv bist! :)

Ich habe dir im Sommer 2013 doch eine Ansteuerroutine für deine 32x16 Bi-Color-Matrix geschrieben und du hattest mir dafür doch extra ein Hardware-Exemplar zur Verfügung gestellt.

Leider hast du dich nach der Fertigstellung gar nicht mehr gemeldet.

Trotzdem habe ich dich nicht vergessen und die Ansteuerroutinen sollst du natürlich immer noch bekommen.
Es sei denn, du benötigst diese nicht mehr und möchtest sie der Allgemeinheit zur Verfügung stellen. ;)

Melde dich doch bitte mal bei mir.

Grüße,
Cassio

** OFFTOPIC END **
 
Hallo RoTo!

Noch mal eben schnell zu deiner Hardware......

Die I2C-Adresse deines Chips liegt zwischen &hE8 bis &hEE !

Deine &H74 können nicht passen, da fehlt das LSB.
Demnach müsste dein Chip auf &hE8 reagieren.

&H74 = 01110100 binär
&HE8 = 11101000 binär

Grüße,
Cassio
 
Hallo RoTo!

Wie ich eben gerade gesehen habe, hattest du die Chip-Adresse im zweiten Beispiel ja schon geändert.
Demnach ist die Hürde ja schon genommen.

Wenn ich mir jetzt deinen Programmcode so ansehe und das Datenblatt dazu nehme, dann passt das meiner Meinung nach nicht zusammen.

Das Datenblatt finde ich auch nicht so gelungen, aber ich bin der Meinung....

Du sendest als erstes die Chip-Adresse,
dann folgt &HFD für das Command Register,
nun musst du dich entscheiden:
Möchtest du die LEDs direkt ansteuern, musst du ein Frame Register von 1 bis 8 (&B0000_0000 bis &B0000_0111) auswählen,
ODER du rufst das Function Register mit &B0000_1011 auf.

Wählst du eines der acht Frame Register, brauchst du nur noch die Daten senden um die LED`s anzusprechen.

Wählst du aber das Fuction Register, muss im nächsten Byte erst mal die Page ausgewählt werden z.B. &H05, für das Display Option Register.
Erst dann folgt das Byte mit Daten, was in die Page geschrieben werden soll (also nun in das Display Option Register).

Wichtig ist auch, jeden Vorgang mit "I2cstop" abzuschließen.

Das bedeutet also, wenn du Daten in die Frames schreibst um die LED`s anzusteuern, dann muss danach ein Stop-Signal kommen.
Erst danach kannst du eine neue Operation wählen (neues Start-Signal) und im Function Register Änderungen vornehmen.
Es funktioniert natürlich auch anders herum. ;)
Also erst im Function Register die Änderungen vornehmen und dann die LED`s ansteuern.

Bedenken musst du nur, dass das Übertragen der Daten in das Function- oder Frame Register zwei verschiedene Paar Schuhe sind! :)


Ich hoffe jetzt nur, ich habe das Datenblatt richtig verstanden.....
und du hast mich nun auch richtig verstanden.....
und kannst es umsetzen. :)


Grüße,
Cassio
 
Zuletzt bearbeitet:
Hi Cassio,
es ist schön auch von dir zu hören:), ich wahr letzte zeit für die Firma sehr viel unterwegs, teilweise auch im Ausland.
Meinem Hobby konnte ich deshalb nicht so richtig nachkommen.

Aber die Hoffnung stirbt zu Letzt;).
Ich bin sehr froh das du mich nicht vergessen hast, und dich hier gemeldet hattest:):).

Ich schreibe gerade aus Büro, werde morgen das was du mir geschrieben hast zu hause in ruhe durchlesen und Abends mich hier melde.

Mann bin ich FROH!!!
Bis dann und schönen Abend.
 
Hallo RoTo!

Natürlich habe ich an dich gedacht.....
und wie du in allen Beiträgen zur Matrix lesen kannst, sogar schon öfter. ;)

Fand es damals nur seltsam, dass du dich gar nicht mehr gemeldet hast.
Egal.... auf alle Fälle sind die Routinen schon lange fertig. :)


Nun wieder zu deinem aktuellen Problem....
Versuch einfach mal meine Tipps umzusetzen und stelle deinen Testcode immer wieder hier rein.
Versuch erst mal nur die LED`s nach deinen Wünschen anzusteuern und lass den zusätzlichen Krams wie Dimmer und Ähnliches erst mal weg. Halte das Programm so kurz und unspektakulär wie möglich!
Wenn die LED`s sich problemlos und geplant steuern lassen, können wir mit den "Extras" spielen.

Der Chip klingt auf alle Fälle wegen der Audio-Ansteuerung echt interessant.
Bin ja mal gespannt, wie das hinterher so aussieht. :)

Wünsch dir nun erst mal viel Spaß beim Tüfteln. ;)


Viele Grüße,
Cassio
 
Hallo Cassio,
erst mal dazu:
Es sei denn, du benötigst diese nicht mehr und möchtest sie der Allgemeinheit zur Verfügung stellen. ;)
Sicher sollst du es behalten, so wahr es Ausgemacht.:rolleyes:;)

Auch wenn das schon drei Jahre her ist aber ich Erinnere mich das du was um gelötet hast auf dem LED Board? aber dazu später, ok?

Jetzt ist mir noch eins nicht Klar, zu der Übertragung:

Wenn ich mir " Figure 5 Writing to IS31FL3731(Typical)" anschaue dann kann ich doch alles in einem
Block übertragen oder?
Oder muss ich (Start) Adresse (Stop), (Start) Befehlsregister (Stop) und....

I2cstart
I2cwbyte ADDRESSE
I2cstop

I2cstart
I2cwbyte COMM_REG '&B1110 1101 = &HFD - Befehlsregister
I2cstop

I2cstart
I2cwbyte REG_CONFIG '&B0000 0000 = &H00 - Befehlsregister Frame 1
I2cwbyte &H00 'LED Control Register CA1
I2cwbyte &B1111_1111 'Alle LED CA1...8 an
I2cwbyte &H01 'LED Control Register CB1
I2cwbyte &B1111_1111 'Alle LED CB9...16 an
I2cwbyte &H12 'Blink Control Register CA1
I2cwbyte &B00000000 ' Aus
I2cwbyte &H13 'Blink Control Register CB1
I2cwbyte &B00000000 'Aus
I2cstop

Funktion Register möchte ich nicht anfassen, es muss erst die Kommunikation funktionieren.

Also was sagst du dazu?

Grüß
 
Zuletzt bearbeitet:
Hallo RoTo!

Scheinbar hast du mich falsch verstanden. ;)


Die Übertragung müsste für die LED`s z.B. so ablaufen:
START --- Adresse (&HE8) --- Command Register (&HFD) --- Frame Register (z.B. &H00) --- DATA (z.B. &H11) --- STOP

Dann sollten die ersten 18 LED`s (2 x 9) leuchten.


Wenn du das Function Register ansprechen möchtest, könnte es so aussehen:

START --- Adresse (&HE8) --- Command Register (&HFD) --- Funktion Register (&B000_1011) --- Display Option Register (&H05) --- DATA (&B0000_1010) --- STOP

Dann sollte das Display eigentlich mit einer 0,54s Blinkperiode blinken.


Versuch es doch einfach mal. :)

Grüße,
Cassio
 
Hallo Cassio,
Die Übertragung müsste für die LED`s z.B. so ablaufen:
START --- Adresse (&HE8) --- Command Register (&HFD) --- Frame Register (z.B. &H00) --- DATA (z.B. &H11) --- STOP

Dann sollten die ersten 18 LED`s (2 x 9) leuchten.

Ist das nicht das was du mir Sagen willst?



CodeBox BascomAVR
I2cstart
I2cwbyte ADDRESSE                                            'Ship Adresse
I2cwbyte COMM_REG                                           '&B1110 1101 = &HFD - Befehlsregister
I2cwbyte REG_CONFIG                                         '&B0000 0000 = &H00 - Befehlsregister Frame 1
I2cwbyte &H00                                                      'LED Control Register  CA1
I2cwbyte Ca                                                          'Ca = &B1111_1111 alle an
I2cwbyte &H01                                                      'LED Control Register  CB1
I2cwbyte Cb                                                          'Cb = &B1111_1111 alle an
I2cwbyte &H12                                                      'Blink Control Register  CA1
I2cwbyte &B00000000                                           'Alle aus
I2cwbyte &H13                                                      'Blink Control Register  CB1
I2cwbyte &B00000000                                           'Alle aus
For REG_PWM = 36 to 51                                     'PWM Register  Dec 36 - 51 (Hex [B]24h bis 33h)[/B]
        I2cwbyte REG_PWM
        I2cwbyte PWM                                             'PWM =255
 NEXT REG_PWM
I2cstop


So habe ich das Datenblatt Interpretiert aber ohne Erfolg.

Sorry, verstehe ich was Falsch?

Grüß
 
Hallo RoTo!

Vergleich doch noch mal was ich geschrieben habe.....
und dann was du daraus gemacht hast!

Ich hatte doch schon geschrieben:
Die LED`s im Frame Register ansteuern ist EINE Sache.....
jedoch Einstellungen im Function Register vornehmen eine ganz ANDERE Sache!


Grüße,
Cassio
 
Hallo Cassio,

Ich habe jetzt umgesetzt 1:1.

Die Übertragung müsste für die LED`s z.B. so ablaufen:
START --- Adresse (&HE8) --- Command Register (&HFD) --- Frame Register (z.B. &H00) --- DATA (z.B. &H11) --- STOP

Dann sollten die ersten 18 LED`s (2 x 9) leuchten.



CodeBox BascomAVR
 I2cstart
 I2cwbyte ADDRESSE                                          '&HE8 Slave Busadresse
 I2cwbyte COMM_REG                                          '&HFD - Befehlsregister
 I2cwbyte REG_CONFIG                                        '&H00 - Befehlsregister Page 1
 I2cwbyte &H11         
 I2cstop


Es funktioniert nicht.

Gehört in die Code vielleicht noch etwas?
Denn I2cwbyte &H11 ist doch letzter LED Control Register Matrix B (Cb9...16)
Um z.B. LED 9 und LED 16 anzusprechen, muss ich doch DATA (z.B. &B1000_0001) noch senden?

Auch das habe ich Ausprobiert, geht auch nicht.

Gruß
 
Hallo RoTo!

Generell würde eich deinem Beispiel oben zustimmen!
Kann es sein, dass du erst einmal das Function Register aufrufen musst, damit sich der Chip nicht im Soft-Shutdown oder ähnliches befindet?

Richtig!!!
Die Frame Register für die LED`s sind &H00 bis &H11
(18 Frame Register mal 8 LED`s sind gleich 144 Led`s)

In jedes dieser 18 Speicherzellen kannst du dann Werte von &H00 (&B0000_0000) bis &HFF (&B1111_1111) angeben.

Seltsam, dass die Anzeige nicht reagiert.

Es gäbe noch eine andere Möglichkeit der Schreibweise unter BASCOM für I2C.
Vielleicht klappt es ja mit I2csend?

Grüße,
Cassio
 

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