roboforum.ru

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

 

Интерактивный мобильный робот Vanessa

Наше хобби — конструировать и программировать.
Демонстрация готовых роботов и устройств построенных своими руками.

Re: Интерактивный мобильный робот Vanessa

Сообщение Michael_K » 22 ноя 2010, 06:50

Scorpio писал(а):Решил на нем программку протестировать, чтобы пойти путем грубых исключений.

Да, в общем-то, понятно, что дело в железе... причем даже наверное не в самих scl/sda/подтяжках.а где-то "в консерватории"... (потому что при таких низких скоростях - пара килогерц, насколько понимаю - там что попало должно работать как часы)...

Добавлено спустя 5 минут 1 секунду:
А может что-то грубое и глупое? ...ну там цоколевку разъема не стой стороны посчитали или что-то в таком духе...
Уверен, смеяться будете, когда найдете :) (у меня так часто бывает :))
Аватара пользователя
Michael_K
 
Сообщения: 6034
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Интерактивный мобильный робот Vanessa

Сообщение loox » 22 ноя 2010, 12:37

Scorpio
Насколько я понял при рботе с i2c, вы работаете без прерыванй.
обратите внимание,в своих функциях вы устанавливаете флаг разрешения прерывания: 1<<TWIE
уберите эту строчку или 0<<TWIE и вероятно все будет ок.
loox

Добавлено спустя 47 минут 54 секунды:
в качестве примера ниже библиотека функций i2c. все функции возвращают код статуса, который помогает контролировать состояние процесса. Все примерно такое же как и в вашем варианте, вы без поймете.
//------------------------------------------------------------------------------------//
// Program : i2c bus
// Description : бибилиотека i2c bus(TWI)
// Frequency : Crystal 20 MHz
// Filename : i2c.h
// C compiler : AVR Studio
//------------------------------------------------------------------------------------//
#include <avr/io.h> // имя файла для AVR MCU
#include <util/twi.h> //библиотека для TW interface
#define ACK 1 // макрос АСК для подтверждения i2c_read функции
#define NACK 0 // макрос без подтверждения i2c_read функции

//----------------------------------------------------------------------------//
//---------------------- функция i2c старт -----------------------//
//----------------------------------------------------------------------------//
char i2c_start()
{
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // формирование состояние СТАРТ
// 1<<TWEN - разрашить работу модуля
// 1<<TWSTA - сформировать состояние СТАРТ
// 1<<TWINT - сбросить флаг TWINT

while (!(TWCR & (1 << TWINT))); // ожидание выполнения
if(TW_STATUS==TW_MT_ARB_LOST) // статус исполнения - успешен?
// код статуса должен быть 08
{
return -1;
}
else
{
return 0;
}
}
//----------------------------------------------------------------------------//
//---------------------- Function i2c stop condition -----------------------//
//----------------------------------------------------------------------------//
void i2c_stop()
{
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); // формирование состояния СТОП
}
//----------------------------------------------------------------------------//
//---------------------- Function i2c write data ----------------------------//
//----------------------------------------------------------------------------//
char i2c_write(unsigned char dat)
{
TWDR = dat; // загрузка данных для i2c bus
TWCR = (1 << TWINT) | (1 << TWEN)| (1 << TWEA); // подтверждение
//TWCR = (1 << TWINT) | (1 << TWEN); // без подтверждения
while (!(TWCR & (1 << TWINT))); // ожидание готовности
if(TW_STATUS==TW_MT_ARB_LOST) // проверка успешности
{
return -1;
}
else
{
return 0;
}
}
//----------------------------------------------------------------------------//
//---------------------- Function i2c read data -----------------------------//
//----------------------------------------------------------------------------//
unsigned char i2c_read(char ack)
{
if(ack)
{
TWCR = (1 << TWINT) | (1 << TWEN)| (1 << TWEA); // подверждение
}
else
{
TWCR = (1 << TWINT) | (1 << TWEN); // без подтверждения
}
while (!(TWCR & (1 << TWINT))); // ожидание окончания
return(TWDR); // возврат сданными
}
Это пример контроля за статусом выполнения передачи
u_dr = _i2c_write_(адрес_или_данные);
uart_putc(u_dr); // вывод на комп состояния исполнения, процедура передачи одного байта по uart


u_dr = _i2c_start();
uart_putc(u_dr); вывод текущего состояния при формировании старт

loox.
loox
 
Сообщения: 237
Зарегистрирован: 26 мар 2008, 12:45

Re: Интерактивный мобильный робот Vanessa

Сообщение Michael_K » 22 ноя 2010, 14:55

А не может быть дело в том, что компас, например, питается от 3.3 вольт, а крамб от пяти?
Аватара пользователя
Michael_K
 
Сообщения: 6034
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Интерактивный мобильный робот Vanessa

Сообщение Scorpio » 22 ноя 2010, 17:23

Не, все от 5-ти питается. Понаблюдал внимательно за картинкой, ошибки возникают уже после передачи байта адреса устройства, когда приемник отвечает NACK. Почему он в одних случаях распознает, а в других нет - непонятно, т.к. картинка передачи байта всегда одинаковая. Скорость ниже некуда, т.е. времени должно хватать. Чудеса да и только. Вечером попробую переключиться на внутренний генератор и снизить частоту синхронизации. Надо всеже найти причину - дело принципа.
Loox, спасибо за библиотеку, всяко пригодится. А, если я не разрешу прерывания, то флаг TWINT все равно будет появляться? Впрочем проверю. А что там в twi.h должно быть кроме имен функций?
Последний раз редактировалось Scorpio 24 ноя 2010, 03:02, всего редактировалось 1 раз.
Аватара пользователя
Scorpio
 
Сообщения: 1561
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Интерактивный мобильный робот Vanessa

Сообщение drugukur » 22 ноя 2010, 18:07

Классный робот.
Сейчас уже есть ряд американских компаний, успешно продающих такие системы. Они позиционируются, как системы дистанционного взаимодействия и предназначены в первую очередь для создания эффекта присутствия, а также для мобильности при удаленной работе.

Вот небольшой обзор подобных роботов: http://nanojam.ru/blog/?p=134
drugukur
 
Сообщения: 8
Зарегистрирован: 02 фев 2010, 21:07
Откуда: Санкт-Петербург
Skype: drugukur
прог. языки: C, C++
ФИО: Александр

Re: Интерактивный мобильный робот Vanessa

Сообщение Scorpio » 22 ноя 2010, 18:30

Ну у моего то фишка как раз в автономности будет, если получится. Телеуправление, как прикольная опция. По крайней мере научить его (а вернее её) приезжать по утрам в спальню, будить меня приятным женским голосом, а убедившись, что а проснулся рассказывать мне свежий анекдот и новости, мне кажется вполне осуществимо. :)
Дизайн больше всего понравился у самого дешевого, за 5000. Цены все равно не адекватные пока.
Аватара пользователя
Scorpio
 
Сообщения: 1561
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Интерактивный мобильный робот Vanessa

Сообщение drugukur » 22 ноя 2010, 18:47

Согласен с вами, робот VGO наиболее привлекателен по дизайну.
drugukur
 
Сообщения: 8
Зарегистрирован: 02 фев 2010, 21:07
Откуда: Санкт-Петербург
Skype: drugukur
прог. языки: C, C++
ФИО: Александр

Re: Интерактивный мобильный робот Vanessa

Сообщение loox » 22 ноя 2010, 22:46

Scorpio
Как правило мастер не работает с прерываниями.
Сейчас я делаю подобную конструкцию, но в силу любопытства я ее делаю "максимально" сложной - сейчас уже 3 меги.
1 мастер и 2 "славе" все работает.
По делу:
1.отключайте прерывания все будет работать
2. кроме библиотеки ничего не надо, только пропишите ее в основной программе
#include <i2c.h>
3. Примерно такие же проблемы были и у меня. При исследовании было установлено: i2c - цифровой автомат, переход из одного состояния в другое строго предопределено таблицами переходов, которые называются в книжках "коды статуса". Для определения ошибки, перед каждым обращением к i2C читал и контролировал состояния кода статуса и так нашел все ошибки. Ваша проблема - вы теряете приоритет. Если сделает мои рекомендации все поправите.
Пример: программа сформировала "старт"
err=0x30; // в этой переменной будут накапливаться количество ошибок, сейчас это "0"
// не обращайте внимание на эту переменную , не существенно
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // старт
while (!(TWCR & (1 << TWINT))) {}; // ждем исполнения
switch ((twst=TW_STATUS)) // читаем статус. могут быть только два состояния
{ // контроль за состоянием:
case TW_REP_START: // сформирован старт
case TW_START: // повторный старт
break;
default:
err++; // другие состояния - ошибки
break;
}
очень рекомендую читать и работать с кодами статуса, иначе проблемы.
в ваших программах есть переходы по шибкам, но вы их ( ошибки ) не обрабатываете.
если есть проблемы с написанием кода - не стесняйтесь. Опишите задачу я помогу Коллеге.
loox
loox
 
Сообщения: 237
Зарегистрирован: 26 мар 2008, 12:45

Re: Интерактивный мобильный робот Vanessa

Сообщение Scorpio » 23 ноя 2010, 02:45

Scorpio писал(а): А что там в twi.h должно быть кроме имен функций?

Я имел ввиду, что в хиадере должна быть расшифровка строчки
Код: Выделить всёРазвернуть
if(TW_STATUS==TW_MT_ARB_LOST) // проверка успешности

Я так понимаю, что TW_STATUS это TWSR & 0xF8, чтобы не брать во внимание биты пре-делителя частоты,
а вот TW_MT_ARB_LOST это судя по названию проигрыш арбитража мастером, и даже, если у вас эта константа имеет значение 8, в случае проверки правильности старта, до для проверки правильности записи байта она уже не подходит.
Разве не так? Непонятно... :oops:
Аватара пользователя
Scorpio
 
Сообщения: 1561
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Интерактивный мобильный робот Vanessa

Сообщение Scorpio » 23 ноя 2010, 18:53

Короче, посыпаю голову пеплом и признаю свое поражение от собственноручно запаянного контроллера. Никакие программные и аппаратные ухищрения не помогли. Вот реальная осциллограмма передачи адресcа компасу (ограничился этим этапом, т.к. уже он дает сбои).
OSC1.jpg

Видно, что посылка импульсов от контроллера компасу в обоих случаях абсолютно одинакова. Какие могут быть к контроллеру притензии? Почему компас, после приема своего адресса, как минимум в 5-ти случаях из 100 отвечает NACK вместо ACK, для меня остается загадкой. Можно предположить, что компасс как-то заточен под лего. Но во-первых, он прекрасно работает с «батерфляем» (с которого идут точно такие-же импульсы), а во-вторых такие-же сбои происходят с MD-25, который никакого отношения к лего не имеет. Я понимаю, что в электронике чудес не бывает. Но остается только смеяться гомерическим смехом. С трудом сдержался, чтобы не растоптать злаполучный «крамбик» после очередного неудачного эксперимента.
P.S.Видимо, я должен попросить модераторов вынести мои TWI- мучения в отдельную тему типа «TWI cбои на CRUMB-168». Если им конечно не в лом и они считают это нужным.
Аватара пользователя
Scorpio
 
Сообщения: 1561
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Интерактивный мобильный робот Vanessa

Сообщение =DeaD= » 23 ноя 2010, 19:01

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

Re: Интерактивный мобильный робот Vanessa

Сообщение Scorpio » 23 ноя 2010, 19:44

на короткий сажал- один хрен. и "батерфляй" с теми-же проводами фурычит нормально. Сфоткать могу, но там кроме крамба, разъемы, стабилизатор, реле с транзистором и штук 5 резюков. Толстенные дорожки. Ничего интересного. Да и импульсы вроде в порядке. Схему нарисую. Все равно надо, чтобы самому не забыть.
Аватара пользователя
Scorpio
 
Сообщения: 1561
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Интерактивный мобильный робот Vanessa

Сообщение =DeaD= » 23 ноя 2010, 20:30

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

Re: Интерактивный мобильный робот Vanessa

Сообщение loox » 24 ноя 2010, 00:07

Scorpio
я полагаю не надо отчаиваться, crumb зесь не причем я спшно работаю и с этим прибором тоже..
Цитата:
Я так понимаю, что TW_STATUS это TWSR & 0xF8, чтобы не брать во внимание биты пре-делителя частоты,
а вот TW_MT_ARB_LOST это судя по названию проигрыш арбитража мастером, и даже, если у вас эта константа имеет значение 8, в случае проверки правильности старта, до для проверки правильности записи байта она уже не подходит.

Вы не точно понимаете:
1. Коы состояния и их численные значения описаны в стандартном модуле <twi.h> и соответствуют таблицам переходов из технического описания на процессор.
2.по стандарту ведомого передатчика -"При передаче последнего байта данных необходимо сбросить бит TWEA в 0. После этого модуль перейдет в состояние с кодом статуса 0xC0 или 0xC8, в зависимости от того, какой сигнал (ACK или NACK) передаст ведущий в ответ. В состояние с кодом статуса 0xC8 модуль TWI перейдет в случае, если ведущий затребовал дополнительные данные, передав подтверждение ACK, несмотря на то что ведомый передал последний байт и ожидал сигнала NACK.
после перехода в любое из указанных состояний модуль будет игнорировать обращение к нему ведущего!!!
3. Еще раз рекомендую проверять состояния шины для поиска решения проблемы.
loox
loox
 
Сообщения: 237
Зарегистрирован: 26 мар 2008, 12:45

Re: Интерактивный мобильный робот Vanessa

Сообщение Scorpio » 24 ноя 2010, 01:32

loox писал(а): Коды состояния и их численные значения описаны в стандартном модуле <twi.h>

У меня в CVAVR вроде нет такого модуля. Под IAR видел, но там понакручено - хрен разберешься.
В моем случае МК всегда мастер и у ведомого всегда считывается только один байт (т.к. все регистры однобайтные) и мастер приемник всегда дает NACK, чтобы освободить ведомый передатчик. Состояния я смотрел - соответствуют картинке на осцике: ведомый иногда не принимает свой адрес (отвечает NACK), и дальнейший обмен уже не имеет смысла. Сделал в процедуре записи 5 попыток передать адрес с небольшой выдержкой и повторным стартом в случае неудачной попытки. Теперь не особо переживаю за потерю данных. Но все равно противно, что не разобрался в аппаратной проболеме. Старею видать.
А вообще спасибо, что не бросаете. :)
Последний раз редактировалось Scorpio 24 ноя 2010, 03:04, всего редактировалось 1 раз.
Аватара пользователя
Scorpio
 
Сообщения: 1561
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Пред.След.

Вернуться в Наши проекты

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

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

Mail.ru counter