реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 1-Wire, Ну что я не так делаю ?
Letis
сообщение Sep 16 2010, 21:37
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 10-07-07
Пользователь №: 29 027



Подключил библиотеку 1wire. Не использовал из CodeVision, так как нужно менять пины порта.
Но функция инициализации не работает, помогите. Что я делаю не так.
Все файлы CodeVision и Протеуса выкладываю ниже.

#define OW_DDR DDRD
#define OW_PIN PIND
#define OW_BUS 0
char count;


//------------------------------------------------------------------------------
// Инициализация
//------------------------------------------------------------------------------
char OW_Initialization(void)
{
char nalichie_ustroystva = 0;
OW_DDR |= (1<<OW_BUS);
delay_us(100);
delay_us(100);
delay_us(100);
delay_us(100);
delay_us(100);
OW_DDR &= ~(1<<OW_BUS);
delay_us(90);
if((OW_PIN&0x01)== 0)
{
nalichie_ustroystva = 1;
}
delay_us(100);
delay_us(100);
return nalichie_ustroystva;
}
//------------------------------------------------------------------------------



Сообщение отредактировал Letis - Sep 17 2010, 00:44
Прикрепленные файлы
Прикрепленный файл  Temp.zip ( 71.31 килобайт ) Кол-во скачиваний: 31
 
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 17 2010, 08:46
Сообщение #2


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Letis @ Sep 17 2010, 01:37) *
...Что я делаю не так. ...


наверное стоит почитать про порты МК.
Направление Вы задаёте. а что порт на пин выдаёт? нолик или одын?
предположим нолик. если это вход - отключение подтяжки, если её нет внешней - Z состояние. если это выход - нолик.
предположим одын. если это вход - подтяжка подключена, логический одын. если выход - одын.

как видите и то и то не - работать не будет.


удачи Вам
(круглый)
Go to the top of the page
 
+Quote Post
GDI
сообщение Sep 17 2010, 11:10
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
предположим нолик. если это вход - отключение подтяжки, если её нет внешней - Z состояние. если это выход - нолик.

Именно так и работает порт с 1-wire.

To Letis
Код
if((OW_PIN&0x01)== 0)

должно быть
Код
if((OW_PIN&(1<<OW_BUS))== 0)

но это мелочи наверное.
В свое время использовал библиотеку http://www.microsyl.com/index.php/2010/03/...newire-library/ и переделывал ее под себя в CodeVision.
А еще можете порыться тут http://electronix.ru/forum/index.php?showtopic=10934. В этом разделе выложено несколько реализаций 1-wire.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 17 2010, 12:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(GDI @ Sep 17 2010, 15:10) *
Именно так и работает порт с 1-wire.
Выше речь шла о том, что о внешней подтяжке к высокому уровню на линии автор вопроса даже не обмолвился (по-умолчанию - её нет), а внутренняя подтяжка в программе при прослушивании presence pulse со стороны МК не предусмотрена.
Go to the top of the page
 
+Quote Post
GDI
сообщение Sep 17 2010, 13:12
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Ну, если топик стартер не знает что для 1-wire нужна подтяжка, тогда и ваши намеки на работу портов бесполезны smile.gif


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 17 2010, 17:03
Сообщение #6


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(GDI @ Sep 17 2010, 15:10) *
Именно так и работает порт с 1-wire....


ну а теперь смотрите даташит на 1Wire в разделе формирования слота. немного почитав даташит и опять просмотрев вдумчиво мессагу мою, Вы поймёте о чем шла речь. Одним дирекшеном Вы не получите необходимой формы сигнала согласно даташиту(без внешнего резистора. нет конечно же можно как в 51 серии вкрячивать лишнюю детальку, платить лишние бабло за линейку и за пайку 9 точек. а оно нуна в производстве?). увы и ах.

(круглый)
ЗЫ
Библиотеки обычно подходят для ознакомления с рабочим вариантом. В боевых применениях, когда требуется получать каждую секунду несколько значений с маленькой кучки датчиков(с разрешением скажем в 0,01 градус), решать основные задачи, следить за процентом помех на линиях датчиков - увы библиотеки вам не помогут...

(круглый)

Сообщение отредактировал kolobok0 - Sep 17 2010, 17:49
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Sep 17 2010, 17:50
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



У меня код такой:

CODE
//----------------------------------------------------------------------------

//Модуль обслуживания термометра 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)
//Термометр должен быть запрограммирован в 12-разрядный режим
//(биты R0, R1 в регистре конфигурации равны единице).
//Считываются только 2 байта темпертуры без проверки CRC.

//----------------------------- Константы: -----------------------------------

#define TCONV 1000 //время преобразования температуры, мс

//---------------------------- Переменные: -----------------------------------

bool Presence; //флаг присутствия термометра
int Temperature; //текущая температура
int TTimer; //таймер термометра

//----------------------------- Функции: -------------------------------------

bool TReset(void); //формирование импульса сброса
char TByte(char dat); //запись/чтение байта
bool TBit(bool cool.gif; //запись/чтение бита
bool Start(void); //запуск преобразования
int Read_T(void); //чтение температуры

//--------------------- Генерация импульса сброса: ---------------------------

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 cool.gif
{
char si;
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP_0;
Port_OWP_OUT; //OWP <- 0
Delay_us(2); //delay 2 uS
if(cool.gif 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);
}

//----------------------- Запуск преобразования: -----------------------------

bool Start(void)
{
if(TReset())
{
TByte(0xCC); //skip ROM
TByte(0x44); //start conversion
return(1);
}
return(0);
}

//-------------------------- Чтение термометра: ------------------------------

int Read_T(void)
{
if(TReset())
{
TByte(0xCC); //skip ROM
TByte(0xBE); //read scratchpad
char l = TByte(0xFF); //чтение младшего байта
char h = TByte(0xFF); //чтение старшего байта
return(WORD(h, l));
}
return(0); //ошибка
}

//--------------------- Инициализация термометра: ----------------------------

void DS18B20_Init(void)
{
Presence = Start();
TTimer = ms2sys(TCONV);
}

//----------------------- Измерение температуры: -----------------------------

void DS18B20_Exe(bool t)
{
if(t)
{
if(TTimer) TTimer--;
if(!TTimer)
{
if(Presence) Temperature = Read_T();
Presence = Start();
TTimer = ms2sys(TCONV);
}
}
}

//------------------------- Чтение температуры: ------------------------------

int DS18B20_GetT(void)
{
return(Temperature);
}

//----------------------------------------------------------------------------


--------------------
Go to the top of the page
 
+Quote Post
ARV
сообщение Sep 17 2010, 18:12
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Леонид Иванович @ Sep 17 2010, 21:50) *
У меня код такой
а у меня такой http://electronix.ru/forum/index.php?showt...st&p=811157 smile.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 17 2010, 18:13
Сообщение #9


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Леонид Иванович @ Sep 17 2010, 21:50) *
У меня код такой:...


вы простите меня. я понимаю что отлаженый код. но всё таки рекомендую подтягивать резистором на плюс 1Wire пин. аргументация проста до безобразия - вы же не собираетесь к нему тупо подключать датчик? нет конечно же для работы на столе до пару метров - без проблем. но в пром. автоматику я бы не рекомендовал. кстати 4,7 кила не обязательно тогда втыкать. он потребуется если только у вас метраж (реально) за 100 метров. ну с перестраховкой 10 метров. тогда Вы понимаете что валятся фронты и помеха даёт о себе знать. Хотя там даже уже и не килы а несколько сот ом уже будет.


ну это чиссо моё имхо. чисса из практики.
(круглый)
ЗЫ
заткнулся smile.gif
ЗЫ ЗЫ
Приведу только кусок вывода (прошу прощение заранее за такую наглость):
Код
;========
; used Z
DSOut0:
; out "0"
    in    ZL,DS_PORT
    andi    ZL,DS_MASKA_AND;
    in    ZH,DS_DIRECTION_PORT
    ori    ZH,DS_MASKA_OR;
    out    DS_PORT,ZL
    out    DS_DIRECTION_PORT,ZH
    ret            ; 4
;========
; used Z
DSOut1:            ; 3
    in    ZL,DS_PORT; 1
    ori    ZL,DS_MASKA_OR; 1
    in    ZH,DS_DIRECTION_PORT; 1
    andi    ZH,DS_MASKA_AND; 1
    out    DS_PORT,ZL; 1=8
    out    DS_DIRECTION_PORT,ZH; 1(9)
    ret            ;
;========


Сообщение отредактировал kolobok0 - Sep 17 2010, 18:17
Go to the top of the page
 
+Quote Post
ARV
сообщение Sep 17 2010, 19:09
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(kolobok0 @ Sep 17 2010, 22:13) *
вы простите меня. я понимаю что отлаженый код. но всё таки рекомендую подтягивать резистором на плюс 1Wire пин. аргументация проста до безобразия - вы же не собираетесь к нему тупо подключать датчик? нет конечно же для работы на столе до пару метров - без проблем. но в пром. автоматику я бы не рекомендовал. кстати 4,7 кила не обязательно тогда втыкать. он потребуется если только у вас метраж (реально) за 100 метров. ну с перестраховкой 10 метров. тогда Вы понимаете что валятся фронты и помеха даёт о себе знать. Хотя там даже уже и не килы а несколько сот ом уже будет.
ваши рекомендации не выдерживают никакой критики - потому и не буду критиковать. но лично мое мнение о том, что правильно, а что нет, основывается на простом факте: что рекомендовано в даташите - правильно, остальное - нет. в каждом даташите на девайсы 1-wire показана схема выхода как открытый сток или коллектор, внешний подтягивающий резистор - обязателен. внутренняя подтяжка AVR - это резистор от 30 до 70 килоом, что явно недостаточно для паразитного питания, да и может не обеспечить время восстановления единицы в линии в соответствии со стандартом. вот как-то так...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 17 2010, 20:30
Сообщение #11


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(ARV @ Sep 17 2010, 23:09) *
...в каждом даташите на девайсы 1-wire...


пускай будет именно так как Вы сказали smile.gif

удачи вам
(круглый)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 18 2010, 07:27
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(ARV @ Sep 17 2010, 22:09) *
ваши рекомендации не выдерживают никакой критики - потому и не буду критиковать. но лично мое мнение о том, что правильно, а что нет, основывается на простом факте: что рекомендовано в даташите - правильно, остальное - нет. в каждом даташите на девайсы 1-wire показана схема выхода как открытый сток или коллектор, внешний подтягивающий резистор - обязателен. внутренняя подтяжка AVR - это резистор от 30 до 70 килоом, что явно недостаточно для паразитного питания, да и может не обеспечить время восстановления единицы в линии в соответствии со стандартом. вот как-то так...

+1

Питание необходимо подавать выдав полную единицу перед циклом измерения. Т.о. паразитное питание ч/з подтяжку не осуществляется.
Я, лично, сталкивался с DS18b20, которые неправильно работали если не ставить внешний резистор. Были две разных партии. Показания в этом случае были неправильны. Как только поставили резисторы подтяжки - всё заработало.

Таким образом, ещё и ещё раз убеждаешься, что следование рекомендациям даташита избавляет вас от лишних потерь времени.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 19 2010, 17:28
Сообщение #13


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(SasaVitebsk @ Sep 18 2010, 11:27) *
... Т.о. паразитное питание ч/з подтяжку не осуществляется....


а вот теперь ткните меня носом где топикастер указывал про паразитное питание в изначальном посте? или 1Wire всегда = паразитное питание? могу привести куча девайсов для 1Wire БЕЗ паразитного питания (например ds1821).


(круглый)

Сообщение отредактировал kolobok0 - Sep 19 2010, 17:31
Go to the top of the page
 
+Quote Post
ARV
сообщение Sep 19 2010, 17:52
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



топикстартеру было паразитное питание до фени - факт. но вы-то высказались против "отпускания" пина в 3-состояние и предложили взамен использовать встроенную подтяжку и отказаться от внешнего резистора - отсюда и развитие темы.

ds1821 - это какой-то выкидыш 1-Wire, т.к. от этого стандарта использует только две вещи: сигналы RESET-PRESENSE и таймслоты приема-передачи, а главные фичи - адресацию и возможность поиска адресов не реализует...


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Sep 20 2010, 06:19
Сообщение #15


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(ARV @ Sep 19 2010, 21:52) *
...предложили взамен использовать встроенную подтяжку и отказаться от внешнего резистора...

ds1821 - это какой-то выкидыш 1-Wire...


1) угумс предложил. будет время - кое чаво проверю в железе. то что дышит (условия опущу пока) - факт. Вы правы указывая на значительную разницу в номиналах резисторов. В одном и другом случае. И Ваше замечание родило интересную идею. нуна подумать.
2) вы как то лихо перескакиваете с темы на тему. теперь вам не нравится конкретная модель smile.gif как дети прям. ок. пускай будет по вашему - ds1820 подойдёт (что из линейки термодатчиков, ышо одын типа)? (хотя на мой взгляд двадцатки сильно уступают 21 ну не суть. у каждого портного свой взгляд на исскуство. не бум в сторону отходить.)

кстати вот вопросы лично к Вам уважаемый созрели. Два провода это хорошо. Исходя из Вашего опыта:
1) применяли ли Вы в 'боевых' условиях скажем больше чем 5 датчиков в установке(приборе)? Время получения показаний со всех точек?
2) что нужно сделать при замене датчиков(либо провода - ведь порой не знаешь что глючить начало. дачтики летят чаще конечно же. где то около 10 на тысячу.) подключённых на одну шину в устройстве? кол-во шагов по замене?
3) каким проводом Вы подключаете при таком включении датчики? телефонной лапшой?

удачи вам
(круглый)

Сообщение отредактировал kolobok0 - Sep 20 2010, 06:22
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 00:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016