Grabar movimientos servo usando pic con CCS C

-1

Aquí, lo que estoy tratando de hacer es controlar el servomotor con un pottentiómetro y grabar su movimiento con un convertidor analógico a digital y luego jugar. Comencé con solo mover el servo. Para ver en qué ángulo se encuentra el servo, imprimo el cálculo del ángulo en la pantalla lcd. Hago esto con este código y funciona bien:

void servo(unsigned long int b,c)
{
output_high(pin_d0);
delay_us(550+b);  
output_low(pin_d0);
delay_us(19450-b);  
printf(lcd_putc,"\fVal = %u DEGREE",c);
}
int n=0;
int a=0;
while(1)
      {

                    i=read_adc();
                    degree=i*2/11.1;
                    i=i*2;
                    servo(i,degree);
      }

pero el problema comienza cuando intento grabar y reproducir el movimiento. Aquí es lo que hice cuando el primer botón presionó los movimientos de grabación y cuando el segundo botón presionó reproducir la grabación.

            while(1)
      {
                while(input(pin_a1)){ //while button 1 pressed record
                    i=read_adc();
                    degree=i*2/11.1;
                    i=i*2;
                    servo(i,degree);
                    write_eeprom(n,i);
                    n++;
          delay_ms(1000);
          if(input(pin_a2)) //if button 2 pressed go to play
          delay_ms(50);
          break;
                }
          while(input(pin_a2)){ //play eeprom


          i=read_eeprom(a);
          degree=i*2/11.1;
          servo(i,degree);
          delay_ms(1000);
          a++;
          if(a==10)
          a=0;
          }



  }

Primero presiono y mantengo el primer botón para registrar valores y registro 10 valores con un retraso de 1000 ms y la pantalla LCD muestra los ángulos rectos. pero después de presionar y mantener presionado el segundo botón, el servo no se mueve, solo lcd está activo. y LCD muestra ángulos equivocados. Por ejemplo grabo 160, 50, 45, ... juega 20,7,10 ... No pude encontrar ningún error. Si alguien puede ayudar seré apreciado. Gracias por leer.

Aquí está mi código real

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

  #FUSES XT
  #FUSES NOWDT                  
  #FUSES NOPUT                  
  #FUSES NOPROTECT              
  #FUSES NODEBUG                
  #FUSES NOBROWNOUT             
  #FUSES NOLVP                  
 #FUSES NOCPD                 
  #FUSES NOWRT                  



  #define use_portb_lcd TRUE
  #use delay (clock=4000000)
  #include <lcd.c>


  unsigned long int i=0,degree=0;

  int n=0;
  int a=0;



  void servo(unsigned long int b,c)
  {
  output_high(pin_d0);
  delay_us(550+b);  
  output_low(pin_d0);
  delay_us(19450-b);  
  printf(lcd_putc,"\fVal = %u DEGREE",c);



  }

   void main()
  { 

  set_tris_a(0x01);
  set_tris_d(0x00);
  output_d(0x00);
  output_b(0x00);
  setup_adc(adc_clock_div_32);
  setup_adc_ports(AN0);
  set_adc_channel(0);
  lcd_init();

      while(1)
      {
                while(input(pin_a1)){
                    i=read_adc();
                    degree=i*2/11.1;
                    i=i*2;
                    servo(i,degree);
                    write_eeprom(n,i);
                    n++;
          delay_ms(1000);
          if(input(pin_a2))
          delay_ms(50);
          break;
                }
          while(input(pin_a2)){


          i=read_eeprom(a);
          degree=i*2/11.1;
          servo(i,degree);
          delay_ms(1000);
          a++;
          if(a==10)
          a=0;
          }



  }
  }

RESOLUCIÓN DE PROBLEMAS He estado intentando escribir en valores de eeprom más de 8 bits (256) que es "i".

    

2 respuestas

0

Dado que nunca inicializa n (cuando escribe) o a (cuando lee), realmente no hay forma de saber en qué parte de la EEPROM está trabajando, o si está escribiendo y leyendo lo mismo. conjunto de direcciones.

Intente mostrar la dirección de escritura / lectura en la pantalla LCD junto con los datos.

    
respondido por el Dave Tweed
0

Parece que estás pasando un flotador de servo, y quiere un largo int. Si este no es el caso, publique el código real.

    
respondido por el Scott Seidman

Lea otras preguntas en las etiquetas