Buenas, realmente no soy como REDPIC para los tutoriales o ejemplos, pero creo que puede llegar a servir este ejemplo:
En un proyecto ya funcionando, tengo que hacer algo para ver el estado de algunas variables, y escribir valores al programa
como las entradas de la USART ya las tengo usadas, implemente por soft la comunicación, con resultados buenos, asi que
comparto para que sea de utilidad, o mejoremos.
Para detectar el inicio de la comunicación, uso la interrupción por cambio del pin RB6, ahi hago el Getc(), luego deshabilito
la interrupción por RB6, y proceso el dato fuera de la interrupción, luego, preparo para la sig interrupción.
#INT_RB
void RB6_isr(void){
int RX =0;
output_toggle(pStatusLed);
disable_interrupts(INT_RB6);
rx=GETC();
rx_char=RX;
fCommand=1;
}
fCommand lo uso para en el main ver el byte que llego y ir armando la acción que queremos hacer:
if (fCommand){
/*estructura de comandos
1 byte= comando: R:leer, W:escribir
2 byte= decimal parametro: 0 a 9
3 byte= unidad parametro: 0 a 9
4 byte= caracter fin comando 0x0A si es lectura
caracter = si es escritura
5 byte= centena valor parametro;
6 byte= decena valor parametro;
7 byte= unidad valor parametro;
8 byte= caracter fin de comando 0x0A
*/
fCommand=0;
switch (rx_index){
case 0://primer byte recibido (COMANDO)
if (rx_char == 'R') fLeer =1;
else if (rx_char == 'W')fEsc=1;
else if (rx_char == 'M')fMon=1;
parNro=0;
break;
case 1://segundo byte (DECIMAL PARAMETRO)
parNro = (rx_char - 0x30)*10;
break;
case 2://segundo byte (UNIDAD PARAMETRO)
parNro = (rx_Char-0x30)+parNro;
BREAK;
case 3://caracter "=" si es escritura
break;
case 4://centena de valor a setear
ParVal= (rx_char - 0x30)*100;
break;
case 5://decena de valor a setear
ParVal= (rx_char - 0x30)*10 + ParVal;
break;
case 6://centena de valor a setear
ParVal= (rx_char - 0x30)+ ParVal;
break;
}
rx_index++;
if (rx_char == 0x0A){
if (fLeer) printf("Parametro Nro: %u\r\n",ParNro);
if (fEsc) printf("Par/Val: %u, %u\r\n",ParNro,ParVal);
parNro=0;
rx_index=0;
fLeer=0;
fEsc=0;
}
enable_interrupts(INT_RB6);
}
Las pruebas las estoy haciendo habilitando la interrupción por RB6 después de revisar el byte que llego,
se podría probar a habilitar la interrupción, dentro de la rutina de interrupción, después del GETC, pero
todavía no lo hice.
Espero que sea de utilidad para alguien.
Saludos.
Alejandro.