термометр в codevision ds18b20
термометр в codevision ds18b20
Я новичок в программировании пытаюсь собрать термометр в codevisionavr з двома датчиками температуры DS18B20 , МК ATMEGA8 и LCD LM016L
При запуске,МК находит только один датчик. Что я делаю не так?
#include <mega8>
#asm
.equ __w1_port=0x15 ;PORTC
.equ __w1_bit=0
#endasm
#include <1wire>
#include <ds18b20>
#define MAX_DS1820 8
unsigned char rom_codes[MAX_DS1820][9];
#include <stdio>
char lcd_buffer[33];
#include <delay>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd>
int temp[8];
void main(void)
{
unsigned char devices,i;
lcd_init(16);
delay_ms(200);
devices=w1_search(0xf0,rom_codes);
sprintf(lcd_buffer," devices=%u",devices); // devices = 1 ): ???
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(2000);
while (1)
{
temp[0]=ds18b20_temperature(&rom_codes[0]);
if (temp>1000){
temp[0]=4096-temp[0];
temp[0]=-temp[0];
}
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp[0],temp[0]%1);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(500);
};
}
При запуске,МК находит только один датчик. Что я делаю не так?
#include <mega8>
#asm
.equ __w1_port=0x15 ;PORTC
.equ __w1_bit=0
#endasm
#include <1wire>
#include <ds18b20>
#define MAX_DS1820 8
unsigned char rom_codes[MAX_DS1820][9];
#include <stdio>
char lcd_buffer[33];
#include <delay>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd>
int temp[8];
void main(void)
{
unsigned char devices,i;
lcd_init(16);
delay_ms(200);
devices=w1_search(0xf0,rom_codes);
sprintf(lcd_buffer," devices=%u",devices); // devices = 1 ): ???
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(2000);
while (1)
{
temp[0]=ds18b20_temperature(&rom_codes[0]);
if (temp>1000){
temp[0]=4096-temp[0];
temp[0]=-temp[0];
}
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp[0],temp[0]%1);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(500);
};
}
- Реклама
- alex2103
- Прорезались зубы
- Сообщения: 219
- Зарегистрирован: Вт сен 18, 2007 16:41:16
- Откуда: Украина, г. Запорожье
- Контактная информация:
Код: Выделить всё
unsigned char devices,i;
lcd_init(16);
delay_ms(200);
devices=w1_search(0xf0,rom_codes);- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Посмотрите здесь. Сделано на основе Helpa. Интерфейс 1-wire. Код имеет некоторые особенности, но насколько я помню, несколько устройств он находил...
http://forum.cxem.net/index.php?s=&show ... t&p=246243
http://forum.cxem.net/index.php?s=&show ... t&p=246243
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
А это в железе или в симуляторе? Если в Протеусе то серийные номера датчикам поставить разные надо. Иначе по одному и найдет.
Вот рабочий пример (для симулятора):
Вот рабочий пример (для симулятора):
Код: Выделить всё
/*****************************************************
Chip type : ATmega16
Program type : Application
Clock frequency : 16,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=2
#endasm
#include <1wire>
#include <delay>
// Standard Input/Output functions
#define DS1990_FAMILY_CODE 1
#define DS2405_FAMILY_CODE 5
#define DS1822_FAMILY_CODE 0x22
#define DS2430_FAMILY_CODE 0x14
#define DS2431_FAMILY_CODE 0x2d
#define DS18S20_FAMILY_CODE 0x10
#define DS18B20_FAMILY_CODE 0x28
#define DS2433_FAMILY_CODE 0x23
#define SEARCH_ROM 0xF0
#include <stdio>
#define MAX_DEVICES 8
unsigned char rom_code[MAX_DEVICES,9];
void main(void)
{
// Declare your local variables here
unsigned char i,j,devices;
unsigned char n=1;
unsigned int addr = 1;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
#asm("sei")
printf("1-Wire MicroLan Net demo\n\r");
devices=w1_search(SEARCH_ROM,&rom_code[0,0]);
printf("%u device(s) found\n\r",devices);
for (i=0;i<devices;i++)
{
// Acknowledge DS1990 family code.
if (rom_code[i,0]==DS1990_FAMILY_CODE)
printf("DS1990 #%u serial number:",n++);
// Acknowledge DS2405s family code.
else if (rom_code[i,0]==DS2405_FAMILY_CODE)
printf("DS2405 #%u serial number:",n++);
// Acknowledge DS1822s family code.
else if (rom_code[i,0]==DS1822_FAMILY_CODE)
printf("DS1822 #%u serial number:",n++);
// Acknowledge DS2430s family code.
else if (rom_code[i,0]==DS2430_FAMILY_CODE)
printf("DS2430 #%u serial number:",n++);
// Acknowledge DS18S20s family code.
else if (rom_code[i,0]==DS18S20_FAMILY_CODE)
printf("DS18S20 #%u serial number:",n++);
else if (rom_code[i,0]==DS18B20_FAMILY_CODE)
printf("DS18B20 #%u serial number:",n++);
// Acknowledge DS2431 family code.
else if (rom_code[i,0]==DS2431_FAMILY_CODE)
printf("DS2431 #%u serial number:",n++);
// Acknowledge DS2433 family code.
else if (rom_code[i,0]==DS2433_FAMILY_CODE)
printf("DS2433 #%u serial number:",n++);
for (j=1;j<=6;j++) {
printf(" %02X",rom_code[i,j]);
};
printf("\n\r");
}
while (1)
{
};
}
- Вложения
-
- ds18.jpg
- ds18s20+ds18s20+ds18b20+ds18b20+ds1990
- (143.77 КБ) 1466 скачиваний
Последний раз редактировалось Goodefine Пт окт 03, 2008 10:08:39, всего редактировалось 1 раз.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
МК должен находить любые датчики в любых комбинациях - и одинаковые и разные. если это не так - что-то не так в программе
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
мне-то все равно, к кому претензииGoodefine писал(а):Может быть Вы не заметили, но человек использует библиотеку 1wire от CVAVR. Поиск числа устройств - функция этой библиотеки. Поэтому все претензии можно адресовать ее разработчику...
кстати, думаю, что функция как раз работает правильно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
или в ДЕЗ или в СЭС ...Goodefine писал(а): все претензии можно адресовать ее разработчику...
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Правда? Вас не затруднит привести реализацию (без дизасма, разумеется)?ARV писал(а):...исходники библиотечной функции там есть - так что все в силах пользователя...
Судя по:ARV писал(а):...кстати, думаю, что функция как раз работает правильно...
думаете Вы иначе...МК должен находить любые датчики в любых комбинациях - и одинаковые и разные. если это не так - что-то не так в программе
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
пожалуй, я погорячился - исходников там много, но как раз не этой функцииGoodefine писал(а):Правда? Вас не затруднит привести реализацию (без дизасма, разумеется)?
а если кто недоволен - может сам написать функцию, да и писать-то особо нечего - исходник и так доступен - в одном из апноутов от Максима-с-Далласом
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
ООН лучше. а еще лучше в ОБЭП - пусть нажмут на пиратов: ваще обнаглели, ломают, ломают - а оно потом не работает, как хочется! да еще, как выяснилось, и без исходников! безобразие!!!tych писал(а):или в ДЕЗ или в СЭС ...Goodefine писал(а): все претензии можно адресовать ее разработчику...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Огромное спасибо после замене серийные номера датчика в протеуси все заработалоА это в железе или в симуляторе? Если в Протеусе то серийные номера датчикам поставить разные надо. Иначе по одному и найдет.
- Вложения
-
- temp_ds18b20WinRAR.rar
- исходный код+Proteus
- (119.33 КБ) 860 скачиваний
Нет не устраиваетРезультат отображается с одним значащим знаком после запятой, но если выставить градацию датчиков в 0.5С точности это не прибавляет (15.0С и 15.5С отображаются как 15.0С) - Вас это устраивает?
Как вывести на LCD перемену типа float ?
Мне необходим сам алгоритм преобразования
float в char .
- Krik99
- Потрогал лапой паяльник
- Сообщения: 375
- Зарегистрирован: Вс мар 04, 2007 13:14:25
- Откуда: Украина
- Контактная информация:
Меряй сразу в signed int , плюс будет менше ресурсов жрать, так как не надо переводить. Я так делаю (код для измерения с десятичными в переменную int):
Это надо ввести в либу и изменить ds18b20.h , так как у нас функция без плавающе запятой. Значения приймёш типа такого 127 = 12,7*С.
Код: Выделить всё
int ds18b20_temperature_10(unsigned char *addr)
{
int temper;
unsigned char resolution;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
#asm("cli")
w1_write(0x44);
#asm("sei")
delay_ms(conv_delay[resolution]);
if (ds18b20_read_spd(addr)==0) return -9999;
#asm("cli")
w1_init();
#asm("sei")
return ((*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*10)>>4;
}

- Denis-d20
- Открыл глаза
- Сообщения: 52
- Зарегистрирован: Сб ноя 24, 2007 10:06:53
- Откуда: Украина,хмельницкий
- Контактная информация:
Напиши на аську 327117582 все докладно розкажу та покажу може й ти чим поділишся.skalish писал(а):Нет не устраиваетРезультат отображается с одним значащим знаком после запятой, но если выставить градацию датчиков в 0.5С точности это не прибавляет (15.0С и 15.5С отображаются как 15.0С) - Вас это устраивает?
Как вывести на LCD перемену типа float ?
Мне необходим сам алгоритм преобразования
float в char .
Добрый день. В продолжение темы.
Пример в CodeVision для работы с DS18B20, на мой взгляд не очень удачный. Одна из проблем в строке(файл DS18B20.lib)
В результате чего создаётся впечатление, что датчик сильно медленно работает. На самом деле "тормозит" программа.
Можно сделать так:
Это рабочий код для трехпроводного проключения. Необходимо исправить библиотеку, удалив строки
Теперь программа не будет сидеть в одном месте почти секунду. Это для одного датчика, а для нескольких надо доработать вывод показаний. Я проверял с одним.
И собственно говоря вопрос - как можно прочитать регистр температуры датчика? В программировании я практически ничего не понимаю, как производится считывание в примере CodeVision мне не нравится (абсолютно ничего не понятно), поэтому и не нравится. Должна же быть команда BEh, но где она? Нужно просто получить 2 байта из датчика, как это сделать?
Пример в CodeVision для работы с DS18B20, на мой взгляд не очень удачный. Одна из проблем в строке(файл DS18B20.lib)
Код: Выделить всё
delay_ms(conv_delay[resolution]);
Можно сделать так:
Код: Выделить всё
while(1)
{
///////////////////////////// какой-то код /////////////////////////////
if(temper_read) //если температура считана
{
#asm("cli")
w1_init();
w1_write(0xCC); //пропуск ROM чтобы обратиться ко всем датчикам одновременно
w1_write(0x44); //команда на преобразование для всех датчиков
#asm ("sei")
delay_ms(10); //пропуск импульсов ответа датчиков
temper_read=0;
};
///////////////////////////// какой-то код /////////////////////////////
if(PINB.3)//если показания готовы (по даташиту) PORTB.3 куда подкл датчик
{
#asm("cli")
temper=ds18b20_temperature_10(&rom_code[i][0]); // смотри на 3 сообщения выше (от Krik99)
#asm ("sei")
temper_read=1; // показания считаны можно запускать новое преобразование
};
///////////////////////////// какой-то код /////////////////////////////
};Код: Выделить всё
#asm("cli")
w1_write(0x44);
#asm("sei")
delay_ms(conv_delay[resolution]);
#asm("cli")
w1_init();
#asm("sei") И собственно говоря вопрос - как можно прочитать регистр температуры датчика? В программировании я практически ничего не понимаю, как производится считывание в примере CodeVision мне не нравится (абсолютно ничего не понятно), поэтому и не нравится. Должна же быть команда BEh, но где она? Нужно просто получить 2 байта из датчика, как это сделать?


