Hola,
Bueno, disculpad el retraso por no haber podido contestar hasta ahora.
Gracias por tus comentarios matocomasi. Lo he estado mirando y esto es lo qe he visto,
debes de asegurarte que tus entradas analogicas no fluctuan
En mi caso creo que las entradas analógicas no fluctuan (o en todo caso es despreciable) ya que conectando todos los potenciómetros como tu dices, en todas las entradas, si conecto un solo servo funciona perfecto. Poniendolo emparejado con qualquier potenciómetro siempre va bien.
En el momento en que conecto un segundo (o mas) servo es cuando empiezan a vibrar. No ocurre lo mismo si en vez de un segundo servo conecto un led. En este caso (1 servo + 1 led) no aparece ninguna vibración.
IF(valor>valor minimo AND valor< valor maximo)(no actualizo la posicion en el servo)
No he acabado de entedner el filtro que propones ya que si el valor del potenciómetro se encuentra dentro del intervalo, bien, pero si se encuentra en uno de sus límites, no deberia tener el mismo efecto de vibración pasando de un escalón a otro?
Despúes de estar haciendo varias pruebas, al final, he probado la interrupción #int_ad. El resultado és el mismo, para un servo va perfectamente pero para mas de uno vibra (es como si se mezclaran las señales).
Otra cosa que veo es que no he podido usar la directiva #device adc=xx, a lo mejor es que este pic solo tiene conversion de 10 bits?
Adjunto la última version del código completo,
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
int8 i=0;
int1 flagB;
int1 flagC;
int1 flagD;
int8 contB=0x00;
int8 contC=0x00;
int8 contD=0x00;
int16 inclinacio = 126;
int1 adc_active=FALSE;
int16 tSERVO[30]={4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200,4200};
#int_RTCC //Port B
void RTCC_isr()
{
if(flagB==0)
{
output_high(31752+contB);
set_TIMER0(65535 - tSERVO[23+contB]);
}
if(flagB==1)
{
output_low(31752+contB);
set_TIMER0(65535 - 7500 + tSERVO[23+contB]);
if(++contB>7) contB=0;
}
++flagB;
}
#int_ad
void adc_handler()
{
inclinacio = read_adc(ADC_READ_ONLY);
tSERVO[30-i]=inclinacio*16+2100;
i<2?(i++):(i=0);
adc_active=FALSE;
}
void main() {
delay_ms(300);
setup_adc_ports(AN0_TO_AN2 | VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_wdt(WDT_OFF);
setup_counters(RTCC_INTERNAL,RTCC_DIV_4);
enable_interrupts(INT_AD);
enable_interrupts(INT_RTCC);
enable_interrupts(global);
set_TIMER0(58035);
set_tris_a(0b00000111);
set_tris_b(0b00000000);
set_tris_c(0b00000000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
output_b(0x00);
output_c(0x00);
output_d(0x00);
output_e(0x00);
i=0;
do
{
if(adc_active==false)
{
set_adc_channel(i);
delay_ms(30);
adc_active=true;
read_adc(ADC_START_ONLY);
}
} while (TRUE);
}
_Maxi,
Esto es justamente lo que pretendo, pasar la lectura de una serie de entradas analógicas a los servos de salida, y si te fijas en el código que puse en mi primer post, estamos haciendo prácticamente lo mismo. Por lo tanto, yo creo que así deberia funcionar pero hay algo se me escapa o no estoy haciendo bien
Bueno, si a alguien se le ocurre algo será muy bienvenido, por mi parte seguiré probando lo que pueda.
Gracias
Kanick