Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

28/03/2012 #1

Avatar de Meta

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í.
30/03/2012 #2


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!
30/03/2012 #3

Avatar de Meta

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.
09/12/2012 #4

Avatar de ilcapo

PIC 12f675 + pulsador en CCS
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 !!
10/12/2012 #5
Moderador

Avatar de D@rkbytes

ilcapo dijo: Ver Mensaje
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.
Archivos Adjuntos
Tipo de Archivo: rar 12F675 Button_While.rar (7,5 KB (Kilobytes), 151 visitas)
10/12/2012 #6

Avatar de ilcapo

genial Darkbytes!! con eso ya lo solucione
10/12/2012 #7

Avatar de mnicolau

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
10/12/2012 #8

Avatar de ilcapo

si estaria bueno

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

perdon por la ignorancia


seria algo asi ?


for (variable16bits=0; variable1bits<1000;variable16bits++)
{ delay_ms(1);
}
10/12/2012 #9

Avatar de mnicolau

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
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.