Hallo Elektronikfreunde, ich habe hier ein lpcxpresso 1769 und ein altes DruckerTFT rumliegen. Da ich eine große Anzeige benötige, habe ich mal beides zusammengebracht und mit etwas Code schonmal prinzipiell zum laufen bekommen. Die Zeichenausgabe zum Display ist aber recht zeitkritisch, mit einer Schleife gelingt es mir nicht. Kann mir vielleicht jemand auf die Sprünge helfen, wie ich dort optimieren kann? Danke schonmal Holger #include "lpc17xx.h" #include "rittimer.h" #include "font8x12.h" #include "ssp1.h" volatile uint32_t rit_timer_counter = 0; int i; uint8_t out, y, jx; uint16_t NextEnab; int CHZeile = 0; int ASCIIZeile = 0; int BSZeile = 0; char display[10][24]={ "Test Zeichenausgabe_", // 10 Zeilen mit mindestens 20 Zeichen "Zeile 2", "AAAAAAAAAAAAAAAAAAAA", "0xDB,Zeile 4", "Zeile 5", "Zeile 6", "Zeile 7", "Zeile 8", "Zeile 9", "Letzte Zeile"}; char *Zeiger; #define enab_h LPC_GPIO2->FIOSET = (1<<8); // ENAB High #define enab_l LPC_GPIO2->FIOCLR = (1<<8); // ENAB LOW /************************************************** **************************** ** Function name: RIT_IRQHandler ** ** Descriptions: RIT timer interrupt handler ** ** parameters: None ** Returned value: None ** ************************************************** ****************************/ void RIT_IRQHandler (void) { LPC_RIT->RICTRL |= (0x1<<0); /* clear interrupt flag */ if (LPC_RIT->RICOMPVAL == 160) { // Interrupt nach HSync ? LPC_RIT->RICOMPVAL = 660; // theoretisch 640 Takte zum nächsten Interrupt // aber mit 660 klappts wr_ssp1(Font[*Zeiger++*12+CHZeile]); LPC_GPIO2->FIOSETL = NextEnab; // setzt Enab wenn Bit in NextEnab High /* for (i = 1; i < 20; i++) { wr_ssp1(Font[(display[ASCIIZeile][i])*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); }*/ wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); wr_ssp1(Font[*Zeiger++*12+CHZeile]); } else { // Interrupt nach Daten, also Enable low LPC_RIT->RICOMPVAL = 160; enab_l; BSZeile++; y++; if (y>3) { // 4 Bildchirmpixel pro Zeichenpixel CHZeile++; y=0; } if (CHZeile > 11) { // 12 Zeilen pro Zeichen CHZeile = 0; ASCIIZeile++; } Zeiger = display[ASCIIZeile]; if (BSZeile > 479) { // VSync ? NextEnab = 0; // ENAB bleibt jetzt Low } if (BSZeile > 527) { // VSync Ende ? Wert durch Versuch rausgefunden BSZeile = 0; // Zurück auf 0! y = CHZeile = ASCIIZeile = 0; NextEnab = (1<<8); // Enab wird wieder High // vsync_h(); } } return; }
Die SSP Einheiten des LPC176x unterstützen DMA. Mit 2 Zeilenpuffern im RAM könnte man dann immer eine Zeile ausgeben und die nächste gleichzeitig vorberechnen. Wieviele Bits überträgt der SPI? Bei 8 Bits braucht man für die 20 Bytes 320 Takte, denn der SSP teilt mindestens durch 2 im Master Mode.
Danke für die Anregung. Ich habe jetzt das komplette TFT im RAM gepuffert. Hat den Vorteil, den Cursor und Grafik darstellen zu können. DMA hab ich mir angeschaut, mal sehen obs gelingt. Da das Display eigentlich ein Farbdisplay ist, könnte man ja den anderen SSP für etwas Farbe nutzen. Ich habe aber dem user manual des lpc1769 nicht entnehmen können, wie man ssp0 und ssp1 taktgleich starten kann. Hat dazu jemand einen Hinweis? Grüße Holger
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.