Codeoptimierung LPC1769

Gast #4001497
Lesenswert?
• ▲
▼
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;
}
#4002057
Lesenswert?
• ▲
▼
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.
Gast #4002980
Lesenswert?
• ▲
▼
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.