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.
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
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
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 ^^
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.