Forum: Mikrocontroller und Digitale Elektronik LPC17XX Daten geschickt an Bus anlegen


von Johannes (Gast)


Lesenswert?

Hallo,

ich habe mir ein LPC Xpresso Board gekauft, da ich mal mit einem Cortex 
M3 rumspielen wollte. Da ich auch noch nie selbst ein Display 
angesteuert habe, will ich auch einen "Treiber" dafür schreiben.
Das Display hat einen 16 Bit Datenbus.
Da die Pins auf dem Testboard ziemlich durcheinander rausgeführt werden, 
dachte ich mir, dass ich den Datenbus auch an beliebige Pins anschließen 
kann (solange sie zu einem Port gehören).
In der Theorie funktioniert dieser Plan auch ABER, das ganze ist 
ziemlich langsam!

Der wichtigste Teil meiner "data" und "command" Funktion für das Display 
ist folgender:
1
  LCD_PORT0->FIOMASK = ~(0x0000 | (  \
2
              (1 << LCD_DB0) | (1 << LCD_DB1) | (1 << LCD_DB2) | (1 << LCD_DB3)  | \
3
              (1 << LCD_DB4) | (1 << LCD_DB5) | (1 << LCD_DB6) | (1 << LCD_DB7)  | \
4
              (1 << LCD_DB8) | (1 << LCD_DB9) | (1 << LCD_DB10)| (1 << LCD_DB11) | \
5
              (1 << LCD_DB12)| (1 << LCD_DB13)| (1 << LCD_DB14)| (1 << LCD_DB15) | \
6
              (1 << LCD_RS)  | (1 << LCD_WR)  | (1 << LCD_RD)));
7
  LCD_PORT0->FIOPIN  =   ((((com >> 0) & 0x01) << LCD_DB0) | \
8
              (((com >> 1) & 0x01) << LCD_DB1) | \
9
              (((com >> 2) & 0x01) << LCD_DB2) | \
10
              (((com >> 3) & 0x01) << LCD_DB3) | \
11
              (((com >> 4) & 0x01) << LCD_DB4) | \
12
              (((com >> 5) & 0x01) << LCD_DB5) | \
13
              (((com >> 6) & 0x01) << LCD_DB6) | \
14
              (((com >> 7) & 0x01) << LCD_DB7) | \
15
              (((com >> 8) & 0x01) << LCD_DB8) | \
16
              (((com >> 9) & 0x01) << LCD_DB9) | \
17
              (((com >> 10) & 0x01) << LCD_DB10) | \
18
              (((com >> 11) & 0x01) << LCD_DB11) | \
19
              (((com >> 12) & 0x01) << LCD_DB12) | \
20
              (((com >> 13) & 0x01) << LCD_DB13) | \
21
              (((com >> 14) & 0x01) << LCD_DB14) | \
22
              (((com >> 15) & 0x01) << LCD_DB15) | \
23
              (1 << LCD_RD));

Ich habe leider nicht bedacht das die Schiebeoperationen und 
Verknüpfungen so viel Zeit in Anspruch nehmen ... ( von 220 Clockcycles 
für einen Command gehen 190 Clockcycles auf das umsortieren)...

Gibt es da noch einen Weg raus den ich nicht sehe??? Oder hilft nur neu 
verkabeln und zwar diesmal in der "richtigen" Reihenfolge...

Dank und Gruß
Johannes

von Albert .. (albert-k)


Lesenswert?

Du könntest versuchen die Daten und Ports zumindest Stücklesweise 
zusammen zu halten (also bsw. 4bit hintereinander). Viel anderes wird 
dir nicht übrig bleiben.
Andere möglichkeit wäre über SPI zu gehen und die 16bit Daten bsw. in 
Seriell-Parallel Wandler zu schieben. SPI geht selbst auf nem Steckbrett 
noch mit etwa 2MHz ganz gut.

von Johannes (Gast)


Lesenswert?

Hallo Albert,

danke... habe ich mir fast gedacht, wollte es aber nicht glauben .... 
najo gibt wohl bald ne neue Platine.
Danke dir!
Grüße
Johannes

von Gerhard G. (xmega)


Lesenswert?

Hallo,

Johannes schrieb:
> ich habe mir ein LPC Xpresso Board gekauft, da ich mal mit einem Cortex
>> M3 rumspielen wollte

das hab ich mir auch gedacht, das was diese Firma an Port's abliefert, 
ist unter aller S.. SPI hin, I2C her, 16 Bit kann man schlicht und 
einfach vergessen.  Ich bleib bei meinen Atmegas und im speziellen bei 
den Xmegas.


Gruß Xmega

von Johannes (Gast)


Lesenswert?

Hm, ja du hast recht. Komplette 16 Bit am Stück gibts nur bei Port 0 und 
die Pins sind überall verteilt. Auch sonst sieht die Pinverteilung wild 
aus.
Denke in der nächsten Version werdens 8 Pins an Port 1 und 8 Pins an 
Port 0, das ist dann schnell genug.
Sonst ist das aber ein klasse Teil, ich bin echt begeistert. Was mich am 
meisten wundert die sind Teilweise spott billig und haben echt ne Menge 
zu bieten...
Grüße
Johannes

von Jörg S. (joerg-s)


Lesenswert?

Johannes schrieb:
> Komplette 16 Bit am Stück gibts nur bei Port 0
Und Port 1

von Gerhard G. (xmega)


Lesenswert?

Hallo,

Johannes schrieb:
> Was mich am meisten wundert die sind Teilweise spott billig

der Preis ist unschlagbar!!  Hier steckt Marketing dahinter.


Ich wollte eigentlich ein Projekt mit einem TFT-Display realisiern.

16 Bit parallel. Das sollte aber nicht sein. Nun habe ich mir eine tolle

Astro-Uhr (Display mit SPI) gebaut. Toller RTC-Baustein, Uhr, Timer, 
Alarm.

Ansonsten bin ich deiner Meinung.


Beitrag "Billiges Cortex-M4-Board STM32F4DISCOVERY jetzt erhältlich"

Das solltest du dir auch mal anschauen. Habe mir bereits zwei dieser
STM32F4-Dicovery bestellt und in Betrieb genommen. Muss mich noch ein 
bisschen an die Befehle des STM32M.. gewöhnen. Die Ports sind hier 
deutlich besser angeordnet und a l l e auf der Platine herausgeführt.

Sound, USB, Beschleunigungssensor können sofort getestet werden.



Gruß Xmega

von Kai F. (k-ozz)


Lesenswert?

Um deinen aktuelle Verdrahtung zu beschleunigen, kannst du auch den 
recht berechnungsintensiven Befehl (LCD_PORT0->FIOPIN = ...) ersetzen, 
indem zu dir zwei LUTs anlegst. Das kostet dich zwar 2k RAM, aber es 
sollte um einiges schneller laufen.
1
uint32_t LCD_LUTL[256];
2
uint32_t LCD_LUTH[256];
3
4
LCD_PORT0->FIOPIN = LCD_LUTL[com & 0xFF] | LCD_LUTH[com >> 8] | (1 << LCD_RD);

Die LUTs musst du dann beim Programmstart einmal berechnen, oder bereits 
einkompilieren.
1
for (i=0;i<256;i++)
2
{
3
  LCD_LUTL[i] = 0;
4
  if (i & (1 << 0)) LCD_LUTL[i] |= (1 << LCD_DB0);
5
  if (i & (1 << 1)) LCD_LUTL[i] |= (1 << LCD_DB1);
6
  if (i & (1 << 2)) LCD_LUTL[i] |= (1 << LCD_DB2);
7
  if (i & (1 << 3)) LCD_LUTL[i] |= (1 << LCD_DB3);
8
  if (i & (1 << 4)) LCD_LUTL[i] |= (1 << LCD_DB4);
9
  if (i & (1 << 5)) LCD_LUTL[i] |= (1 << LCD_DB5);
10
  if (i & (1 << 6)) LCD_LUTL[i] |= (1 << LCD_DB6);
11
  if (i & (1 << 7)) LCD_LUTL[i] |= (1 << LCD_DB7);
12
13
  LCD_LUTH[i] = 0;
14
  if (i & (1 << 8)) LCD_LUTH[i] |= (1 << LCD_DB8);
15
  if (i & (1 << 9)) LCD_LUTH[i] |= (1 << LCD_DB9);
16
  if (i & (1 << 10)) LCD_LUTH[i] |= (1 << LCD_DB10);
17
  if (i & (1 << 11)) LCD_LUTH[i] |= (1 << LCD_DB11);
18
  if (i & (1 << 12)) LCD_LUTH[i] |= (1 << LCD_DB12);
19
  if (i & (1 << 13)) LCD_LUTH[i] |= (1 << LCD_DB13);
20
  if (i & (1 << 14)) LCD_LUTH[i] |= (1 << LCD_DB14);
21
  if (i & (1 << 15)) LCD_LUTH[i] |= (1 << LCD_DB15);
22
}

Wenn die 2k RAM zu viel sind, so kannst du auch 4 LUTs mit jeweils 16 
Einträgen machen, sodass nur 256 Byte benötigt werden, allerdings ist es 
damit in der Ausführung wieder langsamer.

von Johannes (Gast)


Lesenswert?

Hallo zusammen,

Jörg S. schrieb:
> Johannes schrieb:
>> Komplette 16 Bit am Stück gibts nur bei Port 0
> Und Port 1

-> Das war auf das xpresso Board bezogen. Da sind manche Pins nicht 
rausgeführt.

Gerhard G. schrieb:
> der Preis ist unschlagbar!!  Hier steckt Marketing dahinter.

Ja das ist klar. Die Boards sind super billig. Damit machen die 100% 
keinen Gewinn. Aber auch wenn man die Prozzis einzeln kauft sind sie 
nicht teuer (rede von meinem Bastlerleben nicht von einer Großserie ;-) 
) Ich glaube der LPC1751 wars ... gibts für 2,50 Euro

Gerhard G. schrieb:
> Das solltest du dir auch mal anschauen.

Das hättest du nicht machen dürfen .... :-D Wollt doch erstmal an dem 
rumschrauben was ich noch habe ... jetzt bin ich schon wieder am 
überlegen HAHA .. DANKE!!!

Kai F. schrieb:
> aktuelle Verdrahtung zu beschleunigen

WOW das ist noch mal ne Idee!!! Ich glaube ich schreibe das wirklich 
erstmal in den Flash, davon habe ich mehr als ich brauchen kann...
Danke!!! das probiere ich morgen mal aus... mal sehn wieviele 
Clockcycles es spart. Danke noch mal für deine Mühe! Ich werde 
berichten...

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.