roboforum.ru

Технический форум по робототехнике.

Управление Сервами в WinAvr

Управление Сервами в WinAvr

Lirzman » 09 авг 2006, 22:03

Добрый день, у меня возникла маленькая проблемка с WINAVR:

Есть такой код приёма  с USART
Код: Выделить всёРазвернуть
Char a = USART_RECEIVE();
Char b = USART_RECEIVE();
Char с = USART_RECEIVE();
Char d = USART_RECEIVE();
//Допустим принял: a= 1, b= 2 , c= 3, d= 4

//А МНЕ НАДО ЧИСЛО 1234


Проблема в том что функция USART_RECEIVE() за раз может принять
только число от 0 до 9.

Если что простите за ламерский вопрос, но для меня это далеко не самая тривиальная задача.  :shock:
Последний раз редактировалось Lirzman 17 авг 2006, 19:40, всего редактировалось 1 раз.

avr123.nm.ru » 09 авг 2006, 22:36

ну вы отвлекитесь от программирования,

просто на бумажке решите эту задачу для 3 класса,

а потом полученый алгоритм запрограммируете ...

Lirzman » 09 авг 2006, 23:44

avr123.nm.ru писал(а):ну вы отвлекитесь от программирования,

просто на бумажке решите эту задачу для 3 класса,

а потом полученый алгоритм запрограммируете ...

ЭЭЭЭЭЭЭ,:?: а поподробнее можно?
Я спрашиваю про конкретную функцию на C, а на бумажке каждый сможет решить.

avr123.nm.ru » 10 авг 2006, 00:52

ну дак решение с бумажки запишите на Си с помощью avr123.nm.ru/05.htm например или любого учебника по Си.

-= Александр =- » 10 авг 2006, 02:08

АВР, не мучай человека...

x=a*1000+b*100+c*10+d

У всех, как говорится, бывает...  :wink:

avr123.nm.ru » 10 авг 2006, 05:17

дак он же написал что на бумажке решил.

Lirzman » 10 авг 2006, 11:39

Дааа затупил я немного...
(2 AVR)Не все могут похвастаться ясностью ума в 4 часа утра :D
(2 Александр)Спасибо, и вопрос в догонку:

Код: Выделить всёРазвернуть
#define SET_B(x) |= (1<<x) //Спасибо AVR123 :)
#define CLR_B(x)  &=~(1<<x) //Спасибо AVR123 :)
const int period = 30800; //period = 20 ms
int N=1838;//neutral servo = 1.5 ms


void Pos(int servo,int angle)
{
N=angle;
PORTB SET_B(servo);

delaysa(N);
PORTB CLR_B(servo);

delaysa(period);
}

int main()
{
int s,angle,a,b,c,d;
USART_Init(23);
init_devices();

while(1){

s=USART_Receive();


a=USART_Receive();


b=USART_Receive();


c=USART_Receive();


d=USART_Receive();

//delaysa(500);
angle=a*1000+b*100+c*10+d;
Pos(2,2100);
Pos(1,100);
Pos(s,angle);

}
return(0);
}

Pos - подпрограмма управлением сервами (если кто не догадался :D)
Вопрос такой : почему Pos(1,1000) - работает
а Pos(s,angle) не пашет.
Если-бы я писал этот код в Visual Studio или там Borland C++ builder
я бы поставил watch на "S" и "ANGLE", но так как у меня WINAVR и
PROTEUS,отладка по watch или брякам мне только снится :twisted:

P.S: — Папа, папа, а правда говорят, что от ICQ, чатов и ЖЖ люди тупеют? — Гыы, сына, LOL :)

avr123.nm.ru » 10 авг 2006, 12:44

Lirzman писал(а):(2 AVR)Не все могут похвастаться ясностью ума в 4 часа утра :D


потому в сказках и пишут: "утро вечера мудренЕе"

avr123.nm.ru » 10 авг 2006, 12:58

Lirzman писал(а):так как у меня WINAVR и
PROTEUS,отладка по watch или брякам мне только снится :twisted:


есть же маленький но могучий VMLAB и

avr123.nm.ru/z2.htm
avr123.nm.ru/z3.htm
avr123.nm.ru/z9.htm

и еще "супер-пупер" способ отладки
avr123.nm.ru/z4.htm

Lirzman » 10 авг 2006, 13:37

Спасибо, корень проблемы я нашел но легче мне от этого не стало. :D
Код: Выделить всёРазвернуть
int s,angle,a,b,c,d;

s=USART_Receive();

a=USART_Receive();

b=USART_Receive();

c=USART_Receive();

d=USART_Receive();

angle=a*1000+b*100+c*10+d;
USART_Transmit(angle);//Супер-пупер отладка :)
Pos(s,angle);


Все переменные типа int, но при действии:
angle=a*1000+b*100+c*10+d;
получается char в итоге на виртуальный терминал в протеусе выводится всякая абра-кадабра. :shock:

Функция USART_Transmit() взята из ДШ.

avr123.nm.ru » 10 авг 2006, 15:42

Lirzman писал(а):Все переменные типа int, но при действии:
angle=a*1000+b*100+c*10+d;
получается char в итоге на виртуальный терминал в протеусе выводится всякая абра-кадабра. :shock:

Функция USART_Transmit() взята из ДШ.


рецепт и адрес прежние - страница 5 курса - называется она "Си для МК" и имеет вторую часть, о чем я уже говорил.

Заходим:

http://avr123.nm.ru/05a.htm

Читаем:

"в Си в переменную можно помещать только тот тип данных который она может хранить !

Так как PORTB это байт, а ADCW - это два байта, то прежде чем выполнить .... "

=======

Чтоб по каждой затыке не ждать ответа в форуме
рекомендую прочитать  http://avr123.nm.ru/05.htm
и весь курс тоже.

Как принято - С НАЧАЛА.

-= Александр =- » 10 авг 2006, 16:50

unsigned int angle;

char s,a,b,c,d;

Lirzman » 10 авг 2006, 17:30

Чувствую я буду до второго пришествия карячится с этой фигнёй.:(
Карячиться мне не особо хочется, следовательно вопрос:
Есть ли у кого-нибудь исходник на С, для управления сервами  по rs232 с компа.
Понимаю что изобретаю велосипед, но делаю это исключительно для самообразования :D.

Исходники на ASM НЕ ПРЕДЛАГАТЬ, потому что хочу полностью разобратся в алгоритме управления сервами(задержки,USART ),
Смотрел  кучу аналогов на Ассемблере но там сам черт ногу сломит :x.

Что касается настоящего алгоритма то за основу я брал изначально кривой код :?.

avr123.nm.ru » 10 авг 2006, 19:17

да. их море. в том числе и на этом форуме куча сылок.

доходило аж до 32 серв на АТмеге32.

шукай.

Lirzman » 11 авг 2006, 00:20

Не, 32 - это слишком:shock:, мне и 4 хватит.
Я хочу манипулятор сделать, 3-4 степени свободы + двухпалый захват
плюс OPENCV для отработки алгоритмов.  
Т.к  я всё это дело думаю на mega8 замутить, то еще датчиков понавесить разных чтоб портов свободных не осталось:D .

Но это все потом  :roll:, для начала надо с сервами разобраться.


cron
Rambler\'s Top100 Mail.ru counter