Gast
#4001497
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;
}