Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
22.02.2010, 06:00
|
|
Временная регистрация
Регистрация: 20.11.2005
Сообщений: 52
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Что делаю не так с DS12B20
Датчик температуры после сброса выставляет импульс присутствия, и больше ничего не хочет делать. Вот кусок кода:
Код:
|
#define TD_0 output_low(PIN_B4) //
#define TD_1 output_high(PIN_B4) //
#define TD_IN output_float(pin_B4) // делает пин входом
void DS(char word)
{
char i;
for(i=0; i ‹ 8; i++)
{
TD_0;
delay_us( 15 );
if (word & 1) TD_IN;
delay_us( 55 );
TD_IN;
delay_us( 15 );
word = word ›› 1;
}
}
void main(void)
{
InitReg();
// Обмен с термодатчиком
TD_0;
delay_us( 490 ); //импульс RESET
TD_IN;
delay_us( 490 ); //для импульса PRESENCE
DS(0xCC); //Команда Пропуск ROM
//delay_us( 200 );
DS(0xBE); //Команда Чтение памяти
TD_IN;
delay_ms( 900 );
} |
Подскажите что делаю не так? На осциллографе смотрел: команды CC и BE формируется вроде как надо.
|
|
|
|
22.02.2010, 10:18
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Что делаю не так с DS12B20
а где команда начала измерения температуры - типа DS(0x44)?
#define SKIP_ROM 0xCC //Пропустить процедуру сравнив. сер. номера. //;
#define CONVERT_TEMP 0x44 //Команда к началу измерения температуры.
#define WRITE_SCRATCHPAD 0x4E //Записать пользовательские данные в регистры TEMP_TL, TEMP_TH и находящиеся в ПЗУ.
#define READ_SCRATCHPAD 0xBE //Прочесть содержимое ОЗУ (9 байт).
#define COPY_SCRATCHPAD 0x48 //Сохранение текущих значений регистров TEMP_TL\TH в ПЗУ.
OneWire_Init();
OneWire_WriteByte(SKIP_ROM);
OneWire_WriteByte(CONVERT_TEMP);
тут delay или лучше по таймеру
OneWire_WriteByte(SKIP_ROM);
OneWire_WriteByte(READ_SCRATCHPAD);
ds18b20[0]=OneWire_ReadByte();
ds18b20[1]=OneWire_ReadByte();
|
|
|
|
23.02.2010, 11:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Что делаю не так с DS12B20
Сообщение от svv11
|
На осциллографе смотрел: команды CC и BE формируется вроде как надо.
|
И не отвечает на 0xBE?
|
|
|
|
25.02.2010, 13:38
|
|
Прописка
Регистрация: 14.01.2008
Сообщений: 121
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 18 сообщении(ях)
|
Re: Что делаю не так с DS12B20
Используй готовую библиотеку в CodeVision. Там есть все функции для работы с датчиком.
|
|
|
|
25.02.2010, 13:42
|
|
Прописка
Регистрация: 14.01.2008
Сообщений: 121
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 18 сообщении(ях)
|
Re: Что делаю не так с DS12B20
Или я делал так:
#include "Mega16.h"
#asm
.equ __w1_port=0x15 ; PORTC
.equ __w1_bit=0
#endasm
#include "1Wire.h"
#define ConvertT 0x44
#define ReadScratchpad 0xBE
#define WriteScratchpad 0x4E
#define SkipROM 0xCC
//Инициализация термометра
void init_term()
{
w1_init();
w1_write(SkipROM);
w1_write(WriteScratchpad);
w1_write(0x00);
w1_write(0x00);
w1_write(0b01111111);
w1_init();
}
//Чтение температуры
unsigned int read_temp()
{
unsigned char temp[2];
unsigned char n;
unsigned int result;
result = 0;
w1_init();
w1_write(SkipROM);
w1_write(ReadScratchpad);
for (n=0; n‹2; n++)
{
temp[n] = w1_read();
}
w1_init();
w1_write(SkipROM);
w1_write(ConvertT);
w1_init();
result = temp[1] * 256 + temp[0];
return result;
}
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:12.
|
|