Я практически разобрался там был какой-то фьюз от отвечал за пределитель таймера я его вырубил и все стало как надо (светодиод наконечто стал мигать как надо) правда серва поворачиваться пока не хочет , я просто генерирую импульсы а она не поворачиваеться посмотреть бы что там за импульсы а осцилографа нет.
Смотри так: частота повторения импульса: 50 Гц. Делаешь цикл, где его длина постепенно растет и смотришь в каком диапазоне работает серва.
Или попробуй осциллографом померить длину импульса. Осциллограф брать тут: http://user.rol.ru/%7Ezapisnyh/virt.htm - провереная прога, с любой звуковушкой работает...
Сделал, работает, всмысле мигает светодиодами отображая код ASCII который приходит с com-port СУПЕР. С осцилографом спасибо, поробую раздобыть реальный, ну а если не получиться то виртуальным воспоьзуюсь. Для передачи использую RS232Pro там можно самому набирать число в 16-ричном виде или нет. Я пытался найти но не нашел.
Поворачиваеться серва, осцилограф не понадобился она возможно и раньше бы заработала если бы я подключая серву не перепутал провод питания и сигнала сервы. Непонимаю как я это путал, пробовал раз пять, причем перед каждым подключением смотрел распайку сервы в ДШ к ней но всеравно накосячил.
KiCom А программу, поворачивающую серву, можешь кинуть? Плз, хоть с какими-нибуть комментариями, а то читал курс avr123.nm.ru - первые несколько уроков, вроде бы понял все, а коды все равно не читаются Щас видимо еще Сергею ПМ пойдет, вопросы по его коду на управление сервой...
Вот код программы: //ICC-AVR application builder : 11.12.2005 18:05:21 // Target : 2313 // Crystal: 11.059Mhz
#include <io2313v.h> #include <macros.h> #define CENTER 2880 int mks_g=CENTER; int del_0=CENTER; int del_1=CENTER; int del_2=CENTER; int del_3=CENTER; int del_4=CENTER; int del_5=CENTER;
void go_servo (char,char,char,char);
char in,i=0,sum; char n_servo,vector,alfa,summ,ver; void delaysa(unsigned int mks) { if (mks<1400) mks=1400; if (mks>4450) mks=4450; while(mks>0) { mks--; } }
#pragma interrupt_handler uart0_rx_isr:8 void uart0_rx_isr(void) { in=UDR; PORTB^=BIT(7); if (i==0) n_servo=in; if (i==1) vector=in; if (i==2) alfa=in; if (i==3) ver=in; i++; if (i==4) { PORTB^=BIT(6); go_servo(n_servo,vector,alfa,ver); } } #pragma interrupt_handler uart0_tx_isr:10 void uart0_tx_isr(void) {
}
void go_servo (char n_sevro, char vector, char alfa, char ver) { i=0; sum=alfa-n_servo-vector; if (sum==ver) { if (n_servo==0) { if (vector==1) del_0=2880-alfa*6; if (vector==2) del_0=2880+alfa*6; }
if (n_servo==1) { if (vector==1) del_1=2880-alfa*6; if (vector==2) del_1=2880+alfa*6; } if (n_servo==2) { if (vector==1) del_2=2880-alfa*6; if (vector==2) del_2=2880+alfa*6; } if (n_servo==3) { if (vector==1) del_3=2880-alfa*6; if (vector==2) del_3=2880+alfa*6; } if (n_servo==4) { if (vector==1) del_4=2880-alfa*6; if (vector==2) del_4=2880+alfa*6; } if (n_servo==5) { if (vector==1) del_5=2880-alfa*6; if (vector==2) del_5=2880+alfa*6; }
} }
//call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); timer0_init(); uart0_init();
MCUCR = 0x00; GIMSK = 0x00; TIMSK = 0x02; SEI(); //re-enable interrupts //all peripherals are now initialized }
// void main(void) { init_devices(); while(1) {
}
}
Как работать с ШИМ я не разобрался поэтому сделал в лоб. P.s. Пытался использвать кнопку Code но не получилось.