|
|
  |
Подключение нескольких ds1621 |
|
|
|
Feb 15 2007, 12:29
|

Участник

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847

|
Столкнулся с проблемой подключения двух ds1621 по и2с. Одна работает. Вторую подключаю - виснет. Наверно неправильно подключаю. Подскажите как сделать. Сейчас подключено так: SDA & SCL 10к к питанию. При подключении к SDA (либо SCL) еще одного проводника для ds1621 виснет на старте (даже если второй ds1621 нет, т.е. панелька без нее). Убираю проводник, стартует нормально. Длина шлейфа 2м. Да, еще вопрос. Первый ds1621 опрашиваю через нулевой адрес, для этого A1,A2,A3 на земле. Т.е. для выбора первого адреса на втором ds 1621 надо A1 подтянуть к плюсу, A2, A3 на землю?
Сообщение отредактировал D H - Feb 15 2007, 12:30
|
|
|
|
|
Feb 15 2007, 12:54
|

Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070

|
Цитата(D H @ Feb 15 2007, 12:29)  Столкнулся с проблемой подключения двух ds1621 по и2с. Одна работает. Вторую подключаю - виснет. Наверно неправильно подключаю. Подскажите как сделать. Сейчас подключено так: SDA & SCL 10к к питанию. При подключении к SDA (либо SCL) еще одного проводника для ds1621 виснет на старте (даже если второй ds1621 нет, т.е. панелька без нее). Убираю проводник, стартует нормально. Длина шлейфа 2м. Да, еще вопрос. Первый ds1621 опрашиваю через нулевой адрес, для этого A1,A2,A3 на земле. Т.е. для выбора первого адреса на втором ds 1621 надо A1 подтянуть к плюсу, A2, A3 на землю? У меня DS1621 висла при включении питания при медленном нарастании напряжения или при его просадке. Ей надо резкий старт питания. При таком зависании интерфейс I2C работает нормально, все читается, но измерение температуры не проходит - показания "залипают". С адресами - все верно. Не забудь, что в формате команды I2C младший бит адреса сидит не в 0 бите, а в 1, т.е. адрес надо увеличить на 2.
|
|
|
|
|
Feb 15 2007, 15:07
|

Участник

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847

|
Цитата(vmp @ Feb 15 2007, 12:54)  Цитата(D H @ Feb 15 2007, 12:29)  При подключении к SDA (либо SCL) еще одного проводника для ds1621 виснет на старте (даже если второй ds1621 нет, т.е. панелька без нее). Убираю проводник, стартует нормально. Длина шлейфа 2м.
У меня DS1621 висла при включении питания при медленном нарастании напряжения или при его просадке. Ей надо резкий старт питания. У меня виснет контроллер. На инициализации 1621. На горячую выдергиваю из панельки 1621, вставляю - запускается, но ни с первого ни с второго 1621 ничего прочитать не может. Использую CV.
Сообщение отредактировал D H - Feb 15 2007, 15:08
|
|
|
|
|
Feb 15 2007, 17:10
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата SDA & SCL 10к к питанию.При подключении к SDA (либо SCL) еще одного проводника для ds1621 виснет на старте (даже если второй ds1621 нет, т.е. панелька без нее). Убираю проводник, стартует нормально. 10К слишком жирно, да еще и на длинном проводнике. Уменьшить раз в 5-6. Цитата У меня виснет контроллер. ......Использую CV. Процедура родная? Тогда поллит бит готовности. Если некиий символ на шине (старт, стоп, ак) пропал, МК будет ждать его до опупения. Лучше использовать прерывания.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Feb 15 2007, 21:50
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(D H @ Feb 15 2007, 22:14)  В процессе отладки выяснил: 1. виснет в месте инициализации первой 1621, т.е. до второй и не доходит. 2. Если на горячую выдернуть/вставить вторую 1621 - начинает работать, но не читает ни с первой, ни со второй ничего. 3. Если просто допаять проводник к SDA (или SCL), не подлючая к ниму ничего, то же висит на инициализации первой ds1621 Что решил сделать: 1. Добавить на последнем устройстве конденсаторы на SDA, SCL к земле. 2. Уменьшить по совету beer_warrior до 2к резисторы. О результате отчитаюсь. Может кому, как и мне, пригодиться. Какие конденсаторы????!!! Я слышал люди до 150 метров выносили!!! Что значит виснет??? Простите пожалуйста, но если вы хотите получить квалифицированный ответ, то задавайте полный вопрос. То что вы не видете ответов на данный момент, - просто показывает, что не на что отвечать! Вы программист или нет? Что значит виснет? Если ждёт, то чего... В каком месте инициализации... Запомните. По описанию шины и здравому смыслу конденсаторов нет! Не надо сопли вешать! Надо квалифицировано установить причину и её устранить. То, что работает с одной микрухой - не показатель, а частный случай.
|
|
|
|
|
Feb 15 2007, 23:18
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата 1. Добавить на последнем устройстве конденсаторы на SDA, SCL к земле. А зачем? Фронты "зализать"? Попробую внятней. Цитата При подключении к SDA (либо SCL) еще одного проводника для ds1621 виснет на старте 1.Проводник - значит внесена помеха. Обычно это дает о себе знать при высоком сопротивлении нагрузки. Если в шину качается нормальный ток(а именно он задается резистором), наводки незаметны на фоне полезного сигнала. 2.Зависание само по себе. Обусловлено тем простым фактом, что I2C это не SPI. В SPI можно вытолкнуть данные и, если все физически исправно, быть увереннным, что они зайдут в слэйв. I2C - протокол адресуемый, протокол с командами и квитированием.Т.е. если помеха наложится на SPI пострадают отдельные биты, если на I2C - последовательность адресов, команд и подтверждений скорее всего будет нарушена. Т.е. вся транзакция пройдет неправильно. Как делается обмен в АВР? Выполняется команда (отсылаются данные) -> получается подтверждение -> по регистру статуса смотрится результат -> принимается решение: продолжение/выход/рестарт. Обычно во всех конченных библиотечках, поставляемых с компиляторами получение подтверждения делается в цикле Код while(TWI_SR & some_const) Если состояние номер some_const по каким-то причинам не прошло, контроллер будет крутится в бесконечном цикле. Чтобы избежать такой ситуации, надо обрабатывать все возможные коды возврата или (что лучше и проще) делать все на прерываниях. Только прерывания в библиотечку не уложишь, поэтому придется либо писать самому, либо портировать чужой код. P.S. В который раз убеждаюсь, что CV это костыли, которые подкупают мнимой простотой, а впоследствии заводят на серьезные грабли.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Feb 16 2007, 19:10
|

Участник

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847

|
Вот кусок кода.
#asm .equ __i2c_port=0x18 ;PORTB .equ __sda_bit=3 .equ __scl_bit=4 #endasm #include <i2c.h>
#include <ds1621.h>
void main(void) { unsigned int ADCVal[ADCChannels]; int Tin=0,Tout=0; char rtcHour=18,rtcMin=88,rtcSec=88,Hour=0,rtcDay=88,rtcMonth=88,rtcYear=88; char i,j,Min=0,Sec=0,nADCCount=0; char cText1[]="T OUT",cText2[]="T IN",cText3[]="POWER";
OCR1A = 1018; TCCR1B = 9; TCCR1A = 0x00; TIMSK = 0x10; DDRD = 0xf0;
PORTA=0b00001111; DDRA= 0b11110000;
ADMUX=0b11000011; ADCSRA=0x87;
PORTA.7=0; PORTA.6=0; PORTA.5=0; PORTA.4=0; delay_ms(100); PORTA.7=1; PORTA.6=1; PORTA.5=1; PORTA.4=1;
i2c_init(); PORTA.7=0;
ds1621_init(0,50,70,0); --------------------- Здесь останавливается и ждет. PORTA.6=0; Tin=ds1621_temperature_10(0);
ds1621_init(1,50,70,0); PORTA.5=0; Tout=ds1621_temperature_10(0);
MCUCR = 0b10000000; #asm ("sei");
}
Сегодня поставил резисторы 2.2к - не стартует. Поставил 1.5к - стартует, но, примерно, через 1 минуту данные из второй 1621 не читаеn. Из первой читает. В понедельник 1к поставлю.
Сообщение отредактировал D H - Feb 16 2007, 19:13
|
|
|
|
|
Feb 16 2007, 21:34
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 30-08-05
Пользователь №: 8 094

|
Использовал стандартную библиотеку CV ds1621.h Датчик рядом с процом работал на ура. Подключил кабель на 20 метров и второй датчик не заработало поменял стоявшия резисторы для подпитки с 5.1 КОм на 510 Ом и все на ура заработало.
--------------------
|
|
|
|
|
Feb 16 2007, 23:38
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(WHALE @ Feb 16 2007, 18:47)  beer_warrior Вы излишне категорины  Фактор кривых рук(мозгов)вы отметаете?Вон чел на шину конденсаторы вешать предлагает  Библиотека для I2C в CV стопроцентно рабочая.Единственно,что там софтовая реализация,но это и понятно-можно применять на любом камне.(ну и добавить защиту от зависантя-time-out по таймеру).Я её пользовал от силы пару раз и именно для DS1621 на Tiny13.Все очень хорошо описано и запускается буквально за 5 минут.Пока что даже не ясно,о каком камне идет речь.имхо,код в студию. Совершенно согласен в смысле с тем, что не только нет желания читать книги, документы, описания микросхем и компиляторов, но и банально - взять и установить причину "зависания". Виснет, это когда камень не работает. Так его тогда меняют! Но здесь не виснет, а зацикливается в ожидании. Или вываливается если нет ASK, что вероятнее. Так надо закатать рукава и найти место и причину ПРОГРАМНОЙ или ПРОГРАМНО-АППАРАТНОЙ ОШИБКИ. Разобраться с ней и устранить. Если сам не можешь разобраться, то обратись на форум. Но причину - установи. Цитата Датчик рядом с процом работал на ура. Подключил кабель на 20 метров и второй датчик не заработало поменял стоявшия резисторы для подпитки с 5.1 КОм на 510 Ом и все на ура заработало. Это понятно, но есть и другие способы. Например переписать диаграму в сторону увеличения задержек. Шина то статическая. Я думаю, что можно увеличить и дальше. Конечно (хотя эта шина не для того разрабатывалась) обычно применяют комплексные меры. Толстый провод Экранировать Уменьшить нагрузочные резисторы Увеличить задержки Учитывать возможность возникновения ошибки (ввести таймауты и повторное считывание) ну и т.д. Но первое - повторяю - разобраться с ошибкой. Почему? Когда? И где?
|
|
|
|
|
Feb 17 2007, 00:40
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Саша,задержки тут не причем,там уже все сделано .На первый взгляд все,что относится к 1621,вроде верно.Единственно,в этой либе нет защиты от зави- сания шины.Если виснуть начинает с 2 датчиками,то первое,что приходит в голову-правильно ли вы распаяли адресные ножки чипов? 2-вы выяснили,что виснет при инициализации,но в этой функции вызываются 4 встроенные фукции,некоторые из которых включают ещё по несколько штук.Вам надо влезать в исходник(ds1621.lib) и ставить отладочные точки там.И еще-там нет защиты от зависания-встречаются конструкции типа while (ds1621_get_status(chip) & 0x10);-что в случае сбоя повесит прогу насмерть.Вы- ход-использовать таймер для тайм-аута. И последнее-вы так и не указали,какой чип вы используете?Подозреваю,что тини,раз не используете аппаратный I2C.Но они имеют USI,что тоже неплохо.Рекомендую обратить внимание на атмеловский апноут AVR310: Using the USI module as a I2C master-я его пользую для тини и очень доволен. Работа по прерываниям,что разгружает проц и хорошо сделана защита от зависания.Портируется на CV быстро,могу выслать кусок кода для тини2313 на этом драйвере. Удачи.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|