Autor Tema: Hola me pueden dar una mano con este programa??  (Leído 2187 veces)

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

Desconectado Trev_11

  • PIC10
  • *
  • Mensajes: 44
Hola me pueden dar una mano con este programa??
« en: 21 de Septiembre de 2007, 15:41:53 »
Hola a todos,tengo ganas de hacer un control de temperatura,este programa usualmente registra la temperatura y la visualiza en pantalla y eventualmente(mediante int rb)visualiza en pantalla un numero de hasta 2 digitos,el problema es ke no se porke no retorna de la interrupccion si el segundo digito es 0,mi idea ademas tbm es cargar un timer luego de cada pulsacion(aunke aun no manejo el timer)para ke no se cuelgue esperando la pulsacion,bue gracias despues vere como puedo usar ese dato.Salu2 8)

//Este es el primer paso hacia el control de temperatura.Idea:que usualmente sea un sensor y ocacional o
//eventualmente presente en pantalla el numero correspondiente a la tecla oprimida.

#include <16f877.h>
#device adc=10
#fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte portb=6
//#include <Rutina escaneo de teclado 4x3 en C.c>
#use fast_io(D)


char TECLA_PULSADA,digitos;
float const P=0.002219;               //P=(5-2.73)/1023
float voltaje,temperatura;            //Declaro estas variables como globales.
unsigned long int bin_lectura;        //Si bien trabajare con un dato entero de 10 bits.

char escan_teclado()
{
     int tecla;
     int i=0;
     int vect[5]={0x0E,0x0D,0x0B,0x07,0};
     char matriz_teclado[4][3]={'1','2','3','4','5','6','7','8','9','*','0','#'};

     while(i<4)
          {
          portb=vect;
          if(!input(PIN_B4))
                {
                 tecla=0;
                 tecla=matriz_teclado[tecla];
                }
          if(!input(PIN_B5))
                {
                 tecla=1;
                 tecla=matriz_teclado[tecla];
                }
          if(!input(PIN_B6))
                {
                 tecla=2;
                 tecla=matriz_teclado[tecla];
                }
          i++;     
          }     
     return(tecla);
}

#int_rb   //CCS habilita(una vez fuera)e inhabilita(para ke no se produzca de nuevo la int. mientras se la trata) la int. automaticamente.
void exploracion_teclado(void)
{
port_b_pullups(TRUE);
digitos=0;
   while(digitos<2)
   {
   TECLA_PULSADA=escan_teclado();
   if(TECLA_PULSADA!=0)
   {
   if(digitos==0)   
   printf(lcd_putc,"\fUMBRAL INF. C=%c",escan_teclado());
   else
   {
   printf(lcd_putc,"%c",escan_teclado());
   }
   delay_ms(500);
   ++digitos;
   }
   }

//   while(!input(PIN_B4)||!input(PIN_B5)||!input(PIN_B6)||!input(PIN_B7)); //Leo el portb(esto es necesario por problemas con CCS)y al mismo tiempo utilizo solo el flanco descendente como condición de ejecución.
   portb=0x00; 
}

main()
{   
   set_tris_b(0xf0);
   set_tris_d(0x00);                     //Puerto D como salida.
   lcd_init();
   enable_interrupts(global);
   enable_interrupts(int_rb);
   while(1)
   {
   set_tris_a(0x0D);                     //Configuro RA0,RA2(Vref-) y RA3(Vref+) como entradas.                                       
   setup_adc(adc_clock_internal);        //Pongo en marcha módulo A/D.
   delay_us(20);
   setup_adc_ports(AN0_VREF_VREF);       
   set_adc_channel(0);                   //El canal analogo a emplear será RA0/AN0.     
   delay_us(20);                         //Tiempo de adquisición del dato.     
   bin_lectura=read_adc();               
   setup_adc(ADC_OFF);
   delay_us(20);
   voltaje=(bin_lectura*P)+2.73;
   temperatura=(voltaje/0.01)-273;
   printf(lcd_putc,"\fTEMPERATURA=%.3f C",temperatura);
   delay_ms(100);
   lcd_putc("\f");                       //Borro LCD.
   }
}

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Hola me pueden dar una mano con este programa??
« Respuesta #1 en: 21 de Septiembre de 2007, 15:46:35 »
Hola amigo!

Deberias intentar editar el post usando el formato especial para CODIGO, por que parte de tu codigo fuente se ha transformado en "italicas". Supongo que ha sido el [ i ] de portb=vect[ i ]; . Quizas ha pasado en alguna otra parte del codigo, y eso ayuda poco a entenderlo.

Deberia quedarte algo asi:

Código: [Seleccionar]
portb=vect[i];
Saludos!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado Trev_11

  • PIC10
  • *
  • Mensajes: 44
Re: Hola me pueden dar una mano con este programa??
« Respuesta #2 en: 21 de Septiembre de 2007, 16:03:58 »
Si hola aitiopes gracias es ke soy novato aca lo dejo espero salga bien suerte

Código: [Seleccionar]

//Este es el primer paso hacia el control de temperatura.Idea:que usualmente sea un sensor y ocacional o
//eventualmente presente en pantalla el numero correspondiente a la tecla oprimida.

#include <16f877.h>
#device adc=10
#fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte portb=6
//#include <Rutina escaneo de teclado 4x3 en C.c>
#use fast_io(D)


char TECLA_PULSADA,digitos;
float const P=0.002219;               //P=(5-2.73)/1023
float voltaje,temperatura;            //Declaro estas variables como globales.
unsigned long int bin_lectura;        //Si bien trabajare con un dato entero de 10 bits.

char escan_teclado()
{
     int tecla;
     int i=0;
     int vect[5]={0x0E,0x0D,0x0B,0x07,0};
     char matriz_teclado[4][3]={'1','2','3','4','5','6','7','8','9','*','0','#'};

     while(i<4)
          {
          portb=vect[i];
          if(!input(PIN_B4))
                {
                 tecla=0;
                 tecla=matriz_teclado[i][tecla];
                }
          if(!input(PIN_B5))
                {
                 tecla=1;
                 tecla=matriz_teclado[i][tecla];
                }
          if(!input(PIN_B6))
                {
                 tecla=2;
                 tecla=matriz_teclado[i][tecla];
                }
          i++;     
          }     
     return(tecla);
}

#int_rb   //CCS habilita(una vez fuera)e inhabilita(para ke no se produzca de nuevo la int. mientras se la trata) la int. automaticamente.
void exploracion_teclado(void)
{
port_b_pullups(TRUE);
digitos=0;
   while(digitos<2)
   {
   TECLA_PULSADA=escan_teclado();
   if(TECLA_PULSADA!=0)
   {
   if(digitos==0)   
   printf(lcd_putc,"\fUMBRAL INF. C=%c",escan_teclado());
   else
   {
   printf(lcd_putc,"%c",escan_teclado());
   }
   delay_ms(500);
   ++digitos;
   }
   }

//   while(!input(PIN_B4)||!input(PIN_B5)||!input(PIN_B6)||!input(PIN_B7)); //Leo el portb(esto es necesario por problemas con CCS)y al mismo tiempo utilizo solo el flanco descendente como condición de ejecución.
   portb=0x00; 
}

main()
{   
   set_tris_b(0xf0);
   set_tris_d(0x00);                     //Puerto D como salida.
   lcd_init();
   enable_interrupts(global);
   enable_interrupts(int_rb);
   while(1)
   {
   set_tris_a(0x0D);                     //Configuro RA0,RA2(Vref-) y RA3(Vref+) como entradas.                                       
   setup_adc(adc_clock_internal);        //Pongo en marcha módulo A/D.
   delay_us(20);
   setup_adc_ports(AN0_VREF_VREF);       
   set_adc_channel(0);                   //El canal analogo a emplear será RA0/AN0.     
   delay_us(20);                         //Tiempo de adquisición del dato.     
   bin_lectura=read_adc();               
   setup_adc(ADC_OFF);
   delay_us(20);
   voltaje=(bin_lectura*P)+2.73;
   temperatura=(voltaje/0.01)-273;
   printf(lcd_putc,"\fTEMPERATURA=%.3f C",temperatura);
   delay_ms(100);
   lcd_putc("\f");                       //Borro LCD.
   }
}

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Hola me pueden dar una mano con este programa??
« Respuesta #3 en: 21 de Septiembre de 2007, 16:09:49 »
Otra posibilidad además de la que te dice el maestro Aitopes es colocar las etiquetas del GeSHi

[ code=cpp ]

... Tu Codigo Fuente ....

[ \code ]

Antes y después de tu programa, quitando los espacios que hay dentro de esos corchetes para que aparezca así, con sus colores y todo ...

Código: C++
  1. //Este es el primer paso hacia el control de temperatura.Idea:que usualmente sea un sensor y ocacional o
  2. //eventualmente presente en pantalla el numero correspondiente a la tecla oprimida.
  3.  
  4. #include <16f877.h>
  5. #device adc=10
  6. #fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWDT
  7. #use delay(clock=4000000)
  8. #include <lcd.c>
  9. #byte portb=6
  10. //#include <Rutina escaneo de teclado 4x3 en C.c>
  11. #use fast_io(D)
  12.  
  13.  
  14. char TECLA_PULSADA,digitos;
  15. float const P=0.002219;               //P=(5-2.73)/1023
  16. float voltaje,temperatura;            //Declaro estas variables como globales.
  17. unsigned long int bin_lectura;        //Si bien trabajare con un dato entero de 10 bits.
  18.  
  19. char escan_teclado()
  20. {
  21.      int tecla;
  22.      int i=0;
  23.      int vect[5]={0x0E,0x0D,0x0B,0x07,0};
  24.      char matriz_teclado[4][3]={'1','2','3','4','5','6','7','8','9','*','0','#'};
  25.  
  26.      while(i<4)
  27.           {
  28.           portb=vect[i];
  29.           if(!input(PIN_B4))
  30.                 {
  31.                  tecla=0;
  32.                  tecla=matriz_teclado[i][tecla];
  33.                 }
  34.           if(!input(PIN_B5))
  35.                 {
  36.                  tecla=1;
  37.                  tecla=matriz_teclado[i][tecla];
  38.                 }
  39.           if(!input(PIN_B6))
  40.                 {
  41.                  tecla=2;
  42.                  tecla=matriz_teclado[i][tecla];
  43.                 }
  44.           i++;    
  45.           }      
  46.      return(tecla);
  47. }
  48.  
  49. #int_rb   //CCS habilita(una vez fuera)e inhabilita(para ke no se produzca de nuevo la int. mientras se la trata) la int. automaticamente.
  50. void exploracion_teclado(void)
  51. {
  52. port_b_pullups(TRUE);
  53. digitos=0;
  54.    while(digitos<2)
  55.    {
  56.    TECLA_PULSADA=escan_teclado();
  57.    if(TECLA_PULSADA!=0)
  58.    {
  59.    if(digitos==0)  
  60.    printf(lcd_putc,"\fUMBRAL INF. C=%c",escan_teclado());
  61.    else
  62.    {
  63.    printf(lcd_putc,"%c",escan_teclado());
  64.    }
  65.    delay_ms(500);
  66.    ++digitos;
  67.    }
  68.    }
  69.  
  70. //   while(!input(PIN_B4)||!input(PIN_B5)||!input(PIN_B6)||!input(PIN_B7)); //Leo el portb(esto es necesario por problemas con CCS)y al mismo tiempo utilizo solo el flanco descendente como condición de ejecución.
  71.    portb=0x00;  
  72. }
  73.  
  74. main()
  75. {  
  76.    set_tris_b(0xf0);
  77.    set_tris_d(0x00);                     //Puerto D como salida.
  78.    lcd_init();
  79.    enable_interrupts(global);
  80.    enable_interrupts(int_rb);
  81.    while(1)
  82.    {
  83.    set_tris_a(0x0D);                     //Configuro RA0,RA2(Vref-) y RA3(Vref+) como entradas.                                        
  84.    setup_adc(adc_clock_internal);        //Pongo en marcha módulo A/D.
  85.    delay_us(20);
  86.    setup_adc_ports(AN0_VREF_VREF);      
  87.    set_adc_channel(0);                   //El canal analogo a emplear será RA0/AN0.      
  88.    delay_us(20);                         //Tiempo de adquisición del dato.      
  89.    bin_lectura=read_adc();              
  90.    setup_adc(ADC_OFF);
  91.    delay_us(20);
  92.    voltaje=(bin_lectura*P)+2.73;
  93.    temperatura=(voltaje/0.01)-273;
  94.    printf(lcd_putc,"\fTEMPERATURA=%.3f C",temperatura);
  95.    delay_ms(100);
  96.    lcd_putc("\f");                       //Borro LCD.
  97.    }
  98. }
  99. [\code]
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Trev_11

  • PIC10
  • *
  • Mensajes: 44
Re: Hola me pueden dar una mano con este programa??
« Respuesta #4 en: 24 de Septiembre de 2007, 12:42:23 »
Bueno me parece que mi programa no ha generado mucho interes  :D de todas formas ya lo modifique y obtube un resultado aceptable aunque me preocupa la cantidad de memoria que ocupa(22%) lo dejo por a si a alguien le sirve o esta haciendo algo parecido a un control de temperatura,suerte a todos,saludos desde Argentina

Código: [Seleccionar]
//Este programa controla el funcionamiento de una fuente de frio,la temperatura de encendido se puede
//programar por teclado.

#include <16f877.h>
#device adc=10
#fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte portb=6
//#include <Rutina escaneo de teclado 4x3 en C.c>
#use fast_io(D)


int  TECLA_PULSADA;
int  umbral_encendido,digitos;
float const P=0.002219;               //P=(5-2.73)/1023
float voltaje,temperatura;            //Declaro estas variables como globales.
unsigned long int bin_lectura;        //Si bien trabajare con un dato entero de 10 bits.

char escan_teclado()
{
     int tecla=44;
     int i=0;
     int vect[5]={0x0E,0x0D,0x0B,0x07,0};
     int matriz_teclado[4][3]={1,2,3,4,5,6,7,8,9,0,0,0};

     while(i<4)
          {
          portb=vect[i];
          if(!input(PIN_B4))
                {
                 tecla=0;
                 tecla=matriz_teclado[i][tecla];
                }
          if(!input(PIN_B5))
                {
                 tecla=1;
                 tecla=matriz_teclado[i][tecla];
                }
          if(!input(PIN_B6))
                {
                 tecla=2;
                 tecla=matriz_teclado[i][tecla];
                }
          i++;     
          }     
     return(tecla);
}

#int_rb   //CCS habilita(una vez fuera)e inhabilita(para ke no se produzca de nuevo la int. mientras se la trata) la int. automaticamente.
void exploracion_teclado(void)
{
port_b_pullups(TRUE);
digitos=0;
    while(digitos<2)   
    {
    while(escan_teclado()!=0x2c)
    {
    TECLA_PULSADA=escan_teclado();
    if(digitos==0)
    {
    printf(lcd_putc,"\fAIR ON. C=%d",TECLA_PULSADA);
    umbral_encendido=TECLA_PULSADA;
    umbral_encendido*=10;
    }
    else   
    {   
    printf(lcd_putc,"%d",TECLA_PULSADA);
    delay_ms(1000);
    umbral_encendido+=TECLA_PULSADA;
    if(umbral_encendido<20 || umbral_encendido>30)
    {
    printf(lcd_putc,"\f-ERROR-");
    delay_ms(1000);
    printf(lcd_putc,"\fRANGO:20/30 C");
    delay_ms(1000);
    umbral_encendido=25;
    }
    }
    delay_ms(1000);   
    ++digitos;
    }
    }
    portb=0x00;
}

main()
{   
   set_tris_b(0xf0);
   set_tris_d(0x00);                     //Puerto D como salida.
   lcd_init();
   enable_interrupts(global);
   enable_interrupts(int_rb);
   umbral_encendido=25;                  //Es la Tº de encendido por defecto.
   while(1)
   {
   set_tris_a(0x0D);                     //Configuro RA0,RA2(Vref-) y RA3(Vref+) como entradas.
   setup_adc(adc_clock_internal);        //Pongo en marcha módulo A/D.
   delay_us(20);
   setup_adc_ports(AN0_VREF_VREF);       
   set_adc_channel(0);                   //El canal analogo a emplear será RA0/AN0.     
   delay_us(20);                         //Tiempo de adquisición del dato.     
   bin_lectura=read_adc();               
   setup_adc(ADC_OFF);
   delay_us(20);
   voltaje=(bin_lectura*P)+2.73;
   temperatura=(voltaje/0.01)-273;
   printf(lcd_putc,"\fTEMP.=%.3f C",temperatura);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"AIR ON=%d C",umbral_encendido);
   delay_ms(100);
   if(temperatura>umbral_encendido)
   output_bit(PIN_C0,1);                 //Hace calor,prende el aire.
   else
   output_bit(PIN_C0,0);                 
   }
}


Desconectado miriam1485

  • PIC10
  • *
  • Mensajes: 1
Re: Hola me pueden dar una mano con este programa??
« Respuesta #5 en: 13 de Noviembre de 2007, 12:27:36 »
HOLA:
ME INTERESA MUCHO TU PROGRAMA DEL CONTROL DE TEMPERATURA, PIENSO IMPLEMENTARLO, NO SE SI PUDIERAS DARME MAS IMFORMACIÓN DE COMO HACERLO, QUE SENSORES UTILIZAS? Y COMO ES SU FUENCIONAMIENTO.



BYE, BYE :)

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Hola me pueden dar una mano con este programa??
« Respuesta #6 en: 13 de Noviembre de 2007, 15:30:27 »
Buenas Trev_11,

un consejo que te doy es que inicialices las variables globales así como lo has hecho en las locales. Aunque tiene su lógica de no inicializar algunas variables pero a te aseguras que todo te lo hace correctamente.

Saludos.
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Hola me pueden dar una mano con este programa??
« Respuesta #7 en: 13 de Noviembre de 2007, 17:05:07 »
Creo que la rutina de interrupcion es muy larga, le dedicas demasiado tiempo.
Yo utilizaria un Byte de flags, que marco en cada una de las salidas, y saco las escrituras en display afuera, ya que llevan bastante tiempo para hacerlas dentro de una interrupcion... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Trev_11

  • PIC10
  • *
  • Mensajes: 44
Re: Hola me pueden dar una mano con este programa??
« Respuesta #8 en: 16 de Noviembre de 2007, 15:26:41 »
Hola Miriam,se trata del mas simple control; de tipo ON-OFF,manejo una fuente de frio,el led puede representar un relé,con el teclado calibro a partir de que temperatura funciona la fuente de frio,el sensor que uso es el LM335:mandas Vref- a 2.73V (Vref+ a 5V)y con eso puedes medir temperaturas a partir del 0,queria manejar una fuente de frio tanto como una de calor pero se me complicó la programación...le arregle unas cositas:ahora los caracteres no parpadean o titilan,si quieres ver la simulación,aca la dejo (mi versión de proteus es 6.7 sp3),saludos desde Argentina  :)