Lo simulo en proteus 6 y claro el pot es un potenciometro motorizado normal que yo altero
Aqui esta el codigo:
/*Codigo de control de un potenciometro motorizado mediante un servo
y su lectura asi como la posicion en el pc por puerto serie*/
#include<16f873A.h>
#device adc=8
#use delay(clock=4000000) //Declaración de frecuencia de trabajo
#use fast_io(B)
#use fast_io(A)
#use fast_io(C)
#byte port_a = 5 //Declaración de puerto a
#byte port_b = 6 //Declaración de puerto b
#byte port_c = 7 //Declaración de puerto c
int b=1;
int c=0;
char respuesta;
#INT_RTCC
manejo_servo_1 ()
{
set_rtcc(100);
c=b;
bit_set(port_b,4);
for(b=0;b<=c;b++)
{
delay_us (130);//valor que en la practica te da la totalidad de movilidad del servo futaba 3003
}
bit_clear(port_b,4);
b=c;
}
main()
{
int resultado=0;
set_tris_c(0x00);
set_tris_a(0xFF);
set_tris_b(0x20);
port_a=0;
port_b=0;
port_c=0;
SETUP_COUNTERS(RTCC_INTERNAL,RTCC_DIV_128);
setup_adc(adc_clock_div_32);
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B5)
printf(" \n");
printf(" izquierda i derecha d\n\n\r");
set_rtcc(100);//coneste reescaler y en simulación es lo necesario
inicio:
while(1)
{
enable_interrupts (GLOBAL);
enable_interrupts (int_RTCC);
setup_adc_ports(AN0);
set_adc_channel(0);
delay_us(10);
resultado=read_adc();
inicio2:
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B5)
do {
respuesta=getch();
} while(respuesta!='i'&& respuesta!='d');
switch(respuesta)
{
case 'i':
{
printf(" direccion %C valor %X\n\r",respuesta,resultado);
b++;
if(b>=15)
{
b=15;
printf(" tope izquierdo\n\r");
goto inicio2;
}
break;
}
case 'd':
{
printf(" direccion %C\ valor %X \n\r",respuesta,resultado);
b--;
if(b<=1)
{
b=1;
printf(" tope derecho\n\r");
goto inicio2;
}
break;
}
break;
}
goto inicio;
}
}
La comunicacion con el PC imaginareis max 232
un saludo y gracias