Ds18s20 + Динамический Led Индикатор...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

ARV писал(а):Друзья мои! как же вы задолбали одним и тем же!

запомните раз и навсегда и давайте почитать нижеследующие строки всем, кто начнет изучать 1-wire:
критически важным интервалом времени для гарантированно надежного обмена по 1-wire (на стандартной скорости) является интервал в 15-17 микросекунд. обратите внимание - МИКРОсекунд, не МИЛЛИ!!!! поэтому задержка динамической индикации на столь короткий интервал (путем обязательного запрета всех прерываний на это время) будет абсолютно незаметна!

для обмена по 1-wire не требуется запрещать прерывания на бОльший интервал!

ваши проблемы в том, что вы слепо доверяете CodeVision, и ленитесь ручками написать свои собственные функции для работы с 1-wire. а ведь это совсем не сложно! к тому же есть просто МОРЕ отличных, грамотно составленных готовых библиотек!
Осмелюсь спросить: "А ничего, что в даташите в цикле "MASTER WRITE “0” SLOT", требуют держать на шине "0" до 60 мкс, а потом не забыть отпустить ее"? То есть бросать бесконтрольно шину через 15-17 мкс ну никак не советуют, Вы бы им написали олухам, пусть исправят...
Реклама
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

.... действительно метод ФЛЕЙМА легко узнаваем :)))
ChipKiller! Ку-ку, как там 1 миллисекунда поживает :)? Может прокомментируете свой перл о ней, так сказать на бис :lol: ?
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик

Сообщение КАШАК »

А можно ссылку на библиотеку? А то на форуме тоже не нашёл :cry:
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18679
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

IM1 писал(а):Осмелюсь спросить: "А ничего, что в даташите в цикле "MASTER WRITE “0” SLOT", требуют держать на шине "0" до 60 мкс, а потом не забыть отпустить ее"? То есть бросать бесконтрольно шину через 15-17 мкс ну никак не советуют, Вы бы им написали олухам, пусть исправят...
ну погорячился я :) в действительности надо было сказать о 60 микросекундах критически важной длительности, на время которых надо запрещать прерывания :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

ARV писал(а):
IM1 писал(а):Осмелюсь спросить: "А ничего, что в даташите в цикле "MASTER WRITE “0” SLOT", требуют держать на шине "0" до 60 мкс, а потом не забыть отпустить ее"? То есть бросать бесконтрольно шину через 15-17 мкс ну никак не советуют, Вы бы им написали олухам, пусть исправят...
ну погорячился я :) в действительности надо было сказать о 60 микросекундах критически важной длительности, на время которых надо запрещать прерывания :)
ОК, консенсус! Можно дробить и побитно, все зависит от поставленной задачи.
PS
Мне показалось (возможно), что вчера Вы были не совсем в настроении.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

КАШАК писал(а):А можно ссылку на библиотеку? А то на форуме тоже не нашёл :cry:
... к сожалению на 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

Сообщение ChipKiller »

КАШАК писал(а):А где именно нужно вставить?
... например для чтения получится как то так (взял из листинга):

Код: Выделить всё

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

Сообщение kolobok0 »

КАШАК писал(а):А где именно нужно вставить?
если писать на азме и внимательно прочитать даташит на 1Wire то можно сделать обмен по шине без ущерба для других длительных процессов. 1Wire требует чёткого выдерживания интервала между сигналом синхронизации и самим выставлением-чтением данных по битно. это единственный критичный интервал. ввиду его малости (около 1 мкс) - его можно реализовать внутри обработчика прерывания (тактовая частота при этом - должна быть как можно больше). все остальный временные интервалы - менее критичны.

это чиссо из практики (например без проблем дружат несколько 1Wire каналов+LCD+KBD+всякие таймеры+всякие внешние прерывания+ModBus+...).
удачи Вам
(круглый)
PS
Маркхотскому хребту привет :)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18679
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

kolobok0 писал(а):если писать на азме и внимательно прочитать даташит на 1Wire то можно сделать обмен по шине без ущерба для других длительных процессов. 1Wire требует чёткого выдерживания интервала между сигналом синхронизации и самим выставлением-чтением данных по битно. это единственный критичный интервал. ввиду его малости (около 1 мкс)
кпак было сказано ранее, не 1 мкс, а порядка 60 мкс. кроме того, этот принцип ПРЕОТЛИЧНО реализуется на Си - без всякого асма.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Сообщения: 296
Зарегистрирован: Ср дек 30, 2009 09:55:39

Сообщение kolobok0 »

ARV писал(а):...как было сказано ранее, не 1 мкс, а порядка 60 мкс....
даже залез в даташит ради вас.как было сказано ранее в даташите:

слот на чтение - строб 1мкс, достоверные данные в районе от 12мкс(где то) до 15мкс, далее слот продолжается до 60 мкс.


ds18b20 стр.20 картинки MASTER READ "0" SLOT & MASTER READ "1" SLOT


повторюсь...
именно о стробе - 1мкс я и хотел сказать. именно она минимально-критичная величина. всё остальное вторично.

удачи вам
(круглый)
ЗЫ
За 60 мкс поезд уже уйдёт далеко в "боевых" условиях. Это не позволительная роскошь быть слепым и глухим всё это время. Правда если для домашнего будильника, то Вы правы - пофигу.
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

kolobok0 писал(а): даже залез в даташит ради вас.
:o :shock: Не может быть!!!
kolobok0 писал(а): повторюсь...
именно о стробе - 1мкс я и хотел сказать. именно она минимально-критичная величина. всё остальное вторично.
удачи вам
(круглый)
ЗЫ
За 60 мкс поезд уже уйдёт далеко в "боевых" условиях. Это не позволительная роскошь быть слепым и глухим всё это время. Правда если для домашнего будильника, то Вы правы - пофигу.
:))) Спасибо, давно так не веселился.
Ну а кусочек кода в подтверждения своих слов привести можете? Или хотя бы словесное краткое описание, в какой части картинки "ds18b20 стр.20 картинки MASTER READ "0" SLOT & MASTER READ "1" SLOT" Вы делаете то-то и то-то. Про поезд и стоп кран я уже понял.
ПС А то только бла-бла-бла...
Грызет канифоль
Сообщения: 296
Зарегистрирован: Ср дек 30, 2009 09:55:39

Сообщение kolobok0 »

IM1 писал(а):...кусочек кода в подтверждения своих слов привести можете? Или хотя бы словесное краткое описание, в какой части картинки "ds18b20 стр.20 картинки MASTER READ "0" SLOT & MASTER READ "1" SLOT" Вы делаете то-то и то-то....
вам что не понятно то? хотите убедится - пишу ли я боевой код? Или как выводить логический нулик на пин? Или не понятен график из даташита? или логика поведения интересует? конкретизируйте - чего надо то(если вы сюда пришли за опытом). или за вас программу написать?

(дописал):
я против готовых решений на уровне команд того или иного языка. ну ежели только если говорим об одном и том же, а получаем разное. т.е. если уже дошло до конкретики. почему против - сужает полёт хфантазии того кто ищет. Тот кто роет - ему достаточно полуслова по теме и он сам проверит, оценит и сделает выводы. надеюсь мысль донёс...

(круглый)
ЗЫ
я уже давно не консультирую студентов. ещё раньше - закончил разжовывать ту инфу которой в инете достаточно много. обычно если человек в теме - он услышет. нет - не имеет смысла, что то объяснять. ваше право прислушаться или не прислушаться.
ЗЫ ЗЫ
по поводу страницы из даташита - потом глянул у ся страница другая. кхм. ну да лано, заголовок рисунка я озвучил. ARV человек умный - надеюсь он понял о чём речь.
Держит паяльник хвостом
Сообщения: 927
Зарегистрирован: Вт сен 07, 2010 19:27:48
Откуда: Ташкент

Сообщение borys »

Уважаемый kolobok0!
При том, что я лично с уважаемым ИМ1 не знаком, его весьма удачную конструкцию термо-
метра-термостата повторял. И даже не в одном экземпляре. Очень хорошо работает динами-
ческая индикация (измерение температуры - то же). Из этого можно можно сделать простой
вывод - товарищ ИМ1 далеко не студент, и знает о чем говорит.
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

kolobok0 писал(а): вам что не понятно то? хотите убедится - пишу ли я боевой код? Или как выводить логический нулик на пин? Или не понятен график из даташита? или логика поведения интересует? конкретизируйте - чего надо то(если вы сюда пришли за опытом). или за вас программу написать?
Уже убедился. Не только не пишете, но и понятия не имеете по существу вопроса.
kolobok0 писал(а): я уже давно не консультирую студентов. ещё раньше - закончил разжовывать ту инфу которой в инете достаточно много. обычно если человек в теме - он услышет. нет - не имеет смысла, что то объяснять. ваше право прислушаться или не прислушаться.
Чтобы не позориться перед студентами, запомните, правильно будет "разжЕвывать" и "услышИт"
borys писал(а):товарищ ИМ1 далеко не студент, и знает о чем говорит.
Спасибо :beer:
П.С.
Уважаемый kolobok0, извините, но Вы мне очень напоминаете одного моего знакомого, бывшего комсомольского работника. Он может долго и "научно" (по крайней мере мере ему кажется, что научно :) ) говорить на разные технические темы. А со стороны все это выглядит смешно и грустно , одним словом бла-бла-бла...
Прорезались зубы
Аватара пользователя
Сообщения: 209
Зарегистрирован: Вт сен 30, 2008 09:23:14
Откуда: Краснодарский край

Сообщение AndyWorld »

Подскажите мне такую вещь. При использовании датчиков 1820 18В20 обязательно использовать кварцевую стабилизацию или нет. Я тут измерял температуру и пихал ее в УАРТ 4-мя байтами. Дома +24, +23 все идеально (использую правда переходник СОМ-ЮСБ) На работе +27 +28. Какое-то время показания идут нормальные, потом мусор. Подсоединял на СОМ1 скорость 9600, провод 80 см. С чем это может быть связано?
Мучитель микросхем
Аватара пользователя
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Для 1-W - не обязательно, а вот для UART... :kill:
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
IM1
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Сообщение IM1 »

AndyWorld писал(а):Подскажите мне такую вещь. При использовании датчиков 1820 18В20 обязательно использовать кварцевую стабилизацию или нет. Я тут измерял температуру и пихал ее в УАРТ 4-мя байтами. Дома +24, +23 все идеально (использую правда переходник СОМ-ЮСБ) На работе +27 +28. Какое-то время показания идут нормальные, потом мусор. Подсоединял на СОМ1 скорость 9600, провод 80 см. С чем это может быть связано?
Обработкой температуры занимается ПК? МК CRC вычисляет? Если нет, то трудно определить: кто мусорит уарт или 1-wire.
Лично я собирал простенький термометр на тиньке-13 с автономным питанием, супруга просила для цветов. Сам коробок (не датчик) испытывал где то от +5 до +50, вопросов не возникало.
Pooher писал(а):Для 1-W - не обязательно, а вот для UART... :kill:
Склоняюсь к мысли, что ув. Pooher прав, но это без расчетов, навскидку.
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вт июн 07, 2011 22:45:26

Сообщение Welmord »

Здравствуйте, уважаемые коты. Я новичек в Мк, не судите строго. Тоже столкнулся с проблемой мигания индикатора. Согласен с тем что встроенные функции для работы с 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. Есть там строчка такая: :music:
delay_ms(750);//преобразование в 12 битном режиме занимает 750ms
все остальное выполняется мгновенно. Ток я еще не допроверерил.
Кто-то из вас, уважаемые, уже об этом упоминал. Это пока лучшее решение которое я нашел в нете с Сишным кодом.)))


PS.Прошу прощения у господина IM1, я не знаком с его проектом, о котором выше было сказано
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Как тут писали выше, при обмене по шине 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);
}

//----------------------------------------------------------------------------
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»