#define INICIO 0
#define DIRECCION 1
#define FUNCION 2
#define DATOS 3
#define CRC 4
#define END 5
char vector_t,funcion; // 8 bits
bit flag_receptor=0,crc_t=0, dato_valido,transmision_deshabilitada; // Varaible 1 bit
uin16_t valor_crc; //Variable 16 bits
#int_rda
void serial_isr() {
dato_rx
=getc(); // almaceno el dato switch(estado) {
case INICIO:
vector_t=dato_rx;
dato_valido=0;
transmision_deshabilitada=1;
estado=DIRECCION;
break;
case DIRECCION:
if(dato_rx==0x02)
{
flag_receptor=1;
}
else
{
flag_receptor=0;
}
estado=FUNCION;
break;
case FUNCION:
funcion=dato_rx;
estado=DATOS;
break;
case DATOS:
// No se bien donde sacar la cantidad de datos transmitidos, si es dependiente de la funcion o no, se guardaran o no segun flag_receptor
estado=CRC;
valor_crc=0;
break;
case CRC:
valor_crc= (dato_rx << (8 * crc_t));
crc_t ^= 1;
if (crc_t==0) {estado=END;}
break;
case END:
if(dato_rx==vector_t) { dato_valido=1; estado=INICIO; } else {//Aqui esperar hasta que no existan mas datos, solo si no se agarra de comienzo de la trama}
TMR0 = 0x00; // Valor para que se produzca el overflow
enable_interrupt(int_rtcc); // habilito interrupcion del timer
disable_interrupt(int_rda);
// Si queres alta impedancia lo habilitas aca
break;
default:
estado=INICIO;
break;
}
}
#int_rtcc
void timer0_isr() {
if(kbhit())
{
dato_rx
=getc(); //Limpio buffer ( no se la profundidad solo tome uno ) por si algun esclavo respondio algo mientras esperaba los 3.5 caracteres, no deberia y seria un error. borrar_flag_UART();
}
enable_interrupt(int_rda); // habilito interrupcion del timer
disable_interrupt(int_rtcc);
transmision_deshabilitada=0; // habilito nuevamente la transmision, ya paso el tiempo requerido entre tramas
// Aca quitarias la alta impedancia
}