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

Temas similares

04/01/2013 #1

Avatar de anthony123

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
04/01/2013 #2


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!
04/01/2013 #3

Avatar de cosmefulanito04

fuzzer0110 dijo: Ver Mensaje
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.
05/01/2013 #4

Avatar de anthony123

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!
05/01/2013 #5
Moderador

Avatar de D@rkbytes

anthony123 dijo: Ver Mensaje
alguno conoce la rutina "POT" del 16F628 que permite establer la posición de un potenciometro sin usar A/D?
¿Será esto lo que buscas? Función POT
Solo que es para PICBasic y funciona con cualquier PIC

Saludos.
05/01/2013 #6

Avatar de cosmefulanito04

D@rkbytes dijo: Ver Mensaje
¿Será esto lo que buscas? Función POT
Solo que es para PICBasic y funciona con cualquier PIC

Saludos.
Duda, ¿esa función POT usá un ADC no?, ¿de lo contrario como sabe la posición del pote?
05/01/2013 #7
Moderador

Avatar de D@rkbytes

cosmefulanito04 dijo: Ver Mensaje
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

Saludos.
Imágenes Adjuntas
Tipo de Archivo: jpg POT.jpg (7,0 KB (Kilobytes), 61 visitas)
05/01/2013 #8

Avatar de cosmefulanito04

D@rkbytes dijo: Ver Mensaje
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?
05/01/2013 #9

Avatar de Eduardo

cosmefulanito04 dijo: Ver Mensaje
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.
Imágenes Adjuntas
Tipo de Archivo: jpg Pote.jpg (10,0 KB (Kilobytes), 5 visitas)
05/01/2013 #10
Moderador

Avatar de D@rkbytes

cosmefulanito04 dijo: Ver Mensaje
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?
Pues no, trabaja así como lo mostré, directamente sobre un pin del PIC.
Eduardo dijo: Ver Mensaje
Es el viejo método usado en el Game-Port de las PC de toda la vida para leer el pote del joystick.
Así es, exactamente.

Saludos.
05/01/2013 #11

Avatar de cosmefulanito04

Eduardo dijo: Ver Mensaje
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.
05/01/2013 #12

Avatar de anthony123

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!
07/01/2013 #13

Avatar de ByAxel

anthony123 dijo: Ver Mensaje
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.
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.