Autor Tema: PROYECTO PIC16F877A SEGUIR SOLAR 5 POSICIONES  (Leído 2555 veces)

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

Desconectado os.paz

  • PIC10
  • *
  • Mensajes: 1
PROYECTO PIC16F877A SEGUIR SOLAR 5 POSICIONES
« en: 28 de Noviembre de 2013, 22:55:52 »
Hola soy estudiante de electricidad, y estoy realizando un proyecto sobre un seguidor solar con 2 servo para mover los ejes, y paneles solares que los usare como entradas al pic para comprar los voltajes y hasi mover los servos  a la posición con mayor incidencia solar. la programacion la realice en c y en el programa picC y la pos simulacion en Proteus, a continuacion le mostrare el programa COMPLETO, si alguien me puede dar una opion o ayuda ya que en la simulacion no realiza la comparacion y los servos no se mueven.
(entradas analógicas (1 o 0) al pic A0,A1,A2,A3 , servos ( D0,D1 ) lcd en Puerto b.

\\
#include <16F877a.h>
   #device adc = 8  //utilizaremos los 8 pines analogicos del pic
   #use delay (clock = 20M)        //utilizaremos un crystal de q 4mhz
   #fuses XT, NOWDT, NOLVP, NOBROWNOUT, HS, PUT    //fusibles crystal, desabilito el perro guardian,
   #use rs232 (baud = 9600, xmit = pin_c6, rcv = pin_c7, PARITY = N, BITS = 8)
   #use standard_io (D)         //este comando nos permite hacer que un pin de un puerto pueda ser salida y entrada a la vez      //habilito el lcd para que se encienda en el puerto b
   #define use_portb_lcd TRUE
   #include <lcd.c>         //incluyo la libreria del lcd
   #byte port_a = 0x05
   #byte port_b = 0x06
   #byte port_c = 0x07
   #byte port_d = 0x08
   #byte port_e = 0x09
 
   UNSIGNED int8 v1, v2, v3, v4;       //declaro los voltajes leidos como una variable de punto flotante de 16 bits
   UNSIGNED int8 z;         //declaro el resultado de la resolucion como una variable de punto flotante de 16 bits
 
   FLOAT p1, p2, p3, p4;      //seran p1.2.3.4, las bariables leidas en el adc
   float FotoVoltaje (UNSIGNED int8 v){
   UNSIGNED int8 z;         //declaro z como una variable numerica de 16 bits
   z = 1 * v;          //formula con la que se obtiene el valor para la resolucion
   RETURN z / 50;         //obtengo la resolucion
   }
   
   
   VOID main (){
         set_tris_c(0);
         set_tris_d(0);     
         port_c=0;
         port_d=0;
         output_high(pin_c6) ;
         delay_ms (1000) ;
         output_low(pin_c6) ;
         delay_ms (1000) ;   
         lcd_init () ;
         lcd_putc ("SEGUIDOR SOLAR") ;
         delay_ms (1000) ;
                 
         disable_interrupts (GLOBAL) ;
         setup_adc_ports (ALL_ANALOG) ;
         setup_adc (ADC_CLOCK_DIV_32) ;
         setup_adc (ADC_CLOCK_INTERNAL) ;
         delay_ms(500);
     
   
      while (true){ // Se agrega un ciclo while, y el escaneo a las placasa mostrando el voltaje...!
         lcd_putc("\f");
         lcd_gotoxy(1,1);
         
         set_adc_channel (0) ;
         delay_ms(100);
         v1 = read_adc();
         v1=v1/51;
         p1 = FotoVoltaje (v1);
         PRINTF(LCD_PUTC,"Panel=1 Volt=%u\n\r",v1);
         delay_ms(1000);
         lcd_putc("\f");
         
         set_adc_channel (1) ;
         delay_ms(100);
         v2 = read_adc();     
         v2=v2/51;
         p2 = FotoVoltaje (v2);
         PRINTF(LCD_PUTC,"Panel=2 Volt=%u\n\r",v2);
         delay_ms(1000);
         lcd_putc("\f");
         
         
         set_adc_channel (2) ;
         delay_ms(100);
         v3 = read_adc();     
         v3=v3/51;
         p3 = FotoVoltaje (v3);   
         PRINTF(LCD_PUTC,"Panel=3 Volt=%u\n\r",v3);
         delay_ms(1000);
         lcd_putc("\f");
         
         
         set_adc_channel (3) ;
         delay_ms(100);
         v4 = read_adc();     
         v4=v4/51;
         p4 = FotoVoltaje (v4);
         PRINTF(LCD_PUTC,"Panel=4 Volt=%u\n\r",v4); 
         delay_ms(1000);
         lcd_putc("\f");               
         
      if(((v1=v2)&&(v3=v4))){                                     
                                                     
         PRINTF(LCD_PUTC,"PERPENDICULAR"); 
         delay_ms(1000);
         lcd_putc("\f");
         port_c=0;
         output_high(pin_d0);
         delay_us(600);
         output_low(pin_d0);
         delay_us(600);
         delay_ms(1);
         
         output_high(pin_d1);                                                 
         delay_us(600);
         output_low(pin_d1);                                                 
         delay_us(600);
         delay_ms(1);
         }
      if((v1>v2)&&(v1>v3)&&(v1>v4)){                                       //CASO 1,PRIMER MOVIMIENTO HACIA EL NORTE
                                                        //POSIBLE- "IF (v1>max){}...
         PRINTF(LCD_PUTC,"DIRECCION NORTE");
         delay_ms(1000);
         lcd_putc("\f");
         port_c=0;
         
         output_high(pin_d0);
         delay_us(600);
         output_low(pin_d0);
         delay_us(600); // 0 grados posicion Horizontal
         delay_ms(1);
         output_high(pin_d1);                           // 0 grados posicion vertical
         delay_us(600);
         output_low(pin_d1);                           // 0 grados posicion vertical
         delay_us(600);
         delay_ms(1);


         port_d=0;
         output_high(pin_d0);
         delay_us(1200);
         output_low(pin_d0);
         delay_us(1200);                                    //direccion NORTE
         delay_ms(1);       
      }
      if((v2>v1)&&(v2>v3)&&(v2>v4)){                                       //CASO 2, SEGUNDO MOVIMIENTO DIRECCION ESTE
         
         PRINTF(LCD_PUTC,"DIRECCION ESTE"); 
         delay_ms(1000);
         lcd_putc("\f");
         
         port_c=0;
         output_high(pin_d0);
         delay_us(600);   
         output_low(pin_d0);
         delay_us(600);                                                       
         delay_ms(1);
         
         output_high(pin_d1);                 
         delay_us(600);
         output_low(pin_d1);
         delay_us(600);
         delay_ms(1);
         
         output_high(pin_d1);
         delay_us(2400);     
         output_low(pin_d1);
         delay_us(2400);                            //direccion ESTE
         delay_ms(1);
         
         output_high(pin_d0);
         delay_us(1200);         
         output_low(pin_d0);
         delay_us(1200);                            //DERECHA
         delay_ms(1);//DERECHA
           }               
      if((v3>v1)&&(v3>v2)&&(v3>v4)){                                       //CASO 3, SEGUNDO MOVIMIENTO DIRECCION SUR
         PRINTF(LCD_PUTC,"DIRECCION SUR");
         delay_ms(1000);
         lcd_putc("\f");
         port_c=0;
         
         output_high(pin_d0);
         delay_us(600); 
         output_low(pin_d0);
         delay_us(600);                                               
         delay_ms(1);
         output_high(pin_d1);         
         delay_us(600);
         output_low(pin_d1);         
         delay_us(600);
         delay_ms(1);
                 
         output_high(pin_d0);
         delay_us(-1200);
         output_low(pin_d0);
         delay_us(-1200);
         delay_ms(1);  }                 
       

        if((v4>v1)&&(v4>v2)&&(v4>v3)){                              //CASO 4, SEGUNDO MOVIMIENTO DIRECCION OESTE
         
         PRINTF(LCD_PUTC,"DIRECCION OESTE"); 
         delay_ms(1000);
         lcd_putc("\f");
         port_c=0;
         
         output_high(pin_d0);
         delay_us(600);
         output_low(pin_d0);
         delay_us(600);                                           // 0 grados posicion Horizontal                                               
         delay_ms(1);
         
         output_high(pin_d1);                   
         delay_us(600); 
         output_low(pin_d1);                   
         delay_us(600);
         delay_ms(1);
         
         output_high(pin_d1);
         delay_us(1200);
         output_low(pin_d1);
         delay_us(1200);                    //direccion OESTE
         delay_ms(1);
         
         output_high(pin_d0);
         delay_us(1200);
         output_low(pin_d0);
         delay_us(1200);//DERECHA
         delay_ms(1);
         
        }
     
     
      }
      }

     
           
   
   
   \\

Desconectado FabiaHolts

  • PIC10
  • *
  • Mensajes: 1
Re: PROYECTO PIC16F877A SEGUIR SOLAR 5 POSICIONES
« Respuesta #1 en: 03 de Febrero de 2014, 06:24:59 »
Hola soy estudiante de electricidad, y estoy realizando un proyecto sobre un seguidor solar panel con 2 servo para mover los ejes, y paneles solares que los usare como entradas al pic para comprar los voltajes y hasi mover los servos  a la posición con mayor incidencia solar. la programacion la realice en c y en el programa picC y la pos simulacion en Proteus, a continuacion le mostrare el programa COMPLETO, si alguien me puede dar una opion o ayuda ya que en la simulacion no realiza la comparacion y los servos no se mueven.
(entradas analógicas (1 o 0) al pic A0,A1,A2,A3 , servos ( D0,D1 ) lcd en Puerto b.

\\
#include <16F877a.h>
   #device adc = 8  //utilizaremos los 8 pines analogicos del pic
   #use delay (clock = 20M)        //utilizaremos un crystal de q 4mhz
   #fuses XT, NOWDT, NOLVP, NOBROWNOUT, HS, PUT    //fusibles crystal, desabilito el perro guardian,
   #use rs232 (baud = 9600, xmit = pin_c6, rcv = pin_c7, PARITY = N, BITS = 8)
   #use standard_io (D)         //este comando nos permite hacer que un pin de un puerto pueda ser salida y entrada a la vez      //habilito el lcd para que se encienda en el puerto b
   #define use_portb_lcd TRUE
   #include <lcd.c>         //incluyo la libreria del lcd
   #byte port_a = 0x05
   #byte port_b = 0x06
   #byte port_c = 0x07
   #byte port_d = 0x08
   #byte port_e = 0x09
  
   UNSIGNED int8 v1, v2, v3, v4;       //declaro los voltajes leidos como una variable de punto flotante de 16 bits
   UNSIGNED int8 z;         //declaro el resultado de la resolucion como una variable de punto flotante de 16 bits
  
   FLOAT p1, p2, p3, p4;      //seran p1.2.3.4, las bariables leidas en el adc
   float FotoVoltaje (UNSIGNED int8 v){
   UNSIGNED int8 z;         //declaro z como una variable numerica de 16 bits
   z = 1 * v;          //formula con la que se obtiene el valor para la resolucion
   RETURN z / 50;         //obtengo la resolucion
   }
  
  
   VOID main (){
         set_tris_c(0);
         set_tris_d(0);      
         port_c=0;
         port_d=0;
         output_high(pin_c6) ;
         delay_ms (1000) ;
         output_low(pin_c6) ;
         delay_ms (1000) ;  
         lcd_init () ;
         lcd_putc ("SEGUIDOR SOLAR") ;
         delay_ms (1000) ;
                  
         disable_interrupts (GLOBAL) ;
         setup_adc_ports (ALL_ANALOG) ;
         setup_adc (ADC_CLOCK_DIV_32) ;
         setup_adc (ADC_CLOCK_INTERNAL) ;
         delay_ms(500);
      
    
      while (true){ // Se agrega un ciclo while, y el escaneo a las placasa mostrando el voltaje...!
         lcd_putc("\f");
         lcd_gotoxy(1,1);
        
         set_adc_channel (0) ;
         delay_ms(100);
         v1 = read_adc();
         v1=v1/51;
         p1 = FotoVoltaje (v1);
         PRINTF(LCD_PUTC,"Panel=1 Volt=%u\n\r",v1);
         delay_ms(1000);
         lcd_putc("\f");
        
         set_adc_channel (1) ;
         delay_ms(100);
         v2 = read_adc();    
         v2=v2/51;
         p2 = FotoVoltaje (v2);
         PRINTF(LCD_PUTC,"Panel=2 Volt=%u\n\r",v2);
         delay_ms(1000);
         lcd_putc("\f");
        
        
         set_adc_channel (2) ;
         delay_ms(100);
         v3 = read_adc();    
         v3=v3/51;
         p3 = FotoVoltaje (v3);  
         PRINTF(LCD_PUTC,"Panel=3 Volt=%u\n\r",v3);
         delay_ms(1000);
         lcd_putc("\f");
        
        
         set_adc_channel (3) ;
         delay_ms(100);
         v4 = read_adc();    
         v4=v4/51;
         p4 = FotoVoltaje (v4);
         PRINTF(LCD_PUTC,"Panel=4 Volt=%u\n\r",v4);  
         delay_ms(1000);
         lcd_putc("\f");                
        
      if(((v1=v2)&&(v3=v4))){                                    
                                                      
         PRINTF(LCD_PUTC,"PERPENDICULAR");  
         delay_ms(1000);
         lcd_putc("\f");
         port_c=0;
         output_high(pin_d0);
         delay_us(600);
         output_low(pin_d0);
         delay_us(600);
         delay_ms(1);
        
         output_high(pin_d1);                                                  
         delay_us(600);
         output_low(pin_d1);                                                  
         delay_us(600);
         delay_ms(1);
         }
      if((v1>v2)&&(v1>v3)&&(v1>v4)){                                       //CASO 1,PRIMER MOVIMIENTO HACIA EL NORTE
                                                        //POSIBLE- "IF (v1>max){}...
         PRINTF(LCD_PUTC,"DIRECCION NORTE");
         delay_ms(1000);
         lcd_putc("\f");
         port_c=0;
        
         output_high(pin_d0);
         delay_us(600);
         output_low(pin_d0);
         delay_us(600); // 0 grados posicion Horizontal
         delay_ms(1);
         output_high(pin_d1);                           // 0 grados posicion vertical
         delay_us(600);
         output_low(pin_d1);                           // 0 grados posicion vertical
         delay_us(600);
         delay_ms(1);


         port_d=0;
         output_high(pin_d0);
         delay_us(1200);
         output_low(pin_d0);
         delay_us(1200);                                    //direccion NORTE
         delay_ms(1);      
      }
      if((v2>v1)&&(v2>v3)&&(v2>v4)){                                       //CASO 2, SEGUNDO MOVIMIENTO DIRECCION ESTE
        
         PRINTF(LCD_PUTC,"DIRECCION ESTE");  
         delay_ms(1000);
         lcd_putc("\f");
        
         port_c=0;
         output_high(pin_d0);
         delay_us(600);  
         output_low(pin_d0);
         delay_us(600);                                                        
         delay_ms(1);
        
         output_high(pin_d1);                  
         delay_us(600);
         output_low(pin_d1);
         delay_us(600);
         delay_ms(1);
        
         output_high(pin_d1);
         delay_us(2400);    
         output_low(pin_d1);
         delay_us(2400);                            //direccion ESTE
         delay_ms(1);
        
         output_high(pin_d0);
         delay_us(1200);        
         output_low(pin_d0);
         delay_us(1200);                            //DERECHA
         delay_ms(1);//DERECHA
           }              
      if((v3>v1)&&(v3>v2)&&(v3>v4)){                                       //CASO 3, SEGUNDO MOVIMIENTO DIRECCION SUR
         PRINTF(LCD_PUTC,"DIRECCION SUR");
         delay_ms(1000);
         lcd_putc("\f");
         port_c=0;
        
         output_high(pin_d0);
         delay_us(600);  
         output_low(pin_d0);
         delay_us(600);                                              
         delay_ms(1);
         output_high(pin_d1);          
         delay_us(600);
         output_low(pin_d1);          
         delay_us(600);
         delay_ms(1);
                  
         output_high(pin_d0);
         delay_us(-1200);
         output_low(pin_d0);
         delay_us(-1200);
         delay_ms(1);  }                
        

        if((v4>v1)&&(v4>v2)&&(v4>v3)){                              //CASO 4, SEGUNDO MOVIMIENTO DIRECCION OESTE
        
         PRINTF(LCD_PUTC,"DIRECCION OESTE");  
         delay_ms(1000);
         lcd_putc("\f");
         port_c=0;
        
         output_high(pin_d0);
         delay_us(600);
         output_low(pin_d0);
         delay_us(600);                                           // 0 grados posicion Horizontal                                                
         delay_ms(1);
        
         output_high(pin_d1);                    
         delay_us(600);  
         output_low(pin_d1);                    
         delay_us(600);
         delay_ms(1);
        
         output_high(pin_d1);
         delay_us(1200);
         output_low(pin_d1);
         delay_us(1200);                    //direccion OESTE
         delay_ms(1);
        
         output_high(pin_d0);
         delay_us(1200);
         output_low(pin_d0);
         delay_us(1200);//DERECHA
         delay_ms(1);
        
        }
      
      
      }
      }

      
          
  
  
   \\

Thanks for sharing entire code. I have been searching for it a while and finally got it..
« Última modificación: 04 de Febrero de 2014, 07:56:54 por FabiaHolts »