Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

31/01/2012 #21


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.

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.
07/02/2012 #22


Gente, muchas gracias desde ya por toda su compañía y ayuda. Finalmente recurrí al consejo de cubiella de comprar un adaptador Manhattan y así pude solucionar mi problema al cien por ciento.

Les mando un saludo grande y nuevamente les agradezco por haberme sido de tanta ayuda.

Atte. lucasescucha
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.