Control pulsadores de un PIC

Hola:

Estoy poco a poco aprendiendo CCS por un libro centrado en ASM y algo de CCS comparativas. Pero son más bien gente que ya sepan.
Quiero hacer pruebas con ejemplos tontos.

Por ejemplo, teniendo un PIC16F64A/88/886/887 o el 18Fx550, da igual, el que ustedes prefieran, los tengo todos físicamente y puedo hacer pruebas.

Con el copilador CCS, bajo MPLAB lo estoy usando. Quiero hacer con dos entradas que pueden ser el RA0 y el RA1. A su salida, por los puertos B, tienen Led.

Funciones. (PORTA son pulsadores, no interruptores).
Si pulso RA0, se enciende el Led del puerto RB0.
Si pulso RA1, se enciende el Led del puerto RB1.
Si dejp pulsado RA2 durante 3 segundos, se apagan los RB0 y RB1 si están algunos de ellos encendidos.
Si pulso RA3 y RA4 al mismo tiempo durante 3 segundos, se apagan las salidas RB0 y RB1.

Esto parece complicado de hacer. Ya me dirán. Haré Pseudocodigos para no machacarme las neuronas por falta de conocimiento en C para PIC si hace falta.

¿Alguien puede hacerlo?

Si les lleva mucho tiempo, mejor déjalo estar, lo intentaré primero con ASM que se me da mejor, luego intento pasarlo a C.

Un cordial saludo y gracias por leer hasta aquí.
 
Hola Meta,

te recomiendo ir paso a paso. Para lo primero que propones, lo de visualizar el estado del pulsador en el Port B, debes aprender como se hacen las comparaciones en C. Por ejemplo:

if(PIN_A0 == true) output_high(PIN_B0) //enciende el led de Rb0 si esta pulsado Ra0
else output_low(PIN_B0) //si no esta esta pulsado, se apaga el led Rb0

Aquí podrias ahorrarte la parte en que dice "== true" ya que el compilador la sobreentiende, pero lo he puesto así para que lo entiendas tu.

El tema de pulsar durante unos segundos, deberás enfocarlo con timers, que en CCS no recuerdo como van porque yo los usaba en CC5X, en CCS no he tenido aún oportunidad de usarlos. Basicamente, lo que deberás hacer es lo siguiente:

- Configuras y activas el timer que quieras utilizar. Este irá contando y saltando a su función de desbordamiento cuando le corresponda sin afectar al resto del programa. Dentro de la función de desbordamiento indicas que cuando se hayan alcanzado los tres segundos, se ponga a '1' una variable, por ejemplo "tiempotranscurrido".

- Cuando se pulse Ra2, pones a cero la variable que uses para indicar si el tiempo transcurrido es de tres segundos, y después detienes en ese punto la ejecución del programa, hasta que se libere el pulsador o hayan transcurrido los tres segundos:

if(PIN_A2 == true)
{
tiempotranscurrido = false;
while((PIN_A2 == true) && (tiempotranscurrido == false);
}

La tercera de las funciones que describres es una mezcla de las dos anteriores. Siento no poder ayudarte mas en el tema del timer, como te he dicho, aún no los he usado en CCS.

Suerte!
 
Hola:

Gracias por los consejos. ¿Es algo así?
Código:
    #include <16f886.h>
    #fuses    NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT   //Palabra 1 de configuración
    #fuses   NOWRT,BORV40                        //Palabra 2 de configuración

    /* Con estas directivas las funciones "input" y "output_bit" no reprograman
    el pin de la puerta cada vez que son utilizadas. Si no se indica el
    modo fast_io se asume por defecto standard_io el cual reprograma el pin
    siempre antes de ser utilizadas estas funciones. */

    #use fast_io (A)
    #use fast_io (B)
    #use delay(clock=4000000)

    void main()
    {
       output_b(0x0);               //Borra las salidas
       setup_adc_ports(NO_ANALOGS);   //Puertas A y B digitales
         set_tris_a(0x3F);            //Puerta A entrada
         set_tris_b(0x00);            //Puerta B salida
         
         
   while(TRUE)
    {
     if (input(PIN_A0)) //si pulso A0 enciendo led B0
        output_high(PIN_B0); 
        
           
     if (input(PIN_A1)) //si pulso A1 enciendo led B1
        output_high(PIN_B1); 
        
        
     if (input(PIN_A2)) //si pulso A2 espero 3s
        delay_ms(3000);   
        
     if (input(PIN_A2)) //si pasado los tres segundos A2 está a 1 
      {
        output_low(PIN_B0); //apago B0 y B1
        output_low(PIN_B1);
      
      }
        
     if (input(PIN_A3) && input(PIN_A4))// si A3 y A4 están pulsados a la vez
        {
        delay_ms(3000); // espero 3 segundos  
        
       
     if (input(PIN_A3) && input(PIN_A4))// si pasados los tres segindos A3 y A4 están pulsados 
        {
          output_low(PIN_B0); //apago B0 y B1
          output_low(PIN_B1);
      
        }
       }   
   
    }
    }

PD: PD: Hablando de compiladores hay nuevas noticias sobre ello de Microchip. Leer noticias.
 
hola gente del foro tengo un problemita con PIC 12f675 + pulsador en CCS


necesito que el pulsador me de un OK solo si lo dejo presionado por 2 segundos o mas, he probado varias formas y no logro que me funcione, lo que(simplificadamente) hago es:

while (input(PIN_A2)==0) //leo la entrada e incremento un contador mientras la entrada sea 0
{ contador++
}

if (contador > valor minimo)
ok
else
continue

será que en este pic no funciona es la instruccion: (input(PIN_A2)==0) ??

como diria el kiko,,,Pss Me doy !!
 
hola gente del foro tengo un problemita con PIC 12f675 + pulsador en CCS

necesito que el pulsador me de un OK solo si lo dejo presionado por 2 segundos o mas, he probado varias formas y no logro que me funcione,
Saludos.
Mira este pequeño ejemplo, a ver si te sirve para lo que quieres hacer.
Quizá se pueda hacer de otra manera más sencilla.

Suerte.
 

Adjuntos

  • 12F675 Button_While.rar
    7.5 KB · Visitas: 175
En lugar de hacer un delay de 1000ms, podrías hacer uno de sólo 1ms y multiplicar la variable "segundos" x1000. Así no detenés la ejecución de todo el código durante 1 segundo, para ver si se mantiene pulsado el botón.

PD: en ese caso la variable debe ser definida de 16 bits.

Saludos
 
si estaria bueno (y)

pero como se define una variable de 16 bits si el pic es de 8 bits ?

perdon por la ignorancia :oops:


seria algo asi ?


for (variable16bits=0; variable1bits<1000;variable16bits++)
{ delay_ms(1);
}
 
No, lo único que tenés que hacer es declarar la variable de 16 bits, agregando esta línea:

int16 segundos;

El resto quedaría igual y con el cambio comentado anteriormente.

Saludos
 
Atrás
Arriba