Долго пытаюсь найти способ реализации снятия данных температуры с DS18B20 пользуясь контроллером ATMEGA16 и WinAVR... Пересмотрел много примеров, либо все было очень сложно под CodeVision с использованием инклудников КодВижона...
Может ли кто нибудь написать пример функции которая будет возвращать значение температуры... очень прошу....
Инициализация не важна - важен сам способ(пример) как это сделать...
Заранее благодарю... просто спасете=)
DS18b20 и ATMEGA16 (проблемы)...
- MOHOXPOM
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вт мар 18, 2008 08:25:31
- Откуда: Красноярск
- Контактная информация:
Код: Выделить всё
//=============================
//=================== Процедура конвертации температуры ===========
//=============================
void DeviceQ_CONVERT_TEMPERATURE_COMMAND(void){
if (_1_WIRE_ERROR == 0x01){
if (_deviceQ_power_supply == 1){
DeviceQ_write_byte(CONVERT_T); // посылаю команду запуска конвертации
DeviceQ_Pullup(1);
_delay_us(200); // гарантированое время на окончание вычислений 750 ms
DeviceQ_Pullup(0);
}else{
DeviceQ_write_byte(CONVERT_T); // посылаю команду запуска конвертации
until_bit_is_set(DeviceQ_PIN); // ОПАСНО!!!! МОЖЕТ НЕ ВЫЙТИ!!! Проверка на окончание конвертации теппературы
}
}
}
//=============================
//==============Получение температуры с устройства на шине=========
//=============================
void DeviceQ_Read_Temperature(unsigned char Num_QDevice){ //по результату выдает результат вычисления температуры
unsigned char ID = 0, TH = 0, TL = 0;
if (_deviceQ_temperature_flag == false){ //запрос температуры в первый раз после запуска устройства (холостой пересчет)
if(DeviceQ_SKIP_ROM_COMMAND() == true) /*=======>>>>>>>>>>*/ DeviceQ_CONVERT_TEMPERATURE_COMMAND();
if(DeviceQ_SKIP_ROM_COMMAND() == true) DeviceQ_READ_SCARTCHPAD_COMMAND(_deviceQ_ScratchPad);
}
if (_deviceQ_find_count != 0){
if (_deviceQ_find_count == 1){
if(DeviceQ_SKIP_ROM_COMMAND() == true) DeviceQ_CONVERT_TEMPERATURE_COMMAND();
if(DeviceQ_SKIP_ROM_COMMAND() == true) DeviceQ_READ_SCARTCHPAD_COMMAND(_deviceQ_ScratchPad);
}else{
for (int i = 8; i >= 0; i--)
_deviceQ_rom_array[i] = _deviceQ_all_rom[Num_QDevice][i]; //перекидываю адрес устройства (64bit) во временную переменную
if(DeviceQ_MATCH_ROM_COMMAND(_deviceQ_rom_array) == true) DeviceQ_CONVERT_TEMPERATURE_COMMAND();
if(DeviceQ_MATCH_ROM_COMMAND(_deviceQ_rom_array) == true) DeviceQ_READ_SCARTCHPAD_COMMAND(_deviceQ_ScratchPad);
}
ID = _deviceQ_rom_array[0];
TH = _deviceQ_ScratchPad[1];
TL = _deviceQ_ScratchPad[0];
if (ID == DS18S20_FAMILY_CODE) // 0 бит = 0x10 означает что датчик или 1820 или 18s20
Calc_Temp_ds18S20(TH, TL);
if (ID == DS18B20_FAMILY_CODE) // 0 бит = 0x10 означает что датчик или 1820 или 18s20
Calc_Temp_ds18B20(TH, TL);
}
_deviceQ_temperature_flag = true;
}
//=============================
//=================== Считаю температуру для 1820(+S) =============
//=============================
void Calc_Temp_ds18S20(char MSByte, char LSByte){
int _temp = 1;
if (MSByte != 0x00){
LSByte = 0xFF - LSByte + 1;
_temp = -1;
}
Temperature = (int)LSByte*10/2;
TemperH = _temp*Temperature/10;
TemperL = Temperature%10;
}
//=============================
//=================== Считаю температуру для 18b20 ================
//=============================
void Calc_Temp_ds18B20(char MSByte, char LSByte){
int temp = 0x0000;
temp = (MSByte<<4)|(LSByte);
if (MSByte <= 0xF0) Temperature = (int)temp /16;
else Temperature = (int)((0xFFFF-temp)>>8);
}
Как зачем мне голова?! Я ей ем!!!
Зачем так сложно?
все просто..
подключаешь библиотеку #include <ds18b20>
настраиваешь 1-wire, подключаешь #include <1wire>
берешь переменные
#define MAX_DEVICES 8
unsigned char devices,rom_code[MAX_DEVICES][9];
unsigned int t;// темппература
потом инициализируешь
w1_init();
и датчик
ds18b20_init(&rom_code[0][0],20,30,DS18B20_10BIT_RES))
дальше сморишь число датчиков на линии
devices=w1_search(0xf0,rom_code);
и меришь
t=ds18b20_temperature(&rom_code[0][0]);
вот и все:)
я это читал на сайте atmel.moy.su давно...
все просто..
подключаешь библиотеку #include <ds18b20>
настраиваешь 1-wire, подключаешь #include <1wire>
берешь переменные
#define MAX_DEVICES 8
unsigned char devices,rom_code[MAX_DEVICES][9];
unsigned int t;// темппература
потом инициализируешь
w1_init();
и датчик
ds18b20_init(&rom_code[0][0],20,30,DS18B20_10BIT_RES))
дальше сморишь число датчиков на линии
devices=w1_search(0xf0,rom_code);
и меришь
t=ds18b20_temperature(&rom_code[0][0]);
вот и все:)
я это читал на сайте atmel.moy.su давно...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
more, просили же для WinAVR, а вы о чем?
я в инете нашел свободную библиотечку 1-wire (кстати, в комплекте и TWI и работа с ЖКИ) для WinAVR, все с исходниками, все работает просто замечательно. я эту библиотечку немного подкорректировал, сделав чуть более надежной и, как мне кажется, удобной, и теперь пользуюсь - горя не знаю. бОльшую часть этой библиотечки вы можете извлечь из исходников к мини-термостату с моего сайта, а полный комплект можете нагуглить легко и просто...
я в инете нашел свободную библиотечку 1-wire (кстати, в комплекте и TWI и работа с ЖКИ) для WinAVR, все с исходниками, все работает просто замечательно. я эту библиотечку немного подкорректировал, сделав чуть более надежной и, как мне кажется, удобной, и теперь пользуюсь - горя не знаю. бОльшую часть этой библиотечки вы можете извлечь из исходников к мини-термостату с моего сайта, а полный комплект можете нагуглить легко и просто...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Ordsall
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Ср фев 11, 2009 23:19:08
- Откуда: Санкт-Петербург
- Контактная информация:
И еще ежели не трудно - все таки запустил я свои руки в CodeWision дабы расширить кругозор...
Подскажите - как получить температуру с 2х датчиков на 1 линии?
Просто при симуляции выдается сущий бред - перебрал с 10сяток исходников - толком ничего не нашел...
Вот код программы:
#include <mega8>
#include <delay>
#include <lcd>
#asm //объявляем датчики...
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm
.equ __lcd_port=0x12; PORTD
#endasm
#include <1wire>
#include <ds18b20>
#define MAX_DS18b20 2 //кол-во датчиков на линии
void main(void)
{
char *_str="Temp1";
char *_str2="Temp2";
unsigned char devices;
unsigned char rom_code[MAX_DS18b20][9];
int temp;
PORTD=0x00;
DDRD=0xff;
lcd_init(20);
lcd_gotoxy(0, 0);
lcd_puts(_str);
lcd_gotoxy(0, 2);
lcd_puts(_str2);
devices=w1_search(0xf0,rom_code);
while(devices==2)
{
temp=ds18b20_temperature(&rom_code[0][0]);
if (temp>1000)
{
temp=4096-temp;
temp=-temp;
}
lcd_gotoxy(0, 1);
lcd_putchar('=');
lcd_putchar(temp);
temp=ds18b20_temperature(&rom_code[1][0]);
if (temp>1000)
{
temp=4096-temp;
temp=-temp;
}
lcd_gotoxy(0, 3);
lcd_putchar('=');
lcd_putchar(temp);
}
}
Толком все понятно - но походу что-то где то пропустил или что то не допонял... Прошу знающих котов подсказать....
Подскажите - как получить температуру с 2х датчиков на 1 линии?
Просто при симуляции выдается сущий бред - перебрал с 10сяток исходников - толком ничего не нашел...
Вот код программы:
#include <mega8>
#include <delay>
#include <lcd>
#asm //объявляем датчики...
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm
.equ __lcd_port=0x12; PORTD
#endasm
#include <1wire>
#include <ds18b20>
#define MAX_DS18b20 2 //кол-во датчиков на линии
void main(void)
{
char *_str="Temp1";
char *_str2="Temp2";
unsigned char devices;
unsigned char rom_code[MAX_DS18b20][9];
int temp;
PORTD=0x00;
DDRD=0xff;
lcd_init(20);
lcd_gotoxy(0, 0);
lcd_puts(_str);
lcd_gotoxy(0, 2);
lcd_puts(_str2);
devices=w1_search(0xf0,rom_code);
while(devices==2)
{
temp=ds18b20_temperature(&rom_code[0][0]);
if (temp>1000)
{
temp=4096-temp;
temp=-temp;
}
lcd_gotoxy(0, 1);
lcd_putchar('=');
lcd_putchar(temp);
temp=ds18b20_temperature(&rom_code[1][0]);
if (temp>1000)
{
temp=4096-temp;
temp=-temp;
}
lcd_gotoxy(0, 3);
lcd_putchar('=');
lcd_putchar(temp);
}
}
Толком все понятно - но походу что-то где то пропустил или что то не допонял... Прошу знающих котов подсказать....
- Krik99
- Потрогал лапой паяльник
- Сообщения: 375
- Зарегистрирован: Вс мар 04, 2007 13:14:25
- Откуда: Украина
- Контактная информация:
Наверное стои убрать такое строгое условие
и заменить например на
Код: Выделить всё
while(devices==2)и заменить например на
Код: Выделить всё
while(devices>0)
-
Ordsall
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Ср фев 11, 2009 23:19:08
- Откуда: Санкт-Петербург
- Контактная информация:
После того как я добился работы устройства. неплохо было-бы и понять, всё таки как это работает. Когда я запихнул представленный выше код (любезно предоставленный монохромом) в вин авр компилятор выдал ряд ошибок, а точнее он ругался по поводу необъявленных переменных. Скажите нужно что-нибудь дефайнить или подгружать для работы этого кода?
- MOHOXPOM
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вт мар 18, 2008 08:25:31
- Откуда: Красноярск
- Контактная информация:
Вот вся библа. Писал когда изучал 1вирь.
Только вы просили пример реализации
И тут какой-то косяк был в пересчете значения температуры с датчика (модель не помню.)
Пользуйтесь на здоровье.
Только вы просили пример реализации
И тут какой-то косяк был в пересчете значения температуры с датчика (модель не помню.)
Пользуйтесь на здоровье.
- Вложения
-
- 1wire.h
- (50.23 КБ) 877 скачиваний
Как зачем мне голова?! Я ей ем!!!