void TIMER0_IRQHandler(void) { static signed int comodin = 10; //Se usa comodin para dar el valor inicial //ya que se debe asignar un valor fijo al momento de //compilación.- static signed int valor_relativo = 0; //Almacenará el valor del timer capturado cuando interrumpe static signed int valor_absoluto = 0; //Almacenará el valor en useg acumulados entre flancos static signed int cero = 0; //Es el cero que tomará el valor final del nivel anterior if (habilitacion==TRUE){ //Estoy habilitado para operar? if (comodin==10){ cero = TIM_GetCaptureValue(LPC_TIM0,0); //Es la primera vez? comodin=20; //Cambio el valor para no volver } valor_relativo=TIM_GetCaptureValue(LPC_TIM0,0); //Copio el valor del timer capturado valor_absoluto=valor_relativo-cero; //Me quedo con el valor absolito de tiempo en useg if (valor_absoluto>MAX_FULL_BIT) //Me fijo si ese valor está fuera del valor máximo según norma { //Si era mayor es un error. Acá puede caer, si por ejemplo sys = 0; //habilito la medición y decodificación y justo cae en medio cmd = 0; //de un código. } if (GPIO_ReadValue(0) & (1<<24)) // Chequeo el GPIO P0.24 para ver que tipo de flanco es { if (sys == 0) // Es el primer pulso? { low_time = HALF_BIT_TIME; // Asumo tiempo corto en nivel bajo high_time = HALF_BIT_TIME; // Asumo tiempo corto en nivel alto half_bit = 1; // Asumo que es la mitad de un bit cmd = 0x02; // = 00000010, Preparo el byte del comando } else { low_time = valor_absoluto; // Es flanco positivo, copio valor bajo } RC5_Decode(); } else high_time = valor_absoluto; //Sino en flanco negativo, copio valor alto cero=valor_relativo; //El valor del final del nivel (alto o bajo) será mi nuevo cero TIM_ClearIntCapturePending(LPC_TIM0,0); //Reseteo la interrupción } if (habilitacion==FALSE){ //Si estoy acá, estoy en el tiempo donde no habilito la , //edición y decodificación. Lo hago para que no detecte muchos pulsos //en un pulsado. valor_relativo=TIM_GetCaptureValue(LPC_TIM0,0); //Analizo cuanto tiempo pasó desde el último valor_absoluto=valor_relativo-cero; //flanco. if (valor_absoluto>RETARDO) //Si es mayor a RETARDO useg { habilitacion=TRUE; //Ya pasó el tiempo de resguardo cero=valor_relativo; //Actualizo el cero TIM_ClearIntCapturePending(LPC_TIM0,0); //Reseteo interrupción } else TIM_ClearIntCapturePending(LPC_TIM0,0); //Si no pasó el tiempo sólo reseteo interrupción } }
/** * @brief RCR receiver demo exec. * @param None * @retval None */ void Menu_RC5Decode_Func(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* Disable the TIM15, LED Toggling */ TIM_Cmd(TIM15, DISABLE); /* Disable the JoyStick interrupt */ Demo_IntExtOnOffCmd(DISABLE); while (Menu_ReadKey() != NOKEY) {} /* Clear the LCD */ LCD_Clear(LCD_COLOR_WHITE); /* Display Image */ LCD_SetDisplayWindow(120, 192, 64, 64); Storage_OpenReadFile(120, 192, "STFILES/TV.BMP"); LCD_WindowModeDisable(); /* Set the LCD Back Color */ LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the LCD Text Color */ LCD_SetTextColor(LCD_COLOR_WHITE); LCD_DisplayStringLine(LCD_LINE_9, " To exit press UP "); /* Initialize the InfraRed application: RC5 */ RFDemoStatus = RC5DEMO; RC5_Init(); while(Menu_ReadKey() != UP) { /* Decode the RC5 frame */ RC5_Decode(&RC5_FRAME); } LCD_Clear(LCD_COLOR_WHITE); TIM_DeInit(TIM2); /* Time Base configuration 100ms*/ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 1000; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0x0C80; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* Channel 1, 2, 3 and 4 Configuration in Timing mode */ TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0x0; TIM_OC1Init(TIM2, &TIM_OCInitStructure); Demo_LedShow(ENABLE); /* Exit the RF5 demo */ RFDemoStatus = 0; /* Enable the JoyStick interrupt */ Demo_IntExtOnOffCmd(ENABLE); /* Display menu */ Menu_DisplayMenu(); }