Buenas tardes amigos. tengo un problema con mi codigo. estoy realizando un vending despachador de agua y estoy usando en total 4 temporizadores. Timer0 para tiempo de llenado de 10 lts (17 seg.), Timer 1 para tiempo de llenado de 20 lts (37seg.), Timer2 para tiempo de llenado de 5 lts (11 seg.) y el timer3 para tiempo de espera del hopper.
#int_timer0 //T2
void timer0_RTCC()
{
time++; /// aumenta la tiempo cada .5 seg
set_timer0(3036);
clear_interrupt(int_timer0); // limpio flag
if(time==T2) //si la vuelta da 34, en segundos seria 17,
{
output_low(pin_c1); //apaga electrovalvula
valvula_off2=1;
}
}
#int_timer1 //T1
void timer1_isr()
{
time++; /// aumenta la tiempo cada .5 seg
set_timer1(3036);
clear_interrupt(int_timer1); // limpio flag
if(time==T1) //si la vuelta da 74, en segundos seria 37,
{
output_low(pin_c1); //apaga electrovalvula
valvula_off1=1;
}
}
#int_timer2 //T3
void timer2_isr()
{
time++; /// aumenta la tiempo cada .5 seg
set_timer2(250);
//clear_interrupt(int_timer2); // limpio flag
if(time==T3) //si la vuelta da 22, en segundos seria 11,
{
output_low(pin_c1); //apaga electrovalvula
valvula_off3=1;
}
}
#int_timer3 //T3
void timer3_isr()
{
time++; /// aumenta la tiempo cada .5 seg
set_timer3(3036);
if(time==tiempo_espera) //si la vuelta da 22, en segundos seria 11,
{
output_low(pin_c0); //apaga electrovalvula
espera=1; bandera para imprimir en el mensaje principal "monedero sin cambio"
}
}
configuracion de los temporizadores en la funcion principal.
void main(){
setup_timer_0(RTCC_DIV_8); //Cargo valor de Timer 0 para medio segundo
set_timer0(3036);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); //cargo valor del Timer 1 para medio segundo
set_timer1(3036);
setup_timer_2(T2_DIV_BY_16,254,16); //cargo valor de Timer 2 para 4.064 mili segundo con postcaler de 16 (recordar que el timer ///2 es de 8 bits)
set_timer2(250); //4.064 x 250 == 1016 seg. pero 4.064 x 2751 == 11,180 seg. cada 250 es igual a 1seg.
setup_timer_3(T3_INTERNAL|T3_DIV_BY_8); //cargo valor del Timer 3 para medio segundo Tiempo de encendido del hopper.
set_timer3(3036);
enable_interrupts(global);
}
cuando pago el garrafon pagando precio exacto funciona perfectamente ya sea 37sg garrafon lleno, 17 seg. medio garrafon o cuarto garrafon de 11seg.
pero que pasa si hay que dar cambio.
void entregar_producto3() //TIMER 2 CON T3
{
delay_ms(20);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("LLENANDO ESPERE");
output_low(PIN_C0);
output_high(PIN_C1);
enable_interrupts(INT_TIMER2);
while(true){
if (valvula_off3==1){
valvula_off3=0;
delay_ms(50);
entregar_cambio3();
break;
}
} entrego producto y me manda a entregar cambio 3(cuarto de garrafon) 5 lts.
}
///////////////////////////////////////////////////////////////////////////
void entregar_cambio3(){
cambio3=pesos-PR3;
if (cambio3==0){ //producto exacto manda directo a proceso concluido.
proceso_concluido();
}else{
if (pesos>PR3){
output_high(pin_c0);
enable_interrupts(int_timer3);
for(;
{
if (input(pin_a5)==1){
delay_ms(200);
hopper++;
if(cambio3==hopper) {
disable_interrupts(int_timer3);
espera=0; ///borro bandera de no hay cambio.
output_low(pin_c0);
delay_ms(20);
proceso_concluido();
break;
}
}
if (espera==1){ esta bandera no la desactivo hazta que la proxima vez que se ingrese las monedas y de cambio se borrara.
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("DISCULP MONEDERO");
lcd_gotoxy(3,2);
lcd_putc("SIN CAMBIO");
delay_ms(2500);
proceso_concluido();
break;}
}
}
}
}
en la parte de color rojo tengo el problema por que se desfasa el tiempo de llenado y el tiempo de espera del hopper. donde se activa y espera si hay cruces de monedas se desactiva el timer3, sino pues entra a la condiicon de la bandera activa (espera=1).
uso cristal de 4M. pic 18f4550.
Nota.- esto me lo hace en el simulador no lo he realizado en protoboard. omiti Timer0 y timer1. para no colocar todo.
espero y me puedan ayudar.