TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: EDJMM9 en 11 de Enero de 2014, 18:28:16

Título: problema con este proyecto pic c compiler - y simulado en proteus
Publicado por: EDJMM9 en 11 de Enero de 2014, 18:28:16
pic 16f877a
cristal de 4MHZ
1 funcion .. sin importar lo que pase mientras este conectado el pic  se mantendra intermitente un led conectado a (pin_d2)

2 funcion  . tengo conectados 9 pulsadores en los puertos A Y E . ( ya configurados como entrada ) , cada pulsador actúa como control
on/off en los leds conectados a los puertos B Y D

3 funcion  si presiono el boton (pin_E1) apaga los puertos por 10ms y los  enciende de nuevo //

4 funcion  solo si la entrada del pin E2  es igual a  1 //apaga todos los leds//

Mi problema esta es que lo simulo en proteus y funciona  casi perfectamente como lo quiero y digo casi por que
al presionar los pulsadores por primera vez al darle play a proteus (simular) no HACE NADA  sino despues de darle por segunda vez al pulsador y despues de alli si  funciona perfecto ha bueno casi tambien por que cuando le doy a los  botones no hace la funcion al instante como quiero tengo que dejarlos precionados como por un 2 segundos para que haga la funcion .


mi pregunta es por que me pasa esto sera el proteus ? o el codigo esta mal ? otra cosa si pongo el mismo codigo pero sin el led intermitente .O cambio la frecuencia del osc a 20 mhz . si funciona lo demas perfectamente SIN RETARDO EN LOS PULSADORES NI NADA . TODO PERFECTO

este es mi codigo:

justamente asi como esta lo compilo

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
SET_TRIS_A(0b11111111); //seteo los puertos como entrada
SET_TRIS_E(0b11111111); //seteo los puertos como entrada
 
     while(true){
     
     // CODIGO/// FUNCION 1  Mantiene este led intermitente

       output_high(pin_d2);
       delay_ms(500);
       output_low(pin_d2);
       delay_ms(500);
       
    //FUNCION 2

    // CODIGO/// tecla 1
     if(input(pin_a0)==1){
     output_toggle(pin_b0); // cambia de estado//
     while(input(pin_A0)==1);}   
                           // CODIGO/// tecla 2
     if(input(pin_a1)==1){
     output_toggle(pin_b1); // cambia de estado //
     while(input(pin_A1)==1);}     
                           // CODIGO/// tecla 3
     if(input(pin_a2)==1){
     output_toggle(pin_b2);// cambia de estado //
     while(input(pin_A2)==1);}
                           // CODIGO/// tecla 4
     if(input(pin_a3)==1){
     output_toggle(pin_b3);// cambia de estado //
     while(input(pin_A3)==1);}
                           // CODIGO/// tecla 5
     if(input(pin_a4)==1){
     output_toggle(pin_b4);// cambia de estado //
     while(input(pin_A4)==1);}
                           // CODIGO/// tecla 6
     if(input(pin_a5)==1){
     output_toggle(pin_b5);// cambia de estado //
     while(input(pin_A5)==1);}
                           // CODIGO/// tecla 7
     if(input(pin_E0)==1){
     output_toggle(pin_b6);// cambia de estado //
     while(input(pin_E0)==1);}
     
//FUNCION 3

                           // CODIGO/// apaga los puertos por 10ms y los  enciende de nuevo //  tecla 8 (pin_E1)   
               
     if(input(pin_E1)==1){
     output_low(pin_b0);
     output_low(pin_b1);
     output_low(pin_b2);
     output_low(pin_b3);
     output_low(pin_b4);
     output_low(pin_b5);
     output_low(pin_b6);
     output_low(pin_b7);
     output_low(pin_D0);
     delay_ms(10);
     output_toggle(pin_b0);
     output_toggle(pin_b1);
     output_toggle(pin_b2);
     output_toggle(pin_b3);
     output_toggle(pin_b4);
     output_toggle(pin_b5);
     output_toggle(pin_b6);
     output_toggle(pin_b7);
     output_toggle(pin_D0);
     while(input(pin_E1)==1);}   

// FUNCION 4
                        // CODIGO///
        //solo si la entrada del pin e2 es igual a  1 //apaga todos los leds//                   
     if(input(pin_E2)==1){   
     output_low(pin_B0);
     output_low(pin_b1);
     output_low(pin_b2);
     output_low(pin_b3);
     output_low(pin_b4);
     output_low(pin_b5);
     output_low(pin_b6);
     output_low(pin_b7);
     output_low(pin_D0);
     while(input(pin_E2)==1);}   
  }
}
Título: Re: problema con este proyecto pic c compiler - y simulado en proteus
Publicado por: rivale en 13 de Enero de 2014, 14:06:14
el led intermitente que tienes no tiene un tiempo fijo, esto debido a que lo haces funcionar con retardos, entonces cuando tienes presionado un botón, tu led se quedará apagado hasta que sueltes el botón, el led intermitente lo deberias hacer con una interrupción para evitar este problema.


En cuanto al error que mencionas en proteus, me parece que esto es debido al retardo de tu led intermitente, mientras estas en los retardos, tu código aun no llega a la parte donde verifica que los botones esten presionados

si quieres asignar un valor a todo el puerto puedes usar la funcion

output_b(valor);

donde la variable valor asigna que pines pones en alto y cuales en bajo

Saludos
Título: Re: problema con este proyecto pic c compiler - y simulado en proteus
Publicado por: EDJMM9 en 13 de Enero de 2014, 15:24:42
el led intermitente que tienes no tiene un tiempo fijo, esto debido a que lo haces funcionar con retardos, entonces cuando tienes presionado un botón, tu led se quedará apagado hasta que sueltes el botón, el led intermitente lo deberias hacer con una interrupción para evitar este problema.


En cuanto al error que mencionas en proteus, me parece que esto es debido al retardo de tu led intermitente, mientras estas en los retardos, tu código aun no llega a la parte donde verifica que los botones esten presionados

si quieres asignar un valor a todo el puerto puedes usar la funcion

output_b(valor);

donde la variable valor asigna que pines pones en alto y cuales en bajo

Saludos

           OK  muchas gracias por la respuesta voy a probar :D