Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
21.02.2007, 21:22
|
|
Частый гость
Регистрация: 22.11.2006
Сообщений: 19
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
DS18B20
Здравствуйте.
Имею странную проблему:
Если при записи (чтении) байта в термодатчик между передачей отдельных бит проходит некоторое время(конкретно не замерял - в случае отвлечения процессора на обработку какого-либо прерывания), то DS-ка как будто забывает чего до этого происходило, и соответственно нормального обмена с ней не выходит. Если на время обмена запрещаю прерывания - всё ОК.
Компилятор CodeVision 1.25.3.
Насколько я понял из даташита интервалы между битами должны быть больше 1мкс и меньше бесконечности.
Чего я не так понял?
|
|
|
|
21.02.2007, 21:52
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
прерывания нужно запрещать.
Почитай статью http://www.3dnews.ru/cooling/thermometer_ds18s20/
Сам по ней учился.
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
22.02.2007, 01:55
|
|
Временная регистрация
Регистрация: 11.06.2006
Сообщений: 60
Сказал спасибо: 17
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
|
Таких проблем не было, прерывания запрещал только в формировании задержек временых слотов. Время между битами разное было, но датчик ни когда амнизией не стродал. Возможно у Вас прерывания растягивают время временого слота.
|
|
|
|
22.02.2007, 08:06
|
|
Частый гость
Регистрация: 21.02.2007
Сообщений: 42
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
посмотри как я сделал в своём девайсе. конечно криво, но никуда не деться (если использовать динамическую индикацию)
Прикрепленный файл: 9848384.ZIP
|
|
|
|
22.02.2007, 09:04
|
|
Частый гость
Регистрация: 22.11.2006
Сообщений: 19
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от DimAlt
|
Таких проблем не было, прерывания запрещал только в формировании задержек временых слотов. Время между битами разное было, но датчик ни когда амнизией не стродал. Возможно у Вас прерывания растягивают время временого слота.
|
Сначала использовал встроенные библиотеки, в конце концов написал все функции сам. Прерывания запрещаются вначале передачи (приёма) бита, по окончании разрешаются вновь. Длительность интервалов верная (проверял осцилографом).
p.s. Ситуация налаживалась если прерывания запрещались на время передачи (приёма) байта.
Может быть компилятор чего-то не сохраняет перед обработкой прерывания
|
|
|
|
22.02.2007, 11:14
|
|
Временная регистрация
Регистрация: 11.01.2005
Сообщений: 81
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Вот как я делал, с проверкой crc:
/*************1-WIRE ******************/
/*SENSOR1*/
void reset_wire_s1(void)
{
TX_W11();
TX_W01();
PAUSE_US(600); //600us
_CLI();
TDN1();
PAUSE_US(100); //~100 us
if one_set1()
{
_SEI();
sense_error();
}
_SEI();
while wait1() {}
}
void wire_out_s1(byte chr)
{
byte i;
for(i=0;i‹8;i++)
{
_CLI();
TX_W01();
PAUSE_US(10);// ~10 us
if (chr&0x01) {
TX_W11();
}
else {
TX_W01();
}
PAUSE_US(100); // ~100 us
TX_W11();
PAUSE_US(5); // ~5us
_SEI();
chr=(chr››1);
}
}
//чтение байта 1-wire
void rd_mem_s1(void)
{
byte i, j,chr;
byte bufsens[9];
reset_wire_s1();
wire_out_s1(0xCC);
wire_out_s1(0xBE);
for(i=0; i‹9; i++)
{
chr=0x00;
for (j=0; j‹8; j++)
{ chr=(chr››1);
_CLI();
TX_W01();
PAUSE_US(4); // ~4 us
TDN1();
PAUSE_US(9); // ~9 us
if one_set1() {
chr|=0x80;
}
_SEI();
PAUSE_US(120); // ~120us
}
bufsens[i]=chr;
}
if((CalcCrcT(bufsens,9)==0))
{
sens1[0]=bufsens[0];
sens1[1]=bufsens[1];
sens1[2]=bufsens[2];
sens1[3]=bufsens[3];
sens1[4]=bufsens[4];
sens1[5]=bufsens[5];
sens1[6]=bufsens[6];
sens1[7]=bufsens[7];
sens1[8]=bufsens[8];
}
}
void conv_tmp_s1(void) // запуск цикла изм.
{
reset_wire_s1();
wire_out_s1(0xCC);
wire_out_s1(0x44);
}
Как видиш, прерывания как раз и запрещаються на время передачи/приема байта, плюс еще когда ждем отклика на ресет, чтобы его не провтыкать.
__________________
Музыка и звук - не одно и тоже...
|
|
|
|
01.12.2007, 06:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Решил сделать термометр на этом датчике.Сначало отладить решил в Протеусе.Но не могу записать в DS18B20,кажись все нормально.
Сначало сбрасиваю его,потом жду отзыва от него,потом начинаю передачу пропуском ROM команды,потом записать в память регистры Th,Tl и байта конфигурации,но при этом в окошке регистров датчика ничего не меняется.Может кто подскажет или поможет в чем ошибка.
-- Прилагается рисунок: --
Прикрепленный файл: 8559928.rar
|
|
|
|
01.12.2007, 14:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Разобрался,оказывается нельзя подключать простой резистор в протеусе на провод,который подтягивает к плюсу,поставил PULLUP и все заработало,а бился целый день
|
|
|
|
01.12.2007, 15:47
|
|
Временная регистрация
Регистрация: 03.10.2006
Сообщений: 75
Сказал спасибо: 51
Сказали Спасибо 4 раз(а) в 2 сообщении(ях)
|
Сообщение от CERGEI1982
|
Разобрался,оказывается нельзя подключать простой резистор в протеусе на провод,который подтягивает к плюсу,поставил PULLUP и все заработало,а бился целый день
|
Чет не работает
На индикаторе англицкая ь в первом от проца индикаторе. Второй пустой
Протеус ругался на землю и питание.
Сегменты А и В не активны
BEGAN INIT
MVI PORTA,B'11111111' ;
BSF SHIFT
MVI TRISA,0X01 ;НУЛЕВОЙ НА ВХОД
BCF SHIFT
MVI PORTB,B'11111110'
BSF SHIFT
MVI TRISB,0X00
BCF SHIFT
Чет я не знаю такой команды - MVI просветите плиз
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:16.
|
|