Autor Tema: Integrador de luz con PIC16F877  (Leído 4190 veces)

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Integrador de luz con PIC16F877
« Respuesta #15 en: 27 de Noviembre de 2004, 11:58:00 »
Sí hay varios errores.

- set_tris_b(0xFF) //Entradas
- set_tris_b(0x00) //Salidas

- Los setup_counter(----), enable_int(....RTCC y enable_int(GLOBAL) definelos en el main no en el while

- Faltan declarar variables: x, y, z w

- Si te interesa ver los resultados de las sumas usa:

#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7) y abajo en el while:

printf("suma1=%lu suma2=%lu suma3=%lu",suma1,suma2,suma3);

De esta forma verías los resultados en el PC con el hiperterminal de Windows por ejemplo. Tienes para esto que establecer una comunicación con un MAX232 con el PC.

La otra vía para visualizar es la LCD.

Un saludo, pule el código y cuenta.

Desconectado krin

  • PIC10
  • *
  • Mensajes: 9
RE: Integrador de luz con PIC16F877
« Respuesta #16 en: 27 de Noviembre de 2004, 20:02:00 »
si las variabls x, y, z, w, a..... no las declare por que el programa es a modo de ejemplo...por eso no lo he compilado...Parece que la unica alternativa es ver los resultados a traves de una LCD o la otra alternativa como dice pocher...Una vez pula mas el programa lo subo... Gracias por la ayuda.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Integrador de luz con PIC16F877
« Respuesta #17 en: 28 de Noviembre de 2004, 05:21:00 »
...y otra sería que te hicieras con Proteus o algún otro software de simulacion...

Desconectado krin

  • PIC10
  • *
  • Mensajes: 9
RE: Integrador de luz con PIC16F877
« Respuesta #18 en: 30 de Noviembre de 2004, 10:06:00 »
Hola.
Acá va la rutina compilada...el problema es que no hace nada...Tengo una LCD de 1x16 conectada al puerto D, conectado de la anera que sugiere la libreria lcd.c de PICC. Alguna ayuda de por qué no hace nada?

#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#device adc=8
#use delay(clock=4000000)
#include <LCD.C>


#byte port_a=5
#byte port_b=6
#byte port_c=7
#byte port_d=8


short entrada;  //detecta una entrada en el puerto b
short salida;   // detecta salida en el puerto b
short cont;     // inicializador del contador
const float escala = 0.019607; // = 5/255




#define INTS_PER_SECOND 15         //numero de desbordes del tmr0 por segundo 4000/(256*256*4)
BYTE segundos;                     //almacena segundos transcurridos desde q empieza la cuenta
BYTE int_count;                    // contador de interrupciones


#int_rtcc                          // Esta funcion es llamada cada vez
void clock_isr() {                 // que el timer0 se desborda (255->0).
                                   // Para la frecuencia de 4MHz es aprox.
    if(--int_count==0) {           // 15 veces por segundo
      ++segundos;
      int_count=INTS_PER_SECOND;
    }

}

void borra_lcd()
   {
   lcd_putc("f"Giño;  
   }

void main() {

   int sensor1;     // fototransistor conectado a traves de un seguidor de voltaje
   long suma1 = 0;  //variable que acumula la integracion

   set_tris_b(1);                  //entrada      
   set_tris_c(0);                 //salida
   set_tris_d(0);                //salida
   setup_adc_ports(ALL_ANALOG); // A/D
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   lcd_init();
         
   

                     
   while (1)                    
        {
                entrada=input(PIN_B0);
      salida=input(PIN_B1);
                cont=input(PIN_B2);
      
      if(entrada==1||salida==1)    //si hay algo en la entrada o salida se pone una
           {                            // pata del pic en uno. Esto es para otros propositos mas que integrar
                output_bit(PIN_C0, 1);    
      }
                else
                {
                output_bit(PIN_C0,0);
                }   
 

                if(cont==1)                // si entrada del contador se habilita, se hecha a andar el contador
                {
                int_count=INTS_PER_SECOND;
                  set_rtcc(0);
                }
       
                if(segundos<=10)         // si han pasado menos de 10 seg va integrando (sumando) la entrada
                {                        // en suma 1 cada medio segundo.
                set_adc_channel(0);
                sensor1=read_adc();
                suma1 = suma1 + sensor1;
                delay_ms(500);
                }
                else
                {
                suma1=suma1*escala;           // si han pasado mas de diez segundo muestra el resultado en la lcd
      borra_lcd();
                printf(lcd_putc,"suma1=%lu ",suma1);
                }    

           }
}



Desconectado krin

  • PIC10
  • *
  • Mensajes: 9
RE: Integrador de luz con PIC16F877
« Respuesta #19 en: 09 de Diciembre de 2004, 16:18:00 »
Hola estimados...
Como este foro ha sido lo que mas me ha ayudado a aprender a programar en C, acá va un pedazo de una rutina más grande implementada, pero que da buena solución al problema de la integración de señales analógicas a la entrada del PIC. Con ejemplos es la forma mas facil de aprender a programar...Gracias por la ayuda...Ojalá esto le sirva a alguien...

#include <16F877A.H>

#fuses XT,NOWDT,NOPROTECT,NOLVP

//#device adc=8

#device adc=10

#use delay(clock=4000000)

#include <lcd.c>



#use standard_io(A)

#use standard_io(b)

#use standard_io(c)

#use standard_io(d)





#byte port_a=5

#byte port_b=6

#byte port_c=7

#byte port_d=8





short entrada; //detecta una entrada en el puerto b

short salida; // detecta salida en el puerto b

short cont; // inicializador del contador





#define INTS_PER_SECOND 15 //numero de desbordes del tmr0 por segundo 4000/(256*256*4)

int segundos; //almacena segundos transcurridos desde q empieza la cuenta

int int_count; // contador de interrupciones





#int_rtcc // Esta funcion es llamada cada vez que el timer0 se desborda (255->0).

void clock_isr()

   {

// Para la frecuencia de 4MHz es aprox. 15 veces por segundo

   if(--int_count==0) {

     ++segundos;

     int_count=INTS_PER_SECOND;

     }

   }







void main()

   {

   long sensor1=0; // fototransistor conectado a traves de un seguidor de voltaje

   long suma1=0; //variable que acumula la integracion

   long sensor2=0;

   long suma2=0;

   long sensor3=0;

   long suma3=0;

   segundos=0;



   int_count=INTS_PER_SECOND;

   entrada=0;

   salida=0;

   cont=0;





   setup_adc_ports(ALL_ANALOG); // A/D

   setup_adc(ADC_CLOCK_INTERNAL);

   setup_counters( RTCC_INTERNAL, RTCC_DIV_256);

//   set_adc_channel(0);

   set_rtcc(0);



  disable_interrupts(INT_RTCC);

//  enable_interrupts(INT_RTCC);

   enable_interrupts(GLOBAL);







   lcd_init();

   printf(lcd_putc,"Ingrese
 Billete"Giño;



   while(1)

   {

      entrada=input(PIN_D1);

      salida=input(PIN_D2);

      cont=input(PIN_D0);



       if(entrada==0||salida==0)

       {

       output_bit(pin_c0,1);  

       }

      else

       {

       output_bit(pin_c0,0);

       }



       if(cont==0) // si entrada del contador se habilita, se hecha a andar el contador

       {

       enable_interrupts(INT_RTCC);

       printf(lcd_putc,"fProcesan
do..."Giño;

       delay_ms(10);

       }



      if(segundos>0&&segundos<=15) //integra dos señales de entrada en un

      set_adc_channel(0);          //intrvalo de tiempo de 15 seg  

      sensor1=read_adc();

      suma1 = suma1 + sensor1;

      delay_ms(1);

      set_adc_channel(1);

      sensor2=read_adc();

      suma2 = suma2 + sensor2;

      delay_ms(1);

      }



     



      if(segundos>0&&segundos<=16) //se ve en la pantalla el resultado de la integración

      {                            //cada medio segundo, pero no en volts (solo habría

      printf(lcd_putc,"fA=%lu
 V=%lu ",suma1,suma2);//que agregar un factor conversor)



      delay_ms(500);

      }

   

   }

}


 

anything