INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
I²C Buffergrösse
04.09.2016, 16:58
Beitrag #1
I²C Buffergrösse
Kann es sein, das man mit I²C nur 32 Byte auf einmal übertragen kann ?

Send tut der Master die Daten so, wobei bis ein wert bei "max" bis 32 funktioniert, habe ich einen höheren Wert, geht der Rest verloren.
Code:
    Wire.beginTransmission(LS_Adr);
    for (signed char i = 0; i <= max - 1; i++) {
        Wire.write(vram[i]);
    }
    Wire.endTransmission();

Beim Slave sieht es so aus:
Code:
void receiveEvent(int data) {
    char ch;
    I2C_aktiv = true;

    int bSize = Wire.available();
    bSize = 64;  //  Testweise

    for (signed char i = 0; i <= bSize - 1; i++) {
        ch = Wire.read();
        vram[i] = ch;
    }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2016, 17:14
Beitrag #2
RE: I²C Buffergrösse
Hallo Mathias,
das scheint in der Tat so zu sein dass der Wire-Puffer nur 32 Byte hat.
Mehr ist wohl machbar, aber dazu muss man die Wire-Library patchen. Angry

Aber Wire.endTransmission() liefert einen Rückgabewert.
0:success
1:data too long to fit in transmit buffer
2:received NACK on transmit of address
3:received NACK on transmit of data
4:other error

Das hilft dir jetzt nicht weiter, aber du kannst damit Fehler abfangen.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2016, 17:29
Beitrag #3
RE: I²C Buffergrösse
Wenigsten weiss ich jetzt, das ich nicht eine Fehler eingebaut habe.
Zitat:Mehr ist wohl machbar, aber dazu muss man die Wire-Library patchen. Angry
Die lasse ich besser in Ruhe, aus irgend einem Grund lässt die nicht mehr durch.

Ich werde am besten das Problem umgehen, in dem ich mehrere Pakete schicke.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2016, 18:44
Beitrag #4
RE: I²C Buffergrösse
(04.09.2016 17:29)Mathias schrieb:  ...
Ich werde am besten das Problem umgehen, in dem ich mehrere Pakete schicke.
Das ist sicher die beste Lösung wenn das machbar ist.

Dennoch Dank an dich dass du diese Frage gestellt hast, sonst wäre ich bald in das gleiche Messer gelaufen. Smile
Ich bin gerade dabei ein FRAM via I²C an den Arduino zu klemmen.
Ein-, Zwei- und Vierbyte-Variablen schreiben und lesen geht schon. Die Bytes werden dabei einzeln verarbeitet.

Das FRAM hat aber auch einen "Multi-Byte Write" Modus. Dazu sendet man erst eine Startadresse und dann Datenbytes, theoretisch bis der Speicher voll ist. Man könnte also den Inhalt einer struckt-Variablen mit z.B. 100 Byte komplett am Stück wegschreiben. Mit der jetzt erkannten Einschränkung auf 32 Byte kann ich den Versuch dann begraben.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2016, 19:10 (Dieser Beitrag wurde zuletzt bearbeitet: 04.09.2016 19:13 von Mathias.)
Beitrag #5
RE: I²C Buffergrösse
So wie es aussieht, ist das Problem gelöst.

Code:
void WriteVRAM() {
    for (signed char b = 0; b <= 3; b++) {
        Wire.beginTransmission(LS_Adr);
        Wire.write(b);
        for (signed char i = 0; i <= 16 - 1; i++) {
            Wire.write(vram[i + b * 16]);
        }
        Wire.endTransmission();
        //delay(1000);
    }
}

Code:
void receiveEvent(int data) {
    char ch;
    I2C_aktiv = true;

    int bSize = Wire.available();
    bSize -= 1;

    char b = Wire.read();
    if (b > 3)
        return;

    for (signed char i = 0; i <= bSize - 1; i++) {
        ch = Wire.read();
        vram[i + b * 16] = ch;
    }
}

Das Ganze steuert eine Eigenbau-Laufschrift:
Film

Bis gestern hatte ich den Fehler noch nicht bemerkt, das ich erst 32 LED-Spalten hatte.
Heute hatte ich 35, und somit passierte bei den letzten 3 Spalten nichts.

Was ich nebenbei noch festgestellt habe, der Atmega328 hat recht viel Rechenpower, was Multiplexen anbelangt.

Ich habe folgende Werte bei der Timerinizialisierung.
Code:
//    Timer1.initialize(3000);
    Timer1.initialize(90);

Bei 3000 ist das Bild gerade noch Flimmerfrei.
Bei 90 mag das Programm grade noch die Daten sauber zu empfangen.

Somit hätte der Atmega theoretisch genügend Power um eine 16x16x16 Led-Kube anzusteuern, weil das (nur) 8x mehr LEDs sind, wie bei meiner Laufschrift.

Was ich aber noch interessant finde, das icd das delay WriteVRAM() ausklammern konnte. So wie es aussieht, braucht es nach den Paketen keine Verschnaufpause.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2016, 19:29
Beitrag #6
RE: I²C Buffergrösse
Deinen Code lasse ich jetzt mal unkommentiert. Undecided
Ich stecke da zu wenig drin was z.B. "Timer1.initialize(3000);" bedeutet.
Das Filmchen sieht aber richtig gut aus. Smile Und das via I2C.

Mittels SPI geht da vermutlich noch mehr. Hier gibt es zwei Videos sie ich sehenswert finde.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2016, 19:46 (Dieser Beitrag wurde zuletzt bearbeitet: 04.09.2016 19:46 von Tommy56.)
Beitrag #7
RE: I²C Buffergrösse
(04.09.2016 18:44)ardu_arne schrieb:  Dennoch Dank an dich dass du diese Frage gestellt hast, sonst wäre ich bald in das gleiche Messer gelaufen. Smile
Ich bin gerade dabei ein FRAM via I²C an den Arduino zu klemmen.
Ein-, Zwei- und Vierbyte-Variablen schreiben und lesen geht schon. Die Bytes werden dabei einzeln verarbeitet.

Welches FRAM hast Du? Bei mir liegen ein paar FM24C16B rum, um die ich mich irgendwann mal kümmern will.
Machst Du eine Lib draus? Wenn ich die Winzlinge auf eine Platine gelötet bekomme, könnte ich testen.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.09.2016, 21:05
Beitrag #8
RE: I²C Buffergrösse
Ich habe ein FM24C04B, ein FM24C16B und ein FM24C64B zum testen hier. Adapterplatinchen habe ich verwendet um die "Kleinen" auf DIP8 Format zu bringen.
Eine Lib bauen will ich nicht, habe keine Ahnung davon. Confused

Am einfachsten zu handhaben ist ein FM24C64B. Der erhält per I²C eine 16 Bit Adresse für die Speicherzelle und damit kann man den von 0x0000 bis 0x1FFF linear durchadressieren.

Beim FM24C04B und FM24C16B wird über I²C nur eine 8 Bit Adresse für die Speicherzelle übertragen. Deshalb muss man dort zusätzlich die Adresspins A0, A1, A2 für ein Pageselect bedienen. Das kostet zusätzliche Pins am Arduino.

Für die gängigen Datenformate läuft inzwischen alles auch mit 400kHz I²C-Takt. Smile
Ich will mir zum Testen mal die FM25C160B besorgen die per SPI bedient werden.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste