Autor Tema: lecturas y salidas (digitales y analogicas) en lengua c para pic  (Leído 13057 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #90 en: 17 de Abril de 2016, 15:48:45 »
Asu mecha veo las cosas que se pueden colocar con código me refiero a esto (  if((input_b() & 0b01111000) != 0)) la verdad es la primera ves que me topo con algo asi claro es verdad jejejeje me refiero a primera ves porque estoy aprendiendo 
Ahora bien e analizado esto y tengo los siguientes conjeturas primero  leo los estados presente de todo el puerto B y los comparo con el siguiente valor binario 0b01111000 y si no es igual a cero que haga lo que sigue del código es asi verdad

Bueno la conjetura es que debo de cambiar este 0b01111000 por 01111110  y mejor dicho lo cambie y mejoro un poco el programa porque ahora si censa todas las entradas a como estaba fíjate que solo censaba una entrada y así ya censa todas

Bueno ahora buscare porque solo es que cuando se activa algún sensor el programa solo da una salida la de llamar y ni la luz ni la sirena nada asta y se queda. SI  Censa cambio en el puerto B  y si da salida pero solo una que es llamar de hay nada de nada 
Otra pregunta necesito entender el flujo de las funciones para que pueda comprender y detectar en que parte del código se queda el programa osea a lo que me refiero es que necesito entender por ejemplo
Código: C
  1. // Contador que maneja el Timer de la luz
  2.  
  3.         if(LuzActiva == 1)
  4.         {
  5.                 ContadorLuz++;
  6.                 if(ContadorLuz == 60)                                   // 30 seg = 60 entradas
  7.                 {
  8.                         output_low(LUZ_PAD);
  9.                         ContadorLuz = 0;
  10.                         LuzActiva = 0;
  11.                 }
  12.         }
  13.         else
  14.         {
  15.                 output_low(LUZ_PAD);
  16.                 ContadorLuz = 0;
  17.         }

bueno te explicare como lo entiendo y asi podrar ver a que me refiero con el flujo de la funcion
bueno primero tenemos
  if(LuzActiva == 1) y yo lo leo como si LuzActiva es 1 continua la siguiente linea del codigo que es el {
 { osea abrimos un corchete en el cual se anidan un congunto de intrucciones de hay sigue
ContadorLuz++; osea el valor de ContadorLuz incrementamos en 1 valía 0 por que lo inicializamos al comienzo del programa sea 0   que ahora vale 1 de hay sigue la siguiente línea del código
if(ContadorLuz == 60)   donde se pregunta si contador vale 60 como no vale 60 como vale 60 de hay que hace sigue la siguiente línea de codigo si es asi seguiría
{ se abre otro corchete uunnm no se por que donde meteremos otro grupo de instrucciones bueno aqui cabe preguntar si no e serrado el primero este segundo seria como una opción secundaria del primero del primer corchete o es alrebes primero se cumple las instrucciones de este segundo corchete y ya terminado continua ejecutando las primeras instrucciones por eso es toy perdido no comprendo uno las prioridades de los corchetes {} y dos si el código tiene 14 lineas primero hase por ejemplo las primeras 4 de hay regresa ala línea 1 y como no se a cumplido el aumento del contados hay se queda asta que se cumpla el contador =60
si se cumple pasa a la siguiente línea que es output_low(LUZ_PAD); que es apagar LUZ_PAD si es asi cuando se ensenderia LUZ_PAD aver si me explique en la comprensión del flujo del código que te puse arriba

« Última modificación: 17 de Abril de 2016, 16:21:21 por nuevo mundo »

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #91 en: 19 de Abril de 2016, 01:18:49 »
hola alguien me ayuda por favor nesecito ayuda para entender un programa y asi ver si lo puedo componer saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #92 en: 19 de Abril de 2016, 05:53:50 »
Citar
Bueno la conjetura es que debo de cambiar este 0b01111000 por 01111110  y mejor dicho lo cambie y mejoro un poco el programa porque ahora si censa todas las entradas a como estaba fíjate que solo censaba una entrada y así ya censa todas

Eso fue por que yo solo queria que se activara la sirena con las entradas de adentro nomas y no la externas, que las externas solo encendieran la luz.

Citar
Otra pregunta necesito entender el flujo de las funciones para que pueda comprender y detectar en que parte del código se queda el programa

Te lo estoy escribiendo bastante simple, el espacio al frente de las intrucciones no estan sin sentido, estan para ayudar a la lectura.

Código: C
  1. if(LuzActiva == 1)
  2.         {
  3.                 ContadorLuz++;
  4.                 if(ContadorLuz == 60)                                   // 30 seg = 60 entradas
  5.                 {
  6.                         output_low(LUZ_PAD);
  7.                         ContadorLuz = 0;
  8.                         LuzActiva = 0;
  9.                 }
  10.         }
  11.         else
  12.         {
  13.                 output_low(LUZ_PAD);
  14.                 ContadorLuz = 0;
  15.         }

Si te fijas en la misma linea vertical del if, yo puse el else, para que te dieras cuenta rapidamente que ese else pertenece a ese if, es decir que si se cumple la condicion del if, va a ejecutar todo el bloque que encierra sus llaves ( que si te fijas tiene un espacio mas para que sepas lo que conforma TODO el bloque ) de no producirse la condicion es ejecuta el else.

Supongamos que LuzActiva es igual 1. Ahora se debe ejecutar esto:

Código: C
  1. ContadorLuz++;
  2.                 if(ContadorLuz == 60)                                   // 30 seg = 60 entradas
  3.                 {
  4.                         output_low(LUZ_PAD);
  5.                         ContadorLuz = 0;
  6.                         LuzActiva = 0;
  7.                 }

Sumo 1 a ContadorLuz, y se va a ir acumulando cada ves que entre. Mientras no sea igual a 60 solamente se va a producir el incremento de ContadorLuz y se sale del if del LuzActiva.
Cuando se cumple la condicion de que ContadorLuz era 59, entro, se incremento en 1, ahora es 60, se pregunta en el if y cumple la condicion, entonces recien ahi ejecuta lo de adentro del if, es decir:

Código: C
  1. output_low(LUZ_PAD);
  2.                         ContadorLuz = 0;
  3.                         LuzActiva = 0;

Apagando la luz, poniendo el contador a 0 para que comienze de nuevo, Y apagando el tema de LuzActiva. asi ya no vuelve a entrar hasta que el sensor nuevamente detecte algo y ponga el mismo a LuzActiva en 1, para comenzar todo de nuevo.


Citar
si se cumple pasa a la siguiente línea que es output_low(LUZ_PAD); que es apagar LUZ_PAD si es asi cuando se ensenderia LUZ_PAD aver si me explique en la comprensión del flujo del código que te puse arriba

LUZ_PAD se encenderia al momento en que el sensor detecte algo, en la rutina principal

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #93 en: 20 de Abril de 2016, 01:05:13 »
Tienes razón killer jc si veo que eres bueno al escribir e código con orden y respetando la buena imagen lo veré de nuevo con esta nueva perspectiva que me dijiste haber si veo por qué no enciende la LUZ_PAD o la SIRENA ni realiza la rutina de llamar voy a abrir bien los ojos y pediré a los guru de la programación que me den entendimiento jejejeje saludos

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #94 en: 20 de Abril de 2016, 19:32:29 »
pregunta??? ¿la forma de activar cada una de las funciones? según yo esto se hace en el programa principal verdad???? ósea que en el programa principal se llama a la función o se activa la función como se dice 


Código: C
  1. void main(void)
  2. {
  3.  
  4.         // Aca el setup de pines/modulos/etc
  5.  
  6.         set_tris_B(0b11111111);         //asigno todo el puerto B como entradas y lo puse en binario para que lo tenga presente
  7.         set_tris_D(0b00000000);         // asigno todo el puerto D como salidas
  8.         output_D(0b00000000);
  9.  
  10.  
  11.         setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  12.         set_timer1 (3036);
  13.         enable_interrupts(int_timer1);
  14.         enable_interrupts(global);
  15.  
  16.         // Comienzo del programa principal
  17.  
  18.         while(true)
  19.         {
  20.                 if(input(E_ON_OF)==1)                   // Pregunto si la entrada del pin B0 es igual a 0
  21.                 {
  22.                         delay_ms(10);                   // Espero 10ms por si la llave esta rebotando (variando entre 1 y 0 )
  23.                         while(input(E_ON_OF)==1);       // Espero que suelte el boton, observa el ; al final, es decir un while(){}
  24.                         output_toggle(LED_ON_OF);       // Cambio el valor del pin
  25.  
  26.                 }
  27.  
  28.                 if(input(LED_ON_OF)==1)
  29.                 {
  30.                         if((input(S_MOV_PAD)==1))
  31.                         {
  32.                                 LuzActiva = 1;//[color=blue] aqui se activa o se llama a que se ejecute la funcion LuzActiva verdad[/color]
  33.                         }
  34.                         if((input_b() & 0b01111000) != 0)       // Es decir se activo algun sensor interno, entonces active la sirena y la llamada.
  35.                         {
  36.                                 SirenaActiva = 1;   // [color=blue]aqui se activa o se llama a que se ejecute la funcion SirenaActiva verdad[/color]
  37.                                 LLamadaActiva = 1;// [color=blue]aqui se activa o se llama a que se ejecute la funcion SirenaActiva verdad[/color]
  38.                         }
  39.                 }
  40.                 else
  41.                 {
  42.                         LuzActiva=0;
  43.                         SirenaActiva = 0;
  44.                         LLamadaActiva = 0;
  45.                         ContadorParaReset = 0;
  46.                 }
  47.         }
  48. }

lo que marque de axul es donde se llam o se actiba las funciones verdad estoy mal

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #95 en: 20 de Abril de 2016, 19:47:38 »
Lo que pones en code, no toma ningun formato :P

Pero ahi veo, si, lo que hago es simplemente poner a 1 una variable, para que cuando entre al timer actue. Nada mas. Ahora me doy cuenta que le faltaba algo a la funcion de interrupcion:


Código: C
  1. if(LuzActiva == 1)
  2.         {
  3.                 output_high(LUZ_PAD);                          // Esto le faltaba, asi se enciende la luz.
  4.                 ContadorLuz++;
  5.                 if(ContadorLuz == 60)
  6.                 {
  7.                         output_low(LUZ_PAD);
  8.                         ContadorLuz = 0;
  9.                         LuzActiva = 0;
  10.                 }
  11.         }
  12.         else
  13.         {
  14.                 output_low(LUZ_PAD);
  15.                 ContadorLuz = 0;
  16.         }

Ahi comente la instruccion, tal ves a la de la sirena tambien le falte lo mismo.

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #96 en: 21 de Abril de 2016, 00:40:48 »
ok si lo colocare y simulare a ver qué tal  gracias ya lo había visto pero aquí en México se dice
¡¡el que no sabe es como el que no ve!! jejejeje  :D :D
te imaginas e visto el programa unas 80 de veces queriéndole  hacerle un conjuro haaablaaaameee haaablameee  programa y nada que me habla  jejejeje
« Última modificación: 21 de Abril de 2016, 01:23:37 por nuevo mundo »

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #97 en: 21 de Abril de 2016, 02:49:04 »
hasta casi la1 am le di al conjuro del programa pero como no funciono mejor le puse unas 2 líneas de lo que me has enseñado y ya mejoro un poco hay ba ya aunque a la mitad uuuffff a sido un buen camino falta a  ahora la llamada si llama pero hasta ay queda no cuelga ni vuelve a llamar voy a mirar con lupa a ver que veo

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #98 en: 22 de Abril de 2016, 19:47:49 »
hola killer jc una pregunta e visto que la funcion LUZ_PAD Y SIRENA estan resetenado en diferentes tiempo y e visto que es por ue una lo hace con un retardo y el otro con retardo
Código: C
  1. if(LuzActiva == 1)
  2.         {
  3.       output_high(LUZ_PAD);  //esto le puse yo
  4.         ContadorLuz++;
  5.                 if(ContadorLuz == 60)
y el otro asi
Código: C
  1. if( SirenaActiva == 1 )
  2.         {
  3.       output_high(SIRENA);          //OJO OJO esto le puse yo nota le quise poner    output_high(SirenaActiva); pero me marco errooor
  4.         ContadorParaReset++;
  5.                 if ( ContadorParaReset >= 240 )         // 30 Minutos = 1800 segundos = 3600 entradas de 0.5s  OJO OJO cambia  3600  por 240 para 2 min y pueda ver si recetea
  6.                 {
claro que no es lo mismo pero al simular funcionan los dos y si respetan  el ON_OF que me dises hase lo mismo de diferente forma verdad

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #99 en: 22 de Abril de 2016, 20:02:48 »
Como te decia, la luz al menos como se hizo el codigo es para que funcione solo, cuando el sensor de afuera detecta algo que active la luz, este tiene un "temporizador" propio, como puede encenderse la luz pero no la sirena ( que en caso de la sirena es cuando ya se activa un sensor del interior ) tiene que estar separados, si los pusiera juntos deberian activarse ambos al mismo tiempo.

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #100 en: 22 de Abril de 2016, 20:16:08 »
aora seguire con lo de la llamada

Código: C
  1. // Contador que maneja el timer de las llamadas
  2.  
  3.         if(LLamadaActiva == 1)
  4.         {
  5.                 if(ContadorLLamada < 26 )
  6.                 {
  7.                         ContadorLLamada++;
  8.                         if( (ContadorLLamada == 0) || (ContadorLLamada == 2) )                  // Primera entrada presiona LLAMAR por 0.5s
  9.                         {                                                                       // Espera 0.5s y presiona LLAMAR de nuevo por 0.5s
  10.                                 output_high(LLAMAR);
  11.                         }
  12.                         else if ( ContadorLLamada == 22 )                                       // Pasan 10 segundos desde que se llamo y se corta
  13.                         {
  14.                                 output_high(COLGAR);
  15.                         }
pienso que se queda aqui
Código: C
  1. if( (ContadorLLamada == 0) || (ContadorLLamada == 2)
por que solo llama por .5s y ya no hace nada no espera el tiempo que es para espera de llamar y menos da salida para colgar que opinas saludos

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #101 en: 22 de Abril de 2016, 20:20:52 »
ok enterado osea que es el funcionamiento adecuado entiendo gracias ya viste ya empecé a moverle un poco al programa como mover el tiempo de media hora para ver si reseteaba jejeje un poquito osea que poco a poco voy aprendiendo algo
aora seguire de pregunton por lo de la llamada como ya abras visto  :mrgreen:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #102 en: 22 de Abril de 2016, 20:21:39 »
Ten envie el codigo con eso corregido.... Hay un error ahi.. deberian ser:

Código: C
  1. if( (ContadorLLamada == 1) || (ContadorLLamada == 3) )
  2.  else if ( ContadorLLamada == 23 )

Por que apenas entra pasa a 1 antes del primer if, entonces la condicion de ContadorLLamada == 0 nunca se va a lograr. Al aumentarle 1, si se logra.

O... se podria mover ContadorLLamada++; al final de todo esos else de dentro de LLamadaActiva.

Código: C
  1. if(ContadorLLamada < 26 )
  2.                 {
  3.  
  4.                         if( (ContadorLLamada == 0) || (ContadorLLamada == 2) )                  // Primera entrada presiona LLAMAR por 0.5s
  5.                         {                                                                       // Espera 0.5s y presiona LLAMAR de nuevo por 0.5s
  6.                                 xxxx
  7.                         }
  8.                         else if ( ContadorLLamada == 22 )                                       // Pasan 10 segundos desde que se llamo y se corta
  9.                         {
  10.                                xxxx
  11.                         }
  12.                         else
  13.                         {
  14.                                xxxxx
  15.                         }
  16.                         ContadorLLamada++;
  17.                 }
  18.                 else {......}
« Última modificación: 22 de Abril de 2016, 20:26:45 por KILLERJC »

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #103 en: 22 de Abril de 2016, 20:34:06 »
ok enterado gracias lo checo lo sustitullo y lo simulo ya te comento gracias

Desconectado nuevo mundo

  • PIC16
  • ***
  • Mensajes: 108
Re:lecturas y salidas (digitales y analogicas) en lengua c para pic
« Respuesta #104 en: 23 de Abril de 2016, 03:11:10 »
hola simule y no hace mucho con relacion a llamar y detecte que es lo que pasa solo llama una ves pero de hay nada

lo que vi es que deveria de llamar por lo menos 3 veses y tambien 3 veses colgar y entiendo que deveria de ser mas o menos asi aver si me explico o si esta bien la logica
 
output_high(LLAMAR);   //mandamos un 1 como si fuera la primera llamada de hay
delay_ms(10);               //esperamos 10 ms 
output_low(LLAMAR);    //y apagamos la salida de llamada de hay
delay_ms(100);             // esperamos que el cel solito da unas 3  timbradas al numero que ya esta predeterminado por eso este retardo
                                      // de hay que paso este tiempo
output_high(COLGAR);  // damos una salida de 1 a colgar de hay
delay_ms(10);              //esperamos 10 ms y
output_low(COLGAR);   //apagamos colgar

esto seria 3 veses para que llame 3 veses y cuelge 3 veses y el el timer de llamada activa solo me parese que yama una ves y cuelga una ves  no se si me explique ya me voy a dormir ojala que alrato me comentes