Tengo un tablero teensy 2.0 y trato de usarlo para controlar este LCD a través de la serie TTL.
Conseguí que funcionara bien con mi Arduino uno y un código de Arduino de muestra, pero quiero hacerlo con el lenguaje teensy y C.
El teensy utiliza el ATmega32u4 y aquí está la hoja de datos para ese chip.
En la hoja de datos, a partir de la página 186, se encuentra la sección sobre USART. En la página 192 hay un código de ejemplo en lenguaje C sobre cómo inicializar el USART. Estoy confundido en un par de líneas y podría necesitar ayuda.
void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRHn = (unsigned char)(baud>>8);
UBRRLn = (unsigned char)baud;
/*rest of code here*/
}
Primero, no tengo claro cuál debería ser el número de velocidad en baudios. Mi pantalla LCD requiere 9600 baudios con 1 bit de inicio, 1 bit de parada, sin bit de paridad y 8 bits de datos. En la página 189 de la hoja de datos del ATmega32u4 hice el cálculo de cuál debería ser la velocidad en baudios que, en el caso de la combinación teensy y LCD, debería ser 103 porque la frecuencia del chip es 16mhz y la velocidad en baudios es 9600. Esto también coincide con el número en la tabla en la página 213 de la hoja de datos del ATmega32u4. Entonces, ¿es este el número correcto que se pasaría a la función USART_Init para la variable en baudios?
También estoy confundido en las dos líneas que establecen la velocidad de transmisión. Entiendo que, según la página 209 de la hoja de datos de ATmega32u4, los registros de velocidad en baudios se dividen en un registro alto y bajo, pero solo se utilizan los bits 8:10 en el registro alto, lo que lo convierte en un registro combinado de 12 bits. Entonces, volviendo al código, no entiendo algunas cosas:
- ¿Por qué se está encasillando a un personaje sin firma porque supongo que UBRRHn debería estar en notación binaria?
- Tampoco entiendo la parte (baudios > > 8) porque si rellenas 103 para baudios obtienes (103 > > 8) y eso no está bien. ¿Alguien puede explicar esta línea para mí? Gracias.
UBRRHn = (unsigned char)(baud>>8);<br/>
UBRRLn = (unsigned char)baud;
- ¿Debe baud ser la versión binaria de 12 bits de 103 que es 00001100111? Si es así, ¿cómo se escribiría el código?
También, encontré algunos ejemplos de código (http://www.pjrc.com/teensy/uart.html) en el sitio web de teensy que configura el UART y configura la velocidad de transmisión de esta manera:
void uart_init(uint32_t baud)
{
cli();
UBRR1 = (F_CPU / 4 / baud - 1) / 2;
/*rest of code here*/
}
Si conecto los números, se vería así:
UBRR1 = (16000000 / 4 / 9600 - 1) / 2; /* Which would equal 208 */
- El número 208 es diferente de 103, por lo que no entiendo de dónde sacan la ecuación para calcularlo.
- UBRRn solo se menciona en la hoja de datos de ATmega32u4 en las páginas 188 y 189. Parece que tiene el valor de UBRRHn y UBRRLn. El código anterior parece estar intentando configurar ambos al mismo tiempo pero como un int. Estoy tan confundido, ¿no es necesario que esté en notación binaria?
Bueno, estoy deseando superar esta joroba y seguir haciendo que mi LCD bailen. :)