Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: еще раз про скорость at90can128
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Controller Area Network (CAN)
Vlad1977
народ нихрена понять не могу,стоит внешний кварц на 8мГц, настариваю сокрость как написано в даташите, на 250 кбот,

CANBT1= 0x02;
CANBT2 = 0x0C;
CANBT3=0x37;
В итоге посылка проходит, получаю ОК на отправку, ОК на приеме, только данных нету, везде 0 ли прописаны!

Ставлю скорость вот такую, где то нашел в сети:
CANBT1= 0x26; //
CANBT2 = 0x24; //
CANBT3=0x13

Все работает и данные идут, но от куда взялись эти парамтры понять не могу, почему из даташина не работают?
регистр CANTCON = 0x00; может кто поможет, разораться. sad.gif спаисбо!
Vlad1977
блин сейчас вообще ни с какой скоростью данные не доходят sad.gif. гуру ну подскажи плииз где копать? Попадаю на прерывание от моба, те и адрес и маске поравильно заданы, передатчик говорит TXOK, те удачное завершение передачи. А на приемнике в реситре CANCDMOB == 0х80. те младшие биты DLC равны 0. Хотя на передаче я выставляю из хначение 8. Может такое из за сокрости быть ? или ошибка в когде где то sad.gif
Vlad1977
Ну вот разве это похоже на посылку из 8 ми байт? и 11 битный ID
желтый луч в линии а синий на ноге TX
Vlad1977
Очень походе что переджается только адрес, тк его меняю и меняется осуилограмма, а елси меняю данные в посылке ничего не меняется. Отключаю второй узел, который ОК выдает, на желтом лучше пропадает последний импульс.

пипец, взял другую железяку и все пошло sad.gif, 3 дня потратил в пустую....
Vlad1977
А кто сталкивался, если отправлять данные не через прерывание, а ждать ну типа :
while (CANGSTA & (1<<TXBSY));
Это может на долго повесить программу, или же быстро закинется посылка в буффер для отправки, и не важно что там с сетью скоростью и тд? Просто я менял скорость и смотрел по осциллографу сколько держится это флаг, что на быстрой что на медленной передаче примерно 1-2мс, в принципе это терпимо, но вот если эта пауза будет больше, то уже не хорошо.
редактор
Цитата
Это может на долго повесить программу

Зависит от многих факторов.
Самый плохой вариант развития событий: вы заполнили все буфера на передачу, но физически передача не осуществляется (канал постоянно занят другими высокоприоритетными сообщениями). В этом случае можно висеть намного дольше.
При работе по флагам лучше использовать if () вместо while().
Vlad1977
С if тоже хреново, нету же гарантии что передатчик сейчас свободен. А с while вообще не вариант, сейчас посомтрел прибором, елси обрыв в линии то вешается вся программа, достаточно 2-а раза отправить послку. Она просто второй раз не отправится, и будеи висеть в while и ждать.... По хорошему только прервания делать, или таймер еще вводить, типа while (CANGSTA & (1<<TXBSY) | timeOut );
редактор
Цитата
С if тоже хреново, нету же гарантии что передатчик сейчас свободен.

Ну и что, что в данный момент передатчик занят, при следующем опросе освободиться и можно пользовать.
Вопрос в частоте опроса флага (у меня обычно в фоновой задаче) и точности по времени отправки сообщений(обычно задержки в 1-2 мс не критичны). При этом время доставки все равно не гарантируется.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.