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

 
 
> Программа для работы с 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



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

 


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


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