Autor Tema: insertar una condicion mientras se ejecuta un while  (Leído 3767 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
insertar una condicion mientras se ejecuta un while
« en: 04 de Marzo de 2016, 23:13:26 »
tengo este programita que lee la entrada de un pin de un pic en la terminal B0 en la cual tengo un pulsador y si lo pulso  me da una salida en la terminal B1 pero negada osea que si lo pulso por primera ves se coloca un 1 en la terminal b1 y si lo pulso de nuevo se coloca en 0 la terminal b1
la pregunta es como le meto otra instruccion a este programa para que si b1=1  yo pueda leer otro pulsador por egemplo en la terminal b2 y si hay un cambio en esta terminal b2 de 0 a 1 me de un 1 en en la terminal b3 y por ultimo si b1=0 solo aga lo que esta haciendo ahora esperar algun cambio en la terminal B0 que es lo que hace aorita el programa
soy nuevo en esto la verdad y e leido y asta simule este programa en proteus si gustan les mando el archivo de la simulacion pero nesesito abansar mas de ante mano gracias  :) :mrgreen:


#include <16F877a.h>
#use delay(clock=4000000)
#fuses NOWDT,XT,NOPUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT
#use standard_io(c)


void main()
{
output_low(PIN_B1);//se da la intruccion de que al empesar el programa el pin b1 este en alto
    while(true)
 {
     if(input(PIN_B0)==0)//se coloca la pregunta si entrada b1 = a 0 o si pulsabos el suich
    {
     delay_ms(40);//da un retarddo de 40 ms para ebitar rebotes del pulsador
     if(input(PIN_B0)==1)//se verifica si el pin b0=1
       {
      output_toggle(PIN_B1);// esta intruccion es para realizar el complemento del pin que b0 osea si estaba en 0 se pone en 1 y alrebes
       }
    }
 }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #1 en: 04 de Marzo de 2016, 23:25:56 »
Ese codigo es muy complicado que funcione. Si vamos paso a paso seria:

- Pregunto si B0 es 0, si lo es hago lo siguiente:
- Espero 40ms
- Pregunto si B0 es 1

Te podes dar cuenta que tenes una "ventana" de 40ms (40ms es MUY poco tiempo) para poner B0 a 1. Lo cual es muy complicado que suceda. Algo asi te puede servir:

Código: C
  1. if(input(PIN_B0)==0)                    // Pregunto si B0 es 0
  2.         {
  3.                 delay_ms(10);                   // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
  4.                 while(input(PIN_B0)==0);        // Espero que suelte el boton, observa el ; al final, es decir un while(){}
  5.                 output_toggle(PIN_B1);          // Cambio el valor del pin
  6.         }

Si quisieras agregar otro pin mas, simplemente copias eso , lo pegas y ya tenes otro pin funcionando. Solo decirte que mientras tengas B0 en 0. No va a salir del while ese de adentro. Es una solucion como para algo "simple".

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #2 en: 05 de Marzo de 2016, 00:37:27 »
y te comento que ese retardo lo puse porque según lo que leí decía que el ser humano al pulsar un pulsador puede tener mas de un pulso y eso es un retardo para esperar que lo suelte según jejejeje

pero con lo que me dijiste que algo complicado que el programa aga lo que quiero por el retardo eso lo hago según porque esas dos terminales (b0 y b1) yo las usare como un on/of de hay solo quiero leer otro pin por egemplo b2 y si hay cambio que de salida en b3 pero todas la lecturas y salidas de algún otra terminal "dependen" del on/of ósea si esta en on corre el programa de preguntar es estado de b2 y dar salida en b3 pero si esta en of solo el programa este esperando algún cambia en b1 para que empiece a leer b2 y de salida en b3 si me explique no sé si lo que quiero hacer es lo que se llama interrupción o hay alguna técnica para hacerlo

Saludos desde tabasco México :mrgreen: :mrgreen:


Desconectado w3-sistemas

  • PIC12
  • **
  • Mensajes: 89
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #3 en: 05 de Marzo de 2016, 01:14:22 »
HOLA A TODOS, YO PROGRAMO EN "C", Y DONDE REALICE EL CURSO, USAMOS UNA MANERA MUYYY DIFERENTE DE LEER PULSADORES, LA RUTINA DE ANTIRREBOTE LA COLOCAMOS DENTRO DEL TIMER 0 Y PODEMOS COLOCAR LA CANTIDAD QUE QUERAMOS LIMITADA CLARO ESTA POR LA CANTIDAD DE PINES DEL MICRO, DE ESTA MANERA PODEMOS TESTEAR TODOS LOS PULSADORES LAS VECES QUE QUERAMOS Y COMO QUERAMOS, UNA FORMA QUE YO UTILIZO ESTO FUE QUE HICE UN MENÚ LEÍDO POR UNA PANTALLA LCD, Y CUANDO PASABA UN TIEMPO SIN APRETAR NINGÚN PULSADOR LAS LUZ DEL LCD SE ATENUABA Y CUANDO CUALQUIER PULSADOR SE PULSABA PARA MOVERTE EN EL MENÚ HACIA QUE LA LUZ SUBIERA, OSEA QUE A MISMO PULSADOR PUEDO HACER DOS COSAS DIFERENTES AL MISMO TIEMPO Y HASTA PULSAR TODOS A LA VEZ SIN QUE SE CUELGUE EL PROGRAMA NI NADA RARO, OSEA SOLO PREGUNTANDO EL ESTADO DEL SWITCH YA SABEMOS SISE APRETO O NO
ESPERO QUE LES SIRVA

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #4 en: 05 de Marzo de 2016, 02:24:32 »
Citar
y te comento que ese retardo lo puse porque según lo que leí decía que el ser humano al pulsar un pulsador puede tener mas de un pulso y eso es un retardo para esperar que lo suelte según jejejeje

Exacto nuevo mundo, por eso mismo yo tambien deje el retardo ese. Si tu boton por fuera posee un "antirebote" realizado con una resistencia y un capacitor entonces no vale la pena hacerlo por software. Pero me quise asegurar.

Citar
Pero con lo que me dijiste que algo complicado que el programa aga lo que quiero por el retardo

El retardo no es el problema, el problema es que tenes un espacio de tiempo muy pequeño es decir entre que este RB0 en 0 a pasar a 1 son 40ms. Tal ves te funcione por que tu programa no tiene mas nada. Pero apenas escribas un par mas de cosas vas a notar que deja de funcionar. Actualmente para que funcione una persona deberia presionar justo en el momento anterior al if que pregunta por RB0 y soltarlo dentro de los 40ms siguientes. Lo cual es complejo que suceda.

Pero como decia, funciona por que no tenes otras instrucciones dentro, lo cual la mayor parte del tiempo se lo pasa en la demora, con una posibilidad mayor que cuando soltes este dentro de esa demora.

Citar
quiero hacer es lo que se llama interrupción o hay alguna técnica para hacerlo

La tecnica es lo que explica w3-sistemas, y si necesitas usar una interrupcion. Una interrupcion es algo que mientras esta corriendo el "main" deja de hacer eso, ejecuta la funcion de la interrupcion, y vuelve donde dejo. Supongamos que  el micro estaba en la funcion main y ejecutando un delay_ms(50), la interrupcion se produce a causa de un pin externo cuando recien van 20ms de ese delay, ejecuta la funcion de interrupcion, sale de esa funcion, y continua con los 30ms restante que le faltaban y luego con el programa del "main".

HOLA A TODOS, YO PROGRAMO EN "C"......

Exacto w3-sistemas, si la idea es tener el mejor codigo posible, entonces lo conveniente es usar un timer y cada tanto leer las entradas para ver cuales cambiaron y actuar en consecuencia. Hacer esto trae un "antirebote" de forma natural, ya que vas a estar leyendo cada 10 milisegundos por ejemplo. Especialmente en un teclado donde no se necesita gran velocidad.
El tema es que el usuario "nuevo mundo" esta recien comenzando a programar en C, y tratar de hacer eso significa que ademas de conocer el lenguaje C, deberia conocer interrupciones y el timer. Por eso no intente ir a algo tan complejo, y por eso mismo dije en mi post sobre el codigo que propuse Es una solucion como para algo "simple".

Trata para la proxima no escribir todo en mayuscula, es una "norma" impuesta por internet que significa para el lector como si estuvieras "gritando".

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #5 en: 05 de Marzo de 2016, 02:56:13 »
hola w3-sistemas la verdad que me honrra tu apoyo con lo de la lectura de un pulsador y me pregunto si tienes alguna idea de cómo hacer lo que quiero solo quiero que 2 pines de un pic sean usados uno para leer un pulsador y el otro de la salidas (0,1) dependiendo de cada ves que pulso el pulsador si te das cuenta es como guardar un registro de corrimiento que por cada pulso, da un dato en una salida que es un 0 y 1 u otra forma de decirlo q por cada pulso del pulsador conmute en una salida entre (1 y 0) dirás para que quiero esto es porque esta acción la tomare como un of/on dependiendo de ese dato que para mí es un of/on eso se supone que hace el programa pero requiero monitorear esa salida of/on si esta en on encendida que verifique otro par de pines que solo verificare si esta en 1 dar una salida de 1 en otro pin
pero si el of/on esta en of solo realice la verificación de los dos primeros par de pines

todo esto es porque en mi colonia están robando mucho se metieron a las dos casas de alado y según esa rutina la requiero el of/on de los dos primeros pines para el encendido de la alarma ya encendida verificar otro par de pines uno que será la entrada según de algún sensor y el otro será la salida pero si esta en of por lógica no aga nada con el segundo par de pines

ya implementado pienso a serlo sencillo por ejemplo colocar un foto diodo oculto por la puerta el cual estará como el programa que muestro en el pin b0 y el trasmisor en mi mano daré un pulso esto entrara en el pin b0 encenderá la alarma la cual solo verifica el estado de otro pin (sensor) si hay cambio dar salida de 1 en otro pin  y por lógica cuando regrese doy otro pulso y se desactiva la alarma   ojala me puedas ayudar

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #6 en: 05 de Marzo de 2016, 03:22:31 »
hola KILLERJC supongo que yo soy el que me estoy complicando las cosas por falta de conocimientos pero de verdad si estoy leyendo todos los días y viendo videos para que poco a poco pueda ir mejorando voy a retomar jejeje lo de la ayuda lo explicare calmadito

Requiero un of/on (que en este caso está en b1 que depende del pulsador en b0) que es lo que hace el programa de arriba ya lo compile y lo simule en proteus pero ese of/on es solo una parte
 a hora requiero aumentarlo anexarle otras cuantas líneas (si es que me sirviera el programa que tengo) para que dependiendo del estado de b1 que es mi (of/on) si esta en on se verifique otro pin que sería b2 si hay un cambio en este último  me dé un 1 en otro pin por ejemplo b3
Pero si esta en of solo se quede verificando b0

 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #7 en: 05 de Marzo de 2016, 04:01:20 »
Código: C
  1. #use fast_io(b)
  2.  
  3.  
  4. void main(void){
  5.  
  6.         set_tris_b(0b00000101);         // B0 y B2 entradas
  7.         output_low(PIN_B0);
  8.  
  9.         while(1)
  10.         {
  11.                 if(input(PIN_B0)==0)                    // Pregunto si B0 es 0
  12.                 {
  13.                         delay_ms(10);                   // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
  14.                         while(input(PIN_B0)==0);        // Espero que suelte el boton, observa el ; al final, es decir un while(){}
  15.                         output_toggle(PIN_B1);          // Cambio el valor del pin
  16.                 }
  17.  
  18.                 if(input(PIN_B2)==0 && input(PIN_B1)==1)// Pregunto si B0 es 0 y si B1 es 1
  19.                 {
  20.                         delay_ms(10);                   // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
  21.                         while(input(PIN_B2)==0);        // Espero que suelte el boton, observa el ; al final, es decir un while(){}
  22.                         output_toggle(PIN_B3);          // Cambio el valor del pin
  23.                 }
  24.         }
  25. }

Para saber que son las demas cosas, mira el manual de CCS ahi lo explica, si no lo tenes busca en google "CCS Manual" y es un PDF.

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #8 en: 06 de Marzo de 2016, 15:12:59 »
hola KILLERJC muchas gracias por el apoyo de verdad fíjate que utilice el código que me diste y lo compile todo bien gracias pero cuando puse  en el proteos la simulación nada que hace nada estoy tratando de ver que pasa por que no funciona pero me hice una pregunta ?¿ si en algún compilador se puede ver  como corre el programa paso a paso  es que quiero ver si no se sale el programa en algún lado o si no se queda en algún wile
gracias 

 :-/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #9 en: 06 de Marzo de 2016, 16:04:44 »
Yo uso el MPLAB X con XC8 ambos de Microchip, la empresa que fabrica los micros. Lo feo que la optimizacion no es gratuita, pero para comenzar se puede usar el free que funciona igual.

En ese IDE yo puedo simular paso a paso las instrucciones y tambien puedo poner a 1 alguna entrada con un "estimulo". Para ver que pasaria si es que se presiona algo. Y todo dentro del IDE, nada de llevarlo a otro programa para simularlo.

MPLAB X IDE ( te permite usar assembler de los PIC12/16/18):
http://www.microchip.com/mplab/mplab-x-ide

Luego instalas XC8 ( C para micros de 8 bits):
http://www.microchip.com/mplab/compilers

Luego tenes XC16 para micros de 16bits (dsPIC y PIC24) y harmony para los de 32 bits ( PIC32 ). Pero eso por ahora obviarlos.
Al menos yo uso eso, algunos prefieren usar CCS, te vas a encontrar que es muy distinto que CCS y algunas cosas te van a llevar mas trabajo. Ejemplo el mismo programa que te pase en CCS en XC8 seria (aca no se nota tanto):

Código: C
  1. #include <xc.h>
  2.  
  3. void main(void)
  4. {
  5.         TRISB = 0b00000101;         // B0 y B2 entradas
  6.         PORTBbits.RB0 = 0;
  7.  
  8.         while(1)
  9.         {
  10.                 if(PORTBbits.RB0==0)                  // Pregunto si B0 es 0
  11.                 {
  12.                         __delay_ms(10);               // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
  13.                         while(PORTBbits.RB0==0);      // Espero que suelte el boton, observa el ; al final, es decir un while(){}
  14.                         PORTBbits.RB1 ^= 1;           // Cambio el valor del pin
  15.                 }
  16.  
  17.                 if(PORTBbits.RB2==0 && PORTBbits.RB1==1)// Pregunto si B0 es 0 y si B1 es 1
  18.                 {
  19.                         __delay_ms(10);               // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
  20.                         while(PORTBbits.RB2 == 0);    // Espero que suelte el boton, observa el ; al final, es decir un while(){}
  21.                         PORTBbits.RB3 ^= 1;           // Cambio el valor del pin
  22.                 }
  23.         }
  24. }

Respecto a ver como va el programa podrias cargar el .cof si lo genera el CCS en Proteus y ver donde esta quedandose. Si podes mostra una captura de pantalla del circuito que tenes realizado en Proteus, tal ves alli este el error.

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #10 en: 09 de Marzo de 2016, 02:04:53 »
ok enterado ya voy avanzando un poco más de verdad muchas gracias ojala yo también te pueda ayudar alguna ves también 
te comento que ya hice que funcionara tuve que cambiar solo el pic que tenía antes por otro por que vi que para los que quiero no es necesario uno con mas características jejejej y de ahí vi que tengo que pulsar muchas veces a beses hasta 6 beses el pulsador para que haga un cambio hoy le are algunos cambio (jejejej segun yo) a ver si puedo hacer que funcione como quiero y subiré el programa y el circuito también. Esto creo será útil para muchos otros  sería algo que se puede ir ampliando a muchos canales de entradas esto sería la base  para alarmas más complejas y hasta para entrenadores de pic por que tiene algo de control de entradas y de salidas básicas de un pic en ccs saludos un fuerte abraso desde tabasco mexico por cierto si no es indiscreción de que país eres 

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #11 en: 09 de Marzo de 2016, 12:36:20 »
HOLA compañeros fíjense que aún sigo intentando que este programa funcione adecuadamente pero nada la simulación la ise y solo funciona en el cambio del pin b1 cada bes que se pulsa el pulsado.
pero de hay tendria que monitoriar el estado de (b1 y b2) si b1=1 y b2=1 dar salida en b3=1 pero si  b1=0 y b2 =1 entonses b3=0 y por ultimo si b1=1 y b2=0 dar salida en b3=0

esto es lo que tengo y tambien dejo lo que tengo simulado en proteus
#include <16f84a.h>//<16F877a.h>
#use delay(clock=4000000)
#fuses xt//,PWRT,CP //NOWDT,XT,NOPUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT




    #use fast_io(b)


    void main(void){

            set_tris_b(0b00000101);         // B0 y B2 entradas
            output_low(PIN_B0);

            while(1)
            {
                    if(input(PIN_B0)==0)                    // Pregunto si B0 es 0
                    {
                            delay_ms(10);                   // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
                            while(input(PIN_B0)==0);        // Espero que suelte el boton, observa el ; al final, es decir un while(){}
                            output_toggle(PIN_B1);          // Cambio el valor del pin
                    }

                    if(input(PIN_B1)==1 && input(PIN_B2)==1)// Pregunto si B1 es 0 y si B1 es 1
                    {
                            delay_ms(10);                   // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
                            while(input(PIN_B2)==1);        // Espero que suelte el boton, observa el ; al final, es decir un while(){}
                            output_toggle(PIN_B3);          // Cambio el valor del pin
                            delay_ms(50);
                    }
            }
    }
« Última modificación: 09 de Marzo de 2016, 12:38:47 por nuevo mundo »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #12 en: 09 de Marzo de 2016, 12:45:42 »
Lo que tenes es el programa que te pase yo, es hora que te pongas a modificarlo, es tan absurda la modificacion que tenes que hacer para que funcione como queres que seria agregar 2 lineas y modificar 1.

La idea es que aprendas asi que vas a tener que comenzar a leer el programa

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #13 en: 09 de Marzo de 2016, 13:40:25 »
si modifique una línea aun en estos momentos voy a borrar unas líneas y colocar otras para ver si funciona no me voy a dar por vencido
 y si e leido el programa que mandastes vi que faltaba cambiar un pin pero estoy en la lucha aun en cuanto lo logre completamente lo subo para compartirlo claro que lo tengo que lograr  :laugh: de verdad aprecio el apoyo por que ni idea de el if ni que se podia && (compueta nand) la verdad que me as ayudado mucho  :mrgreen:

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re:insertar una condicion mientras se ejecuta un while
« Respuesta #14 en: 09 de Marzo de 2016, 13:57:14 »
Eliminados un par de mensajes por atentar contra las Normas del Foro:

5º No hagas consultas sobre piratería de software, por favor. Es ilegal y compromete al foro. Nada de cracks, serials, plug-in's pagos y/o cualquier software y/o hardware sujeto a Copyrights y/o Derechos de Autor;

6º Si citas o incluyes material sujeto a Copyrights y/o Derechos de Autor en tu mensaje, asegúrate de cumplir con todas las pautas que exige su Autor;

un saludo