Go Down

Topic: Librería gameduino 2 modificada para pantallas FT81X  (Read 42663 times) previous topic - next topic

RndMnkIII

Hola buenas, he estado mirando el tema de como modificar la velocidad del bus SPI de las Teensy 3.x.
La cuestion es que no se puede hacer utilizando las funciones de la librería estandard de Arduino, porque
solo funciona con las placas con procesador AVR y con las placas Due (función setClockDivider).
Buscando en algunos foros, el desarrollador de las placas Teensy, PaulStoffregen, ha modificado una librería
para utilizar pantallas ST7735 con bus SPI alcanzando velocidades de hasta 24MHz. La clave está en manipular
los registros del procesador de la Teensy 3.x (CortexM4) a bajo nivel para inicializarlos a los valores correctos. Además habría que parchear todas las llamadas a funciones de inicialización y transferencia del bus SPI en el código fuente de GD2. Así que ya tengo tareas pendientes para solucionar:
- Solventar conexión Teensy 3.x a shield tft Riverdi.
- Modificar código SPI para utillizar optimizaciones para procesador CortexM4.

Dejo un fragmento del código que he extraído de la citada librería, extraído de aquí:
https://github.com/PaulStoffregen/Adafruit_ST7735/blob/master/Adafruit_ST7735.cpp:

Code: [Select]
/***************************************************************/
/*     Teensy 3.0, 3.1, 3.2, 3.5, 3.6                          */
/***************************************************************/
#elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__)

inline void Adafruit_ST7735::writebegin()
{
}

inline void Adafruit_ST7735::spiwrite(uint8_t c)
{
for (uint8_t bit = 0x80; bit; bit >>= 1) {
*datapin = ((c & bit) ? 1 : 0);
*clkpin = 1;
*clkpin = 0;
}
}

void Adafruit_ST7735::writecommand(uint8_t c)
{
if (hwSPI) {
KINETISK_SPI0.PUSHR = c | (pcs_command << 16) | SPI_PUSHR_CTAS(0);
while (((KINETISK_SPI0.SR) & (15 << 12)) > (3 << 12)) ; // wait if FIFO full
} else {
*rspin = 0;
*cspin = 0;
spiwrite(c);
*cspin = 1;
}
}

void Adafruit_ST7735::writedata(uint8_t c)
{
if (hwSPI) {
KINETISK_SPI0.PUSHR = c | (pcs_data << 16) | SPI_PUSHR_CTAS(0);
while (((KINETISK_SPI0.SR) & (15 << 12)) > (3 << 12)) ; // wait if FIFO full
} else {
*rspin = 1;
*cspin = 0;
spiwrite(c);
*cspin = 1;
}
}

void Adafruit_ST7735::writedata16(uint16_t d)
{
if (hwSPI) {
KINETISK_SPI0.PUSHR = d | (pcs_data << 16) | SPI_PUSHR_CTAS(1);
while (((KINETISK_SPI0.SR) & (15 << 12)) > (3 << 12)) ; // wait if FIFO full
} else {
*rspin = 1;
*cspin = 0;
spiwrite(d >> 8);
spiwrite(d);
*cspin = 1;
}
}

static bool spi_pin_is_cs(uint8_t pin)
{
if (pin == 2 || pin == 6 || pin == 9) return true;
if (pin == 10 || pin == 15) return true;
if (pin >= 20 && pin <= 23) return true;
return false;
}

static uint8_t spi_configure_cs_pin(uint8_t pin)
{
        switch (pin) {
                case 10: CORE_PIN10_CONFIG = PORT_PCR_MUX(2); return 0x01; // PTC4
                case 2:  CORE_PIN2_CONFIG  = PORT_PCR_MUX(2); return 0x01; // PTD0
                case 9:  CORE_PIN9_CONFIG  = PORT_PCR_MUX(2); return 0x02; // PTC3
                case 6:  CORE_PIN6_CONFIG  = PORT_PCR_MUX(2); return 0x02; // PTD4
                case 20: CORE_PIN20_CONFIG = PORT_PCR_MUX(2); return 0x04; // PTD5
                case 23: CORE_PIN23_CONFIG = PORT_PCR_MUX(2); return 0x04; // PTC2
                case 21: CORE_PIN21_CONFIG = PORT_PCR_MUX(2); return 0x08; // PTD6
                case 22: CORE_PIN22_CONFIG = PORT_PCR_MUX(2); return 0x08; // PTC1
                case 15: CORE_PIN15_CONFIG = PORT_PCR_MUX(2); return 0x10; // PTC0
        }
        return 0;
}

#define CTAR_24MHz   (SPI_CTAR_PBR(0) | SPI_CTAR_BR(0) | SPI_CTAR_CSSCK(0) | SPI_CTAR_DBR)
#define CTAR_16MHz   (SPI_CTAR_PBR(1) | SPI_CTAR_BR(0) | SPI_CTAR_CSSCK(0) | SPI_CTAR_DBR)
#define CTAR_12MHz   (SPI_CTAR_PBR(0) | SPI_CTAR_BR(0) | SPI_CTAR_CSSCK(0))
#define CTAR_8MHz    (SPI_CTAR_PBR(1) | SPI_CTAR_BR(0) | SPI_CTAR_CSSCK(0))
#define CTAR_6MHz    (SPI_CTAR_PBR(0) | SPI_CTAR_BR(1) | SPI_CTAR_CSSCK(1))
#define CTAR_4MHz    (SPI_CTAR_PBR(1) | SPI_CTAR_BR(1) | SPI_CTAR_CSSCK(1))

void Adafruit_ST7735::setBitrate(uint32_t n)
{
if (n >= 24000000) {
ctar = CTAR_24MHz;
} else if (n >= 16000000) {
ctar = CTAR_16MHz;
} else if (n >= 12000000) {
ctar = CTAR_12MHz;
} else if (n >= 8000000) {
ctar = CTAR_8MHz;
} else if (n >= 6000000) {
ctar = CTAR_6MHz;
} else {
ctar = CTAR_4MHz;
}
SIM_SCGC6 |= SIM_SCGC6_SPI0;
KINETISK_SPI0.MCR = SPI_MCR_MDIS | SPI_MCR_HALT;
KINETISK_SPI0.CTAR0 = ctar | SPI_CTAR_FMSZ(7);
KINETISK_SPI0.CTAR1 = ctar | SPI_CTAR_FMSZ(15);
KINETISK_SPI0.MCR = SPI_MCR_MSTR | SPI_MCR_PCSIS(0x1F) | SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF;
}


Saludos!

lightcalamar

#31
Dec 11, 2016, 07:44 pm Last Edit: Dec 11, 2016, 07:47 pm by lightcalamar
Esta tarde he realizado testeos sobre mi MDC que estoy realizando.

Con los sensores que tengo puestos a mi FT800, y no creo que sea por el números de ellos porque todavía faltan algunos mas, llegado al testeo como dije la pantalla se me congelaba, o dicho de otro modo "colgaba" a los 10 / 15 minutos muy eraticamente inclusive a los 2/3 minutos.

Unas semanas atrás estuve intentando averiguar cual es el problema y hoy hablando con Javier sobre velocidades del BUS SPI, he probado al menos en MEGA la velocidad adecuada al chip FT800Q en la cual la linea en el setup es esta;

Code: [Select]

SPI.setClockDivider(SPI_CLOCK_DIV32);


es decir la frecuencia de Arduino MEGA (16MHz) 16:32 = 0,5 es decir a 500kHz. De momento y después de mas de 40 minutos 0 cuelgues. Aqui va el dato para futuros problemas. Otra cosa sean las FT811 y familia... por averiguar hasta donde alcanzan. Veo a echar un vistazo a las DataSheet de las FT8xx a ver si maxima velocidad.

Saludos.
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

RndMnkIII

Hola TFTLCDCyg,  necesito ayuda para ver que pines de la Teensy 3.2 deberia utilizar para los CS de la TFT y la SD. Si me pudieras adjuntar algun esquema de conexionado te lo agradecería un monton.

Saludos!

RndMnkIII

Mi idea es usar la shield que he creado con la teensu 3.2 para conectarla al shield tft de riverdi


https://drive.google.com/file/d/0By5wADoEOJ9fYzNNWlJOZU13a00/view?usp=drivesdk



TFTLCDCyg

Tiene buen aspecto ese shield, de hecho yo uso esta placa de prototipado:


Sus dimensiones permiten construir shields para teensy que pueden conectarse a los shields de arduino UNO. Se pueden conectar tanto el teensy 3.2 y el 3.6.

Usé este conexionado:

Code: [Select]
FT8XX    Teensy 3.2/3.6

MOSI        11   (MOSI0)
MISO        12   (MISO0)
SCK         13   (SCK0)
CS          10   (CS0)
GND         GND
VCC         3.3 V
VDD-BL      3.3 V
GND-BL      GND

SD-CS       5


Es compatible con las librerías GD2 y GD3 referidas en este post.

RndMnkIII

Ok gracias, probaré a ver que tal. Si me puedes decir donde has comprado los pcb protoboard que utilizas porque los mios ya venian con los headers de arduino soldados y las conexiones ya estaban soldadas por lo que me ha complicado mas el tema de soldar el cableado de los pines de la teensy al header.

lightcalamar

Hola Javier.

Yo he comprado la protoboard que ha puesto TFTLCDCyg en Ebay, concretamente este enlace todavia no me ha llegado pues lo pedí hace 3 semanas. A ver si esto te ayuda.
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

RndMnkIII

He conseguido mantener estable RVT70UQFNWC0x. Después de varias pruebas he verificado que con una fuente de alimentación externa que la pantalla junto con el arduino mega requiere unos 700mA de corriente para funcionar. Asi que nada de alimentar directamente la pantalla a través de un puerto USB o el regulador de 3.3v de la Teensy 3.2.

https://drive.google.com/file/d/0By5wADoEOJ9fRTJmT2toR0JCNjg/view?usp=sharing

https://drive.google.com/file/d/0By5wADoEOJ9fWGpFdElMMWpMM28/view?usp=sharing

RndMnkIII

https://drive.google.com/file/d/0By5wADoEOJ9fMlVuMGt4UnlVejQ/view?usp=sharing

Regulador de corriente que proporciona tanto 3.3v como 5v que he utilizado.
http://www.petervis.com/Raspberry_PI/Breadboard_Power_Supply/YwRobot_Breadboard_Power_Supply.html

https://drive.google.com/file/d/0By5wADoEOJ9fMlVuMGt4UnlVejQ/view?usp=sharing

No lo recomiendo ya que la máxima corriente que puede suministrar son 700mA, con lo que estaría funcionando al 100% de sus posibilidades, algo nada recomendable.

RndMnkIII

Esto ya va marchando. Probando demo de streaming de audio. He utilizado un amplificador digital PAM8403 para amplificar la señal hasta 3w.
https://drive.google.com/file/d/0By5wADoEOJ9fT2kyMlpMNE9QM1k/view?usp=drivesdk

También quiero agradecer la ayuda prestada por lightcalamar, quien me ha dado algunos sabios consejos sin los que no hubiese progresado tan rapido.

Saludos!


RndMnkIII

Examinando los esquemas de la riverdi tft shield me he dado cuenta de que hay un chip (NVT2008BQ) que convierte los niveles de 5v de arduino a los 3.3v del FT813. Con el shield Teensy que he intentado hacer no he tenido en cuenta esto y basicamente estaba metiendo las señales de la teensy (3.3v) a dicho conversor por el lado de los 5v. Tendre q realizar el conexionado de otra forma para evitar q las señales pasen por dicho chip, utilizando en conector CN2 que parece q maneja las señales directamente a 3.3v. El problema es que no se como acceder a la señal CS de 3.3v de la SD card del tft shield.

TFTLCDCyg

El Teensy 3.2 soporta lógica de 3.3V y de 5V, creo que no tendría que haber algún problema, sin embargo el teensy requiere de un cableado lo mas directo posible hacia la pantalla.

El camino que estás siguiendo es nuevo ya que desde un principio opté por el break out-20 de Riverdi, incluso para el Due y el teensy 3.2. Había experimentado previamente con lectores micro SD y di con el adecuado.



ligthcalamar decidió construir un lector a partir de uno de los adaptadores micro SD que tiene kingston y funciona correctamente. De cuando en cuando hay que formatear la tarjeta micro SD con el fin de eliminar alguno que otro error de lectura.

Te sugiero que trates de conseguir el break out-20 de Riverdi, te ahorrará muchos dolores de cabeza





El arreglo final es alimentado por USB y es suficiente para abastecer la demanda de la retroiluminación de la pantalla FT813 de 5". Recuerda que el teensy 3.2 tiene dos pines de 3.3V, uno de esos pines entrega un máximo de 250 mA. Te sugiero usar el segundo, ubicado cerca del procesador cortex.

El cableado que usé en el teensy 3.2 lo volví a usar en el teensy 3.6, lo aprendido con el lector micro SD ayudó a desistir en usar el shield de Riverdi.


lightcalamar

Tema sobre adaptador microSD

Como bien dices TFTLCDCyg mi primera shield la he realizado con un adaptador que se vende junto a la microSD (concretamente Kington) sin embargo esto es para usuarios avanzados porque los cables han de ser muy relativamente cortos.

Encontré la solución a los adaptadores microSD funcionando a lógica de 3V3 como tiene que ser, éste puede ser usado por usuarios no tan expertos y  es  este;



El enlace de la tienda para comprarlo es esta

Hay que realizar unas simples modificaciones y es la mejor opción. Esto lo tengo ya preparado en mi Manual PDF que estoy realizando para pantallas comprados en HotMCU.com y compatible con Arduino DUE como ejemplo. Esta shield microSD en su formato esta preparada para realizar un simple PCB con el "cabezal" SPI de Arduino ahorrando cables, longitudes etc... yo diría que es perfecta para su manejo de "plug and play".

Lógica / conversores 3V3 y/o 5V

Esto lo detallo sin haber realizado ninguna prueba sin embargo tengo todo lo necesario para intentar hacer funcionar las pantallas HotMCU de logica 5V a 3V3 y es mas usando hasta la shield de Riverdi dado el caso.
Los conversores de nivel lógico no solo realizan esta función, sino otra muy importante que es internamente estos poseen unos buffers los cuales "planchan" la señal y la generan sin ruidos hasta cierta longitud donde las señales pueden manejarse en su origen. Si la shield de Riverdi usa esta lógica desde su propio conversor a 5V, ya que el LCD (cristal liquido) de la pantalla trabaja a 3V3 lo que se podría usar en un segundo conversor y he aquí el motivo de mi mensaje.

Es decir poner un nuevo conversor de 5V a 3V3 sería este chip; TXS0108E  http://www.ti.com/lit/ds/symlink/txs0108e-q1.pdf en el cual tendríamos: 3V3· a 5V y luego 5V a 3V3 este es la solución al menos hacer trabajar mis pantallas en un futuro con Teensy o DUE.

De estas pruebas os mantendré informados.




Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

Go Up