Shop OBEX P1 Docs P2 Docs Learn Events
Check this code please — Parallax Forums

Check this code please

AndreaAndrea Posts: 17
edited 2012-01-08 18:30 in Propeller 1
Hello,
this is my first propeller project. I try to read touch coordinates from uLCD-32PT 3.2" 240x320px LCD from 4D systems. So far I was able to control the display (write strings, images, videos etc)... But I'm straggling for 3 days now to get right XY touch coords from it. Received X coord is correct but Y is not, always about 100px more.

The datasheet says:
For serial send "cmd, mode"
CMD: 6F(hex) or o(ascii) : Command header byte
MODE:...04hex : Get Touch status, 05hex : Get Touch coordinates
Response: x_coord(msb:lsb), y_coord(msb:lsb)

For testing I create image with 3 check points,at (X-20px,Y-20px), (X-80px, Y-20px) and (X-120px, Y-60px) upload it to the display and try to read XY, than to draw the circle at that loacation.
With this code:
CON

  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000

VAR
     BYTE X[2],Y[2]
 
OBJ

  disp:   "Simple_Serial"
  pst:    "Parallax Serial Terminal" 

PUB start
  pst.Start(9600)
  pst.Str(string("PST ready",13))

  
  disp.init(25, 24, 9600) 
  waitcnt(clkfreq*2+cnt)
      
  disp.tx($55)                                          ' Auto baud
  GET_ACK

  disp.tx($45)                                          ' Clear display 
  GET_ACK

  GET_TOUCH_XY                                          ' Get touch XY cordintes
  
 
                                                         

PUB GET_TOUCH_XY | idx

  ENABLE_TOUCH                                          '                                                                                                
  PUT_IMG                                               ' Image for testing coordinates
  
  repeat
    disp.tx($6F)                                        ' Check if
    disp.tx($04)                                        ' touch pressed cmd
    GET_ACK
    idx:= disp.rx                                        
    
    if idx==1                                           ' if so 
      disp.tx($6F)                                      ' Get
      disp.tx($05)                                      ' x_coord(msb:lsb), y_coord(msb:lsb)
      
      X[1] := disp.rx
      X[0] := disp.rx
      Y[1] := disp.rx
      Y[0] := disp.rx  

        pst.str(string("MSB X : "))                     ' Debug via PST 
        pst.Dec(X[1])
        pst.NewLine
        pst.str(string("LSB X : "))                     
        pst.Dec(X[0])
        pst.NewLine

        pst.str(string("MSB Y : "))
        pst.Dec(Y[1])
        pst.NewLine
        pst.str(string("LSB Y : "))
        pst.Dec(Y[0])
        pst.NewLine
      
        pst.NewLine
        pst.DEC(word[@X])
        pst.str(string(", "))
        pst.DEC(word[@Y])

        pst.newline  

      disp.tx($43)                                      ' Now draw 
             
      disp.tx(X[1])                                     ' circle 
      disp.tx(X[0]) 
      disp.tx(Y[1])                                     ' to the 
      disp.tx(Y[0])                                     ' display
                      
      disp.tx($00)                                      ' at the same XY
      disp.tx($05)
      disp.tx($00)
      disp.tx($1F)
      GET_ACK                  

PUB ENABLE_TOUCH 
  disp.tx($59)
  disp.tx($05)
  disp.tx($00)  
  GET_ACK

PUB GET_ACK | ack 

   ack:=disp.rx     
  if ack==$06
    pst.Str(string(13,"ACK",13))
  else
    pst.Str(string("NACK",13))

PUB PUT_IMG
  disp.tx($40)
  disp.tx($49)     
  disp.tx($00)
  disp.tx($00)
  disp.tx($00)
  disp.tx($00)
  disp.tx($00)
  disp.tx($F0)
  disp.tx($01)
  disp.tx($40)
  disp.tx($10)
  disp.tx($00)
  disp.tx($02)
  disp.tx($58)
  GET_ACK

But as you can see at attached image, Y coordinate is always missed.

I have no idea what I'm doing wrong, can you help me?

here is debug from PST:
#1 dot pressed:
MSB X : 0
LSB X : 19
MSB Y : 0
LSB Y : 137
Dec values: 19, 137


#2 dot pressed:
MSB X : 0
LSB X : 77
MSB Y : 0
LSB Y : 137
Dec values: 77, 137

#3 dot pressed:
MSB X : 0
LSB X : 119
MSB Y : 0
LSB Y : 157
Dec values: 119, 157

Thank you
1024 x 768 - 69K

Comments

  • Dave HeinDave Hein Posts: 6,347
    edited 2012-01-08 18:30
    You might try using "Parallax Serial Terminal" or FullDuplexSerial to talk to the LCD instead of Simple_Serial. Simple_Serial implements the serial port in Spin instead of PASM, and you might be missing the falling edge of the start bit. I timed the overhead of your statement that call the rx routine, and it takes about 4500 cycles. At 9600 baud 1 bit time is 8333 cycles, but Simple_Serial returns when its half way through the stop bit, so you only have 4167 cycles before the falling edge of the start bit. This means that Simple_Serial would be sliding about 333 cycles for each byte received. In theory, you should be OK receiving 4 sequential bytes, but maybe your starting the first byte a little late.
Sign In or Register to comment.