Функцию сброса нужно изменить так Код (Text): //сброс трансиввера void CTr24a::reset() { PORTC&= ~(1<<PIN_RESET); _delay_ms(20); PORTC|= (1<<PIN_RESET); _delay_ms(20); }//end reset //====================================================================== Иначе на низких скоростях инициализировать трансивер не получится. Функцию отправки байта по SPI Код (Text): //передать/принять байт unsigned char CSpi::send(unsigned char data) { unsigned char counter=0; SPDR = data; while (!(SPSR & (1<<SPIF))) { if(counter==20) { break; } counter++; } return SPDR; }//end send //====================================================================== где counter зависит от скорости. Чем ниже скорость тем больше counter. Так прошивка не повесится на этом вайле.
Далеко не все трансиверы умеют определять наличие коллизии. Модуль TR24A(и все его родичи) этого делать не умеют. Поэтому для таких трансивверов писать протокол на порядок сложнее.
ээм, извините, если я не по теме под какие платформы это работает? например, под авр идет? по какому гуглкодо-адресу можно поглядеть исходники с викой проекта? (трансиверы действительно дешевые, затея эта выглядит интересной и полезной) еще раз извините
В исходниках есть упоминание, что писалось для atmega8. Если есть опыт, то можно перевести под тини. Должно работать на всех мегах. В сети по этому модулю почти ничего внятного нет. Производитель надежно засекретил свою разработку))
Спасибо огромное a9d ты просто гуру, более подробного описания по TR24 я еще не находил в инете , вожусь с TR24 уже несколько месяцев , использовал примеры кода отсюда http://code.google.com/p/spiriton-tr24a-demo/ и отсюда http://bsvi.ru/drajver-modulya-tr24a-ili-transivera-em198810/ пока безрезультатно, почему то не могу считать регистры TR24 после инитциализации, думаю с помощью твоих классов я смогу разобраться. Я кстати тоже использую Atmega8 - 8 MHz, и в будущем планирую попробывать на ATxmega128A1. Моя цель заключается в том чтобы снимать данные со 100 фотодиодов и посылать их непрерывным потоком на комп в пределах обычной квартиры. Было бы здорово если бы ты показал пример реальной программы, какой нибудь, tr24a.c , для такого чайника как я. Хотя я и знаю как использовать классы, хотелось бы увидеть в какой последовательности они используются и как оно все смотриться в реальном приложении.
Спасибо. На данный момент я сейчас луплюсь с портом под арм. С этим портом просто ЧП. Софт варные задержки в армах работают через задницу в виду специфики ядра. Аппаратные пашут на ура, но как по нормальному вставить аппаратную задерку в код не знаю. Простенькая программа для теста: Код (Text): MyTr.ModeRecive(); for(;;) { if(MyTr.GetState()!=2) { len=MyTr.PkgRead(data); MyTr.ModeRecive(); for(int i=0;i<len;i++) { MyUart.sendByte(data[i]); } } Sleep(1); } и передатчик: Код (Text): index=0; while(1) { for(i=0;i<61;i++) { out[i]=index; } index++; MyTr.PkgSend(63,out); Sleep(500); } Эти трансивверы еще нужно грызть и грызть.
Спасибо за ответ a9d, у меня возник еще один вопрос когда я начал компилировать програму, до этого я использовал стандартные настройки для мейк файла в АВР Студио и их мне всегда хватало для моих простых програм, но я никогда не компилировал С++ классы в АВР Студио, из-за этого компилятор выдает кучу ошибок. Хотелось бы узнать опыт других по этому поводу, например параметры для мейк файла. (Я использую последнюю версию WinAVR 20100110 и AVR Studio 4.18 build 692)
Я для сборки использую Eclipse с плагином для авр-ок. В нем вообще о майкфайле задумываться не нужно. Да и редактор кода намного удобней чем в AVR Studio.
Только, что заметил особенность. Из режима TX нельзя сразу переходить в режим RX и наоборот. Т.е переходить можно только так: TX->Idle->RX RX->Idle->TX