Sub-funciones Lenguaje C

Feliz año Compañeros!

Mi duda es la siguente, tengo dos "flips flops" en forma de sub-rutinas que quiero ejecutar al mismo tiempo, pero solo ocurre con la que pongo de primera (Fijense en el primer if). ¿Qué puedo hacer?

Les subo el codigo en lenguaje C:
Código:
#include <16f628A.h>                    
#fuses XT,NOWDT,NOPROTECT             
#use delay (clock=4000000)            
#use standard_io(b)                    


#define PA0 PIN_A0
#define PA1 PIN_A1  
#define PA2 PIN_A2
#define PA3 PIN_A3
#define PA4 PIN_A4
#define PB0 PIN_B0
#define PB1 PIN_B1  
#define PB2 PIN_B2
#define PB3 PIN_B3
#define PB4 PIN_B4
#define PB5 PIN_B5
#define PB6 PIN_B6
#define PB7 PIN_B7
int a=0,b=0,c=0,d=0;
void bascula_volt();
void bascula_amp();
/********************************Programa*****************************************/
void main(){
   set_tris_b(0b00000000);   
   set_tris_a(0b00011111);
   output_b(0b00000000);         
   while(true){                  
    if (input (PA4)==0)
    {
    delay_us (200);
    output_high (PB7);
   bascula_amp();
   bascula_volt();
    
    }
}
}
void bascula_volt()
{
while (true){
   if (input(PA0)==0)
     {
     delay_us (200);
     a=1;
     b=0;
     }
    
    if (input (PA1)==0)
    {
    delay_us (200);
    b=1;
    a=0;
    }
    if ((b==0)&&(a==1))
     {
    output_high (PB0);
     }
    if ((b==1)&&(a==0))
    {
    output_low  (PB0);
    }
}
}
void bascula_amp ()
{
while (true){
   if (input(PA2)==0)
     {
     delay_us (200);
     c=1;
     d=0;
     }
    
    if (input (PA3)==0)
    {
    delay_us (200);
    d=1;
    c=0;
    }
    if ((c==0)&&(d==1))
     {
    output_high (PB1);
     }
    if ((c==1)&&(d==0))
    {
    output_low  (PB1);
    }
}
}

Saludos y gracias :D
 
Hola anthony123, por que utilizas while() en las funciones bascula_amp() y bascula_volt()? Una vez ingresa a una de estas funciones no le tienes ninguna instrucción para salir de ellas.

Saludos!
 
Hola anthony123, por que utilizas while() en las funciones bascula_amp() y bascula_volt()? Una vez ingresa a una de estas funciones no le tienes ninguna instrucción para salir de ellas.

Saludos!

Tal como menciona fuzzer, al entrar en un while(true) no hay vuelta atrás, salvo que haya un break, cosa que no hay. Pero, ¿para qué necesitas el while(true) en c/rutina? si de hecho ya tenés un while que es el de main, con ese debería alcanzar, así que probá sacando el while(true) de esas funciones.
 
Efectivamente, el while de la subfunción me estaba chocando. Por cierto, alguno conoce la rutina "POT" del 16F628 que permite establer la posición de un potenciometro sin usar A/D?

Saludos y gracias!
 
Duda, ¿esa función POT usá un ADC no?, ¿de lo contrario como sabe la posición del pote?
Nop. Utiliza cualquier pin configurado como Digital I/O
La rutina funciona midiendo el tiempo de descarga de un capacitor sobre un circuito R/C.

Según el manual de PBP, así es como trabaja...

POT Pin,Scale,Var

Lee un potenciómetro (ú otro dispositivo resistivo) en Pin.
Pin puede ser una constante, 0 - 15, ó una variable que contenga un número de 0-15 (p.ej. B0)
ó un número de Pin (p.ej. PORTA.0)

La resistencia se mide tomando el tiempo de descarga de un capacitor a través de un resistor. (5 K a 50 K)
Scale se usa para ajustar distintas constantes RC.
Para constantes RC grandes, Scale debe ser baja (valor mínimo 1)
Para constantes RC pequeñas, Scale debe ser máxima (255)
Si el valor de Scale es correcto, Var debe ser cero para mínima resistencia y 255 para máxima resistencia.

Desafortunadamente, Scale debe ser determinada en forma experimental.
Para esto, coloque el dispositivo a medir en máxima resistencia y mídalo con Scale = 255
En estas condiciones, Var tendrá un valor apropiado de Scale.

Conexión
POT.jpg
Saludos.
 
Última edición:
Nop. Utiliza cualquier pin configurado como Digital I/O
La rutina funciona midiendo el tiempo de descarga de un capacitor sobre un circuito R/C.

Según el manual de PBP, así es como trabaja...

POT Pin,Scale,Var

Lee un potenciómetro (ú otro dispositivo resistivo) en Pin.
Pin puede ser una constante, 0 - 15, ó una variable que contenga un número de 0-15 (p.ej. B0)
ó un número de Pin (p.ej. PORTA.0)

La resistencia se mide tomando el tiempo de descarga de un capacitor a través de un resistor. (5 K a 50 K)
Scale se usa para ajustar distintas constantes RC.
Para constantes RC grandes, Scale debe ser baja (valor mínimo 1)
Para constantes RC pequeñas, Scale debe ser máxima (255)
Si el valor de Scale es correcto, Var debe ser cero para mínima resistencia y 255 para máxima resistencia.

Desafortunadamente, Scale debe ser determinada en forma experimental.
Para esto, coloque el dispositivo a medir en máxima resistencia y mídalo con Scale = 255
En estas condiciones, Var tendrá un valor apropiado de Scale.

Saludos.

Interesante, no sabía de la existencia de ese método, ¿ahí faltaría un transistor o algo que sirva de carga y descarga no?
 
Interesante, no sabía de la existencia de ese método, ¿ahí faltaría un transistor o algo que sirva de carga y descarga no?

Es el viejo método usado en el Game-Port de las PC de toda la vida para leer el pote del joystick.

- Se activa la salida y se cuenta hasta que se lee un '1' en la entrada.
- Se resetea la salida y se devuelve el valor de la cuenta.
- No puede hacerse otra lectura hasta que el capacitor se haya descargado.

En las aplicaciones normales de este método, lo que importa es usar un mínimo de recursos, precisión y estabilidad no calientan.
 

Adjuntos

  • Pote.jpg
    Pote.jpg
    10 KB · Visitas: 5
Es el viejo método usado en el Game-Port de las PC de toda la vida para leer el pote del joystick.

- Se activa la salida y se cuenta hasta que se lee un '1' en la entrada.
- Se resetea la salida y se devuelve el valor de la cuenta.
- No puede hacerse otra lectura hasta que el capacitor se haya descargado.

En las aplicaciones normales de este método, lo que importa es usar un mínimo de recursos, precisión y estabilidad no calientan.

Ahí me cerró, interesante el método, realmente no sabía que existía, si uno anda corto con los ADC, es una solución bastante piola.
 
Y que me pueden decir acerca de la funcion "counter" de Basic? Existe su contraparte en C? Porque me vuelvo un 8 con las interrupciones :(

Saludos y gracias!
 
Y que me pueden decir acerca de la funcion "counter" de Basic? Existe su contraparte en C? Porque me vuelvo un 8 con las interrupciones :(

Saludos y gracias!

Hola:
No voy a ser tan metiche sobre el tema, solo para aclarar :).
El lenguaje C es como si se hablara en ASM pero más bonito y entendible... ahún más ya que estás usando el compilador PICC de CCS...
En C hablemos sobre librerias, siendo genéricas la mayoria de las funciónes (no en el CCS ya que dispone otras más).
Similar a la instruccion Counter no existe, ya que no hay una libreria en C en la cuál se pueda especificar si el conteo va a ser por código, por interrupción o por algún hardware interno que disponga dicho PIC, dependiendo del tipo se puede utilizar 'n' modos de conteo y que trabaje de 'n' formas para que se ajuste a la lógica del programa que se este desarrollando (la cantidad de código generado depende de estos detalles, entre otros...). Trabajar en C, es como trabajar con buena exactitud (no tanto como en ASM).

Puedes crear tus propias funciones (crear librerias) que podras reutilizar en otros proyectos.

Saludos.
 
Atrás
Arriba