Bien, el codigo que pase tiene algunos errores importantes luego te lo doy corregido, pero miremos este codigo que me preguntas
.. separemos el codigo..
if(input(PIN_B1)) // Boton seleccion de tiempo
{
while(input(PIN_B1));
Eso simplemente es lo del boton, nada mas, pide que este presionado y luego que se suelte para poder continuar. Esta parte no tienen nada que ver con el parpadeo
indice++;
limite = tiempo[indice];
Esta parte del codigo es donde procedo a cambiar la velocidad, aumento indice, y con el nuevo indice encuentro el tiempo que me dice el array, el indice simplemente es un numero que me dice que posicion del array tomar, 0,1,2,3, etc. Esto no tiene nada que ver con el parpadeo.
if(indice>=sizeof(tiempo))
{
indice = 0;
}
A pesar que este es un error donde esta ubicado pero funciona correctamente, porque deberia ir entre medio de las 2 instrucciones anteriores, en si este codigo te dice que si por algun motivo al incrementar indice pasamos la cantidad de datos que tiene el array tiempo[] paso a 0, es decir los valores en el ejemplo son de 0 a 3 ( 4 elementos ) al llegar indice a 4, deberia pasarse a 0. Con el mayor o igual directamente me aseguro que sea cualquier valor incorrecto ( 100, 124, etc ) pase a 0. Y no me quedo con simplemente == 4. Esto no tiene nada que ver con el parpadeo.
Por ultimo la parte del parpadeo.
for(i=0;i<=indice;i++)
{
output_bit(PIN_B6,0);
delay_ms(200);
output_bit(PIN_B6,1);
delay_ms(200);
}
Un simple for... desde i = 0, hasta que la condicion i <= indice sea falsa. Por que menor o igual y no directamente menor solo ? Porque sino al ser indice = i = 0, no ejecutaria el ciclo for 1 vez. Tambien podria haber realizado una condicion como esta i < (indice +1), cuestion de gustos.
Entonces supongamos que indice era 2. (recorda que el primer elemento es indice 0, por lo tanto seria el 3er elemento)
Comienza el for con i = 0, la condicion es true entonces realiza el codigo
Termina la vuelta e i pasa a valer 1, sigue siendo true y realiza el codigo
Otra vuelta i = 2, sigue siendo true y realiza el codigo, aca ya fueron 3 veces que parpadeo el led, ( los del 0, 1 y 2 )
proxima vuelta i = 3, por lo que ya la condicion pasa a ser false y sale del for.
En todo esto el for se repetio (indice + 1) veces o mejor dicho el numero del elemento elegido si es que empezamos a contar desde 1 y no 0.
-------------------------------
Codigo con unas cuantas cosas corregidas.
#include <16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,NOMCLR
#use delay(clock=4000000)
#use fast_io(b)
volatile int1 activo;
volatile int16 contador=0;
volatile int8 indice;
int16 tiempo[4] = {1000,2000,3000,4000};
int8 temp;
#int_timer1
void TIMER1_isr(void)
{
set_timer1(192);
if(activo)
{
contador++;
}
if(contador>=tiempo[indice])
{
output_bit(PIN_B7,0); // Apago Rele
contador=0;
activo= false;
}
}
void main(void)
{
int8 i;
// Inicializacion de variables
indice = 0;
activo = true;
// Configuracion de los modulos
set_tris_b(0x0F); // RB0 a RB3 entradas, RB4 a RB7 salidas
output_bit(PIN_B7,1); //Inicia con el rele encendido
setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
set_timer1(192);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
while(1)
{
/*
* Boton de reset
*/
if(input(PIN_B0)) // Boton de reset
{
contador = 0; // Reinicio el tiempo
output_bit(PIN_B7,1); // Activo rele
activo = true;
}
/*
* Boton de tiempo
*/
if(input(PIN_B1)) // Boton seleccion de tiempo
{
while(input(PIN_B1))
{
output_bit(PIN_B6,activo);
}
temp = indice + 1;
if(temp>=sizeof(tiempo))
{
indice = 0;
}
else
{
indice++;
}
for(i=0;i<=indice;i++)
{
output_bit(PIN_B6,0);
delay_ms(200);
output_bit(PIN_B6,1);
delay_ms(200);
}
}
/*
* Led indicador
*/
output_bit(PIN_B6,activo);
}
}
En este codigo soluciono los anteriores errores.
- No asigno "limite" en el while, solo indice que es de 8 bits, Tambien debo usar una variable temporal para un calculo, para saber si se va a exceder o no del valor correcto, de esa forma nunca indice tendria un valor fuera de rango.
- Como recordas mientras se mantenga presionado el boton es posible que no se actualize el led, si es que termina, entonces para eso la solucion mas simple fue ponerlo dentro del while del boton, podria haberlo puesto en el timer tambien, ya que este ultimo siempre se esta ejecutando, pero este interferiria en el for de muestra de velocidad. Por eso no lo hice alli.