Ето и един код (отново на CCS) за управляването на серво чрез adc модула на микроконтролера
#device adc=8 // ako adc=10, то долу трябва да е разделено на 1024
#define min_pulse 500
#define max_pulse 2400
void main(){
int i;
/*
code
*/
set_adc_channel(0); // PIN_A0
for (;;)
for (i=0;i<50;i++){
k=read_adc();
pulse_width=min_pulse + (max_pulse-min_pulse)/256*k;
output_bit(PIN_A1,1); //Servo pin High - Pulse Start
delay_us(pulse_width);
output_bit(PIN_A1,0); //Servo pin Low - Pulse End
delay_us(20000-pulse_width);
}
}
Но имам въпрос- Когато искам да изпратя от друг микроконтролер на къде да се върти, се получава така, че сервото всъщност не реагира на промяната на тримера и "държи" в първоначалната позиция.
Кодът на получаващият микроконтролер :
unsigned char k;
for(;;){
for(i=0;i<50;i++){
k=getc();
pulse_width=min_pulse + (max_pulse-min_pulse)/256*((int)k);
output_bit(PIN_A1,1);
delay_us(pulse_width);
output_bit(PIN_A1,0);
delay_us(20000-pulse_width);
}
}
Кодът на изпращащият микроконтролер :
set_adc_channel(0);
for(;;){
data=read_adc();
putc(data);
delay_ms(20); //да изчака др. микроконтролер да бъде готов
}
RS-232 работи до колкото знам добре (тествах го да изпраща 'A' или 'B' и другият обработваше информацията така, като трябва).