Hola mcrven. Te paso la mayor parte del código del firmware que desarrollé. Respecto al circuito, me gustaría saber primero para que lo necesitas completo, así entiendo a dónde pensas que puede estar el problema.
PD.: El código no esta totalmente documentado, igual no creo que se te complique comprender su funcionamiento. Siempre trato de desarrollar código autodocumentado.
Muchas gracias nuevamente.
PD.: El código no esta totalmente documentado, igual no creo que se te complique comprender su funcionamiento. Siempre trato de desarrollar código autodocumentado.
Código:
Version VERSION_ACTUAL={'A',0,0,1};
unsigned int8 indiceCursor=0;
volatile PuertoSerie pSerie={(int1)FALSE,(int1)FALSE,0,SIN_ERROR,{0,0,0,0,0,0}};
Pantalla* PantallaActual;
volatile unsigned int16 __temporizadorBackligth=0;
volatile unsigned int16 __temporizadorTiemout=0;
volatile int1 __actualizarPantallas=0;
unsigned int16 Adquisiciones[CANTIDAD_ENTRADAS];
Adquisicion AP;
//Interrupcion: Dato recibido por puerto serie
//Encola los datos que llegan, hasta recibir un caracter
//de fin de paquete '+'. En ese momento señaliza el
//evento para que se procese el paquete de manera
//sincrónica
#int_RDA
void RS232_isr(void)
{
output_toggle(LED2);
if(pSerie.PaqueteRecibido)
return;
if(__temporizadorTiemout>TIEMPO_TIMEOUT)
{
__temporizadorTiemout=0;
pSerie.UltimoError=ERROR_TIMEOUT;
pSerie.BytesRecibidos=0;
}
switch(pSerie.UltimoError)
{
case ERROR_TIMEOUT:
case LONGITUD_INCORRECTA:
pSerie.BytesRecibidos=0;
default:
break;
}
int8 datoRecibido=getc();
putc(datoRecibido);
if(pSerie.BytesRecibidos<LONGITUD_MAXIMA_PAQUETE)
pSerie.BufferRecepcion[pSerie.BytesRecibidos++]=datoRecibido;
if(pSerie.BytesRecibidos==1&&datoRecibido=='+'||
pSerie.BytesRecibidos>=LONGITUD_MAXIMA_PAQUETE)
{
pSerie.UltimoError=LONGITUD_INCORRECTA;
}
else if(datoRecibido=='+')
{
pSerie.PaqueteRecibido=(int1)TRUE;
pSerie.LongitudPaquete=pSerie.BytesRecibidos;
pSerie.BytesRecibidos=0;
}
}
//Interrupcion: Overflow del timer 0
#int_TIMER0
void TIMER0_isr(void)
{
static unsigned int16 contadorDivision_Timer500ms=0;
static unsigned int16 contadorDivision_RS232TimerTick=0;
static unsigned int16 contadorDivision_OnPaint=0;
output_toggle(LED1);
HandlerEventoTimer255ms();
if(contadorDivision_Timer500ms++ > FACTOR_Timer500ms)
{
contadorDivision_Timer500ms = 0;
HandlerEventoTimer500ms();
}
if(contadorDivision_RS232TimerTick++ > FACTOR_RS232TimerTick)
{
contadorDivision_RS232TimerTick = 0;
HandlerEventoOnRS232TimerTick();
}
if(contadorDivision_OnPaint++ > FACTOR_OnPaint)
{
contadorDivision_OnPaint = 0;
HandlerEventoOnPaint();
}
}
//Interrupcion: Encoder rotado
#int_EXT
void INT_EXT_isr(void)
{
HandlerEventoEncoderRotado(CalcularDireccionRotacionEncoder());
CambiarEstadoBackligth(Encendido);
__temporizadorBackligth = 0;
}
// Descripción: Función main del programa
void main(void)
{
disable_interrupts(GLOBAL);
InicializarColaDeMensajes();
InicializarEventos();
//Inicialización de puertos I/0
set_tris_A(0b11101111);
set_tris_B(0b11100011);
set_tris_C(0b10000000);
set_tris_D(0b00000000);
set_tris_E(0b00000000);
port_b_pullups(TRUE);
LATA=LATB=LATC=LATD=LATE=0x00;
//Configuración del oscilador
OSCTUNE=0b11000000;
OSCCON=0b01110011;
setup_oscillator(OSC_32MHZ);
//Espera hasta que se estabilice el oscilador interno
while(!(OSTS&&IOFS));
//Inicialización de modulo ADC
setup_adc_ports(AN0_TO_AN3 | VSS_VDD);
setup_adc(ADC_CLOCK_DIV_32 | ADC_TAD_MUL_0);
//Inicialización de modulo de comunicaciones
setup_spi(SPI_SS_DISABLED);
//Inicialización módulo de tiempos
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16|RTCC_8_BIT);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
//Configuración módulo de comparación
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
//Inicializacion de las rutinas del gLCD
glcd_init(ON);
//Renderizacion de las pantallas principales y de presentacion
Version version;
CALIB_LeerCalibracion(VERSION_FIRMWARE,(BYTE*)&version);
if(memcmp(&version,&VERSION_ACTUAL,sizeof(Version)))
{
CALIB_GrabarCalibracion(VERSION_FIRMWARE,(BYTE*)&version);
DibujarPresentacion(version,1);
}
else
DibujarPresentacion(VERSION_ACTUAL,0);
CargarCalibracionesEquipo();
CargarPantalla(&PantallaPrincipal);
//Configuracion de interrupciones
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_EXT);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
HiloPrincipal();
}
// Descripción: Esta función es el hilo general (main thread) y es
// el encargado de guardar y realizar las adquisiciones
void HiloPrincipal(void)
{
while(TRUE)
{
HiloAtencion232();
HiloAdquisicion();
HiloSistemaVentanas();
ProcesarAdquisiciones();
}
}
//Procesa el paquete recibido
void HiloAtencion232(void)
{
if(!pSerie.PaqueteRecibido)
return;
puts("PAQUETE RECIBIDO");
if(pSerie.BufferRecepcion[0]!='@')
{
pSerie.PaqueteRecibido=0;
return;
}
switch(pSerie.BufferRecepcion[1])
{
case 'C':
//CALIBRACION: 1° byte: numero de calibracion
// 2° a 5° byte: valor de la calibracion (float32)
if(pSerie.BufferRecepcion[11]!='>')
{
puts("COMANDO INCORRECTO");
pSerie.PaqueteRecibido=0;
return;
}
char respuesta[10];
float32 calibracion;
DWORD conversion=RG_ConvertirCadenaHexadecimal(pSerie.BufferRecepcion+3,8);
sprintf(respuesta,"%ld",conversion);
puts(respuesta);
CALIB_GrabarCalibracion((BYTE)pSerie.BufferRecepcion[2],(BYTE*)conversion);
CALIB_LeerCalibracion((BYTE)pSerie.BufferRecepcion[2],(BYTE*)calibracion);
puts(memcmp(calibracion,conversion,sizeof(float32))?"ERROR(2)":"CORRECTO");
CargarCalibracionesEquipo();
break;
case 'L':
{
char respuesta[10];
float32 calibracion;
CALIB_LeerCalibracion((BYTE)pSerie.BufferRecepcion[2],(BYTE*)calibracion);
sprintf(respuesta,"%02.2f",calibracion);
puts(respuesta);
break;
}
case 'P':
if(pSerie.BufferRecepcion[2]!='1')
{
puts("DIRECCION INCORRECTA");
pSerie.PaqueteRecibido=0;
return;
}
puts("ENVIANDO PAQUETE");
EnviarPaqueteRS232();
break;
case 'V':
switch(pSerie.BufferRecepcion[2])
{
case 'I': AgregarMensajeCola(MSJ_ENCODER_IZQUIERDA); break;
case 'D': AgregarMensajeCola(MSJ_ENCODER_DERECHA); break;
case 'P': AgregarMensajeCola(MSJ_BOTON_PULSADO); break;
}
break;
case 'R':
reset_cpu();
break;
}
pSerie.PaqueteRecibido=0;
}
void DibujarPresentacion(Version version, int1 actualizada)
{
char titulo1[]="PROYECTO DE";
char titulo2[]="INGENIERIA";
char nombre[]="LUCAS ............- 2012 ";
char sTemp[22];
sprintf(sTemp,"VERSION: %c.%u.%u.%u", version.Inicial,version.Mayor,
version.Menor,version.Revision);
glcd_text57(0,1,titulo1,2,1,ALIN_CENTRO);
puts(titulo1);
glcd_text57(0,17,titulo2,2,1,ALIN_CENTRO);
puts(titulo2);
glcd_text57(0,34,nombre,1,1,ALIN_CENTRO);
puts(nombre);
glcd_text57(0,44,sTemp,1,1,ALIN_CENTRO);
puts(sTemp);
if(actualizada)
{
sprintf(sTemp,"ACTUALIZADA");
glcd_text57(0,54,sTemp,1,1,ALIN_CENTRO);
puts(sTemp);
}
delay_ms(5000);
}
Muchas gracias nuevamente.