Programación de Pantalla LCD

Dudas, cuestiones, sugerencias y peticiones en general sobre esta placa

Moderador: jepalza

Responder
Anticiudadano
Veroboard
Mensajes: 1
Registrado: 17 Jun 2019, 17:25

Programación de Pantalla LCD

Mensaje por Anticiudadano » 17 Jun 2019, 17:46

Buenas, el motivo de este post es para resolver un rompe cabeza. Mi placa es una Arty 35t de digilent (https://reference.digilentinc.com/refer ... y-a7/start) y me he comprado esta pantalla lcd con el shield de arduino(http://www.lcdwiki.com/3.5inch_Arduino_Display-UNO).

MI problema es "sencillo" quiero poder programar la pantalla lcd desde microblaze,para el cual he creado el hardware en vivado y compilado. Lo he abierto con el xilinx sdk y he comenzado a realizar un programa en C. He estado leyendo el datasheet de la pantalla que usa el microcontrolador ILI9486. En el apartado "7.3.3.2.1.2." del datasheet muestra un ejemplo de conjuntos de palabras que envías con los 8 pines que son la comunicación en paralelo y para la comunicación y no consigo que reaccione ante nada. He comprobado con un osciloscopio las señales de salida de la fpga y salen las señales correctas.

Por lo tanto mi duda es un poco de luz con respecto al tema o en su defecto, como poder adaptar las librerías de arduino a microblaze para poder usarlo de manera más sencilla.

Este es el código que estoy usando para dicha palabra de estado que quiero enviar:

Código: Seleccionar todo

/*
 * Send_test.c
 *
 *  Created on: 1 jun. 2019
 *      Author: Edu
 */


#include 	"xparameters.h"
#include	"xgpio.h"
#include	"xil_printf.h"
#include 	<stdio.h>
#include	"microblaze_sleep.h"



/* Pines de Control Sobre el LCD
#define	LCD_RST		0x12	//18
#define LCD_CS		0x11	//17
#define	LCD_RS		0x10	//16
#define LCD_WR		0x0F	//15
#define	LCD_RD		0x0E


/*Pines D para el BUS de datos y parámetros que van desde el 7 al 0
#define LCD_D7		0x07
#define LCD_D6		0x06
#define LCD_D5		0x05
#define LCD_D4		0x04
#define LCD_D3		0x03
#define LCD_D2		0x02
#define LCD_D1		0x09
#define LCD_D0		0x08



/*Pines de control sobre protocolo SPI para tarjeta SD
#define SD_SCK		0x0D
#define	SD_MOSI		0x0C
#define SD_MISO		0x0B
#define	SD_SS		0X0A

#define Screen_On

#define	Column_Strt
#define	Column_End
#define	Page_Strt
#define	Page_End
*/
											//	Rst		CS		RS		RD		WR
#define Screen_Wr_On			0x13		//	 1		 0		 0		 1		 1
#define	Screen_Wr_Off			0x12		//	 1		 0		 0		 1		 0
#define	Screen_Cmd_Data			0x04		//	 0		 0		 1		 0		 0

#define Data_Identification		0x05
#define ECC						0x2C


#define Screen_Off				0x28
#define	Screen_On				0x29
#define	Sleep_In				0x10
#define Sleep_Out				0x11



#define Colum_Cmd				0x2A			//479
#define Colum_IniMsb			0x00
#define Colum_IniLsb			0x00
#define Colum_EndMsb			0x01
#define Colum_EndLsb			0xDF

#define Page_Cmd				0x2B			//319
#define Page_IniMsb				0x00
#define Page_IniLsb				0x00
#define Page_EndMsb				0x00				//0x01
#define Page_EndLsb				0x0F				//0x3F

#define Memory_Writ				0x2C
#define Memory_Read				0x2E

#define azul					0x00
//Direccionamiento a dispositivo
#define GPIO_DEVICE		XPAR_AXI_GPIO_0_DEVICE_ID
#define Param_Data			1
#define Control				2


int Status;

XGpio	GpioOutput;

void WriteFunction(int Param1o0);
void CommandFunction(int byte,int Param1o0);



void WriteFunction(int Param1o0){
	if (Param1o0 == 1){
		XGpio_DiscreteWrite(&GpioOutput,Control,Screen_Wr_On+Screen_Cmd_Data);
		usleep_MB(50);
		XGpio_DiscreteWrite(&GpioOutput,Control,Screen_Wr_Off+Screen_Cmd_Data);
		usleep_MB(50);
		XGpio_DiscreteWrite(&GpioOutput,Control,Screen_Wr_On+Screen_Cmd_Data);
	}
	else{
		XGpio_DiscreteWrite(&GpioOutput,Control,Screen_Wr_On);
		usleep_MB(50);
		XGpio_DiscreteWrite(&GpioOutput,Control,Screen_Wr_Off);
		usleep_MB(50);
		XGpio_DiscreteWrite(&GpioOutput,Control,Screen_Wr_On);
	}
}


void CommandFunction(int Hexa,int Param1o0){

	XGpio_DiscreteWrite(&GpioOutput,Param_Data,Hexa);
	usleep_MB(50);
	WriteFunction(Param1o0);
}



main(){

	Status = XGpio_Initialize(&GpioOutput,GPIO_DEVICE);
	if(Status != XST_SUCCESS){
		xil_printf("\n El inicio ha sido fallido \n\r");
		return XST_FAILURE;
	}

	XGpio_SetDataDirection(&GpioOutput,Control,0x00000);
	XGpio_SetDataDirection(&GpioOutput,Param_Data,0x00000000);


	
	CommandFunction(Data_Identification,0);
	CommandFunction(Screen_Off,0);
	CommandFunction(azul,0);
	CommandFunction(ECC,0);
}
Gracias de antemano

Avatar de Usuario
yombo
Veroboard
Mensajes: 16
Registrado: 17 Ago 2018, 10:51

Re: Programación de Pantalla LCD

Mensaje por yombo » 21 Jun 2019, 16:41

No estás realizando ninguna secuencia de inicialización. La pantalla que conseguí usar desde ZX-Uno (ILI9341, parecida) tiene una secuencia de inicialización bastante larga, y hay que hacer esperas de milisegundos entre algunos comandos.

Te recomiendo que mires en su datasheet y también en la librería de Arduino para esta pantalla de Adafruit, de donde puedes copiar la secuencia para tu pantalla.

Aquí tienes la máquina de estados de ZX-Uno y la secuencia de init para 9341: https://github.com/yomboprime/zxuno-add ... /tftscreen


Edito: Aquí está la librería de Adafruit pero no contiene el ILI9486 :( https://github.com/adafruit/TFTLCD-Libr ... TFTLCD.cpp
ERROR:NgdBuild:455 - logical net 'yombo' has multiple driver(s):
ERROR:NgdBuild:924 - input pad net 'yombo' is driving non-buffer primitives:

Responder

Volver a “Preguntas y peticiones”