Todavia soy un poco novato en esto de la programación de PIC y más aun si se trata de la programación en lenguaje C. El siguiente programa lo he realizado con el compilador PCW. El problema que se me presenta aparece en la simulacion de PROTEUS, en estos momentos no puedo realizar ningun programador y es por eso que preciso de vuestros consejos.
El programa es el que pienso utilizar en un seguidor de linea compuesto por 2 motores para el avance del seguidor y 1 servo para el giro de las curbas. Los sensores serian cny70 que estan simulados como pulsadores en PROTEUS, los sensores estan numerados de izquierda a derecha, es decir de 0º hasta 180º. 90º seria la posicion del sensor 4, el sensor 1 seria la posicion 0º y el sensor 7 seria la posicion 180º.
Para controlar el servo utilizaria pwm por software (ya que me estoy iniciando es mas comodo para mi). Ahora que tengo expuesto
el funcionamiento del seguidor de linea tengo las siguientes dudas:
1º) Querría saber si el programa que he realizado esta bien echo y los defectos que tiene o retoques que aplicariais.
2º) En la simulacion en PROTEUS el servo motor no se posiciona correctamente en los angulos predefinidos. ¿A que es debido?
Espero haber dicho claramente las dudas que tengo, espero que me podais ayudar, si no entendeis algo decidmelo.
Salu2.
Aqui el codigo
#include <16f84.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,
#use delay(clock = 4mhz)
#use fast_io (b)
#use fast_io (a)
void posicion1 (void);
void posicion2 (void);
void posicion3 (void);
void posicion4 (void);
void posicion5 (void);
void posicion6 (void);
void posicion7 (void);
void main (void) {
int periodo;
int bajo;
int posicion;
periodo=20000;
bajo=periodo-posicion;
set_tris_a (0b00000000);
set_tris_b (0b11111111);
posicion4();
output_high (PIN_A0);
output_high (PIN_A1);
do{
if (input (PIN_B0))
posicion1();
if (input (PIN_B1))
posicion2();
if (input (PIN_B2))
posicion3();
if (input (PIN_B3))
posicion4();
if (input (PIN_B4))
posicion5();
if (input (PIN_B5))
posicion6();
if (input (PIN_B6))
posicion7();
}while (true);
}
void posicion1 (void){
int periodo;
int bajo;
int posicion;
posicion=300;
bajo = periodo-posicion;
output_high (PIN_A3);
delay_us(posicion);
output_low (PIN_A3);
delay_us(bajo);
}
void posicion2 (void){
int periodo;
int bajo;
int posicion;
posicion=633;
bajo = periodo-posicion;
output_high (PIN_A3);
delay_us (posicion);
output_low (PIN_A3);
delay_us (bajo);
}
void posicion3 (void){
int periodo;
int bajo;
int posicion;
posicion=967;
bajo = periodo-posicion;
output_high (PIN_A3);
delay_us (posicion);
output_low (PIN_A3);
delay_us (bajo);
}
void posicion4 (void){
int periodo;
int bajo;
int posicion;
posicion=1300;
bajo = periodo-posicion;
output_high (PIN_A3);
delay_us (posicion);
output_low (PIN_A3);
delay_us (bajo);
}
void posicion5 (void){
int periodo;
int bajo;
int posicion;
posicion=1633;
bajo = periodo-posicion;
output_high (PIN_A3);
delay_us (posicion);
output_low (PIN_A3);
delay_us (bajo);
}
void posicion6 (void){
int periodo;
int bajo;
int posicion;
posicion=1967;
bajo = periodo-posicion;
output_high (PIN_A3);
delay_us (posicion);
output_low (PIN_A3);
delay_us (bajo);
}
void posicion7 (void){
int periodo;
int bajo;
int posicion;
posicion=2300;
bajo = periodo-posicion;
output_high (PIN_A3);
delay_us (posicion);
output_low (PIN_A3);
delay_us (bajo);
}
Siento que el codigo no este comentado, en cuanto pueda lo edito.
Tambien os dejo los archivos de proteus