User avatar
Laurens-wuyts
Posts: 716
Joined: Wed Aug 21, 2013 7:35 pm
Location: Belgium
Contact: Website

Question: Hitachi LCD

Sat Apr 11, 2015 1:10 pm

Hey everyone

I have a Hitachi sx19v007-z2a laying around. So I was thinking if I could control it using a raspberry pi.
I found the datasheet for this device and I understand the protocol for sending frames (p7).
The problem is the speed of the IO's of the raspberry pi.

I wrote this little program to write 1 line at (I think) max speed.

Code: Select all

import RPi.GPIO as GPIO

data_pins = [16,18,7,11,13,15,19,21]

CL1_pin = 22
CL2_pin = 24
FLM_pin = 26

# Firts line full red. 
# 240 bytes 
# *8  -> 1920 bits 
# :3 (RGB)  -> 640 pixels

byte_array = [	0b10010010,0b01001001,0b00100100,
				0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
				0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
				0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
				0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
				0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100,
                0b10010010,0b01001001,0b00100100]

#Board layout
GPIO.setmode(GPIO.BOARD)

# Set the data pins as output
for i in range(0,8):
	GPIO.setup(data_pins[i], GPIO.OUT)

# Set the control pins as output
GPIO.setup(CL1_pin, GPIO.OUT)
GPIO.setup(CL2_pin, GPIO.OUT)
GPIO.setup(FLM_pin, GPIO.OUT)

#Subroutine for writing the data
def write_data(byte):
	GPIO.output(CL2_pin, True)

        for i in range(0,8):	# Every pin its corresponding value
		GPIO.output(data_pins[i], ((byte & (1 << i)) != 0))

	GPIO.output(CL2_pin, False)

for i in range(0,239):	# 239 bytes without puls on CL1
	write_data(byte_array[i])

GPIO.output(CL1_pin, True)
write_data(byte_array[239])	# Last byte with puls on CL1
GPIO.output(CL1_pin, False)

#Wait for key press
raw_input("Press Enter to clear the IO outputs...")

GPIO.cleanup() # Clean the IO's
Regarding to my measurements it took about 30ms to send the 240 bytes.
Image
This is way to slow, because then it would take 480*30ms = 14,4 sec. for 1 frame which is a frequency of 0,0694 Hz and the datasheet said 70Hz was the least frequency.

My question is:
Is there a way to speed this up in Raspbian?
If not, do you think it is possible in bare metal?

Otherwise I'll need an FPGA/CPLD. :(

Laurens

User avatar
Laurens-wuyts
Posts: 716
Joined: Wed Aug 21, 2013 7:35 pm
Location: Belgium
Contact: Website

Re: Question: Hitachi LCD

Sat Apr 11, 2015 3:58 pm

Ok

I got 100 times faster using C and the bcm2835 library.:P
Image

But it's still not fast enough. :cry:
I have 1 option left before bare metal:
Straight accessing the IO's. ;)

Hope this works.

Laurens

P.S. The C code:

Code: Select all

#include <bcm2835.h>

#define data_pin_1 RPI_V2_GPIO_P1_16
#define data_pin_2 RPI_V2_GPIO_P1_18
#define data_pin_3 RPI_V2_GPIO_P1_07
#define data_pin_4 RPI_V2_GPIO_P1_11
#define data_pin_5 RPI_V2_GPIO_P1_13
#define data_pin_6 RPI_V2_GPIO_P1_15
#define data_pin_7 RPI_V2_GPIO_P1_19
#define data_pin_8 RPI_V2_GPIO_P1_21

#define FLM_pin RPI_V2_GPIO_P1_26
#define CL1_pin RPI_V2_GPIO_P1_24
#define CL2_pin RPI_V2_GPIO_P1_22

unsigned char red[3] = {0b10010010,0b01001001,0b00100100};
unsigned char i;

int main()
{
	if(!bcm2835_init())
		return 1;

	bcm2835_gpio_fsel(data_pin_1, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_fsel(data_pin_2, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_fsel(data_pin_3, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_fsel(data_pin_4, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_fsel(data_pin_5, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_fsel(data_pin_6, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_fsel(data_pin_7, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_fsel(data_pin_8, BCM2835_GPIO_FSEL_OUTP);

	bcm2835_gpio_fsel(FLM_pin, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_fsel(CL1_pin, BCM2835_GPIO_FSEL_OUTP);
	bcm2835_gpio_fsel(CL2_pin, BCM2835_GPIO_FSEL_OUTP);

	for(i = 0; i < 79; i++)
	{
		bcm2835_gpio_write(CL2_pin, HIGH);
		bcm2835_gpio_write(data_pin_1, (red[0] & 0b10000000));
		bcm2835_gpio_write(data_pin_2, (red[0] & 0b01000000));
		bcm2835_gpio_write(data_pin_3, (red[0] & 0b00100000));
		bcm2835_gpio_write(data_pin_4, (red[0] & 0b00010000));
		bcm2835_gpio_write(data_pin_5, (red[0] & 0b00001000));
		bcm2835_gpio_write(data_pin_6, (red[0] & 0b00000100));
		bcm2835_gpio_write(data_pin_7, (red[0] & 0b00000010));
		bcm2835_gpio_write(data_pin_8, (red[0] & 0b00000001));
		bcm2835_gpio_write(CL2_pin, LOW);
		
		bcm2835_gpio_write(CL2_pin, HIGH);
		bcm2835_gpio_write(data_pin_1, (red[1] & 0b10000000));
		bcm2835_gpio_write(data_pin_2, (red[1] & 0b01000000));
		bcm2835_gpio_write(data_pin_3, (red[1] & 0b00100000));
		bcm2835_gpio_write(data_pin_4, (red[1] & 0b00010000));
		bcm2835_gpio_write(data_pin_5, (red[1] & 0b00001000));
		bcm2835_gpio_write(data_pin_6, (red[1] & 0b00000100));
		bcm2835_gpio_write(data_pin_7, (red[1] & 0b00000010));
		bcm2835_gpio_write(data_pin_8, (red[1] & 0b00000001));
		bcm2835_gpio_write(CL2_pin, LOW);
		
		bcm2835_gpio_write(CL2_pin, HIGH);
		bcm2835_gpio_write(data_pin_1, (red[2] & 0b10000000));
		bcm2835_gpio_write(data_pin_2, (red[2] & 0b01000000));
		bcm2835_gpio_write(data_pin_3, (red[2] & 0b00100000));
		bcm2835_gpio_write(data_pin_4, (red[2] & 0b00010000));
		bcm2835_gpio_write(data_pin_5, (red[2] & 0b00001000));
		bcm2835_gpio_write(data_pin_6, (red[2] & 0b00000100));
		bcm2835_gpio_write(data_pin_7, (red[2] & 0b00000010));
		bcm2835_gpio_write(data_pin_8, (red[2] & 0b00000001));
		bcm2835_gpio_write(CL2_pin, LOW);
	}

	bcm2835_gpio_write(CL2_pin, HIGH);
	bcm2835_gpio_write(data_pin_1, (red[0] & 0b10000000));
	bcm2835_gpio_write(data_pin_2, (red[0] & 0b01000000));
	bcm2835_gpio_write(data_pin_3, (red[0] & 0b00100000));
	bcm2835_gpio_write(data_pin_4, (red[0] & 0b00010000));
	bcm2835_gpio_write(data_pin_5, (red[0] & 0b00001000));
	bcm2835_gpio_write(data_pin_6, (red[0] & 0b00000100));
	bcm2835_gpio_write(data_pin_7, (red[0] & 0b00000010));
	bcm2835_gpio_write(data_pin_8, (red[0] & 0b00000001));
	bcm2835_gpio_write(CL2_pin, LOW);
		
	bcm2835_gpio_write(CL2_pin, HIGH);
	bcm2835_gpio_write(data_pin_1, (red[1] & 0b10000000));
	bcm2835_gpio_write(data_pin_2, (red[1] & 0b01000000));
	bcm2835_gpio_write(data_pin_3, (red[1] & 0b00100000));
	bcm2835_gpio_write(data_pin_4, (red[1] & 0b00010000));
	bcm2835_gpio_write(data_pin_5, (red[1] & 0b00001000));
	bcm2835_gpio_write(data_pin_6, (red[1] & 0b00000100));
	bcm2835_gpio_write(data_pin_7, (red[1] & 0b00000010));
	bcm2835_gpio_write(data_pin_8, (red[1] & 0b00000001));
	bcm2835_gpio_write(CL2_pin, LOW);
		
	bcm2835_gpio_write(CL1_pin, HIGH);
	bcm2835_gpio_write(CL2_pin, HIGH);
	bcm2835_gpio_write(data_pin_1, (red[2] & 0b10000000));
	bcm2835_gpio_write(data_pin_2, (red[2] & 0b01000000));
	bcm2835_gpio_write(data_pin_3, (red[2] & 0b00100000));
	bcm2835_gpio_write(data_pin_4, (red[2] & 0b00010000));
	bcm2835_gpio_write(data_pin_5, (red[2] & 0b00001000));
	bcm2835_gpio_write(data_pin_6, (red[2] & 0b00000100));
	bcm2835_gpio_write(data_pin_7, (red[2] & 0b00000010));
	bcm2835_gpio_write(data_pin_8, (red[2] & 0b00000001));
	bcm2835_gpio_write(CL2_pin, LOW);
	bcm2835_gpio_write(CL1_pin, LOW);
	
	while(1)
	{
		
	}
}

Return to “Python”