Salut,
ich arbeite gerade an einem Grafik-Touchscreen-Terminal, das Teil eines
größeren Projekts ist, um alten Elektronik-Experimentierkästen (Philips,
Schuco, Kosmos) wieder neues Leben einzuhauchen. Das Projekt wird in
einem anderen Forum beschrieben
(http://server23.hostpoint.ch/~rigertc/rigert.com/ee-forum/viewtopic.php?f=35&t=1601).
Das Grafik-Touchscreen-Terminal verwendet eine China-Standardplatine mit
4,3"-TFT-Touchscreen und dem SSD1963 als Controller. Die Ansteuerung von
außen zum Experimentieren erfolgt rein seriell und wird durch zwei MC's
(644 für die Grafik und 88 für Touch/Tasten) geleistet. Das ganze
basiert auf der UTFT-Library und bietet die Möglichkeit, mit ganz wenig
Aufwand ein Terminal oder Diagramme oder Eingabeeelemente wie Menüs,
Listen usw. zu nutzen. Unser Ziel ist, eine möglichst vielseitige
Platine zu schaffen und den Nutzern den Einstieg möglichst einfach zu
machen - soweit die Einführung zum Projekt. Ein paar Bilder habe ich
angehängt. Codes dazu und die ganze Anleitung gibt's hier:
https://www.dropbox.com/l/kX19SfyLe0x575egbAjxKc
Nun aber zu meinem Problem: Ich habe es bisher nicht geschafft, aus dem
SSD1963 einzelne Pixeldaten auszulesen. Leider ist google hier nicht
mein Freund - es gibt zwar die Doku, nach der es funktionieren sollte,
aber keinen lauffähigen Codeteil, der zeigt, wie es richtig gemacht
wird. Die Tipps, die ich finden konnte, führten zum folgenden Code:
1
unsignedintgetPixel(unsignedintx0,unsignedinty0)
2
{
3
unsignedintpixeldat,r/*, g, b */;
4
5
setXY(x0,y0,x0,y0);
6
LCD_Write_COM(0x2E);// Read_Memory_Start
7
8
sbi(PORTD,B_WR);
9
sbi(PORTD,B_RS);
10
11
set_direction_registers_read();
12
PORTA=0xFF;
13
PORTC=0xFF;
14
15
pulse_low(PORTD,B_RD);//R_D = 0; //dummy read
16
pulse_low(PORTD,B_RD);// R_D = 0;
17
18
r=PINA;
19
pixeldat=(r<<8)+PINC;
20
21
/*
22
cbi(PORTD, B_RD); // R_D = 0;
23
sbi(PORTD, B_RD); // R_D = 1;
24
g = PINA;
25
26
cbi(PORTD, B_RD); // R_D = 0;
27
sbi(PORTD, B_RD); // R_D = 1;
28
b = PINA;
29
*/
30
31
//pixeldat = (b<<11)+(g<<5)+(r<<0);
32
33
set_direction_registers_write();
34
sbi(PORTD,B_CS);
35
returnpixeldat;
36
}
Wie unschwer zu erraten ist, funktioniert er leider nicht. Es kommt
immer dieselbe Farbe zurück. Ich habe die Routine benutzt, um ein 50x50
Pixdel großes Rechteck auszulesen und zu "kopieren" - leider ohne
Erfolg. Der "dummy read" im Code stammt bereits aus einem der Tipps zum
Auslesen. Es funktioniert mit genauso wenig wie ohne.
Falls jemand das Auslesen des Speichers erfolgreich gelöst hat, würde
ich mich über eine Unterstützung freuen.
Viele Grüße,
Frank
> setXY(x0,y0,x0,y0);> LCD_Write_COM(0x2E); // Read_Memory_Start
Ich nehme mal an, Dein Problem ist bereits gelöst ;)
Falls nicht:
Wahrscheinlich wird beim setXY-Befehl nur das Fenster incl. Koordinaten
zum Schreiben gültig(*).
Der LCD_Write_COM(0x2E) läuft dann ins Leere bzw liest kein Fenster,
sondern nur ein einziges Pixel aus (das von x0,y0).
Ich habe den getXY-Command genauso aufgebaut wie den setXY, also erst
die beiden Words für die columns, dann die beiden Words für die pages,
und dann als einzigen Unterschied zum setXY nicht den 0x2C-Befehl zum
Schreiben, sondern wie Du auch 0x2E zum Lesen.
getXY:
1
TFT_Write_COM(CMD_SET_COL_ADDRESS);//0x2A
2
TFT_Write_DATA((x1>>8)&0xFF);
3
TFT_Write_DATA(x1&0xFF);
4
TFT_Write_DATA((x2>>8)&0xFF);
5
TFT_Write_DATA(x2);
6
TFT_Write_COM(CMD_SET_PAGE_ADDRESS);//0x2B
7
TFT_Write_DATA((y1>>8)&0xFF);
8
TFT_Write_DATA(y1);
9
TFT_Write_DATA((y2>>8)&0xFF);
10
TFT_Write_DATA(y2);
11
TFT_Write_COM(CMD_READ_MEM_START);//0x2E
Also Fenster setzen, und dann die Bytes für die Pixeldaten ohne weiteres
Kommando abholen.
So geht es bei mir zumindest.
(*)was noch zu beweisen wäre: Setz doch mal mit setXY auf Deine maximale
Displaygröße, also anstatt nur auf ein einzelndes Pixel(x0,y0) auf den
ganzen Screen, z.B. bei 320x240-Display -> setXY(0,0,320-1,240-1).
Wenn Du dann danach dann 0x2E schickst, könnte es trotzdem klappen - hab
ich ehrlich gesagt noch nicht probiert ;)
Salut,
mein Problem habe ich zwischenzeitlich leider noch nicht lösen können
und deshalb die Funktion erst einmal außen vor gelassen.
Daher vielen Dank für deinen Tipp - ich werde es ausprobieren und dann
berichten. Wäre echt klasse, wenn das Pixelauslesen dann auch endlich
klappt.
Grüße, Frank
Hallo zusammen !
Ich bin ein absoluter Anfänger was dieses Thema betrifft. Aber wir haben
ein TFT Display des Typs SSD1963 und da ist ein SD Karten Slot drauf.
Auf dem TFT ist ein Teil zum Bedienen vorbereitet und auf dem oberen
Teil ist das Logo des Herstellers drauf, jetzt habe Ich die SD Karte
entnommen und wollte dort unser Logo einfügen, aber leider hat es nicht
geklappt da es nur Wirre Linien und Punkte anzeigt. Kann mir jemand von
euch helfen ? Bitte !
Hallo alle zusammen,
Ein Freak hat mal wieder ganze Arbeit geleistet! Vielen Dank er trägt
seinen Namen zurecht. Mein Problem ist soweit gelöst !
Vielen Dank
Hallo,
ich habe heute das Problem gelöst und kann nun aus dem
SSD1963-Controller einzelne Pixel auslesen. Es ist aber tatsächlich ein
wenig umständlich und steht so auch nicht in der Doku - vielleicht ist
das der Grund, warum man bei google keine einzige funktionierende
Version von getPixel findet.
1
unsignedintgetPixel(intx,inty)
2
{
3
unsignedcharHi,Lo;
4
unsignedintcolor;
5
6
// erste Runde, liefert Lo-Byte
7
cbi(PORTD,B_CS);
8
setXY(x,y,x,y);
9
LCD_Write_COM(0x2E);// Read_Memory_Start
10
set_direction_registers_read();
11
12
cbi(PORTD,B_RD);// Einmal Lesebefehl als Dummy absetzen
13
NOP;
14
sbi(PORTD,B_RD);
15
cbi(PORTD,B_RD);
16
Lo=PINC;
17
sbi(PORTD,B_RD);
18
19
set_direction_registers_write();
20
// zweite Runde, liefert Hi-Byte
21
LCD_Write_COM(0x2E);// Read_Memory_Start
22
set_direction_registers_read();
23
24
cbi(PORTD,B_RD);// Einmal Lesebefehl als Dummy absetzen
25
NOP;
26
sbi(PORTD,B_RD);
27
cbi(PORTD,B_RD);
28
Hi=PINA;
29
sbi(PORTD,B_RD);
30
31
set_direction_registers_write();
32
sbi(PORTD,B_CS);
33
// Farben zusammensetzen
34
color=((int)Hi<<8)+Lo;
35
returncolor;
36
}
Die Pinbelegungen hängen natürlich davon ab, wie das Panel an den AVR
angeschlossen ist, die grunsätzliche Vorgehensweise ist aber immer die
selbe: es muss zweimal ausgelesen werden. Beim ersten Mal bekommt man
ein gültiges Lo-Byte an den Pins D0-D7, beim zweiten Versuch ein
gültiges Hi-Byte an den Pins D8-D15. Die jeweils korrespondierenden
Bytes am jeweils anderen Port sind ungültig.
Außerdem streikt der Controller bei Farbwerten, bei denen Grün und Blau
voll ausgesteuert sind - er liefert dann einfach Schwarz als Farbe. Es
sieht so aus, als würde da ein Überlauf entstehen. Ich konnte mich hier
darauf beschränken, einfach keine voll ausgesteuerten Farben mehr zu
benutzen; ich ziehe immer das LSB von jeder Farbe ab, wenn sie maximal
wird.
Hi Frank - I am using a 5-inch TFT touch screen and the UTFT library
from Rinky-Dink electronics with an Arduino Mega 2560, and I would like
to add a getPixel() command. I am trying to use your code from your
2015-01-24 14:12 post with the title "Solved: SSD1963 - TFT controller -
read out pixels". I have added your code at the end of the UTFT.cpp, and
included an entry in the header file, but I am having difficulties in
converting your commands "set_direction_registers_read" and
"set_direction_registers_write" into the appropriate commands understood
by the rest of the UTFT library. There is a command
"_set_direction_registers(mode)" which might be nearly the same, but I
would be grateful if you could help. Can you point me to the source code
for "set_direction_registers_read" and "set_direction_registers_write"?
I can send you the UTFT.cpp and UTFT.h files if you think it would help
- best regards - Peter