Que tal remi04,
Antes que nada gracias por responder.
Yo aquí veo que el pin tx (supongo que usas el pic de 20 pins) lo tienes que elegir mediante el registro PPS. No creo que use_rs232 lo haga por ti y tampoco veo que lo estés ajustando en el main.
En realidad la directiva #use rs232 de acuerdo al manual, al definir los parámetros de xmit y rcv (que en mi caso son los puertos RB7 y RB5 respectivamente) y si el microcontrolador contiene USART por hardware lo configura automáticamente por ti, amenos que uses el parametro FORCE_SW.
Este microcontrolador contiene EUSART por hardware, por lo tanto yo esperaría que lo configura con los parametros que le estoy indicando. Pero no es así, al analizar el listing file o el assembler file, veo que está realizando la emulación del peurto serial mediante software y el baud rate generado es 108694 bps (lo he medido con un osciloscopio).
La pregunta es: ¿cómo configurar el EUSART interno mediante la directiva #use rs232?
Lo de la frecuencia de 117640 para generarla ya tienes que usar un cristal externo con frecuencia múltiplo de rs232.
No estoy intentando generar ese baud rate de 117640, lo que quiero es configurar el ESUART interno con un baud rate de 115200bps, pero según la hoja de datos, la fórmula proporcionada y la frecuencia en la que está trabajando el microcontrolador (16MHz), el baudrate generado debería ser de 117640bps, es decir no puedo generar el baud rate de 115200 bps exactos hay un error del 2.12%, pero eso esta bien, ya que cae dentro de la norma del 3%.
En el otro código veo que apuntas con directivas word a registros que son bytes. No sé si por ahí te pueden dar problemas.
En esto no estoy de acuerdo contigo porque este microcontrolador tiene 32 paginas de memoria RAM y en esas páginas se encuentran los SFR (Special Function Registers), es decir, también tenemos 32 páginas de registros de función especial.
Y como te puedes dar cuenta la dirección de los registros de configuración del ESUART comienzan en la dirección 0x199 (409 decimal), este número no pude ser #byte o no encaja en un byte. Este debe ser "#word", el cual, según el manual de CCS, es del tipo int16. Es por eso que debo definir esos registros como tipo #word y NO como tipo #byte.
El que no esté de acuerdo no significa que yo tenga razón, es posible que yo esté completamente mal y no esté entendiendo esta nueva directiva. En los microcontroladores anteriores, los SFR estaban dentro de las 256 direcciones de RAM así que siempre definía tales registros usando #byte, pero ahora la RAM es mucho más grande y las direcciones son más extensas, por eso mi conclusión de usar #word.
Ayer hice más pruebas de esto y me dí cuenta que CCS está haciendo algo muy extraño, en cada ocasión que intento asignar un valor a estos registros, siempre agrega un CLRF SFR+1 o un CLRF SFR-1
Me explico, cuando hago lo siguiente:
RCREG = 0x90;
El compilador produce el siguiente código en ensamblador:
MOVLW 90h
MOVLP 03h
MOWF RCSTA
CLRF TXSTA
Ese CLRF TXSTA no debería estar allí. De hecho lo que hice fue cambiar el orden de asignación de manera consecutiva de esta manera me evité que borrara los registros siguientes. Pero sigo teniendo problemas. Y tal vez como mencionas debería usar #byte, pero no logro entender cómo, si la direcciones de los registros de configuración del EUSART cominzan en 0x199. Alguna idea?
Nuevamente gracias y sigo esperando algunas otras ideas o sugerencias.
elreypic.