|
Поддержи наш сайт! |
Через WebMoney
R785211844650
Z210696637574
E368177590409
|
|  | | | |
программная реализация OW slave (1 просматривает)
|
|
TOPIC: программная реализация OW slave
|
nkrk (Пользователь)
Новичок
Постов: 1
|
| программная реализация OW slave 19.01.2012 17:14 |
Репутация: 0   |
Имеется в наличии датчик влажности sht21 также есть функционирующая 1Wire сеть с 3мя датчиками DS1820 поэтому хочу сделать 1wire slave устройство на основе atmega8 нашел код эмулирующий 1wire slave https://github.com/smurfix/owslaveно никак не могу запустить его на mega8. Хотя в Proteus работает, хотя и не без 'привета' Заливаю эту прогу в МК и он либо вообще всю сеть вешает (т.е. ни одно устройство на ней не определяется, либо никак не определяется и не мешает ) опишу глюк в протеусе: сейчас в схеме моя mega8 c тестовой прошивкой, устройство мастер на основе AT90S8515 и прошивкой из примеров эмулирующая мастера 1wire и осциллограф подключенный к сети В такой конфигурации все работает, но стоит мне выкинуть !!! осциллограф как сразу мое 1wire slave устройство более не определяется прикладываю исходники может кто поможет разобраться Содержимое поста отредактировано: nkrk, в: 19.01.2012 17:22
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: программная реализация OW slave 20.01.2012 10:16 |
Репутация: 167   |
|
посмотрел бегло код - очень он мне не понравился. чисто субъективно не понравился, не могу сказать, плохой он или хороший. сам я делал реализацию ведомого 1-wire, в протеусе работало и в реале с компьютером через СОМ-портовый адаптер связывалось/определялось. Мой код в самом простом варианте влезает и в attiny13, но в нем невозможно реализовать режим экономии энергии, т.е. МК должен постоянно молотить на максимальной рабочей частоте (не менее 8 МГц). Код не до конца испытан, потому пока и не публикую. Если гарантируете всестороннюю проверку (тестирование) моего кода и помощь в его "вылизывании" - могу предоставить, пишите через меню КОНТАКТЫ. да, я работаю ТОЛЬКО с WinAVR.
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
stiff (Пользователь)
Новичок
Постов: 7
|
| В ответ на: программная реализация OW slave 25.02.2012 07:54 |
Репутация: 0   |
сам я делал реализацию ведомого 1-wire, в протеусе работало и в реале с компьютеромНашел код на радиокоте. Собрался на авр студии и даже отдает свой адрес. Возник вопрос. А не могли бы Вы в двух словах (строчках кода) написать как обрабатывать команды мастера? | Code: | int main () {
uint8_t resp[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0xFF, 0xFE, 0xFD, 0xFB};
while (1) {
uint8_t result = wait_command();
if (result != 0) {
//send_block_P(9,resp);
//send_byte(0xac);
send_byte(0xac);
}
}
}
|
Мастер спрашивает температуру, а в ответ приходят странные вещи.
Если я отправляю только один 0xac, то приходит
0xAC 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
Но если я отправляю три раза 0xac, то приходит
0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
При этом DS18B20, висящие на этом же проводе, о своей температуре исправно рапортуют и железка свой адрес отдает.
ЧЯДНТ? Содержимое поста отредактировано: stiff, в: 25.02.2012 10:12
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: программная реализация OW slave 25.02.2012 10:35 |
Репутация: 167   |
|
вы имитируете DS1820, который на запрос температуры выдает 9 байт. вы отвечаете одним байтом - он приходит, а еще 8 байтов мастер ЗАПРАШИВАЕТ, но вы на это не реагируете, и поэтому мастер считывает единички из шины. выдавать несколько байт надо функцией выдачи блока, чтобы гарантированно избежать затрат времени. т.к. мой код еще сыроват (официально я его не публиковал именно по этой причине), в нем могут быть косяки. времени довести до ума пока нет, к сожалению...
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
stiff (Пользователь)
Новичок
Постов: 7
|
| В ответ на: программная реализация OW slave 25.02.2012 19:50 |
Репутация: 0   |
Меня просто немного удивило, что если отсылать три байта, то первые два перестают приходить. Сделал через отправку блока | Code: | send_block(9,resp);
|
все работает.
т.к. мой код еще сыроват
Ваш код — единственное из доступного в сети, что заработало с минимальным допиливанием.
Премногоблагодарствую за это.
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: программная реализация OW slave 25.02.2012 21:14 |
Репутация: 167   |
было бы хорошо узнать о допиливании, которое потребовалось. у самого меня времени на допилы нет, а тема, как я понимаю, интересна многим. поможете мне с доработками - я опубликую код. Можете вписать себя в тексте исходников с указанием, что именно вы там доделали - будет типа GNU проекта
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
stiff (Пользователь)
Новичок
Постов: 7
|
| В ответ на: программная реализация OW slave 25.02.2012 22:01 |
Репутация: 0   |
|
Я ошибся. Сейчас попробовал оригинальный файл — работает без изменений. Возможно, не хватает расчета CRC.
Если в процессе вылезет какие-нибудь траблы — отпишусь.
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: программная реализация OW slave 26.02.2012 00:02 |
Репутация: 167   |
|
не понял, в чем вы ошиблись? в том, что мой код работает? или в чем-то еще? как-то из сказанного я в потерях...
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
stiff (Пользователь)
Новичок
Постов: 7
|
| В ответ на: программная реализация OW slave 26.02.2012 01:11 |
Репутация: 0   |
|
не понял, в чем вы ошиблись? в том, что мой код работает? или в чем-то еще? как-то из сказанного я в потерях... когда я полез разбираться с кодом — в одном месте поставил отладочный вывод в uart и соответственно порушил тайминги. Потом убрал и чуть код поменял. Заработало. А потом вернул все в исходное состояние — продолжает работать.
Так что код работает. Ошибся я в том, что в код нужно было вносить изменения для его работоспособности.
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
stiff (Пользователь)
Новичок
Постов: 7
|
| В ответ на: программная реализация OW slave 26.02.2012 04:10 |
Репутация: 0   |
Ошибся два раза =) Протеус не обновил прошивку. В общем доработка состоит в изменении | Code: | if(get_byte(&cmd)) goto m1;
|
на
| Code: | if(0 == get_byte(&cmd)) goto m1;
|
Также предлагаю ввести ф-цию расчета crc
| Code: | //
// Compute a Dallas Semiconductor 8 bit CRC directly.
//
uint8_t calc_crc8(uint8_t len, uint8_t *addr)
{
uint8_t crc = 0;
while (len--) {
uint8_t inbyte = *addr++;
for (uint8_t i = 8; i; i--) {
uint8_t mix = (crc ^ inbyte) & 0x01;
crc >>= 1;
if (mix) crc ^= 0x8C;
inbyte >>= 1;
}
}
return crc;
}
|
И что-нибудь в виде
| Code: | uint8_t send_block_crc(uint8_t count, uint8_t *buf){
uint8_t crc = calc_crc8(count, buf);
for(; count; count--){
if(!send_byte(*buf++)) return 0;
}
if(!send_byte(crc)) return 0;
return 1;
}
|
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
|
|
|
| | |  |
|