So tell us more about the guts on the other side. Are you basically taking in data over USB and outputting it to the display? Or do you have a clever external ram mechanism for a display buffer?
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Timothy D. Swieter, E.I. www.brilldea.com - Prop Blade, LED Painter, RGB LEDs, uOLED-IOC, eProto for SunSPOT, BitScope www.tdswieter.com
It certainly looks custom with the circuit board on the back. Soon Brilldea will have a LCD and driver board that has a TV input, but I don't think this is what Rayman is using.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Timothy D. Swieter, E.I. www.brilldea.com - Prop Blade, LED Painter, RGB LEDs, uOLED-IOC, eProto for SunSPOT, BitScope www.tdswieter.com
Not much there...· Just Prop chip, uSD, FTDI USB, 3.3V regulator...
But there's plenty of room for other stuff.
The picture was sent over the USB interface, but soon I'll add support for SD card...
I picked this display because of the 16-bit interface that should allow fast frame rates.··· But, it also has an 8-bit mode that would free up 8 pins for GPIO.
I'm thinking about modifying the standard TV and VGA drivers to display on this screen instead.· Or, it could just be used as a serial controlled device.
I'm leaning toward replacing the uSD with a full size SD socket.· I think there's enough room for that.
I think this thing could be sold for $50.· But, I'm not sure I'm the one to do it [noparse]:)[/noparse]
Cool Ray [noparse]:)[/noparse] didn't realise that your first SMT was on the back of a 320x240 LCD [noparse]:)[/noparse] makes it even cooler [noparse]:)[/noparse]
How much was the display, and where from?
I was thinking about this setup. If the Prop is only used to take data from one point and put it on the display, then this is almost like a digital picture frame. In that case I can find displays here in Hong Kong and China that we can use and offer to the group. Also I have some leads on OLED displays. The thing I wish for is more RAM in the Prop so we can also generate graphics, but for displaying picture from an SD card or USB or Ethernet or wireless interface, the setup Rayman has would work well.
I suppose some creative effort could be done to make a user interface that copies a picture from an SD card, on to the screen, and then copies specific text or indicators on in the display as well. There would have to be some sort of transparency or something in the processing.
Rayman, did you have a particular application in mind when you created this or just seeing what you can do? Thanks for the inspiration.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Timothy D. Swieter, E.I. www.brilldea.com - Prop Blade, LED Painter, RGB LEDs, uOLED-IOC, eProto for SunSPOT, BitScope www.tdswieter.com
Rayman, let us know when and where you get your new touchscreen version of it, I'm looking forward to having a play with this one [noparse]:D[/noparse]
What I have in mind is something like what Primer did for the SMT32... A little, self-contained development platform. But, I'm also aiming it to have a practical side too... So, that it could either be a super-charged display module, or the actual controller for applicaitons.
I could really use a 64-IO-pin Prop here! I'm leaning towards adding an I2C I/O expander to make up for the lack of pins...
May be forced to drop back to 8-bit interface to free up 8 pins...
Right now, I've modified the standard VGA driver to work with the display. Able to do a full screen update in just a few milliseconds. I'm aiming towards replicating the Graphics Demo (but better) on this LCD.
For compatibility with the usual TV/VGA apps, I'm going to replace the color scheme with an 8-bit CLUT. So, there'll be a CLUT for VGA and another for TV. This way, existing code and concepts can be easily ported back and forth...
But, a full range of colors will be possible.
These displays are now cheaper than a LCD TV screen, and then if you can replace a mouse with a touch screen that saves even more. And obviously, the display has more colors than the prop. Plus this sort of display frees up hub ram that one might be using as a graphics buffer.
Re that ebay display, it looks like the SD card connections come to the header so if one were building a propeller board, that would save buying an SD socket and soldering it in. Need to think about the touch screen pins - ? input directly into the prop or ? via a SPI or I2C A to D?
I am interested in your comments on 8 vs 16 bit comms. I've ended up using propeller pins P16-P23 for displays - TV, VGA, serial displays and now, hopefully, this display.
I agree OBC. I think these displays could be the missing link that can take a command line OS like Kyedos to a GUI where you tap an icon to run a program. ILI9325 datasheet http://www.adafruit.com/datasheets/ILI9325.pdf
I am very excited about all this!
Addit: Links to two more board suppliers that appear to be using the same 40 pin format. Hopefully this is a 'standard'
More information. Attached is the schematic for these boards. It appears they have a SD card, 16 megabit flash ram and an A to D converter.
I'm not 100% sure of the sd card as there are series resistors and my understanding is these need pullups, not series resistors and I've seen pullup values of 10k and so if you use a series resistor of 10k as well, I think that works but I'm not sure.
The flash ram could be useful for storing data. Though if you already have an SD card, maybe not.
The A to D is very useful. I think it uses 6 pins, not 4, but I am not entirely sure what the "busy" line does, so maybe it is 5. The datasheet is here http://www.ti.com/lit/ds/symlink/ads7843.pdf
So - thinking aloud, I'm not entirely sure of all the best possibilities. For Catalina and ?GCC that use caching, the speed of external ram does not matter so much. Say you have 2 pins for download, 2 for eeprom and 2 for keyboard (keyboard could still be useful). Mouse not needed. So 26 propeller pins free. 6 for the touchscreen leaves 20 pins free. 4 for SD card leaves 16. If you had 4 for SPI ram (32k microchip) then you only have 12 pins left - which might be just enough for an 8 bit data system.
There are other solutions too. Say you took the dracblade format. P16-23 usually do TV or VGA, so those pins could do the touchscreen instead.
4 pins for SD card, and there are 12 pins free on the dracblade running external memory and with a 138 decoder and latches there are free 138 latches one could use. So the data can be latched out to give 16 bit access to the display.
And a third option - I believe the ILI9325 can be run in SPI mode. However I think you need to set some pins in a certain way to do that and I don't think those pins are brought out to the 40 pin header.
This is some C driver code I found. I think what this may show is that the LCD_RD function is never used which means you only write to this device, and that ought to simplify interfacing. I believe this would use 8+8+4 lines.
[code]
#include <reg51.h>
Got a board soldered up and some colors on the display. Woot!
I needed to modify the code. I'm using the Dracblade format and so pins 0-11 get shared for the display and for external ram. P16-P23 are for VGA/TV so I am going to use those for the touchscreen. P12-P15 are for the SD card and this display board has an sd card on it, so this saves making another Gadget Gangster board.
Code is very messy and am doing this in Spin first which I translated from C. It means it should be easy to get C working, though ultimately a Pasm driver will be the best solution.
Colors fit into 16 bits - 5 bits for red, 6 bits for green, 5 bits for blue.
Re the question in the post above, the main current consumption is from the backlight. I used a 220 ohm resistor running from 5V and the backlight is a white led so maybe 20mA or less?
The aim with all this is to have everything backwards compatible with all the Dracblade stuff, so you can still plug in a VGA monitor or a TV or this display.
The Gadget Gangster board is a 138 chip and three 374 latches.
Next challenge - get a picture off an SD card and onto this board. All great fun!
Spin code with the original C code at the bottom.
[code]
'' ILI9325 driver using pins P0-P11 for the display and P16-P23 for the touchscreen
'' James Moxham 2011
CON
_clkmode = xtal1 + pll16x ' use crystal x 16
_xinfreq = 5_000_000
OBJ
delay : "timing"
VAR
long DisplayPins ' status of all the display pins
PUB Start | i,j
DisplayPins := %00000000_00000000_00000000_00000000 ' store the status of the display pins
EnableLatchPins
Latch7 ' RS/CS/WR/RD/RESET all low
Init ' start up the driver
'Pant($07,$E0)
ChipSelectLow
Address_set(40,40,40,140) ' fill up in this block x1,y1 to x2,y2
repeat 100
Lcd_Write_Data(%11111111,%11111111) ' white line
Address_set(100,0,129,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
Lcd_Write_Data(%11111000,%00000000)
Address_set(140,0,169,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
Lcd_Write_Data(%00000111,%11100000)
Address_set(180,0,209,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
Lcd_Write_Data(%00000000,%00011111)
Address_set(0,0,29,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
'Lcd_Write_Data(%00000111,%11100000) ' fills up this block with data bytes RRRRRGGGGGGBBBBB 5 red 6 green 5 blue
Lcd_Write_Data(%11111111,%11111111) ' fills up this block with data bytes RRRRRGGGGGGBBBBB 5 red 6 green 5 blue
Address_set(40,0,69,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
Lcd_Write_Data(%11111111,%11100000)
Address_set(100,100,131,150) ' fill up in this block x1,y1 to x2,y2
i := 0
repeat 50
repeat 32
Lcd_Write_Data(i,j)
j := j+1
j :=0
ChipSelectHigh
PRI Init ' see LCD.c program in c:\propeller\ILI9325\Updated c51 code
ResetHigh
delay.pause1ms(5)
ResetLow
delay.pause1ms(5)
ResetHigh
ChipSelectHigh
ReadHigh
WriteHigh
delay.pause1ms(5)
ChipSelectLow
' ************* Start Initial Sequence **********
Lcd_Write_Com($00,$E5)
Lcd_Write_Data($78,$F0) ' set SRAM internal timing
Lcd_Write_Com($00,$01)
Lcd_Write_Data($01,$00) ' set SS and SM bit
Lcd_Write_Com($00,$02)
Lcd_Write_Data($07,$00) ' set 1 line inversion
Lcd_Write_Com($00,$03)
Lcd_Write_Data($10,$30) ' set GRAM write direction and BGR=1.
Lcd_Write_Com($00,$04)
Lcd_Write_Data($00,$00) ' Resize register
Lcd_Write_Com($00,$08)
Lcd_Write_Data($02,$07) ' set the back porch and front porch
Lcd_Write_Com($00,$09)
Lcd_Write_Data($00,$00) ' set non-display area refresh cycle ISC[3:0]
Lcd_Write_Com($00,$0A)
Lcd_Write_Data($00,$00) ' FMARK function
Lcd_Write_Com($00,$0C)
Lcd_Write_Data($00,$00) ' RGB interface setting
Lcd_Write_Com($00,$0D)
Lcd_Write_Data($00,$00) ' Frame marker Position
Lcd_Write_Com($00,$0F)
Lcd_Write_Data($00,$00) ' RGB interface polarity
' *************Power On sequence ****************//
Lcd_Write_Com($00,$10)
Lcd_Write_Data($00,$00) ' SAP, BT[3:0], AP, DSTB, SLP, STB
Lcd_Write_Com($00,$11)
Lcd_Write_Data($00,$07) ' DC1[2:0], DC0[2:0], VC[2:0]
Lcd_Write_Com($00,$12)
Lcd_Write_Data($00,$00) ' VREG1OUT voltage
Lcd_Write_Com($00,$13)
Lcd_Write_Data($00,$00) ' VDV[4:0] for VCOM amplitude
Lcd_Write_Com($00,$07)
Lcd_Write_Data($00,$01)
delay.pause1ms(50) ' Dis-charge capacitor power voltage
Lcd_Write_Com($00,$10)
Lcd_Write_Data($10,$90) ' 1490//SAP, BT[3:0], AP, DSTB, SLP, STB
Lcd_Write_Com($00,$11)
Lcd_Write_Data($02,$27) ' DC1[2:0], DC0[2:0], VC[2:0]
delay.pause1ms(50) ' delay
Lcd_Write_Com($00,$12)
Lcd_Write_Data($00,$1F) '001C// Internal reference voltage= Vci;
delay.pause1ms(50) ' delay
Lcd_Write_Com($00,$13)
Lcd_Write_Data($15,$00) '$1000//1400 Set VDV[4:0] for VCOM amplitude 1A00
Lcd_Write_Com($00,$29)
Lcd_Write_Data($00,$27) '$0012 //001a Set VCM[5:0] for VCOMH //$0025 0034
Lcd_Write_Com($00,$2B)
Lcd_Write_Data($00,$0D) ' Set Frame Rate 000C
delay.pause1ms(50) ' delay
Lcd_Write_Com($00,$20)
Lcd_Write_Data($00,$00) ' GRAM horizontal Address
Lcd_Write_Com($00,$21)
Lcd_Write_Data($00,$00) ' GRAM Vertical Address
'
Adjust the Gamma Curve
//
Lcd_Write_Com($00,$30)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$31)
Lcd_Write_Data($07,$07)
Lcd_Write_Com($00,$32)
Lcd_Write_Data($03,$07)
Lcd_Write_Com($00,$35)
Lcd_Write_Data($02,$00)
Lcd_Write_Com($00,$36)
Lcd_Write_Data($00,$08) '//0207
Lcd_Write_Com($00,$37)
Lcd_Write_Data($00,$04) '//0306
Lcd_Write_Com($00,$38)
Lcd_Write_Data($00,$00) '//0102
Lcd_Write_Com($00,$39)
Lcd_Write_Data($07,$07) '//0707
Lcd_Write_Com($00,$3C)
Lcd_Write_Data($00,$02) '//0702
Lcd_Write_Com($00,$3D)
Lcd_Write_Data($1D,$04) '//1604
'
Set GRAM area
//
Lcd_Write_Com($00,$50)
Lcd_Write_Data($00,$00) ' Horizontal GRAM Start Address
Lcd_Write_Com($00,$51)
Lcd_Write_Data($00,$EF) ' Horizontal GRAM End Address
Lcd_Write_Com($00,$52)
Lcd_Write_Data($00,$00) ' Vertical GRAM Start Address
Lcd_Write_Com($00,$53)
Lcd_Write_Data($01,$3F) ' Vertical GRAM Start Address
Lcd_Write_Com($00,$60)
Lcd_Write_Data($A7,$00) ' Gate Scan Line
Lcd_Write_Com($00,$61)
Lcd_Write_Data($00,$01) ' NDL,VLE, REV
Lcd_Write_Com($00,$6A)
Lcd_Write_Data($00,$00) ' set scrolling line
'
Partial Display Control
/
Lcd_Write_Com($00,$80)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$81)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$82)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$83)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$84)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$85)
Lcd_Write_Data($00,$00)
' //
Panel Control
//
Lcd_Write_Com($00,$90)
Lcd_Write_Data($00,$10)
Lcd_Write_Com($00,$92)
Lcd_Write_Data($06,$00)
Lcd_Write_Com($00,$07)
Lcd_Write_Data($01,$33) ' 262K color and display ON
PRI Lcd_Write_Com(VH,VL)
RSLow
LCD_Writ_Bus(VH,VL)
PRI Lcd_Write_Data(VH,VL)
RSHigh
LCD_Writ_Bus(VH,VL)
PRI EnableLatchPins
DIRA:=%00000000_00000000_00001111_11111111 ' 138 active, gate active and 8 data lines active
PRI Tristate ' tristate all pins - needs a pullup on the 138 enable prop pin P8
DIRA:=%00000000_00000000_00000000_00000000
PRI ToggleGate
OUTA[8]:=0 ' set gate pin low
OUTA[8]:=1 ' and high again - may need a delay in PASM
PRI Latch5(VL) ' send the low byte xxxx = C,B,A,enable
VL := VL | %00000000_00000000_00001011_00000000 ' OR with the LCD address 101
OUTA := VL ' 4 send it to propeller pins
ToggleGate ' 5 and latch it to the latch
PRI Latch6(VH) ' send the middle byte
VH := VH | %00000000_00000000_00001101_00000000 ' 3 OR with the LCD address for latch 6 110
OUTA := VH ' 4 send it to propeller pins
ToggleGate ' 5 and latch it to the latch
PRI Latch7 | i ' send the high byte if DisplayPins to the approprite latch
i := DisplayPins ' get the value
i := i >> 16 ' shift right by 16 places
i := i & %11111111 ' mask the low byte
i := i | %00000000_00000000_00001111_00000000 ' 3 OR with the LCD address for latch 7 111
OUTA := i ' 4 send it to propeller pins
ToggleGate ' 5 and latch it to the latch
PRI RSLow ' RS pin
DisplayPins := DisplayPins & %11111111_11111110_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI RSHigh
DisplayPins := DisplayPins | %00000000_00000001_00000000_00000000 ' mask the reset pin to 1
Latch7 ' send to the latch
PRI WriteLow
DisplayPins := DisplayPins & %11111111_11111101_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI WriteHigh
DisplayPins := DisplayPins | %00000000_00000010_00000000_00000000 ' mask the reset pin to 1
Latch7 ' send to the latch
PRI ReadLow
DisplayPins := DisplayPins & %11111111_11111011_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI ReadHigh
DisplayPins := DisplayPins | %00000000_00000100_00000000_00000000 ' mask the reset pin to 1
Latch7
PRI ChipSelectLow
DisplayPins := DisplayPins & %11111111_11110111_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI ChipSelectHigh
DisplayPins := DisplayPins | %00000000_00001000_00000000_00000000 ' mask the reset pin to 1
Latch7
PRI ResetLow
DisplayPins := DisplayPins & %11111111_11101111_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI ResetHigh
DisplayPins := DisplayPins | %00000000_00010000_00000000_00000000 ' mask the reset pin to 1
Latch7
I'm running mine in 16 bit mode so the resistor stays. My code is a bit convoluted as I start out with 8 bits, send it out to two latches to make 16 bits plus another latch to do the wr/rd/reset/cs/rs lines so it is controlled with 21 pins. But I wanted to share the dracblade memory format so it only uses 12 propeller pins.
It doesn't really matter as the code to translate the data and send it out the latches, vs the code to send it out directly, are very similar. So we can mix and match all sorts of options using different propeller pins and still work together on the project.
This is the standard LCD_Writ_Bus routine which I modified:
Looks like GG and myself are now at a similar stage - get the touchscreen working.
Then we can start playing around with reading icons off an sd card, drawing some icons on the screen, working out which one was pressed, and then chaining another binary program. Kyedos with a GUI instead of typing in the name.
These displays are very nice. More colors than TV and VGA and they work out cheaper. Plus lots of memory now free in hub as no graphics buffer needed.
We will probably need a pasm driver - it is a little slow in Spin. Need a routine to move data from an sd card into hub then to the display, probably in tiles ?64x64.
And a routine to translate 256x256x256 colors into 16 bits RRRRRGGGGGBBBBB
This display has an amazing resolution. The pixels are too small to see unless you look very closely. The color depth is 65k and I can't see any difference in the picture when I run a vb.net program to decrease the color depth from RRRRRRRRGGGGGGGGBBBBBBBB to RRRRRGGGGGGBBBBB
Code to do this in vb.net. This displays to a 240x320 picture box, displays the modified picture and then saves a binary file.
Private Sub Button67_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button67.Click
Dim R, G, B As Long
Dim Mycolor As Color
Dim x, y, t As Integer
Dim sizex, sizey As Integer
' load in the picture
sizex = 240 - 1 '240x320 (portrait mode)
sizey = 320 - 1
Dim PixelArray(sizex, sizey, 5) As Double
Dim Sourcefile, Destinationfile As String
Sourcefile = TextBox98.Text
' this little bit of code replaces new sytem.drawing.bitmap as the latter leaves the file locked eg so paintshop can't save a new file
Dim img As Image
Dim fs As New FileStream(Sourcefile, IO.FileMode.Open)
img = Image.FromStream(fs)
fs.Close()
PictureBox115.Image = img
' picture to array
Dim MyBitmap As New System.Drawing.Bitmap(PictureBox115.Image) 'image from picture box
For y = 0 To sizey
For x = 0 To sizex
Mycolor = MyBitmap.GetPixel(x, y) ' get the color
PixelArray(x, y, 0) = (Int(Mycolor.R) >> 3) << 3 ' red byte 2^5 values
PixelArray(x, y, 1) = (Int(Mycolor.G) >> 2) << 2 ' green byte 2^6 values
PixelArray(x, y, 2) = (Int(Mycolor.B) >> 3) << 3 ' blue byte 2^5 values
' RRRRRGGGGGGBBBBB
R = PixelArray(x, y, 0) >> 3 ' bit shifts
G = PixelArray(x, y, 1) >> 2
B = PixelArray(x, y, 2) >> 3
PixelArray(x, y, 3) = (R << 11) + (G << 5) + B
PixelArray(x, y, 4) = PixelArray(x, y, 3) >> 8 ' high byte
PixelArray(x, y, 5) = PixelArray(x, y, 3) And 255 ' low byte
Next
Next
'display on a new picturebox
For y = 0 To sizey
For x = 0 To sizex
Mycolor = Color.FromArgb(255, PixelArray(x, y, 0), PixelArray(x, y, 1), PixelArray(x, y, 2))
MyBitmap.SetPixel(x, y, Mycolor) ' set the pixels back to this palette color
Next x
Next y
PictureBox116.Image = MyBitmap ' display the picture after processing
Dim OutputArray((sizex + 1) * (sizey + 1) * 2) As Byte ' 2 bytes stored
t = 0
For y = 0 To sizey
For x = 0 To sizex
OutputArray(t) = PixelArray(x, y, 4) ' high byte
t += 1
OutputArray(t) = PixelArray(x, y, 5) ' low byte
t += 1
Next
Next
Destinationfile = TextBox99.Text
Dim OutputILI As New FileStream(Destinationfile, FileMode.Create, FileAccess.Write)
OutputILI.Write(OutputArray, 0, (sizex + 1) * (sizey + 1) * 2) ' save bytes
OutputILI.Close()
End Sub
I've bundled up a zip file with the source code and also this binary file. Copy it to an SD card. The code also uses a TV screen on pins 16-18 - this was very useful for debugging to make sure the SD card mounted and to see the first few bytes were correct.
In the photo the stack of Gadget Gangster grows higher (though not as high as Humanoido's tower!). There is a key/mouse/TV/VGA board, a motherboard with a propeller, a switching regulator board, an external memory board and the ILI9325 board. Also in the picture is a diagnostic leds board with 30 leds for P0-P29 which was very useful for debugging.
The Gadget Gangster format is proving very useful here as it is possible to mix and match boards in all sorts of ways. This was originally debugged on a standard USB Gadget Gangster board. Both the Gadget Gangster board and the ILI9325 touchscreen board have SD cards on them so there are many ways to get mass storage.
Speed is an issue and this will be much better in pasm.
I've attached my schematic - this uses a few extra chips so that it is backwards compatible with the Dracblade memory (and hence can run large C programs) but using propeller pins directly will obviously be simpler to wire up.
The screenshot from the vb.net program shows the original bitmap and then after processing. I must say I can't tell the difference. This looks just as good on the real display - I have tried many photos but the camera has an autofocus and keeps giving blurry shots. 3 x 4 =12 icons on a screen works out about right for this display. Icons are 96x96 which is about finger size. I can post the binary for that icon picture if anyone wants this as it might be useful for testing the touchscreen.
Having said all this, I'd really appreciate some help with the ADS7843 driver code. The examples (like the display examples) are in C but with comments all in Chinese so not the easiest to decode. I've taken their example code and stripped out the comments and all the display code and it comes in fairly short now. Some of the functions in 'main' have been deleted as I'm 99% certain these are display functions.
where NOP seems to do nothing, and DCLK is a variable that changes. There was code like this in the display driver and I replaced it with spin that did things like change the status of DCLK. But in this code, it seems like in C you change the value of the clock pin, but how do you actually change that to a status change on the pin? Maybe it is a macro?
And is the _nop_(); function actually doing anything or is it just a delay loop?
I've been searching for the last hour or so for some driver code for this chip - any help here would be most appreciated.
A quick note to myself - I'm searching with "ads7843 c code" at the moment for the touchscreen controller.
I'm able to read from the touchscreen using Beau's SPI object;
PUB main | yval, xval
SPI.start(3,0)
'SPI read S, A2, A1, A0, Mode, SER, PD1, PD0
' 1 0 0 1 1 0 0 0
' MSB first
' 001 is X
' 101 is Y
repeat
SPI.SHIFTOUT(19, 21, 5, 8 , %1101_0000) ' reads y from 500 to 3700 (off < 500 )
yval := SPI.SHIFTIN(17,21,2, 12)
SPI.SHIFTOUT(19, 21, 5, 8 , %1001_0000) ' reads x from 420 to 3800 (off > 3800 )
xval := SPI.SHIFTIN(17,21,2, 12)
The values seem to correspond to where I'm touching the screen. First bit is a start bit, A2,A1, And A0 set what axis you want to read. Mode is whether you want 8-bit or 12-bit resolution. SER further sets how you want the measurements returned. PD0 and PD1 are for the power down mode.
Next thing is to roll this into the Spin version of the SPI object - I'd like the touchscreen to be read without needing another cog.
Looks like we are all racing toward the same end here. I am using the same display as mynet43, and it is going along quite well. Just to play around a little bit and try to figure out how to work with real displays other than TV or the NewHaven 2x20's, I am able to have the "Little Dog" from the graphics demo crawling across the screen, and "Woof!" growing larger then snapping back to small size. Once I figure out color palates (really getting frustrated with the 4 color per tile thing), I will be able to go forward with my design, and stop all this playing around business.
Currently, I am waiting on a batch of TSC2007IPW chips to come in with some proto boards for my touch screen. I seem to remember someone in the past having good luck with this and 4 wire resistive touch screens, and I remember archiving a driver they posted on the forums. (cannot remember who exactly it was, but thank you!)
Next thing is to roll this into the Spin version of the SPI object - I'd like the touchscreen to be read without needing another cog.
What would be the best combination regarding cogs? Combine with a SD SPI cog perhaps? That code does look fairly straightforward.
The touchscreen and display parts are quite separate - different pins, different code, and almost certainly different cogs. The display would replace a TV or VGA object. The touchscreen would be a SPI object. The touchscreen would replace mouse and keyboard, so you can save some cogs there.
These modules also have SD sockets on them - very handy too. I'm working on a board design that wires them straight through to propeller pins. The SD socket is also quite separate from a hardware perspective. But from a software perspective maybe it makes sense to combine with an SD card. Can you send instructions to the touchscreen in the middle of, say, a block read from an sd card?
Comments
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Timothy D. Swieter, E.I.
www.brilldea.com - Prop Blade, LED Painter, RGB LEDs, uOLED-IOC, eProto for SunSPOT, BitScope
www.tdswieter.com
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
http://www.propgfx.co.uk/forum/·home of the PropGFX Lite
·
What is the display ? How much do they cost ? Is it NTSC/PAL, VGA or something custom ?
Bean.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
There is a fine line between arrogance and confidence. Make sure you don't cross it...
·
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Timothy D. Swieter, E.I.
www.brilldea.com - Prop Blade, LED Painter, RGB LEDs, uOLED-IOC, eProto for SunSPOT, BitScope
www.tdswieter.com
http://forums.parallax.com/showthread.php?p=779876
Not much there...· Just Prop chip, uSD, FTDI USB, 3.3V regulator...
But there's plenty of room for other stuff.
The picture was sent over the USB interface, but soon I'll add support for SD card...
I picked this display because of the 16-bit interface that should allow fast frame rates.··· But, it also has an 8-bit mode that would free up 8 pins for GPIO.
I'm thinking about modifying the standard TV and VGA drivers to display on this screen instead.· Or, it could just be used as a serial controlled device.
I'm leaning toward replacing the uSD with a full size SD socket.· I think there's enough room for that.
I think this thing could be sold for $50.· But, I'm not sure I'm the one to do it [noparse]:)[/noparse]
How much was the display, and where from?
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
http://www.propgfx.co.uk/forum/·home of the PropGFX Lite
·
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
http://www.propgfx.co.uk/forum/·home of the PropGFX Lite
·
know of any decent supplier?
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
http://www.propgfx.co.uk/forum/·home of the PropGFX Lite
·
Post Edited (Rayman) : 2/9/2009 2:06:53 AM GMT
I suppose some creative effort could be done to make a user interface that copies a picture from an SD card, on to the screen, and then copies specific text or indicators on in the display as well. There would have to be some sort of transparency or something in the processing.
Rayman, did you have a particular application in mind when you created this or just seeing what you can do? Thanks for the inspiration.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Timothy D. Swieter, E.I.
www.brilldea.com - Prop Blade, LED Painter, RGB LEDs, uOLED-IOC, eProto for SunSPOT, BitScope
www.tdswieter.com
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
http://www.propgfx.co.uk/forum/·home of the PropGFX Lite
·
I could really use a 64-IO-pin Prop here! I'm leaning towards adding an I2C I/O expander to make up for the lack of pins...
May be forced to drop back to 8-bit interface to free up 8 pins...
Right now, I've modified the standard VGA driver to work with the display. Able to do a full screen update in just a few milliseconds. I'm aiming towards replicating the Graphics Demo (but better) on this LCD.
For compatibility with the usual TV/VGA apps, I'm going to replace the color scheme with an 8-bit CLUT. So, there'll be a CLUT for VGA and another for TV. This way, existing code and concepts can be easily ported back and forth...
But, a full range of colors will be possible.
Post Edited (Rayman) : 2/9/2009 2:08:13 AM GMT
The prices of these displays seems to be coming down - $16 including the touch screen http://www.ebay.com.au/itm/170709358010?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649 . The ILI9325 seems a standard driver for many displays.
These displays are now cheaper than a LCD TV screen, and then if you can replace a mouse with a touch screen that saves even more. And obviously, the display has more colors than the prop. Plus this sort of display frees up hub ram that one might be using as a graphics buffer.
Re that ebay display, it looks like the SD card connections come to the header so if one were building a propeller board, that would save buying an SD socket and soldering it in. Need to think about the touch screen pins - ? input directly into the prop or ? via a SPI or I2C A to D?
I am interested in your comments on 8 vs 16 bit comms. I've ended up using propeller pins P16-P23 for displays - TV, VGA, serial displays and now, hopefully, this display.
Do you have any code you might be able to share?
I have plans for a PSM2, but I keep finding other distractions...
Good Find!
http://www.ebay.com/itm/170709358010?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649#ht_6075wt_874
I couldn't resist grabbing one of these! We should be doing something like this with the prop.
I am very excited about all this!
Addit: Links to two more board suppliers that appear to be using the same 40 pin format. Hopefully this is a 'standard'
http://www.ebay.com.au/itm/2-4-TFT-LCD-Display-Touch-Panel-PCB-adapter-Module-/260765262794?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item3cb6d223ca
http://www.ebay.com.au/itm/2-4-TFT-LCD-Module-Display-Touch-Panel-PCB-adapter-/190477028273?pt=LH_DefaultDomain_0&hash=item2c5950cbb1
Some are using micro SD and some are using standard sized SD. So that adds some flexibility.
I'm not 100% sure of the sd card as there are series resistors and my understanding is these need pullups, not series resistors and I've seen pullup values of 10k and so if you use a series resistor of 10k as well, I think that works but I'm not sure.
The flash ram could be useful for storing data. Though if you already have an SD card, maybe not.
The A to D is very useful. I think it uses 6 pins, not 4, but I am not entirely sure what the "busy" line does, so maybe it is 5. The datasheet is here http://www.ti.com/lit/ds/symlink/ads7843.pdf
So - thinking aloud, I'm not entirely sure of all the best possibilities. For Catalina and ?GCC that use caching, the speed of external ram does not matter so much. Say you have 2 pins for download, 2 for eeprom and 2 for keyboard (keyboard could still be useful). Mouse not needed. So 26 propeller pins free. 6 for the touchscreen leaves 20 pins free. 4 for SD card leaves 16. If you had 4 for SPI ram (32k microchip) then you only have 12 pins left - which might be just enough for an 8 bit data system.
There are other solutions too. Say you took the dracblade format. P16-23 usually do TV or VGA, so those pins could do the touchscreen instead.
4 pins for SD card, and there are 12 pins free on the dracblade running external memory and with a 138 decoder and latches there are free 138 latches one could use. So the data can be latched out to give 16 bit access to the display.
And a third option - I believe the ILI9325 can be run in SPI mode. However I think you need to set some pins in a certain way to do that and I don't think those pins are brought out to the 40 pin header.
This is some C driver code I found. I think what this may show is that the LCD_RD function is never used which means you only write to this device, and that ought to simplify interfacing. I believe this would use 8+8+4 lines.
[code]
#include <reg51.h>
/* http://ttmcu.taobao.com
I'm using a very similar display 2.4" 240x320 color. By Newhaven Display.
Have you done any power measurements on what you're using? I'm trying to use this in a battery powered device.
I recently measured the current usage, and it seems to take around 50ma. There are 4 built-in backlight LED's that I'm driving from Prop pins.
The 50ma is so high that it makes it almost unusable for a battery device.
Do you have any suggestions for very-low-power displays with similar attributes?
Thank you for your help.
Jim
I needed to modify the code. I'm using the Dracblade format and so pins 0-11 get shared for the display and for external ram. P16-P23 are for VGA/TV so I am going to use those for the touchscreen. P12-P15 are for the SD card and this display board has an sd card on it, so this saves making another Gadget Gangster board.
Code is very messy and am doing this in Spin first which I translated from C. It means it should be easy to get C working, though ultimately a Pasm driver will be the best solution.
Colors fit into 16 bits - 5 bits for red, 6 bits for green, 5 bits for blue.
Re the question in the post above, the main current consumption is from the backlight. I used a 220 ohm resistor running from 5V and the backlight is a white led so maybe 20mA or less?
The aim with all this is to have everything backwards compatible with all the Dracblade stuff, so you can still plug in a VGA monitor or a TV or this display.
The Gadget Gangster board is a 138 chip and three 374 latches.
Next challenge - get a picture off an SD card and onto this board. All great fun!
Spin code with the original C code at the bottom.
[code]
'' ILI9325 driver using pins P0-P11 for the display and P16-P23 for the touchscreen
'' James Moxham 2011
CON
_clkmode = xtal1 + pll16x ' use crystal x 16
_xinfreq = 5_000_000
OBJ
delay : "timing"
VAR
long DisplayPins ' status of all the display pins
PUB Start | i,j
DisplayPins := %00000000_00000000_00000000_00000000 ' store the status of the display pins
EnableLatchPins
Latch7 ' RS/CS/WR/RD/RESET all low
Init ' start up the driver
'Pant($07,$E0)
ChipSelectLow
Address_set(40,40,40,140) ' fill up in this block x1,y1 to x2,y2
repeat 100
Lcd_Write_Data(%11111111,%11111111) ' white line
Address_set(100,0,129,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
Lcd_Write_Data(%11111000,%00000000)
Address_set(140,0,169,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
Lcd_Write_Data(%00000111,%11100000)
Address_set(180,0,209,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
Lcd_Write_Data(%00000000,%00011111)
Address_set(0,0,29,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
'Lcd_Write_Data(%00000111,%11100000) ' fills up this block with data bytes RRRRRGGGGGGBBBBB 5 red 6 green 5 blue
Lcd_Write_Data(%11111111,%11111111) ' fills up this block with data bytes RRRRRGGGGGGBBBBB 5 red 6 green 5 blue
Address_set(40,0,69,29) ' fill up in this block x1,y1 to x2,y2
repeat 900
Lcd_Write_Data(%11111111,%11100000)
Address_set(100,100,131,150) ' fill up in this block x1,y1 to x2,y2
i := 0
repeat 50
repeat 32
Lcd_Write_Data(i,j)
j := j+1
j :=0
ChipSelectHigh
PRI Init ' see LCD.c program in c:\propeller\ILI9325\Updated c51 code
ResetHigh
delay.pause1ms(5)
ResetLow
delay.pause1ms(5)
ResetHigh
ChipSelectHigh
ReadHigh
WriteHigh
delay.pause1ms(5)
ChipSelectLow
' ************* Start Initial Sequence **********
Lcd_Write_Com($00,$E5)
Lcd_Write_Data($78,$F0) ' set SRAM internal timing
Lcd_Write_Com($00,$01)
Lcd_Write_Data($01,$00) ' set SS and SM bit
Lcd_Write_Com($00,$02)
Lcd_Write_Data($07,$00) ' set 1 line inversion
Lcd_Write_Com($00,$03)
Lcd_Write_Data($10,$30) ' set GRAM write direction and BGR=1.
Lcd_Write_Com($00,$04)
Lcd_Write_Data($00,$00) ' Resize register
Lcd_Write_Com($00,$08)
Lcd_Write_Data($02,$07) ' set the back porch and front porch
Lcd_Write_Com($00,$09)
Lcd_Write_Data($00,$00) ' set non-display area refresh cycle ISC[3:0]
Lcd_Write_Com($00,$0A)
Lcd_Write_Data($00,$00) ' FMARK function
Lcd_Write_Com($00,$0C)
Lcd_Write_Data($00,$00) ' RGB interface setting
Lcd_Write_Com($00,$0D)
Lcd_Write_Data($00,$00) ' Frame marker Position
Lcd_Write_Com($00,$0F)
Lcd_Write_Data($00,$00) ' RGB interface polarity
' *************Power On sequence ****************//
Lcd_Write_Com($00,$10)
Lcd_Write_Data($00,$00) ' SAP, BT[3:0], AP, DSTB, SLP, STB
Lcd_Write_Com($00,$11)
Lcd_Write_Data($00,$07) ' DC1[2:0], DC0[2:0], VC[2:0]
Lcd_Write_Com($00,$12)
Lcd_Write_Data($00,$00) ' VREG1OUT voltage
Lcd_Write_Com($00,$13)
Lcd_Write_Data($00,$00) ' VDV[4:0] for VCOM amplitude
Lcd_Write_Com($00,$07)
Lcd_Write_Data($00,$01)
delay.pause1ms(50) ' Dis-charge capacitor power voltage
Lcd_Write_Com($00,$10)
Lcd_Write_Data($10,$90) ' 1490//SAP, BT[3:0], AP, DSTB, SLP, STB
Lcd_Write_Com($00,$11)
Lcd_Write_Data($02,$27) ' DC1[2:0], DC0[2:0], VC[2:0]
delay.pause1ms(50) ' delay
Lcd_Write_Com($00,$12)
Lcd_Write_Data($00,$1F) '001C// Internal reference voltage= Vci;
delay.pause1ms(50) ' delay
Lcd_Write_Com($00,$13)
Lcd_Write_Data($15,$00) '$1000//1400 Set VDV[4:0] for VCOM amplitude 1A00
Lcd_Write_Com($00,$29)
Lcd_Write_Data($00,$27) '$0012 //001a Set VCM[5:0] for VCOMH //$0025 0034
Lcd_Write_Com($00,$2B)
Lcd_Write_Data($00,$0D) ' Set Frame Rate 000C
delay.pause1ms(50) ' delay
Lcd_Write_Com($00,$20)
Lcd_Write_Data($00,$00) ' GRAM horizontal Address
Lcd_Write_Com($00,$21)
Lcd_Write_Data($00,$00) ' GRAM Vertical Address
'
Adjust the Gamma Curve
//
Lcd_Write_Com($00,$30)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$31)
Lcd_Write_Data($07,$07)
Lcd_Write_Com($00,$32)
Lcd_Write_Data($03,$07)
Lcd_Write_Com($00,$35)
Lcd_Write_Data($02,$00)
Lcd_Write_Com($00,$36)
Lcd_Write_Data($00,$08) '//0207
Lcd_Write_Com($00,$37)
Lcd_Write_Data($00,$04) '//0306
Lcd_Write_Com($00,$38)
Lcd_Write_Data($00,$00) '//0102
Lcd_Write_Com($00,$39)
Lcd_Write_Data($07,$07) '//0707
Lcd_Write_Com($00,$3C)
Lcd_Write_Data($00,$02) '//0702
Lcd_Write_Com($00,$3D)
Lcd_Write_Data($1D,$04) '//1604
'
Set GRAM area
//
Lcd_Write_Com($00,$50)
Lcd_Write_Data($00,$00) ' Horizontal GRAM Start Address
Lcd_Write_Com($00,$51)
Lcd_Write_Data($00,$EF) ' Horizontal GRAM End Address
Lcd_Write_Com($00,$52)
Lcd_Write_Data($00,$00) ' Vertical GRAM Start Address
Lcd_Write_Com($00,$53)
Lcd_Write_Data($01,$3F) ' Vertical GRAM Start Address
Lcd_Write_Com($00,$60)
Lcd_Write_Data($A7,$00) ' Gate Scan Line
Lcd_Write_Com($00,$61)
Lcd_Write_Data($00,$01) ' NDL,VLE, REV
Lcd_Write_Com($00,$6A)
Lcd_Write_Data($00,$00) ' set scrolling line
'
Partial Display Control
/
Lcd_Write_Com($00,$80)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$81)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$82)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$83)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$84)
Lcd_Write_Data($00,$00)
Lcd_Write_Com($00,$85)
Lcd_Write_Data($00,$00)
' //
Panel Control
//
Lcd_Write_Com($00,$90)
Lcd_Write_Data($00,$10)
Lcd_Write_Com($00,$92)
Lcd_Write_Data($06,$00)
Lcd_Write_Com($00,$07)
Lcd_Write_Data($01,$33) ' 262K color and display ON
ChipSelectHigh
PRI LCD_Writ_Bus(VH,VL)
Latch5(VL) ' send low byte
Latch6(VH) ' send high byte
WriteLow ' write pin low
WriteHigh ' toggle write pin
PRI Lcd_Write_Com(VH,VL)
RSLow
LCD_Writ_Bus(VH,VL)
PRI Lcd_Write_Data(VH,VL)
RSHigh
LCD_Writ_Bus(VH,VL)
PRI EnableLatchPins
DIRA:=%00000000_00000000_00001111_11111111 ' 138 active, gate active and 8 data lines active
PRI Tristate ' tristate all pins - needs a pullup on the 138 enable prop pin P8
DIRA:=%00000000_00000000_00000000_00000000
PRI ToggleGate
OUTA[8]:=0 ' set gate pin low
OUTA[8]:=1 ' and high again - may need a delay in PASM
PRI Latch5(VL) ' send the low byte xxxx = C,B,A,enable
VL := VL | %00000000_00000000_00001011_00000000 ' OR with the LCD address 101
OUTA := VL ' 4 send it to propeller pins
ToggleGate ' 5 and latch it to the latch
PRI Latch6(VH) ' send the middle byte
VH := VH | %00000000_00000000_00001101_00000000 ' 3 OR with the LCD address for latch 6 110
OUTA := VH ' 4 send it to propeller pins
ToggleGate ' 5 and latch it to the latch
PRI Latch7 | i ' send the high byte if DisplayPins to the approprite latch
i := DisplayPins ' get the value
i := i >> 16 ' shift right by 16 places
i := i & %11111111 ' mask the low byte
i := i | %00000000_00000000_00001111_00000000 ' 3 OR with the LCD address for latch 7 111
OUTA := i ' 4 send it to propeller pins
ToggleGate ' 5 and latch it to the latch
PRI RSLow ' RS pin
DisplayPins := DisplayPins & %11111111_11111110_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI RSHigh
DisplayPins := DisplayPins | %00000000_00000001_00000000_00000000 ' mask the reset pin to 1
Latch7 ' send to the latch
PRI WriteLow
DisplayPins := DisplayPins & %11111111_11111101_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI WriteHigh
DisplayPins := DisplayPins | %00000000_00000010_00000000_00000000 ' mask the reset pin to 1
Latch7 ' send to the latch
PRI ReadLow
DisplayPins := DisplayPins & %11111111_11111011_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI ReadHigh
DisplayPins := DisplayPins | %00000000_00000100_00000000_00000000 ' mask the reset pin to 1
Latch7
PRI ChipSelectLow
DisplayPins := DisplayPins & %11111111_11110111_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI ChipSelectHigh
DisplayPins := DisplayPins | %00000000_00001000_00000000_00000000 ' mask the reset pin to 1
Latch7
PRI ResetLow
DisplayPins := DisplayPins & %11111111_11101111_11111111_11111111 ' mask the reset pin to zero
Latch7 ' send to the latch
PRI ResetHigh
DisplayPins := DisplayPins | %00000000_00010000_00000000_00000000 ' mask the reset pin to 1
Latch7
PRI Address_set(x1, y1, x2, y2)
Lcd_Write_Com($00,$20)
Lcd_Write_Data(x1>>8,x1)
Lcd_Write_Com($00,$21)
Lcd_Write_Data(y1>>8,y1)
Lcd_Write_Com($00,$50)
Lcd_Write_Data(x1>>8,x1)
Lcd_Write_Com($00,$52)
Lcd_Write_Data(y1>>8,y1)
Lcd_Write_Com($00,$51)
Lcd_Write_Data(x2>>8,x2)
Lcd_Write_Com($00,$53)
Lcd_Write_Data(y2>>8,y2)
Lcd_Write_Com($00,$22)
PRI Pant(VH,VL)
ChipSelectLow
Address_set(0,0,240,320)
Lcd_Write_Data(VH,VL)
ChipSelectHigh
{
#include <reg51.h>
/* http://ttmcu.taobao.com
Did you remove the resistor at R2 as Nick did here?
(http://www.gadgetgangster.com/forums/viewtopic.php?f=3&t=20)
OBC
It doesn't really matter as the code to translate the data and send it out the latches, vs the code to send it out directly, are very similar. So we can mix and match all sorts of options using different propeller pins and still work together on the project.
This is the standard LCD_Writ_Bus routine which I modified:
Looks like GG and myself are now at a similar stage - get the touchscreen working.
Then we can start playing around with reading icons off an sd card, drawing some icons on the screen, working out which one was pressed, and then chaining another binary program. Kyedos with a GUI instead of typing in the name.
These displays are very nice. More colors than TV and VGA and they work out cheaper. Plus lots of memory now free in hub as no graphics buffer needed.
We will probably need a pasm driver - it is a little slow in Spin. Need a routine to move data from an sd card into hub then to the display, probably in tiles ?64x64.
And a routine to translate 256x256x256 colors into 16 bits RRRRRGGGGGBBBBB
This display has an amazing resolution. The pixels are too small to see unless you look very closely. The color depth is 65k and I can't see any difference in the picture when I run a vb.net program to decrease the color depth from RRRRRRRRGGGGGGGGBBBBBBBB to RRRRRGGGGGGBBBBB
Code to do this in vb.net. This displays to a 240x320 picture box, displays the modified picture and then saves a binary file.
I've bundled up a zip file with the source code and also this binary file. Copy it to an SD card. The code also uses a TV screen on pins 16-18 - this was very useful for debugging to make sure the SD card mounted and to see the first few bytes were correct.
In the photo the stack of Gadget Gangster grows higher (though not as high as Humanoido's tower!). There is a key/mouse/TV/VGA board, a motherboard with a propeller, a switching regulator board, an external memory board and the ILI9325 board. Also in the picture is a diagnostic leds board with 30 leds for P0-P29 which was very useful for debugging.
The Gadget Gangster format is proving very useful here as it is possible to mix and match boards in all sorts of ways. This was originally debugged on a standard USB Gadget Gangster board. Both the Gadget Gangster board and the ILI9325 touchscreen board have SD cards on them so there are many ways to get mass storage.
Speed is an issue and this will be much better in pasm.
I've attached my schematic - this uses a few extra chips so that it is backwards compatible with the Dracblade memory (and hence can run large C programs) but using propeller pins directly will obviously be simpler to wire up.
The screenshot from the vb.net program shows the original bitmap and then after processing. I must say I can't tell the difference. This looks just as good on the real display - I have tried many photos but the camera has an autofocus and keeps giving blurry shots. 3 x 4 =12 icons on a screen works out about right for this display. Icons are 96x96 which is about finger size. I can post the binary for that icon picture if anyone wants this as it might be useful for testing the touchscreen.
Having said all this, I'd really appreciate some help with the ADS7843 driver code. The examples (like the display examples) are in C but with comments all in Chinese so not the easiest to decode. I've taken their example code and stripped out the comments and all the display code and it comes in fairly short now. Some of the functions in 'main' have been deleted as I'm 99% certain these are display functions.
The datasheet is here http://www.ti.com/lit/ds/symlink/ads7843.pdf
I'm fairly sure this is a SPI type interface with a couple of extra pins.
I don't know if anyone has written a Spin driver as yet.
The code I don't understand is this sort of thing:
where NOP seems to do nothing, and DCLK is a variable that changes. There was code like this in the display driver and I replaced it with spin that did things like change the status of DCLK. But in this code, it seems like in C you change the value of the clock pin, but how do you actually change that to a status change on the pin? Maybe it is a macro?
And is the _nop_(); function actually doing anything or is it just a delay loop?
I've been searching for the last hour or so for some driver code for this chip - any help here would be most appreciated.
A quick note to myself - I'm searching with "ads7843 c code" at the moment for the touchscreen controller.
We are so close here to a GUI for Kyedos!!!
The values seem to correspond to where I'm touching the screen. First bit is a start bit, A2,A1, And A0 set what axis you want to read. Mode is whether you want 8-bit or 12-bit resolution. SER further sets how you want the measurements returned. PD0 and PD1 are for the power down mode.
Next thing is to roll this into the Spin version of the SPI object - I'd like the touchscreen to be read without needing another cog.
Currently, I am waiting on a batch of TSC2007IPW chips to come in with some proto boards for my touch screen. I seem to remember someone in the past having good luck with this and 4 wire resistive touch screens, and I remember archiving a driver they posted on the forums. (cannot remember who exactly it was, but thank you!)
What would be the best combination regarding cogs? Combine with a SD SPI cog perhaps? That code does look fairly straightforward.
The touchscreen and display parts are quite separate - different pins, different code, and almost certainly different cogs. The display would replace a TV or VGA object. The touchscreen would be a SPI object. The touchscreen would replace mouse and keyboard, so you can save some cogs there.
These modules also have SD sockets on them - very handy too. I'm working on a board design that wires them straight through to propeller pins. The SD socket is also quite separate from a hardware perspective. But from a software perspective maybe it makes sense to combine with an SD card. Can you send instructions to the touchscreen in the middle of, say, a block read from an sd card?