Разработка Open Robotics: Контроллер общ. назн., SMD-вариант

Правила форума
Правила раздела OpenRobotics

Re: Разработка Open Robotics: Контроллер общ. назн., SMD-вариант

Сообщение blindman » 31 мар 2009, 10:34

Тайминги похоже неправильно расчитаны.

Я бы по-другому сделал. Сделать таблицу, в которую записаны состояния выходов серв, и время след. переключения. Прерывание по таймеру получится намного короче. Управление моторами сделать по прерыванию от таймера 2, а чтение АЦП - по прерыванию от самого АЦП.
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Разработка Open Robotics: Контроллер общ. назн., SMD-вариант

Сообщение =DeaD= » 31 мар 2009, 11:21

Можно и по другому :)

Про таблицу - давай подробнее - если обнаруживаем, что не успеваем выйти из прерывания - начинаем в нём зависать, а по UART'у теряем данные?

Добавлено спустя 1 минуту 53 секунды:
Я вообще пока делаю "что бы хоть как-то работало и можно было использовать", приводить в идеальное состояние прошивку вроде можно и позже?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Разработка Open Robotics: Контроллер общ. назн., SMD-вариант

Сообщение blindman » 31 мар 2009, 11:36

У тебя шлюз изначально на 16МГц работал, и в принципе все успевало. Сейчас тактовая более чем в 2 раза ниже. уарт вряд ли потеряем, даже на 115200 получается 640 тактов на байт. А вот само прерывание по таймеру подгружает процессор неслабо, и надо бы его подсократить. Щас накидаю примерный код.
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Разработка Open Robotics: Контроллер общ. назн., SMD-вариант

Сообщение =DeaD= » 31 мар 2009, 12:56

2blindman: Погоди, а зачем? Это же самостоятельная прошивка, в неё ничего кроме этой прошивки не происходит? Какая цель? Увеличить количество шагов по серве?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Разработка Open Robotics: Контроллер общ. назн., SMD-вариант

Сообщение blindman » 31 мар 2009, 13:47

А ты свой код дизассемблируй и поймешь. В прерывании от таймера в стэке сохраняются 28(!) регистров. Сохранение-восстановление одного регистра - 8 тактов, плюс столько же на вход и выход из прерывания. То есть если процессор только тем и будет заниматься, что обрабатывать это прерывание, получим 30 шагов - явно маловато, да и процессору кроме этого еще есть чем заняться. Да и вообще делать по принципу "работает - и ладно" - неправильно, ИМХО.

Добавлено спустя 36 минут 59 секунд:
Код: Выделить всё
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

uint8_t* port;
uint8_t* servoPtr;
uint8_t servoValues[9*2];

ISR(TIMER0_COMP_vect)
{
    uint8_t time = *servoPtr;
    servoPtr++;
    *port = *servoPtr;
    servoPtr++;
    if (time) {
        OCR0 += time;
    } else {
        TCCR0 = 0;
    }
}


port - адрес порта, к которому подключены сервы, для обращения как к ячейке памяти.
servoPtr - указатель на текущее значение в таблице servoValues
servoValues - таблица, содержащая значения выводимые в порт, и время, в течение которого это время сохраняется. Каждые 4-5 мс устанавливаем новое значение port, ставим servoPtr на начало таблицы, заполняем таблицу значениями, выводим все 1 в порт и запускаем таймер на срабатывание прерывания через 1000 мкс (мин. длина импульса). Например если у нас 3 сервы подключенные к порту B[1,7,2], и длительность импульсов 1000, 1100, 1300 то таблица будет выглядеть так:
{100, 11111101b, 200, 01111101b, 0, 01111001b}, только длительность естественно надо пересчитать из микросекунд в периоды тактовой частоты таймера, port будет 0x38.

Если все это на ассемблере написать, 100 шагов можно будет получить, причем на любой ноге МК. Ну и все прочие обработчики прерываний пересмотреть, чтобы прерывания были запрещены минимальное время.
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Разработка Open Robotics: Контроллер общ. назн., SMD-вариант

Сообщение Duhas » 31 мар 2009, 16:26

а я всегда говорю - асм рулит )
на сях оно конечно быстрей получится... и проще... но тяжелее...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Разработка Open Robotics: Контроллер общ. назн., SMD-вариант

Сообщение blindman » 31 мар 2009, 16:29

Получается впихнуть все прерывание в 60 тактов процессора, с учетом времени на вход в прерывание и выход из него. Значит можно будет сделать разрешение в 64 такта, или 8.68 мкс. На интервале в 1000 мкс это будет 115 шагов. В наихудшем случае, когда все 8 выводов порта используются для серв, и длительности импульсов отличаются на 1 шаг, получаем что в этом прерывании залипаем на 8*64= 512 тактов раз в 5мс, времени для обработки уарта и прочих прерываний более чем достаточно.
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Разработка Open Robotics: Контроллер общ. назн., SMD-вариант

Сообщение =DeaD= » 31 мар 2009, 16:41

Ок, не спорю - можно сделать вообще красиво :) но лучше сначала "как-то", а потом "красиво" :)
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Пред.

Вернуться в Разработка модулей

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2