Осмелюсь спросить: "А ничего, что в даташите в цикле "MASTER WRITE “0” SLOT", требуют держать на шине "0" до 60 мкс, а потом не забыть отпустить ее"? То есть бросать бесконтрольно шину через 15-17 мкс ну никак не советуют, Вы бы им написали олухам, пусть исправят...ARV писал(а):Друзья мои! как же вы задолбали одним и тем же!
запомните раз и навсегда и давайте почитать нижеследующие строки всем, кто начнет изучать 1-wire:
критически важным интервалом времени для гарантированно надежного обмена по 1-wire (на стандартной скорости) является интервал в 15-17 микросекунд. обратите внимание - МИКРОсекунд, не МИЛЛИ!!!! поэтому задержка динамической индикации на столь короткий интервал (путем обязательного запрета всех прерываний на это время) будет абсолютно незаметна!
для обмена по 1-wire не требуется запрещать прерывания на бОльший интервал!
ваши проблемы в том, что вы слепо доверяете CodeVision, и ленитесь ручками написать свои собственные функции для работы с 1-wire. а ведь это совсем не сложно! к тому же есть просто МОРЕ отличных, грамотно составленных готовых библиотек!
Ds18s20 + Динамический Led Индикатор...
- Реклама
ChipKiller! Ку-ку, как там 1 миллисекунда поживает.... действительно метод ФЛЕЙМА легко узнаваем
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
А можно ссылку на библиотеку? А то на форуме тоже не нашёл 
Опыт растет прямо пропорционально выведенному из строя оборудованию...
ну погорячился яIM1 писал(а):Осмелюсь спросить: "А ничего, что в даташите в цикле "MASTER WRITE “0” SLOT", требуют держать на шине "0" до 60 мкс, а потом не забыть отпустить ее"? То есть бросать бесконтрольно шину через 15-17 мкс ну никак не советуют, Вы бы им написали олухам, пусть исправят...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ОК, консенсус! Можно дробить и побитно, все зависит от поставленной задачи.ARV писал(а):ну погорячился яIM1 писал(а):Осмелюсь спросить: "А ничего, что в даташите в цикле "MASTER WRITE “0” SLOT", требуют держать на шине "0" до 60 мкс, а потом не забыть отпустить ее"? То есть бросать бесконтрольно шину через 15-17 мкс ну никак не советуют, Вы бы им написали олухам, пусть исправят...в действительности надо было сказать о 60 микросекундах критически важной длительности, на время которых надо запрещать прерывания
PS
Мне показалось (возможно), что вчера Вы были не совсем в настроении.
- Реклама
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
... к сожалению на CV AVR не пишу, но после компиляции проекта и разбора листинга выяснилось следующее - на "низком уровне" CV, для работы с DS18xx, использует функции w1_init(), w1_read_bit(), w1_write_bit(). Функций конечно больше, но именно в этих 3 нужно внести небольшие изменения, а именно в нужном месте добавить инструкции CLI и SEI. После этого можно обращаться к DS18xx при разрешенных прерываниях.КАШАК писал(а):А можно ссылку на библиотеку? А то на форуме тоже не нашёл
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
А где именно нужно вставить?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
... например для чтения получится как то так (взял из листинга):КАШАК писал(а):А где именно нужно вставить?
Код: Выделить всё
w1_read_bit: // чтение бита
cli // disable
sbi __w1_port-1,__w1_bit // 1-wire = 0 (Out)
__DELAY_USB 0x2
cbi __w1_port-1,__w1_bit // 1-wire (In)
__DELAY_USB 0xE
clc
sbic __w1_port-2,__w1_bit // read bit
sec
ror r30
sei // enable
__DELAY_USB 0x62
ret
_w1_read: // чтение байта
ldi r22,8 // 8 bit read
__w1_read0:
rcall __w1_read_bit
dec r22
brne __w1_read0
ret
- Сообщения: 296
- Зарегистрирован: Ср дек 30, 2009 09:55:39
если писать на азме и внимательно прочитать даташит на 1Wire то можно сделать обмен по шине без ущерба для других длительных процессов. 1Wire требует чёткого выдерживания интервала между сигналом синхронизации и самим выставлением-чтением данных по битно. это единственный критичный интервал. ввиду его малости (около 1 мкс) - его можно реализовать внутри обработчика прерывания (тактовая частота при этом - должна быть как можно больше). все остальный временные интервалы - менее критичны.КАШАК писал(а):А где именно нужно вставить?
это чиссо из практики (например без проблем дружат несколько 1Wire каналов+LCD+KBD+всякие таймеры+всякие внешние прерывания+ModBus+...).
удачи Вам
(круглый)
PS
Маркхотскому хребту привет
кпак было сказано ранее, не 1 мкс, а порядка 60 мкс. кроме того, этот принцип ПРЕОТЛИЧНО реализуется на Си - без всякого асма.kolobok0 писал(а):если писать на азме и внимательно прочитать даташит на 1Wire то можно сделать обмен по шине без ущерба для других длительных процессов. 1Wire требует чёткого выдерживания интервала между сигналом синхронизации и самим выставлением-чтением данных по битно. это единственный критичный интервал. ввиду его малости (около 1 мкс)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 296
- Зарегистрирован: Ср дек 30, 2009 09:55:39
даже залез в даташит ради вас.как было сказано ранее в даташите:ARV писал(а):...как было сказано ранее, не 1 мкс, а порядка 60 мкс....
слот на чтение - строб 1мкс, достоверные данные в районе от 12мкс(где то) до 15мкс, далее слот продолжается до 60 мкс.
ds18b20 стр.20 картинки MASTER READ "0" SLOT & MASTER READ "1" SLOT
повторюсь...
именно о стробе - 1мкс я и хотел сказать. именно она минимально-критичная величина. всё остальное вторично.
удачи вам
(круглый)
ЗЫ
За 60 мкс поезд уже уйдёт далеко в "боевых" условиях. Это не позволительная роскошь быть слепым и глухим всё это время. Правда если для домашнего будильника, то Вы правы - пофигу.
kolobok0 писал(а): даже залез в даташит ради вас.
kolobok0 писал(а): повторюсь...
именно о стробе - 1мкс я и хотел сказать. именно она минимально-критичная величина. всё остальное вторично.
удачи вам
(круглый)
ЗЫ
За 60 мкс поезд уже уйдёт далеко в "боевых" условиях. Это не позволительная роскошь быть слепым и глухим всё это время. Правда если для домашнего будильника, то Вы правы - пофигу.
Ну а кусочек кода в подтверждения своих слов привести можете? Или хотя бы словесное краткое описание, в какой части картинки "ds18b20 стр.20 картинки MASTER READ "0" SLOT & MASTER READ "1" SLOT" Вы делаете то-то и то-то. Про поезд и стоп кран я уже понял.
ПС А то только бла-бла-бла...
- Сообщения: 296
- Зарегистрирован: Ср дек 30, 2009 09:55:39
вам что не понятно то? хотите убедится - пишу ли я боевой код? Или как выводить логический нулик на пин? Или не понятен график из даташита? или логика поведения интересует? конкретизируйте - чего надо то(если вы сюда пришли за опытом). или за вас программу написать?IM1 писал(а):...кусочек кода в подтверждения своих слов привести можете? Или хотя бы словесное краткое описание, в какой части картинки "ds18b20 стр.20 картинки MASTER READ "0" SLOT & MASTER READ "1" SLOT" Вы делаете то-то и то-то....
(дописал):
я против готовых решений на уровне команд того или иного языка. ну ежели только если говорим об одном и том же, а получаем разное. т.е. если уже дошло до конкретики. почему против - сужает полёт хфантазии того кто ищет. Тот кто роет - ему достаточно полуслова по теме и он сам проверит, оценит и сделает выводы. надеюсь мысль донёс...
(круглый)
ЗЫ
я уже давно не консультирую студентов. ещё раньше - закончил разжовывать ту инфу которой в инете достаточно много. обычно если человек в теме - он услышет. нет - не имеет смысла, что то объяснять. ваше право прислушаться или не прислушаться.
ЗЫ ЗЫ
по поводу страницы из даташита - потом глянул у ся страница другая. кхм. ну да лано, заголовок рисунка я озвучил. ARV человек умный - надеюсь он понял о чём речь.
Уважаемый kolobok0!
При том, что я лично с уважаемым ИМ1 не знаком, его весьма удачную конструкцию термо-
метра-термостата повторял. И даже не в одном экземпляре. Очень хорошо работает динами-
ческая индикация (измерение температуры - то же). Из этого можно можно сделать простой
вывод - товарищ ИМ1 далеко не студент, и знает о чем говорит.
При том, что я лично с уважаемым ИМ1 не знаком, его весьма удачную конструкцию термо-
метра-термостата повторял. И даже не в одном экземпляре. Очень хорошо работает динами-
ческая индикация (измерение температуры - то же). Из этого можно можно сделать простой
вывод - товарищ ИМ1 далеко не студент, и знает о чем говорит.
Уже убедился. Не только не пишете, но и понятия не имеете по существу вопроса.kolobok0 писал(а): вам что не понятно то? хотите убедится - пишу ли я боевой код? Или как выводить логический нулик на пин? Или не понятен график из даташита? или логика поведения интересует? конкретизируйте - чего надо то(если вы сюда пришли за опытом). или за вас программу написать?
Чтобы не позориться перед студентами, запомните, правильно будет "разжЕвывать" и "услышИт"kolobok0 писал(а): я уже давно не консультирую студентов. ещё раньше - закончил разжовывать ту инфу которой в инете достаточно много. обычно если человек в теме - он услышет. нет - не имеет смысла, что то объяснять. ваше право прислушаться или не прислушаться.
Спасибоborys писал(а):товарищ ИМ1 далеко не студент, и знает о чем говорит.
П.С.
Уважаемый kolobok0, извините, но Вы мне очень напоминаете одного моего знакомого, бывшего комсомольского работника. Он может долго и "научно" (по крайней мере мере ему кажется, что научно
Подскажите мне такую вещь. При использовании датчиков 1820 18В20 обязательно использовать кварцевую стабилизацию или нет. Я тут измерял температуру и пихал ее в УАРТ 4-мя байтами. Дома +24, +23 все идеально (использую правда переходник СОМ-ЮСБ) На работе +27 +28. Какое-то время показания идут нормальные, потом мусор. Подсоединял на СОМ1 скорость 9600, провод 80 см. С чем это может быть связано?
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Для 1-W - не обязательно, а вот для UART... 
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Обработкой температуры занимается ПК? МК CRC вычисляет? Если нет, то трудно определить: кто мусорит уарт или 1-wire.AndyWorld писал(а):Подскажите мне такую вещь. При использовании датчиков 1820 18В20 обязательно использовать кварцевую стабилизацию или нет. Я тут измерял температуру и пихал ее в УАРТ 4-мя байтами. Дома +24, +23 все идеально (использую правда переходник СОМ-ЮСБ) На работе +27 +28. Какое-то время показания идут нормальные, потом мусор. Подсоединял на СОМ1 скорость 9600, провод 80 см. С чем это может быть связано?
Лично я собирал простенький термометр на тиньке-13 с автономным питанием, супруга просила для цветов. Сам коробок (не датчик) испытывал где то от +5 до +50, вопросов не возникало.
Склоняюсь к мысли, что ув. Pooher прав, но это без расчетов, навскидку.Pooher писал(а):Для 1-W - не обязательно, а вот для UART...
- Сообщения: 35
- Зарегистрирован: Вт июн 07, 2011 22:45:26
Здравствуйте, уважаемые коты. Я новичек в Мк, не судите строго. Тоже столкнулся с проблемой мигания индикатора. Согласен с тем что встроенные функции для работы с DS18b20 не продумманны в плане многозадачности процессора. Сначала я нашел вот Это http://chipenable.ru/index.php/programm ... 0-avr.html и это http://chipenable.ru/index.php/programm ... 0-avr.html. Решил сам написать функции, но слава богу потом нашел вот это http://samou4ka.net/page/interfejs-1-wi ... ik-ds18b20. Есть там строчка такая:
delay_ms(750);//преобразование в 12 битном режиме занимает 750ms
все остальное выполняется мгновенно. Ток я еще не допроверерил.
Кто-то из вас, уважаемые, уже об этом упоминал. Это пока лучшее решение которое я нашел в нете с Сишным кодом.)))
PS.Прошу прощения у господина IM1, я не знаком с его проектом, о котором выше было сказано
delay_ms(750);//преобразование в 12 битном режиме занимает 750ms
все остальное выполняется мгновенно. Ток я еще не допроверерил.
Кто-то из вас, уважаемые, уже об этом упоминал. Это пока лучшее решение которое я нашел в нете с Сишным кодом.)))
PS.Прошу прощения у господина IM1, я не знаком с его проектом, о котором выше было сказано
Как тут писали выше, при обмене по шине 1-Wire нет необходимости запрещать прерывания больше чем на 60 мкс. Поэтому если индикация осуществляется в прерывании, никаких проблем не возникает. Но хочется и индикацию из прерывания вынести в основной цикл. Тогда дела обстоят хуже. Нужно разбивать обмен с термометром на элементарные операции, каждая из которых короче системного тика (скажем, 1 мс). Я так и сделал в печально известной паяльной станции DSS-90. Индикатор горит ровно, но если хорошо присмотреться, небольшие мигания все же есть. Что, впрочем, логично. Ну не может быть в самом провальном проекте года ни одной функции без глюков!
Код: Выделить всё
//----------------------------------------------------------------------------
//DSS-90
//Модуль обслуживания термометра DS18B20
//Цифровой датчик температуры DS18B20 подключен по 1-проводному
//интерфейсу, который реализован программно.
//Для подключения датчика используется порт OWP.
//Порт должен быть настроен на ввод,
//внутренний подтягивающий резистор должен быть отключен,
//используется внешний подтягивающий резистор 4.7 кОм.
//Во время измерения обеспечивается сильноточная
//подтяжка линии данных (порт переключается на вывод ВЫСОКОГО уровня),
//поэтому возможно использование термометра с паразитным питанием.
//Должны быть определены следующие макросы:
//#define OWP (1 << Pxn)
//#define Port_OWP_OUT (DDRx |= OWP)
//#define Port_OWP_IN (DDRx &= ~OWP)
//#define Pin_OWP (PINx & OWP)
//Датчик DS18B20 должен быть запрограммирован в 12-разрядный режим
//(биты R0, R1 в регистре конфигурации равны единице,
//это заводская установка).
//Дискретность измерения температуры составляет 0.1°C.
//Из датчика считываются только 2 байта, CRC не проверяется, но
//это легко при желании добавить.
//Для инициализации модуля один раз в начале программы должна
//вызываться функция DS18B20_Init(). Функция DS18B20_Exe() должна
//вызываться в основном цикле, она осуществляет запуск преобразования,
//формирует в фоновом режиме временную задержку и производит считывание
//температуры во внутреннюю переменную Temp.
//Функция DS18B20_Exe() получает в виде параметра t тики системного таймера,
//у меня это 1 мс.
//Поскольку обмен по однопроводной шине довольно медленный (сброс, чтение
// или запись одного байта занимает порядка 0.5 мс), целиком выполнять
//чтение температуры и запуск преобразования за один вызов DS18B20_Exe()
//нельзя. Это может нарушить выполнение других задач. Поэтому процесс
//обмена с термометром разбит на элементарные операции, каждая из
//которых включает в себя обмен не более чем одним байтом.
//Значение температуры в любой момент может быть считано с помощью функции
//DS18B20_GetT(). Значение представлено в виде 16-разрядного целого числа
//со знаком и представляет собой температуру в десятых долях градуса.
//До того, как закончится первое преобразование температуры, возвращается
//значение T_NORDY. В случае отсутствия ответа термометра возвращается
//код ошибки T_ERROR.
//----------------------------------------------------------------------------
#include "Main.h"
#include "DS18B20.h"
//------------------------------ Константы: ----------------------------------
#define TCONV 750 //время преобразования температуры, мс
//----------------------------- Переменные: ----------------------------------
static int Temp; //текущая температура
static char TState; //состояние процесса измерения
//-------------------------- Прототипы функций: ------------------------------
bool TReset(void); //формирование импульса сброса
char TByte(char dat); //запись/чтение байта
bool TBit(bool b); //запись/чтение бита
//--------------------- Инициализация термометра: ----------------------------
void DS18B20_Init(void)
{
Temp = T_NORDY; //результат измерения не готов
TState = 0; //начало процесса
}
//----------------------- Измерение температуры: -----------------------------
void DS18B20_Exe(bool t)
{
static int TTimer = 0; //таймер термометра
static int T; //код температуры
if(t)
{
if(TTimer) //если интервал таймера не истек,
{
TTimer--; //ожидание (и декремент таймера)
}
else //иначе выполнение шага
{
switch(TState)
{
case 0: if(TReset()) //команда RESET
TState++; //если выполнена успешно, следующий шаг
else TState = 0xFF; //если ошибка, переход на задержку
break;
case 1: TByte(0xCC); //команда SKIP ROM
TState++; //следующий шаг
break;
case 2: TByte(0x44); //команда START CONVERSION
TTimer = ms2sys(TCONV); //загрузка задержки преобразования
TState++; //следующий шаг
break;
case 3: if(TReset()) //команда RESET
TState++; //если выполнена успешно, следующий шаг
else TState = 0xFF; //если ошибка, переход на задержку
break;
case 4: TByte(0xCC); //команда SKIP ROM
TState++; //следующий шаг
break;
case 5: TByte(0xBE); //команда READ SCRATCHPAD
TState++; //следующий шаг
break;
case 6: T = TByte(0xFF); //чтение TL
TState++; //следующий шаг
break;
case 7: T |= TByte(0xFF) << 8; //чтение TH
TState++; //следующий шаг
break;
case 8: Temp = 10 * T / 16; //вычисление температуры
TState = 0; //переход на первый шаг
break;
default: TTimer = ms2sys(TCONV); //загрузка задержки
Temp = T_ERROR; //код ошибки
TState = 0; //переход на первый шаг
}
}
}
}
//--------------------- Генерация импульса сброса: ---------------------------
bool TReset(void)
{
char si;
Port_OWP_0;
Port_OWP_OUT; //OWP <- 0
Delay_us(500); //delay 500 uS
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP_IN; //OWP <- 1
Delay_us(14); //delay 14 uS
if(Pin_OWP) //если OWP = 0, то ошибка
{
Delay_us(52); //delay 52 uS
if(!Pin_OWP) //если OWP = 1, то ошибка
{
__restore_interrupt(si); //восстанавление прерываний
Delay_us(250); //delay 250 uS
if(Pin_OWP) //если OWP = 0, то ошибка
{
return(1); //если ошибок нет, термометр присутствует
}
}
}
__restore_interrupt(si); //восстанавление прерываний в случае ошибки
return(0);
}
//-------------- Запись/чтение байта по однопроводной шине: ------------------
char TByte(char dat)
{
char res;
for(char i = 0; i < 8; i++)
{
res = res >> 1;
if(TBit(dat & 1)) res |= 0x80;
else res &= ~0x80;
dat = dat >> 1;
}
return(res);
}
//--------------- Запись/чтение бита по однопроводной шине: ------------------
bool TBit(bool b)
{
char si;
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP_0;
Port_OWP_OUT; //OWP <- 0
Delay_us(2); //delay 2 uS
if(b) Port_OWP_IN; //bit = 1, OWP <- 1
Delay_us(13); //delay 13 uS
bool owp = Pin_OWP; //чтение порта
Delay_us(45); //delay 45 uS
Port_OWP_1; //force pullup
Port_OWP_OUT;
__restore_interrupt(si); //восстанавление прерываний
Delay_us(2); //delay 2 uS
return(owp);
}
//------------------------- Чтение температуры: ------------------------------
int DS18B20_GetT(void)
{
return(Temp);
}
//----------------------------------------------------------------------------


