Всё по DS18(B/S)20.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Всё по DS18(B/S)20.
На такие предупреждения стОит обращать внимание - у вас получилась многозадачная система - и, в данном случае, выполнение одной задачи мешает другой. Например, вы выдаете код 44 - в момент выдачи этой инфы, в время, когда выдается 1 - пошел прием байта по ком порту, программа отвлеклась на прерывание - и вместо выдачи 1 выдался 0 (пока зашли в прерывание, забрали байт, обработали , вышли) - вместо 44 получилось 40 или что-то в этом роде.
Продумайте алгоритм, запрещайте прерывания на момент записи бита в 1 wire.
Да, разделите задачи по файлам и не старайтесь все воткнуть в 1 файл - в идеале, 1 функция должна укладываться в размер экрана.
Продумайте алгоритм, запрещайте прерывания на момент записи бита в 1 wire.
Да, разделите задачи по файлам и не старайтесь все воткнуть в 1 файл - в идеале, 1 функция должна укладываться в размер экрана.
Re: Всё по DS18(B/S)20.
urry писал(а):На такие предупреждения стОит обращать внимание - у вас получилась многозадачная система - и, в данном случае, выполнение одной задачи мешает другой. Например, вы выдаете код 44 - в момент выдачи этой инфы, в время, когда выдается 1 - пошел прием байта по ком порту, программа отвлеклась на прерывание - и вместо выдачи 1 выдался 0 (пока зашли в прерывание, забрали байт, обработали , вышли) - вместо 44 получилось 40 или что-то в этом роде.
Продумайте алгоритм, запрещайте прерывания на момент записи бита в 1 wire.
Да, разделите задачи по файлам и не старайтесь все воткнуть в 1 файл - в идеале, 1 функция должна укладываться в размер экрана.
Система многозадачная, но нигде нет прерываний, тем более я их запретил. Все остальные команды съедаются запросто. Вот таким образом датчик реагирует только на команду Read Scratchpad(0xBE). А сам дебаггер пишет, что это нормальная команда. Я уже просто не знаю, что за ерунда такая. Насчет разделить задачи по файлам - это я сделаю, но только потом как все заработает.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Всё по DS18(B/S)20.
Потом никогда не наступит, делайте сразу.
Паузу между битами сделайте больше - после выдачи 0 там всего 5 микросекунд.
При первом считывании измерение в мусор - он прочитает 85 градусов.
Снимайте и сверяйте кс.
Паузу между битами сделайте больше - после выдачи 0 там всего 5 микросекунд.
При первом считывании измерение в мусор - он прочитает 85 градусов.
Снимайте и сверяйте кс.
Re: Всё по DS18(B/S)20.
urry писал(а):Потом никогда не наступит, делайте сразу.
Паузу между битами сделайте больше - после выдачи 0 там всего 5 микросекунд.
При первом считывании измерение в мусор - он прочитает 85 градусов.
Снимайте и сверяйте кс.
Собственно, я уже вообще ничего не понимаю.
Код: Выделить всё
ready=init();
if (ready==1)
{
TX(0xCC); // skip ROM
TX(0xBE); // Чтение памяти
temp[0]=RX(); // и тут он все исправно читает, в этом бите лежит число 0x50
temp[1]=RX(); // а вот в этом бите лежит 0x05, то есть температура 85, как и должно быть, потому что конвертирование мы не делали.
init(); // посылаем сброс
TX(0xCC); //skip ROM
TX(0x44); // Отправляем на конвертирование
_delay(750000); // ждем положенные 750 мс
init(); // опять посылаем сброс
TX(0xCC); // пропускаем ROM
TX(0xBE); // Читаем память
temp[2]=RX(); // а тут сюрприз, в этот бит приходит 254
temp[3]=RX(); // а вот сюда 255
}
else print("Denied");
display(temp[0]);
lcd_dat(0x20);
display(temp[1]);
lcd_dat(0x20);
display(temp[2]);
lcd_dat(0x20);
display(temp[3]);
lcd_dat(0x20);}Собственно, то, что неконвертированную температуру он считывает, позволяет говорить о том, что подпрограммы записи и чтения верны. Что же тогда может препятствовать?
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS18(B/S)20.
В какой температуре у вас датчик находится? 
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Всё по DS18(B/S)20.
Gudd-Head писал(а):В какой температуре у вас датчик находится?
Пока в никакой, железо только через 2 дня приедет, пока в протеусе химичу.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS18(B/S)20.
Ну ХЗ. У вас
Дожидается ответа Presence?
init(); // посылаем сброс
Дожидается ответа Presence?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Всё по DS18(B/S)20.
Gudd-Head писал(а):Ну ХЗ. У васinit(); // посылаем сброс
Дожидается ответа Presence?
Да, дожидается.
Re: Всё по DS18(B/S)20.
Дык, все таки, временные интервалы тайм слотов чтения/записи поправили?
Все время слота чтения, к примеру, - 65 µs, а вы мяукаете там чуть не полчаса
Код: Выделить всё
pin=0;
state=0;
_delay(15);
state=1;
_delay(65);
b=pin;
_delay(50);
Все время слота чтения, к примеру, - 65 µs, а вы мяукаете там чуть не полчаса

Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Re: Всё по DS18(B/S)20.
Может быть, имеет смысл дождаться железо? В своё время имел неоднократный секас с протеусом по причине кривых моделей...Reaper666 писал(а): пока в протеусе химичу.
Re: Всё по DS18(B/S)20.
Уж что, что, а модели для DS18B20 и иже с ними, работают в Proteus отменно.
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Re: Всё по DS18(B/S)20.
passer_by - ну, почти "отменно", нюансы есть.
Reaper666 - где взять Ваш компонент отладчика 1-wire? (у меня ISIS 7.7 sp2 build 9089), Ваш проект не запускается:

еще из даташита: ведущий на шине при чтении бита должен притягивать шину к нулю не меньше чем на 1 uS, а затем, читать результат не позднее 15 uS после фронта притягивания к нулю
:

у Вас это выполняется?
... сдается мне, что дело совсем не в этом...
Reaper666 - где взять Ваш компонент отладчика 1-wire? (у меня ISIS 7.7 sp2 build 9089), Ваш проект не запускается:
еще из даташита: ведущий на шине при чтении бита должен притягивать шину к нулю не меньше чем на 1 uS, а затем, читать результат не позднее 15 uS после фронта притягивания к нулю
у Вас это выполняется?
... сдается мне, что дело совсем не в этом...
- Вложения
-
- 2233311.jpg
- (68.42 КБ) 769 скачиваний
-
- 122123.jpg
- (60.26 КБ) 670 скачиваний
Re: Всё по DS18(B/S)20.
passer_by писал(а):Дык, все таки, временные интервалы тайм слотов чтения/записи поправили?Код: Выделить всё
pin=0;
state=0;
_delay(15);
state=1;
_delay(65);
b=pin;
_delay(50);
Все время слота чтения, к примеру, - 65 µs, а вы мяукаете там чуть не полчаса
Код: Выделить всё
unsigned char RX(void) // процедура чтения
{
unsigned char i=0,dat=0,b;
for (i=0;i<8;i++)
{
pin=0;
state=0; // удерживаем линию
_delay(5); // на 5 мкс( в даташите сказано, что минимум на 1 мкс)
state=1; // отпускаем шину
_delay(20); // ждем 15 мкс
b=pin; // смотрим, что у нас на выводе
dat|=(b<<i);
_delay(35);
}
return dat;
}Да, поправил. Я же говорю, у меня до конвертации все считывается, а вот после конвертации ерунда какая-то.
Re: Всё по DS18(B/S)20.
pin=0;
state=0; // удерживаем линию
_delay(5); // на 5 мкс( в даташите сказано, что минимум на 1 мкс)
state=1; // отпускаем шину
_delay(20); // ждем 15 мкс
b=pin; // смотрим, что у нас на выводе
"ждем 15 мкс" - а на самом деле 20 после конца импульса, который 5 - итого: Вы считываете через 25. по даташиту нужно не позже 15 от начала.
state=0; // удерживаем линию
_delay(5); // на 5 мкс( в даташите сказано, что минимум на 1 мкс)
state=1; // отпускаем шину
_delay(20); // ждем 15 мкс
b=pin; // смотрим, что у нас на выводе
"ждем 15 мкс" - а на самом деле 20 после конца импульса, который 5 - итого: Вы считываете через 25. по даташиту нужно не позже 15 от начала.
Re: Всё по DS18(B/S)20.
a_skr писал(а):passer_by - ну, почти "отменно", нюансы есть.
Reaper666 - где взять Ваш компонент отладчика 1-wire? (у меня ISIS 7.7 sp2 build 9089), Ваш проект не запускается:
еще из даташита: ведущий на шине при чтении бита должен притягивать шину к нулю не меньше чем на 1 uS, а затем, читать результат не позднее 15 uS после фронта притягивания к нулю:
у Вас это выполняется?
... сдается мне, что дело совсем не в этом...
Там в проекте протеуса затесался ненужный файл. Собственно, в архиве сам проект в протеусе, хекс-файл для него, проект в MpLAb, и файлы для отладчика. Файл с расширением dll кидаете в папку Models, а два остальным (idx и lib) в Library. Потом отладчик в компонентах находится по слову 1-wire. Все задержки я там соблюдал.
- Вложения
-
- Desktop.rar
- (171.75 КБ) 143 скачивания
Re: Всё по DS18(B/S)20.
поставил MPLAB, HI-TECH C for the PIC10/12/16 MCU Family,
просто откомпилировал:


просто откомпилировал:
Re: Всё по DS18(B/S)20.
Reaper666 писал(а):a_skr писал(а):поставил MPLAB, HI-TECH C for the PIC10/12/16 MCU Family,
просто откомпилировал:
Афигеть, то есть у меня все абсолютно верно. У вас какая версия протеуса? и можно вашу модельку датчика, моя может кривая какая-то. А остальные темпеературы правильно показывает?
Re: Всё по DS18(B/S)20.
до компиляции с Вашим hex'ом действительно было 254 и 255
Re: Всё по DS18(B/S)20.
a_skr писал(а):до компиляции с Вашим hex'ом действительно было 254 и 255
То есть, есть подозрение на то, что компилятор чудит? а можно тогда ваш hex, который вы получили.
Re: Всё по DS18(B/S)20.
Все заработало, проблема была в компиляторе. Кто знает, как можно выловить этот глюк компилятора?