maunix muchas gracias, no logro entenderlo pero el poner un while(true) ha surtido efecto!!!
Si no lo entiendes, acá estamos para ayudarte a entender. Tu has demostrado esfuerzo e interés en resolver el problema, y en esos casos te aseguro que encontraras en este foro gente dispuesta a echarte una mano!
Piensa de la siguiente forma.
El main no diferente a cualquier otra función, empieza y termina. Y cuando termina... a donde va? qué hace? Bueno, esto depende del compilador. Algunos envían al código de nuevo a reiniciarse, otros lo dejan ahi parado, lo mandan al micro a un sleep, etc.
Imaginate que tuvieras
void main(void)
{
...
...
}
sleep
Siendo el sleep una instrucción que estará en memoria de programa, no visible para el programador sino que se compilará justo debajo de la última instrucción del bucle main. Lo mismo puede ser si el micro hace un reseteo o similar (esto es solo para los 18F y superiores).
Entonces la usart tiene tamaño para un par de bytes. Uno en el TXREG y otro en el registro de transmisión TSR. Entonces, en esa parte el código quiere enviar. Cambiaré el número para hacer gráfico el ejemplo y que no te marees con tantos 2.
Ej. respuesta = 234.
1. El micro tiene el TXREG = "2" y el TSR = " "
(esto es porque el contenido del TXREG pasa al TSR cuando éste se vacía, es el TSR el que irá sacando sus bits por el pin)
2. Se transmitió correctamente el espacio y ahora tenemos:
TXREG = "3" y el TSR = "2".
3. Se transmitió correctamente el "2" ahora tenemos
TXREG = "4" y el TSR = "3"
4. Se transmitió correctamente el "3" ahora tenemos
TXREG = <vacío> y el TSR = "4"
En tu caso, ni bien comienza la secuencia 3, el micro se va a dormir, se resetea o lo que sea. Por eso si le pones un while() que evite que se resetee o vaya a dormir, tu dato se transmite correctamente!
Espero haber sido claro