roboforum.ru

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

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

Re: Помогите с WINAVR

aesok » 11 авг 2006, 01:06

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


 :shock:


Можно поподробнее, Вы приняли числа 1, 2, 3,... или символы '1', '2', '3',....?

Анатолий.

Re: Помогите с WINAVR

Lirzman » 11 авг 2006, 12:58

aesok писал(а):
Lirzman писал(а):[

Можно поподробнее, Вы приняли числа 1, 2, 3,... или символы '1', '2', '3',....?



При отладке, с выводом промежуточного результата (на терминал) умножения всех символов, будь-то числа или символы, преобразуются в коды  ASCII.

Например:
Код: Выделить всёРазвернуть
USART_Transmit('1');//Тип char
//Вывод:A

USART_Transmit(0x31);//Шеснадцатеричное представление
//Вывод:A

Usart_Transmit(1);//Полагаю десятичное
//Вывод:ничего

Но проблема не в этом. проблема в том что с ними нельзя совершать арифметические действия.
Хотя может это в ПРОТЕУСЕ глюки,щас попробую в VMLAB посмотреть.

Lirzman » 11 авг 2006, 13:28

Кажется я понял свою ошибку: при действии 30+3 получаю 33 :D ,
в шестнадцатеричном представлении это 0x21 что при переводе в ascii с шрифтом English в настройках терминала даёт восклицательный знак("!"), он-то и вылезает в терминале :D  :D  :D

А так как в любом шрифте символы кодируются 1 байтом(кроме китайского:D) то при попытки выйти за пределы 0-256 например 255+35=22   :shock:  :shock:  :shock: начинает крутить по кругу.

avr123.nm.ru » 11 авг 2006, 13:44

Об этом конечно рассказано в задаче 4 курса.

aesok » 11 авг 2006, 14:35

Lirzman писал(а):Дааа затупил я немного...


[code]

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;




Если a, b, c, d это числа  1, 2, 3, 4 то;
angle=1*1000+2*100+3*10+4;

Если a, b, c, d это символы '1', '2', '3', '4' то;
angle=0x31*1000+0x32*100+0x33*10+0x34;


Анатолий.

Lirzman » 11 авг 2006, 16:38

Я так понял что мне теперь придется оперировать числами только в шеснадцатеричной системе счисления.
Так как у меня кварц на 3,6864MHz то среднее положение сервы в 1,5мс
достигается за 1838 тиков процессора следовательно, причем это приблизительное значение, на самом деле при 1839-ти тиках, поворот осуществляется на -0.8гр, а уже при 1835 на +0.7гр (вот такая точность суперская :D), конечто можно списать это на погрешность эмуляции PROTEUS(если она вообще есть).

angle=(unsigned int)((0xff*7+0x35)+a);
0xff*7+0x35//1.5мс (255*7+53=1838)
a - поворот

Вопрос:
в таблице символов символы нумеруются от 0x21 до 0xff  а мне надо от 0x1 до 0xff, так как я тестирую через терминал то я связан по рукам и ногам диапазоном нумерации символов.

КАК МНЕ ЭТО ОБОЙТИ???

avr123.nm.ru » 11 авг 2006, 16:55

Lirzman писал(а):Я так понял что мне теперь придется оперировать числами только в шеснадцатеричной системе счисления.


Нет конечно. просто вычтите из полученого символа цифры некоторое число (41 по моему) и получится число обознчаемое цифрой.

Таблица символов есть в курсе и в интернете.

aesok » 11 авг 2006, 19:58

Lirzman писал(а):Если-бы я писал этот код в Visual Studio или там Borland C++ builder
я бы поставил watch на "S" и "ANGLE", но так как у меня WINAVR и
PROTEUS,отладка по watch или брякам мне только снится :twisted:


А чем вам не нравиться AVRStudio, там есть watch и воровать ничего не нужно.

Lirzman » 11 авг 2006, 21:50

aesok писал(а):А чем вам не нравиться AVRStudio, там есть watch и воровать ничего не нужно.


Я не шибко люблю на асме кодить,"С" мне больше по душе :D

AVR.123.nm.ru писал(а):
Lirzman писал(а):Я так понял что мне теперь придется оперировать числами только в шеснадцатеричной системе счисления.


Нет конечно. просто вычтите из полученого символа цифры некоторое число (41 по моему) и получится число обознчаемое цифрой.


Простите, вы по поводу перевода чисел из шестнадцатеричной в десятичную систему счисления или насчет диапазона кодов символов??? :?:

aesok » 11 авг 2006, 22:00

Lirzman писал(а):
aesok писал(а):А чем вам не нравиться AVRStudio, там есть watch и воровать ничего не нужно.


Я не шибко люблю на асме кодить,"С" мне больше по душе :D

Ассемблер здесь не причем. AVRStudio 4.12 позволяет отлаживать программу написанную на С и откомпилированную  avr-gcc (WinAVR).

Анатолий.

aesok » 11 авг 2006, 22:34

Попробуйте разобраться с функциями 'itoa' ('utoa') - для конвертирования числа в строку символов, и 'atoi' ('strtol')- для конвертирования строки в число.

Находяться в <stdlib.h>.

Это позволит Вам избежать изобретение велосепеда, ... вместе с колесом.

Анатолий.

avr123.nm.ru » 12 авг 2006, 01:54

aesok писал(а):AVRStudio 4.12 позволяет отлаживать программу написанную на С и откомпилированную  avr-gcc (WinAVR).


при весе 45 Мб.

А весящий ВСЕГО 4 Мб VMLAB позволяет делать тоже
+ многое другое в частности вот такое:
http://avr123.nm.ru/vmlab.png

тоже бесплатный да еще и работает с МК фирмы st.com

Lirzman » 12 авг 2006, 10:54

Я уже в принципе разобрался, жестко забил шаги через 5 градусов от 0 до 90 и -90.
Как оказалось точность низкая только в промежутке от -4 до +4 гр,
а так получилось весьма точно например 60гр  в протеусе показывает как 59.9 что вполне можно списать на погрешность :D
Не смотря на достаточно громоздкий код размер hex файла увеличился всего на 1kb в итоге из 8kb на обработку приёма с usart и управления сервами ушло 2.1kb, так что тепель периферии понавесить можно. :D

Lirzman » 12 авг 2006, 12:21

Всё с сервами покончено!!! :D
Теперь есть поддержка до 8-ми серв,правда они занимают весь PORTB.
Управляется все это дело так:

1.Сначала передаётся буква s(0x73), контроллер переходит в подпрограмму управления сервами(это я сделал чтобы потом расширить функциональность программы).

2.Потом передаётся номер сервы, это число от 1 до 9 (0x31..0x39)
,т.к процедура принимает только шестнадцатеричное число то
из полученного числа вычитается 0x31 и получается искомый промежутор 0x00..0x08.

3.Тут самое интересное, я не стал заморачиватся с переводом из char в int а просто сделал так
Код: Выделить всёРазвернуть
#define m5 1804
#define m10 1770
#define m15 1736
//Итак до m90 с шагом в 5 градусов
//и
#define p5 1873
#define p10 1907
#define p15 1941
//Итак до p90 с шагом в 5 градусов
//как вы наверно уже поняли 'm' означает поворот на -x градусов а
//'p' на +x градусов

В итоге 37 констант :shock:  :shock:  :shock:.

Дальше - больше:
Код: Выделить всёРазвернуть
s=USART_Receive();
s=s-0x31;

angle=USART_Receive();
if(angle=='a')
{
turn=m5;}
else
if(angle=='b')
{turn=m10;
}
else
//...
if(angle=='A')
{
turn=p5;}
else
if(angle=='B')
{turn=p10;
}
else
//...
Pos(s,turn);

Как видите всё проще пареной репы :D.
Каждому 5-му градусу соответствует буква английского алфавита,
т.к получилось 17 отрицательных положений, 17 положитнльных и нулевое то положительным соотв. буквы в верхнем регистре, а отрицательным - в нижнем.
Вот такой вот некислый код получился:D

Высказывайте своё мнение господа.

aesok » 12 авг 2006, 13:20

Lirzman писал(а):Высказывайте своё мнение господа.


#include <stdlib.h>

int main ()
{
 int i;
 char szInput [4];

szInput[0] = USART_RECEIVE();
szInput[1] = USART_RECEIVE();
szInput[2] = 0;  // Строка должна заканчиваться 0

 i = atoi (szInput);

}

И все, в i число от 0 до 99, правда  числа от 0 до 9 нужно передовать как 00, .. 09.

6 строк програмы вместо 150.

Анатолий.


Rambler\'s Top100 Mail.ru counter