Продумайте алгоритм, запрещайте прерывания на момент записи бита в 1 wire.
Да, разделите задачи по файлам и не старайтесь все воткнуть в 1 файл - в идеале, 1 функция должна укладываться в размер экрана.
urry писал(а):На такие предупреждения стОит обращать внимание - у вас получилась многозадачная система - и, в данном случае, выполнение одной задачи мешает другой. Например, вы выдаете код 44 - в момент выдачи этой инфы, в время, когда выдается 1 - пошел прием байта по ком порту, программа отвлеклась на прерывание - и вместо выдачи 1 выдался 0 (пока зашли в прерывание, забрали байт, обработали , вышли) - вместо 44 получилось 40 или что-то в этом роде.
Продумайте алгоритм, запрещайте прерывания на момент записи бита в 1 wire.
Да, разделите задачи по файлам и не старайтесь все воткнуть в 1 файл - в идеале, 1 функция должна укладываться в размер экрана.
Собственно, я уже вообще ничего не понимаю.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 писал(а):В какой температуре у вас датчик находится?
Дожидается ответа Presence?init(); // посылаем сброс
Gudd-Head писал(а):Ну ХЗ. У васДожидается ответа Presence?init(); // посылаем сброс
Все время слота чтения, к примеру, - 65 µs, а вы мяукаете там чуть не полчасаКод: Выделить всё
pin=0; state=0; _delay(15); state=1; _delay(65); b=pin; _delay(50);
Может быть, имеет смысл дождаться железо? В своё время имел неоднократный секас с протеусом по причине кривых моделей...Reaper666 писал(а): пока в протеусе химичу.
passer_by писал(а):Дык, все таки, временные интервалы тайм слотов чтения/записи поправили?Все время слота чтения, к примеру, - 65 µs, а вы мяукаете там чуть не полчасаКод: Выделить всё
pin=0; state=0; _delay(15); state=1; _delay(65); b=pin; _delay(50);
Код: Выделить всё
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;
}Там в проекте протеуса затесался ненужный файл. Собственно, в архиве сам проект в протеусе, хекс-файл для него, проект в MpLAb, и файлы для отладчика. Файл с расширением dll кидаете в папку Models, а два остальным (idx и lib) в Library. Потом отладчик в компонентах находится по слову 1-wire. Все задержки я там соблюдал.a_skr писал(а):passer_by - ну, почти "отменно", нюансы есть.
Reaper666 - где взять Ваш компонент отладчика 1-wire? (у меня ISIS 7.7 sp2 build 9089), Ваш проект не запускается:
еще из даташита: ведущий на шине при чтении бита должен притягивать шину к нулю не меньше чем на 1 uS, а затем, читать результат не позднее 15 uS после фронта притягивания к нулю:
у Вас это выполняется?
... сдается мне, что дело совсем не в этом...
Reaper666 писал(а):a_skr писал(а):поставил MPLAB, HI-TECH C for the PIC10/12/16 MCU Family,
просто откомпилировал:
Афигеть, то есть у меня все абсолютно верно. У вас какая версия протеуса? и можно вашу модельку датчика, моя может кривая какая-то. А остальные темпеературы правильно показывает?
a_skr писал(а):до компиляции с Вашим hex'ом действительно было 254 и 255