Autor Tema: Funcion condicionada Pic16f876  (Leído 3581 veces)

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

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Funcion condicionada Pic16f876
« en: 03 de Febrero de 2011, 15:03:38 »
Hola a todo el foro,

Estoy haciendo un voltimetro y funciona pero con gotos, lo que quiero hacer es cuando pulse una tecla salga un mensaje en el lcd, yo lo consigo utilizando un goto, pero yo no quiero utilizar un goto quiero utilizar una funcion. Osea que una vez haya salido el mensaje vuelva a donde se habia quedado el programa.

yo la funcion que conozco es del tipo:

void funcion_1(void)
{
  instrucciones
}

pero no se hacer que la funcion se cumpla despues de una condicion

creo que la linea a modificar seria: if (BIT_TEST(PORTA,2)==1) void funcion_1(void);


Gracias a toda la ayuda.



El programa seria el siguiente:



#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)

#define use_portb_lcd TRUE

#include <LCD.C>
#include <math.h>

#BYTE TRISA = 0x85  //estos dos valores son exclusivos del PORT A
#BYTE PORTA = 0x05  //estos dos valores son exclusivos del PORT A


void main() {
   int16 q;
   float p;
   

  //setup_adc_ports(AN0);                                   //Canal 0 analógico
 
  bit_set (TRISA , 2); // A2 como entrada
 
setup_adc_ports(RA0_RA1_RA3_ANALOG); //RA0 y RA1 analógica, RA2 digital RA2 DIGI


  setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC

   lcd_init();
   
   /////////////////////////////////////////////////////////////////////
   

   inicio:

 
 // CONSULTAMOS EL VALOR DEL ADC
   
      set_adc_channel(0);           //Habilitación canal0
      delay_us(20);
      q = read_adc();                  //Lectura canal0
   
   
// APLICAMOS CALCULOS


  p=5.0*q/1024.0; // pasamos la intensidad a potencia. P=V*I
     
      // 220.0 (poniendo .0 se visualiza tambien los decimales)
 
// utilizar en los numeros .0
 
 // VISUALIZAMOS EN EL LCD
 
   
       
    printf(lcd_putc, "\fV = %4ld voltios", p);
   
 
      delay_ms(50); //valor original 100 ms
     
      if (BIT_TEST(PORTA,2)==1) void funcion_1(void);
     
     
      goto inicio;
     
     


void funcion_1(void)
{
 
  printf(lcd_putc, "\f" );//BORRAMOS LA PANTALLA
   
   printf(lcd_putc, "\ftecla pulsada");
   
   delay_ms(1000);//retardo 1 segundo
}
     
     
     
 
   
   goto inicio;
      }

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Funcion condicionada Pic16f876
« Respuesta #1 en: 03 de Febrero de 2011, 18:54:21 »

  En el bloque del programa tendrías que utilizar el while(1) para que haga un loop infinito, algo así....

Código: C
  1. while (1)
  2. {
  3.   ...........
  4. ...........
  5. .........
  6. ..........
  7. ..........
  8. ............
  9. if (BIT_TEST(PORTA,2)==1) funcion_1();
  10.  
  11. }

  Cuando llamás a una función no es necesario poner los "void". Eso sólo es necesario en el momento de la declaración y la implementación.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Funcion condicionada Pic16f876
« Respuesta #2 en: 03 de Febrero de 2011, 20:43:07 »
Hola lo que oi hago es lo siguiente:


while(1)  //bucle principal
{

while(menu == 1)
{
muestro en lcd MENU1
while(menu == 1)
{
aqui hago lo ke kiero
y leo las teclas de flechas
si hay que salir del presente bucle cambio el valor de la variable menu al del que deseo
}
}

while(menu == 2)
{
muestro en lcd MENU2
while(menu == 2)
{
aqui hago lo ke kiero
y leo las teclas de flechas
si hay que salir del presente menu cambio el valor de la variable menu al del while ke deseo
}
}

}
asi de facil.

saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: Funcion condicionada Pic16f876
« Respuesta #3 en: 04 de Febrero de 2011, 06:18:30 »
Muchas gracias a los dos, tanto a AngelGris como a KALLITOS, voy a probarlo

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: Funcion condicionada Pic16f876
« Respuesta #4 en: 04 de Febrero de 2011, 14:14:12 »
Hola, he puesto el nuevo codigo y me sale el siguiente error:

*** Error 12 "voltimentro.c" Line 66(43,44): Undefined identifier  -- funcion_1

*** Error 51 "voltimentro.c" Line 73(4,8): A numeric expression must appear here
      2 Errors,  1 Warnings.


creo que se refiere a la linea:  """"void funcion_1(void)""""   que le falta un valor numerico pero no entiendo lo que quiere decir.


¿cómo se resuelve? Gracias


El codigo que he puesto es el siguiente:



#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)

#define use_portb_lcd TRUE

#include <LCD.C>
#include <math.h>

#BYTE TRISA = 0x85  //estos dos valores son exclusivos del PORT A
#BYTE PORTA = 0x05  //estos dos valores son exclusivos del PORT A


void main() {
   int16 q;
   float p;
   

  //setup_adc_ports(AN0);                                   //Canal 0 analógico
 
  bit_set (TRISA , 2); // A2 como entrada
 
setup_adc_ports(RA0_RA1_RA3_ANALOG); //RA0 y RA1 analógica, RA2 digital RA2 DIGI


  setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC

   lcd_init();
   
   /////////////////////////////////////////////////////////////////////
   

while (1)
{
 
 // CONSULTAMOS EL VALOR DEL ADC
   
      set_adc_channel(0);           //Habilitación canal0
      delay_us(20);
      q = read_adc();                  //Lectura canal0
   
   
// APLICAMOS CALCULOS


  p=5.0*q/1024.0; // pasamos la intensidad a potencia. P=V*I
     
      // 220.0 (poniendo .0 se visualiza tambien los decimales)
 
// utilizar en los numeros .0
 
 // VISUALIZAMOS EN EL LCD
 
   
       
    printf(lcd_putc, "\fV = %4ld voltios", p);
   
 
      delay_ms(50); //valor original 100 ms
     
      if (BIT_TEST(PORTA,2)==1)  funcion_1();
       
     
      tecla:// visualizamos la presentacion 5 segundos
 
   
   
   void funcion_1(void)
{
 
  printf(lcd_putc, "\f" );//BORRAMOS LA PANTALLA
   
   printf(lcd_putc, "\ftecla pulsada");
   
   delay_ms(1000);//retardo 1 segundo
}
      }
}

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Funcion condicionada Pic16f876
« Respuesta #5 en: 04 de Febrero de 2011, 14:30:11 »
Hola, cuando usas funciones hay dos maneras de ubicarlas:

Antes de la funcion MAIN, alli todo normal, solo colocas el contenido y nada mas.
Despues de la funcion MAIN, alli deberas colocar el nombre de la funcion antes de la principal.

En lineas de color azul te muestro.

saludos




Hola, he puesto el nuevo codigo y me sale el siguiente error:

*** Error 12 "voltimentro.c" Line 66(43,44): Undefined identifier  -- funcion_1

*** Error 51 "voltimentro.c" Line 73(4,8): A numeric expression must appear here
      2 Errors,  1 Warnings.


creo que se refiere a la linea:  """"void funcion_1(void)""""   que le falta un valor numerico pero no entiendo lo que quiere decir.


¿cómo se resuelve? Gracias


El codigo que he puesto es el siguiente:



#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)

#define use_portb_lcd TRUE

#include <LCD.C>
#include <math.h>

#BYTE TRISA = 0x85  //estos dos valores son exclusivos del PORT A
#BYTE PORTA = 0x05  //estos dos valores son exclusivos del PORT A


void funcion_1(void);

void main() {
   int16 q;
   float p;
   

  //setup_adc_ports(AN0);                                   //Canal 0 analógico
 
  bit_set (TRISA , 2); // A2 como entrada
 
setup_adc_ports(RA0_RA1_RA3_ANALOG); //RA0 y RA1 analógica, RA2 digital RA2 DIGI


  setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC

   lcd_init();
   
   /////////////////////////////////////////////////////////////////////
   

while (1)
{
 
 // CONSULTAMOS EL VALOR DEL ADC
   
      set_adc_channel(0);           //Habilitación canal0
      delay_us(20);
      q = read_adc();                  //Lectura canal0
   
   
// APLICAMOS CALCULOS


  p=5.0*q/1024.0; // pasamos la intensidad a potencia. P=V*I
     
      // 220.0 (poniendo .0 se visualiza tambien los decimales)
 
// utilizar en los numeros .0
 
 // VISUALIZAMOS EN EL LCD
 
   
       
    printf(lcd_putc, "\fV = %4ld voltios", p);
   
 
      delay_ms(50); //valor original 100 ms
     
      if (BIT_TEST(PORTA,2)==1)  funcion_1();
       
     
      tecla:// visualizamos la presentacion 5 segundos
 
   
   
   void funcion_1(void)
{
 
  printf(lcd_putc, "\f" );//BORRAMOS LA PANTALLA
   
   printf(lcd_putc, "\ftecla pulsada");
   
   delay_ms(1000);//retardo 1 segundo
}
      }
}
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Funcion condicionada Pic16f876
« Respuesta #6 en: 04 de Febrero de 2011, 14:35:20 »
Te dejo un ejemplo de como hago los menus, esta recien comenzado, pero para que lo entiendas es suficiente creo.

Saludios.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Funcion condicionada Pic16f876
« Respuesta #7 en: 04 de Febrero de 2011, 14:38:56 »
  Por lo que yo veo del código, parece que está implementando la función, pero queda dentro del while y por ende dentro del main.
  Yo creo que por eso el error.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: Funcion condicionada Pic16f876
« Respuesta #8 en: 04 de Febrero de 2011, 14:45:10 »
gracias por las respuestas. Ahora me sale error en el while (1). He puesto la funcion antes del void main.

Este el el codigo:





#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)

#define use_portb_lcd TRUE

#include <LCD.C>
#include <math.h>

#BYTE TRISA = 0x85  //estos dos valores son exclusivos del PORT A
#BYTE PORTA = 0x05  //estos dos valores son exclusivos del PORT A

void funcion_1(void)
   
{

 
  printf(lcd_putc, "\f" );//BORRAMOS LA PANTALLA
   
   printf(lcd_putc, "\ftecla pulsada");
   
   delay_ms(1000);//retardo 1 segundo
}


void main() {
   int16 q;
   float p;
   

  //setup_adc_ports(AN0);                                   //Canal 0 analógico
 
  bit_set (TRISA , 2); // A2 como entrada
 
setup_adc_ports(RA0_RA1_RA3_ANALOG); //RA0 y RA1 analógica, RA2 digital RA2 DIGI


  setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC

   lcd_init();
   
   /////////////////////////////////////////////////////////////////////
   

while (1)
{
 
 // CONSULTAMOS EL VALOR DEL ADC
   
      set_adc_channel(0);           //Habilitación canal0
      delay_us(20);
      q = read_adc();                  //Lectura canal0
   
   
// APLICAMOS CALCULOS


  p=5.0*q/1024.0; // pasamos la intensidad a potencia. P=V*I
     
      // 220.0 (poniendo .0 se visualiza tambien los decimales)
 
// utilizar en los numeros .0
 
 // VISUALIZAMOS EN EL LCD
 
   
       
    printf(lcd_putc, "\fV = %4ld voltios", p);
   
 
      delay_ms(50); //valor original 100 ms
     
      if (BIT_TEST(PORTA,2)==1)  funcion_1();
       
     
      tecla:// visualizamos la presentacion 5 segundos
 
   
   
   
   

      }
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Funcion condicionada Pic16f876
« Respuesta #9 en: 04 de Febrero de 2011, 14:56:15 »
¿Y cuál es el mensaje de error?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Funcion condicionada Pic16f876
« Respuesta #10 en: 04 de Febrero de 2011, 15:00:09 »
gracias por las respuestas. Ahora me sale error en el while (1). He puesto la funcion antes del void main.

Este el el codigo:





#include <16F876.h>
#device adc=10

#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)

#define use_portb_lcd TRUE

#include <LCD.C>
#include <math.h>

#BYTE TRISA = 0x85  //estos dos valores son exclusivos del PORT A
#BYTE PORTA = 0x05  //estos dos valores son exclusivos del PORT A

void funcion_1(void)
   
{

 
  printf(lcd_putc, "\f" );//BORRAMOS LA PANTALLA
   
   printf(lcd_putc, "\ftecla pulsada");
   
   delay_ms(1000);//retardo 1 segundo
}


void main() {
   int16 q;
   float p;
   

  //setup_adc_ports(AN0);                                   //Canal 0 analógico
 
  bit_set (TRISA , 2); // A2 como entrada
 
setup_adc_ports(RA0_RA1_RA3_ANALOG); //RA0 y RA1 analógica, RA2 digital RA2 DIGI


  setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC

   lcd_init();
   
   /////////////////////////////////////////////////////////////////////
   

while (1)
{
 
 // CONSULTAMOS EL VALOR DEL ADC
   
      set_adc_channel(0);           //Habilitación canal0
      delay_us(20);
      q = read_adc();                  //Lectura canal0
   
   
// APLICAMOS CALCULOS


  p=5.0*q/1024.0; // pasamos la intensidad a potencia. P=V*I
     
      // 220.0 (poniendo .0 se visualiza tambien los decimales)
 
// utilizar en los numeros .0
 
 // VISUALIZAMOS EN EL LCD
 
   
       
    printf(lcd_putc, "\fV = %4ld voltios", p);
   
 
      delay_ms(50); //valor original 100 ms
     
      if (BIT_TEST(PORTA,2)==1)  funcion_1();
       
     
      tecla:// visualizamos la presentacion 5 segundos
 
   
   
   
   

      }
}

Alli hay un error.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: Funcion condicionada Pic16f876
« Respuesta #11 en: 04 de Febrero de 2011, 15:00:33 »
>>> Warning 203 "voltimentro.c" Line 51(1,1): Condition always TRUE


*** Error 51 "voltimentro.c" Line 86(1,2): A numeric expression must appear here
      1 Errors,  1 Warnings.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Funcion condicionada Pic16f876
« Respuesta #12 en: 04 de Febrero de 2011, 15:04:44 »
>>> Warning 203 "voltimentro.c" Line 51(1,1): Condition always TRUE


*** Error 51 "voltimentro.c" Line 86(1,2): A numeric expression must appear here
      1 Errors,  1 Warnings.

  Con respecto al primero es sólo un warning, y te está avisando que siempre va a ser verdadera dicha condición.

  Con respecto la segundo, creo que sería lo que te mostró KALLITOS
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado xabc2007

  • PIC12
  • **
  • Mensajes: 62
Re: Funcion condicionada Pic16f876
« Respuesta #13 en: 04 de Febrero de 2011, 15:06:53 »
Perfecto. Funciona. Muchas gracias a ti KALLITOS y obviamente a ti Angel Gris.



 

anything