TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: quantum27 en 07 de Junio de 2013, 01:12:00

Título: Programar en PIC C Delay en sentido inverso.
Publicado por: quantum27 en 07 de Junio de 2013, 01:12:00
Saludos nuevamente amigos, debo desarrollar el siguiente programa en CCS y simularlo en Proteus:

a)   Debe tener 3 actuadores, uno de simple efecto “A”, y dos de doble efecto “B” y “C”.
b)   Inicialmente los tres cilindros están retraídos.
c)   Al pulsar momentáneamente el botón de arranque “SW1”, se extiende el cilindro “A”.
d)   A los 5 segundos de haberse extendido por completo el cilindro “A”, se extiende el  cilindro “B”.
e)   A los 4 segundos de haberse extendido por completo el cilindro “B”, se extiende el cilindro “C”
Al mantener presionado durante al menos 3 segundos el interruptor momentáneo “SW2”, todos los cilindros regresan a su posición inicial retraída.


Los actuadores los simule con leds y todo corre anda bien en el programa que pego abajo, solo use delays, ya que soy muy novato para meterme con timers, sin embargo, tengo problemas con la ultima condición, se apaga todo el sistema a los 3 segundos de haber pulsado el boton de apagado... pero no debe apagarse a menos que se mantenga presionado durante 3 segundos si es menos el sistema debe permanecer encendido...

Ojala puedan ayudarme solo es un lio con los delay, como hacer que no se ejecute la acción hasta que se cumpla cierto tiempo presionando el botón. De antemano, gracias.




Código: [Seleccionar]
#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#use delay(clock=4000000)

#BYTE TRISA = 0x85    // Configuramos el TRISA
#BYTE TRISB = 0x86    // Configuramos el TRISB
#BYTE PORTA = 0x05    // Configuramos el PORTA
#BYTE PORTB = 0x06    // Configuramos el PORTB


void main()
{

   TRISA = 0xff;
   TRISB = 0x00;
    bit_clear(portB,0);
    bit_clear(PORTB,1);
    bit_clear(PORTB,2);
    bit_clear(portB,3);
    bit_clear(PORTB,4);
    bit_clear(PORTB,5);
    bit_clear(portB,6);
    bit_clear(portB,7);
    
   while(true)
   {
      if(bit_test(PORTA,1)==1)
      {
         bit_set(PORTB,1);
      }
      
      if(bit_test(PORTA,2)==1)
      {
         delay_ms(5000);
         bit_set(PORTB,2);
      }
      
       if(bit_test(PORTA,3)==1)
      {
         delay_ms(4000);
         bit_set(PORTB,3);
      }
      
            
       while((bit_test(PORTA,0)==1))
       {
       delay_ms(1000);
        if(bit_test(PORTB,1)==1)
      
          {
             delay_ms(1000);}
            
               if(bit_test(PORTB,2)==1)
               {
                delay_ms(1000);}
              
               if(bit_test(PORTB,3)==1)
               {
        
         bit_clear(PORTB,1);
         bit_clear(PORTB,2);
         bit_clear(portB,3);
               }
              
       }
   }
  
}
Título: Re: Programar en PIC C Delay en sentido inverso.
Publicado por: quantum27 en 07 de Junio de 2013, 02:36:46
Problema resuelto... solo mande testear 3 veces cada segundo el puerto A pin0 que es la señal de apagado, si la señal sigue activa se apaga y si no continua encendida. Gracias de todos modos amigos, hasta pronto.

Citar
#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#use delay(clock=4000000)

#BYTE TRISA = 0x85    // Configuramos el TRISA
#BYTE TRISB = 0x86    // Configuramos el TRISB
#BYTE PORTA = 0x05    // Configuramos el PORTA
#BYTE PORTB = 0x06    // Configuramos el PORTB


void main()
{

   TRISA = 0xff;
   TRISB = 0x00;
    bit_clear(portB,0);
    bit_clear(PORTB,1);
    bit_clear(PORTB,2);
    bit_clear(portB,3);
    bit_clear(PORTB,4);
    bit_clear(PORTB,5);
    bit_clear(portB,6);
    bit_clear(portB,7);
   
   while(true)
   {
      if(bit_test(PORTA,1)==1)
      {
         bit_set(PORTB,1);
      }
     
      if(bit_test(PORTA,2)==1)
      {
         delay_ms(5000);
         bit_set(PORTB,2);
      }
     
       if(bit_test(PORTA,3)==1)
      {
         delay_ms(4000);
         bit_set(PORTB,3);
      }
     
           
       while((bit_test(PORTB,3)==1))
       {
       
        if(bit_test(PORTA,0)==1)
     
          {
             delay_ms(1000);
             
               if(bit_test(PORTA,0)==1)
               {
                   delay_ms(1000);
       
                     if(bit_test(PORTA,0)==1)
                      {
                         delay_ms(1000);
                 
                            if(bit_test(PORTA,0)==1)
                           {
                                bit_clear(PORTB,1);
                                bit_clear(PORTB,2);
                                bit_clear(portB,3);
                           }
                      }
              }
          }
       }
       
   }
   
}


 :mrgreen: