Forum: Mikrocontroller und Digitale Elektronik Programmierstil I2C Display DMA


von Peter F. (peter_da_steht_er)


Lesenswert?

Hallo, ich habe eine Frage zum Programmablauf. Ich verwende einen 
STM32F1, also eine DMA Kanal steht zur Verfügung. Mein Programm ist im 
Moment noch so aufgebaut, dass z.B die Funktion lcd_puts("Hallo") erst 
verlassen wird, wenn das "Hallo" gesendet wurde. Das Display 20*4 hängt 
an einem PCf8574t(I2C 100kHz), somit dauert dies verhältnismäßig lange. 
Meine Idee wäre durch die Funktion "lcd_puts" ein Puffer mit den 
I2C-Daten befüllen zu lassen und am Ende meiner Main-While, diese dann 
per DMA zu senden. Idee zwei: ein 3-dimensionales Array zu fülle und 
dann auch wieder per DMA zu senden.
Die zwei Möglichkeiten sind eigentlich sehr ähnlich.
Was wäre noch denkbar?

Vielen Dank für die Ratschläge.

von Max D. (max_d)


Lesenswert?

Bastel dir ne fifo.
Du lädst den Text in den Puffer und jedesmal wenn I²C nen byte 
verschickt hat lädst du im interrupt das nächste. Ist wenn man es 
richtig macht sogar (nahezu) Platformunabhängig....

Nachtrag: hat den zusätzlichen Vorteil, dass der Int schlauer ist als 
der DMA und du das EN-Pin gewackel nicht mit-buffern musst.

: Bearbeitet durch User
von Peter F. (peter_da_steht_er)


Lesenswert?

Hallo, danke für die Idee.
Ich werde sie umsetzten, aber ich kann noch schlecht einschätzen, ob es 
noch "ok" ist die Logik in der Interrupt Routine zu progammieren, oder 
eher eine flag zu setzten und dann im Main weiter verarbeiten?

viele Grüße Peter

von Max D. (max_d)


Lesenswert?

Also ich sprech hier eher aus AVR-Fahrung ^^, aber hier lohnt es sich 
für etwas so einfaches wie ne fifo abzufeiern eher keine Verlagerung in 
die main(). Man muss den Handler halt optimiert anlegen und damit die 
Durchlaufzeiten klein halten.

Atmel hat eine schöne Appnote ( http://www.atmel.com/Images/doc2564.pdf 
) dazu wie man deren TWI-Module auf dem AVR Interrupt basiert anspricht. 
Das Grundkonzept ist aber natürlich universell anwendbar ^^

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Ein 20x4 LCD sollte mit einem 100kHz I2C pfeilschnell befüllt werden. 
Lass die Daten von der Main bei jedem Umlauf oder bei jedem 2. 
aktualisieren, indem Du ein oder einige wenige Byte schickst. Davon 
merkt das restliche Programm fast gar nichts. Das I2C fertig Flag kannst 
Du auch hier zum Triggern eines neuen Transfers verwenden. Der 
darzustellende Text kommt in einen 4x20 Byte Puffer, der quasi 
automatisch rausgerödelt wird. Dein Programm muss dann nur noch in 
diesen Puffer schreiben und kann dies zu jeder Zeit tun, auch aus einem 
Interrupt.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.