Страница 1 из 1
DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 11:26:06
*Trigger*
Доброго времени суток.
Собрал я термометр. Всё работает, на иногда (не всегда) при чтении температуры из датчика на дисплее выскакивает -79. В чём проблема???
Прошивка вот:
Проект в CVAVR:
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 11:47:39
*Trigger*
up
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 12:28:02
*Trigger*
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 12:42:49
urry
это нормально. Вы применяете готовую библиотеку далласовского датчика, а затем мешаете ей своими прерываниями таймера.
перепишите библиотеку сами.
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 12:54:06
*Trigger*
Спасибо большое! Я писать библиотеки не умею, так что буду перед чтением отключать таймер, выводить вместо прерывания 0b00, а после чтения включать таймер. Как думаете, работать будет???
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 13:42:59
ChipKiller
*Trigger* писал(а):Я писать библиотеки не умею....
...в этом нет ничего сложного
Код: Выделить всё
uchar DS18b20_init(void){
uchar cnt;
DDRD.Ds18b20=1; // линию в "0"
delay_us(480);
#asm("cli")
DDRD.Ds18b20=0; // отпустим линию
delay_us(5);
cnt=20;
while(cnt--){ // ждем ответа 50 мкс
if(PIND.Ds18b20==1){ delay_us(1);}
else {
#asm("sei")
delay_us(480);
goto end_init; }
}
#asm("sei")
end_init:
return cnt;
}
по аналогии, глядя в datasheet, напишите DS18b20_read и DS18b20_write и все.....
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 21:25:04
*Trigger*
ChipKiller писал(а):Код: Выделить всё
cnt=20;
while(cnt--){ // ждем ответа 50 мкс
if(PIND.Ds18b20==1){ delay_us(1);}
Поясните, пожалуйста, как работают эти строки.
В даташите
http://pdf1.alldatasheet.com/datasheet- ... 18B20.html на странице 20 мне не понятно, что значат заштрихованные поля. И что значат диаграммы, где написано 15, 15, и 30 us (и подобные)???
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 21:49:11
ChipKiller
*Trigger* писал(а):Поясните, пожалуйста, как работают эти строки.
Код: Выделить всё
........
cnt=20;
while(cnt--){ // ждем ответа 50 мкс
if(PIND.Ds18b20==1){ delay_us(1);} // если Ds18b20 не ответил "0" ждем ....
else { // отклик Ds18b20 (при этом cnt!=0) - даем задержку 480us
#asm("sei")
delay_us(480);
goto end_init; }
}
#asm("sei")
end_init:
return cnt;
... если не было ответа - на выходе 0 ( cnt=20 - реально хватает и 20 мкс)
*Trigger* писал(а):что значат заштрихованные поля
... если "все так плохо", погуглите есть перевод datasheeta на русском
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 22:15:45
*Trigger*
Под заштрихованными полями я имел в виду косую штриховку (редкую). Вменяемого перевода я не нашёл.
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 22:27:55
ChipKiller
*Trigger* писал(а):Вменяемого перевода я не нашёл.
... вот "невменяемый"
http://usbsergdev.narod.ru/DOC/DS18B20_RU.pdf
Re: DS18b20 + ATTiny2313 = -79
Добавлено: Ср июн 22, 2011 23:44:05
*Trigger*
Спасибо.