DS18b20 и ATMEGA16 (проблемы)...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Ordsall
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср фев 11, 2009 23:19:08
Откуда: Санкт-Петербург
Контактная информация:

DS18b20 и ATMEGA16 (проблемы)...

Сообщение Ordsall »

Долго пытаюсь найти способ реализации снятия данных температуры с DS18B20 пользуясь контроллером ATMEGA16 и WinAVR... Пересмотрел много примеров, либо все было очень сложно под CodeVision с использованием инклудников КодВижона...

Может ли кто нибудь написать пример функции которая будет возвращать значение температуры... очень прошу....

Инициализация не важна - важен сам способ(пример) как это сделать...

Заранее благодарю... просто спасете=)
Аватара пользователя
MOHOXPOM
Встал на лапы
Сообщения: 108
Зарегистрирован: Вт мар 18, 2008 08:25:31
Откуда: Красноярск
Контактная информация:

Сообщение MOHOXPOM »

Код: Выделить всё

//=============================
//=================== Процедура конвертации температуры ===========
//=============================
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);
}

Как зачем мне голова?! Я ей ем!!!
more
Родился
Сообщения: 11
Зарегистрирован: Сб июл 18, 2009 09:50:21

Сообщение more »

Зачем так сложно?
все просто..
подключаешь библиотеку #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
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

more, просили же для WinAVR, а вы о чем?

я в инете нашел свободную библиотечку 1-wire (кстати, в комплекте и TWI и работа с ЖКИ) для WinAVR, все с исходниками, все работает просто замечательно. я эту библиотечку немного подкорректировал, сделав чуть более надежной и, как мне кажется, удобной, и теперь пользуюсь - горя не знаю. бОльшую часть этой библиотечки вы можете извлечь из исходников к мини-термостату с моего сайта, а полный комплект можете нагуглить легко и просто...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ordsall
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср фев 11, 2009 23:19:08
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Ordsall »

И еще ежели не трудно - все таки запустил я свои руки в 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);
}
}

Толком все понятно - но походу что-то где то пропустил или что то не допонял... Прошу знающих котов подсказать....
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Наверное стои убрать такое строгое условие

Код: Выделить всё

while(devices==2)

и заменить например на

Код: Выделить всё

while(devices>0)
Изображение
Ordsall
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср фев 11, 2009 23:19:08
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Ordsall »

После того как я добился работы устройства. неплохо было-бы и понять, всё таки как это работает. Когда я запихнул представленный выше код (любезно предоставленный монохромом) в вин авр компилятор выдал ряд ошибок, а точнее он ругался по поводу необъявленных переменных. Скажите нужно что-нибудь дефайнить или подгружать для работы этого кода?
Аватара пользователя
MOHOXPOM
Встал на лапы
Сообщения: 108
Зарегистрирован: Вт мар 18, 2008 08:25:31
Откуда: Красноярск
Контактная информация:

Сообщение MOHOXPOM »

Вот вся библа. Писал когда изучал 1вирь.
Только вы просили пример реализации :)
И тут какой-то косяк был в пересчете значения температуры с датчика (модель не помню.)
Пользуйтесь на здоровье.
Вложения
1wire.h
(50.23 КБ) 877 скачиваний
Как зачем мне голова?! Я ей ем!!!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»