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

 
 
 
Reply to this topicStart new topic
> Программа для работы с 1-wire термометром DS1820, Сигнал присутствия приходит, а дальше - ничего
DimitryB
сообщение Jan 7 2008, 09:02
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 19-07-07
Пользователь №: 29 255



Помогите, пожалуйста
help.gif
Пытаюсь работать с термометром DS1820 Повесил его на PA11 своего МК. Питание у него внешнее, не паразитное. Кидаю ему reset - получаю ответ. А вот на посылки типа "выдай температуру" или даже "выдай свой уникальный код" он просто не отвечает.

Идея в коде пока такая. Процедура DS1820_Init дает импульс. Получает ответный импульс. Если ответный импульс был - загорается желтый светодиодик на плате. Потом посылается запрос. Если в ответ что-то пришло, загорается зеленый светодиодик. Так вот желтый загорается, а зеленый ни в какую. smile3046.gif

Посмотрите, пожалуйста, код. Может, я что-то упустил. Надеюсь, код легко читаем. Написан под GCC.
Код как файл мне прицепить не дают. Пришлось запузырить в текст.

CODE
#include "include/includes.h"


#define WIRE (1<<11) // a pin number, connected to data line define after <<
// Номер пина, который соединен с шиной 1-wire после <<
#define TX AT91F_PIO_CfgOutput (AT91C_BASE_PIOA, WIRE) // config to send signals
// режим отправки сигналов
#define RX AT91F_PIO_CfgInput (AT91C_BASE_PIOA, WIRE) // config to get signals
// переключает ножку в режим приема импульсов
#define TXON AT91C_BASE_PIOA->PIO_SODR = WIRE // ON pin
// подать импульс
#define TXOFF AT91C_BASE_PIOA->PIO_CODR = WIRE // OFF off pin
// отключить импульс



/* Initialization of 1-wire bus
* Инициализация шины 1-wire */
void DS1820_Init (void){

//enable the clock of the PIO
//Включение тактирования опроса пинов PIO (иначе будет не прочитать состояние пина)
AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, (1 << AT91C_ID_PIOA));

unsigned long j; //переменная для цикла чтения состояния пина

TXOFF;

ON=GREEN; //отключить зеленый светодиод. На моей плате они работают инверсно...
reset_devices(); //перезагрузка устройств на 1-wire шине


//Listen incoming presence signals
//Прием входящих сигналов с с шины
RX; //Swith pin to read mode

//Втечение 480 мс ждем импульса готовности устройств.
for (j = 1000*480; j != 0; j-- ){ //during 480 ms read WIRE to get presence pulse
if (!AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, WIRE)) { //When line is down
OFF=YELLOW; //turn on YELLOW if get impulse (inversed for my board)
//ON=YELLOW; //turn on GREEN LED if get signal

}
}

delay(100);

/* Передача битов разбита по тайм-слотам. Слот инициируется вызовом TXON с последующей паузой 15 мс.
* Затем, если надо передать на шину 0, ждем 15-45 мс. и даем TXOFF.
* Если надо передать 1, то сразу по истечении 15 ms даем TXOFF и ждем 15-45 мс.
* Перед началом следующего тайм-слота надо подождать не менее 1 мс.
*
* Bits translation is devided into timeslots. Timeslot initializes by TXON and pause 15 ms.
* Then, if you send 0, wait 15-45 ms. and do TXOFF.
* If you need to send 1, then after 15 ms do TXOFF and wait 15-45 ms.
* Before next timeslot wait not less 1 ms. */


TX;
TXOFF;

sendbyte (0,0,0,0,1,1,1,1); //send F0h
//sendbyte (1,1,1,1,0,0,0,0); //я пробовал послать команду и наоборот...


//Listen incoming signals

RX; //Swith pin to read mode
delay(1);


for (j = 1000*1000480; j != 0; j-- ){
if (!AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, WIRE)) {
OFF=GREEN; //turn on YELLOW if thermometer answeres
}
}

delay(1000000);

}

/* Sends 1 bit during one time slot
* Отправляет 1 бит за один таймслот */
void sendbit (int cool.gif {
// Перед обращением включить TX! Before call this func. call TX!
TXON;

if (b==0) {
delay(15);
delay(45);
TXOFF; //send 0
} else {
delay(15);
TXOFF;
delay(45); //send 1
}

//minimum time between bits (timeslots in datasheet) should be 1 ms
delay(50);
}

void sendbyte (int a, int b, int c, int d, int e, int f, int j, int k) {
sendbit(a);
sendbit(cool.gif;
sendbit©;
sendbit(d);
sendbit(e);
sendbit(f);
sendbit(j);
sendbit(k);

}

//Reset 1-wire devices
void reset_devices (void) {
//set wire for out and send outgoing line reset signal (480 ms minimum)
TX; //Swith pin to send mode
TXON; //Turn on the pin
delay(480); //Wait
TXOFF; //Turn off the pin
delay(40); //A small pause to give the DS1820 feel the edge
}
Go to the top of the page
 
+Quote Post
Andy Great
сообщение Jan 7 2008, 09:27
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 793
Регистрация: 5-11-04
Из: Краматорск, Украина
Пользователь №: 1 057



Не забываем, про особенности стыковки 5В и 3В (?) дивайсов. Проверяем времянки и фронты. Должно работать. У меня была проблема с повышенной емкостью линии.

P.S.: Используйте теги [code]
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 7 2008, 09:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(DimitryB @ Jan 7 2008, 11:02) *
Может, я что-то упустил. Надеюсь, код легко читаем. Написан под GCC.
Код как файл мне прицепить не дают. Пришлось запузырить в текст.

Moderator:
Текст не читаем, как минимум по причине отсутстия форматирвания. Обширные файлы прикрепляются ввиде архива. Для небольших используютя тэги code. По Dallas-у тема дежурная - можете поискать вопросы многочисленных предшественников. Тему для поста тоже просьба выбирать более соответствующюю - пришлось переносить.

Для начала просто ознакомьтесь с документацие на Dallas, поскольку даже процедура сброса ничего общего с требуемой не имеет. Задежки при этом должны быть точными а не абстрактными.
Вот это
Цитата
//Втечение 480 мс ждем импульса готовности устройств.
for (j = 1000*480; j != 0; j-- )

есть фуфло чистой воды.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Jan 7 2008, 14:36
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Во-первых, советую обратиться к этой документации:
http://atmel.com/dyn/resources/prod_documents/doc2579.pdf

Во-вторых, по первости вам может оказаться полезным этот исходник (я его сипользовал с некоторыми переделками)
Прикрепленный файл  1_wire_src.rar ( 5.67 килобайт ) Кол-во скачиваний: 273

В-третьих, извините за повторение, можно посмотреть сюда:
http://files.dalsemi.com/auto_id/public/owpd310.zip
( http://www.maxim-ic.com/products/ibutton/s...ire/wirekit.cfm )
Go to the top of the page
 
+Quote Post
Зверюга
сообщение Jan 10 2008, 16:51
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563



Я однажды тоже долго мучился.... Поом выяснилось, что котроллер работает на 1 МГц, а программа скомпилирована под 16МГц. Настоятельно рекомендую автору подумать об этом.
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jul 16 2015, 14:11
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Т.к. тема про 1-wire уже есть, припишу и свое сюда. Не знаю, даже, к чему больше относится: к STM32 или к DS18S20.

Рисую "полуаппаратную" реализацию 1-wire, вот код. На ура отрабатывает команды "Convert T" и "Skip ROM + Read Scratchpad", а вот "Read ROM" ни в какую (на шине только один датчик)! Попробовал два разных - диагноз совершенно одинаковый.
Передаю данные через DMA, который меняет содержимое регистра CCR одного канала таймера, а событие CCR другого канала (читающего из этого) пинает DMA для записи пришедших данных.

Может быть, нужно выдержать какую-то паузу после команды "Read ROM"? Но в даташите ничего подобного не нашел, а в другой реализации 1-wire (для STM8, на прерываниях, но тоже ШИМом таймера) безо всяких пауз работало...
Go to the top of the page
 
+Quote Post

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

 


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


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