Двухканальный термометр на AtMega8
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Двухканальный термометр на AtMega8
Замечания, вопросы и пожелания по двухканальному термометру http://radiokot.ru/circuit/digital/home/128/ складывайте здесь.
- Реклама
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Двухканальный термометр на AtMega8
А как программа узнает, который датчик внешний, а который внутренний? При наличии такого количества свободных портов зачем садить два датчика параллельно? Ну и еще замечание - нет никакой защиты линии внешнего датчика.
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Re: Двухканальный термометр на AtMega8
Леонид Иванович, программа не знает, какой датчик внешний, а какой-внутренний. Ей все равно. С каждого датчика показания выводятся на свой дисплей. На нижнем дисплее у меня температура на улице, на верхнем-дома. Они местами не поменяются. По поводу того, что 2 датчика в параллель. В МК только одна ножка может быть запрограммирована на прием и передачу данных по интерфейсу 1-Wire. А опрос датчиков делается по его адресу, который программа узнает при инициализации датчиков. Программа знает, сколько датчиков подключено. А защита там и не нужна вовсе. Какая должна быть ее функция? От замыкания? Ну тогда можно предохранитель поставить....Привожу пример из даташита на датчик. Никакой защиты там не нужно.
- Вложения
-
- 2012-05-16_181701.png
- (19.15 КБ) 2343 скачивания
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Re: Двухканальный термометр на AtMega8
ELcat.
Вот пример для датчиков.
#asm("sei") //разрешаем прерывания
num_dat=w1_search(0xf0,rom_codes);//поиск датчиков
ds18b20_init( &rom_codes[0][0], 0, 0, DS18B20_12BIT_RES ); //инициализация первого датчика
ds18b20_init( &rom_codes[1][0], 0, 0, DS18B20_12BIT_RES ); //инициализация второго датчика
При обращении к конкретному датчику
tem1=ds18b20_temperature(&rom_codes[1][0]); // в переменную пишем значение, прочитанное из датчика
Вот пример для датчиков.
#asm("sei") //разрешаем прерывания
num_dat=w1_search(0xf0,rom_codes);//поиск датчиков
ds18b20_init( &rom_codes[0][0], 0, 0, DS18B20_12BIT_RES ); //инициализация первого датчика
ds18b20_init( &rom_codes[1][0], 0, 0, DS18B20_12BIT_RES ); //инициализация второго датчика
При обращении к конкретному датчику
tem1=ds18b20_temperature(&rom_codes[1][0]); // в переменную пишем значение, прочитанное из датчика
Re: Двухканальный термометр на AtMega8
добрый день! Как проецируется отрицательные температуры?
- Реклама
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Re: Двухканальный термометр на AtMega8
При отрицательной температуре от -0,1 градуса до -9,9 градуса знак минус спереди. Один знак после запятой. Ниже -10 градусов только знак минуса без десятичного знака
Re: Двухканальный термометр на AtMega8
Спасибо!!!!
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Двухканальный термометр на AtMega8
Вот это и плохо. Должна быть четкая привязка, например, верхний дисплей - комната, нижний - улица.Nusik1975 писал(а):Леонид Иванович, программа не знает, какой датчик внешний, а какой-внутренний.
Почему же? Портов 1-Wire можно сделать столько, сколько есть свободных ног. Например, вот здесь http://www.digit-el.com/files/products/ ... fn-603.jpg у меня их шесть.Nusik1975 писал(а):В МК только одна ножка может быть запрограммирована на прием и передачу данных по интерфейсу 1-Wire.
Если провод датчика тянется на улицу, то защита нужна обязательно. На линии питания датчика - от замыкания (хотя бы 100 Ом последовательно). На линии данных - от перенапряжения, чтобы наводками не повредило порт процессора, например, во время грозы. Резистор последовательно + диоды на землю и питание. Если в даташите на датчик не нарисована защита, это не значит, что она не нужна ни в каких ситуациях.Nusik1975 писал(а):А защита там и не нужна вовсе. Какая должна быть ее функция? От замыкания? Ну тогда можно предохранитель поставить....Привожу пример из даташита на датчик. Никакой защиты там не нужно.
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Re: Двухканальный термометр на AtMega8
Я же написал, что у меня верхний дисплей дом, нижний-улица. Четкая привязка!
Производитель не указывает, что нужна защита. Я не спорю, можно и поставить. Я не ставил.
В данном проекте не вижу смысла использовать несколько ножек процессора.
P.S. Я только начинаю делать первые шаги в программировании МК, поэтому рациональные предложения принимаю!
Производитель не указывает, что нужна защита. Я не спорю, можно и поставить. Я не ставил.
В данном проекте не вижу смысла использовать несколько ножек процессора.
P.S. Я только начинаю делать первые шаги в программировании МК, поэтому рациональные предложения принимаю!
Re: Двухканальный термометр на AtMega8
Скорее всего, вы так же как и я, просто не имеете примера как это реализуется в коде (похоже программа написани на С ?)Nusik1975 писал(а):В данном проекте не вижу смысла использовать несколько ножек процессора.P.S. Я только начинаю делать первые шаги в программировании МК, поэтому рациональные предложения принимаю!
Я бы тоже с удовольствием посмотрел такой кусок кода где 1-Wire можно сделать столько, сколько есть свободных ног.....
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Re: Двухканальный термометр на AtMega8
Да, я начинающий. И тоже с удовольствием посмотрю, если Леонид Иванович покажет в коде, как это делать. Просим! Наверное там библиотека переделываться будет... И да, я пишу на Си. Асм не знаю
Re: Двухканальный термометр на AtMega8
Если там переделывается библиотека, то мне тот кусок кода ничем не поможет, я например еще не на том уровне осмысления программирования 
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Re: Двухканальный термометр на AtMega8
Да это практически то же самое.
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Двухканальный термометр на AtMega8
Так как у Вас - неудобно. Нужно включить термометр, посмотреть, какой из датчиков отображается на нижнем дисплее, затем именно его вывести на улицу. А что будет, если датчик придется заменить? Серийный номер может оказаться как больше, так и меньше. Правильное решение - использовать две ножки контроллера для получения двух 1-Wire портов. Тогда один из них можно закрепить за улицей, второй - за помещением.Nusik1975 писал(а):Я же написал, что у меня верхний дисплей дом, нижний-улица. Четкая привязка!
Не там смотрите. Про защиту нужно смотреть не в даташитах по 1-Wire микросхемах, а в Application Notes по шине 1-Wire. Там много про защиту написано.Nusik1975 писал(а):Производитель не указывает, что нужна защита.
Пример организации 6-ти портов 1-Wire:
Код: Выделить всё
//----------------------------------------------------------------------------
//--------------------------- Цифровые датчики: ------------------------------
//----------------------------------------------------------------------------
//Используются термометры DS18B20 (S20), которые подключены к портам OWPn.
//Считанное значение температуры заносится в массив Temp[],
//температура представлена в десятых долях градуса.
//Диапазон возможных температур составляет от TEMP_MIN до TEMP_MAX
//градусов. При отсутствии термометра показания равны TEMP_MIN.
//------------------------------- Константы: ---------------------------------
#define FCLK 18.432 //тактовая частота, Мгц
#define OWP0 (1 << PC0) //порт цифрового термометра 0
#define OWP1 (1 << PC1) //порт цифрового термометра 1
#define OWP2 (1 << PC2) //порт цифрового термометра 2
#define OWP3 (1 << PC3) //порт цифрового термометра 3
#define OWP4 (1 << PC4) //порт цифрового термометра 4
#define OWP5 (1 << PC5) //порт цифрового термометра 5
//Маски термометров:
const __flash char Masks[CHANNELS] = {OWP0, OWP1, OWP2, OWP3, OWP4, OWP5};
//-------------------------------- Макросы: ----------------------------------
//Макроопределения для работы с портами:
#define Port_OWP_0(m) (DDRC |= m)
#define Port_OWP_Z(m) (DDRC &= ~m)
#define Pin_OWP(m) (PINC & m)
#define WORD(b1,b0) ((unsigned int)(b1 << 8) | b0)
#define Delay_us(x) __delay_cycles((int)(x * FCLK + 0.5))
//------------------------------- Переменные: --------------------------------
static int Temp[CHANNELS]; //текущая температура
static bool Present[CHANNELS]; //флаги присутствия термометров
//---------------------------- Прототипы функций: ----------------------------
void Start(char n); //старт термометра
void Read(char n); //чтение термометра
void TReset(char n); //генерация импульса сброса
char TByte(char n, char dat); //запись/чтение байта
bool TBit(char n, bool b); //запись/чтение бита
void Do_Crc(char b, char *crc); //вычисление CRC
//------------------ Инициализация измерителя температуры: -------------------
void Therm_Init(void)
{
for(char i = 0; i < CHANNELS; i++)
{
Temp[i] = TEMP_MIN; //инициализация температуры
Start(i); //старт всех термометров
}
}
//------------------------ Измерение температуры: ----------------------------
void Therm_Exe(char n) //должна вызываться в основном цикле
//раз в 750 мс с интересующими значениями n
{
Read(n); //чтение термометра - самое первое измерение
Start(n); //старт термометра
}
//-------------------------- Старт термометра: -------------------------------
void Start(char n)
{
TReset(n); //импульс сброса
if(Present[n])
{
TByte(n, 0xCC); //skip ROM
TByte(n, 0x44); //convert T
}
}
//------------------------- Чтение термометра: -------------------------------
void Read(char n)
{
if(Present[n])
{
TReset(n); //импульс сброса
if(Present[n])
{
TByte(n, 0xCC); //skip ROM
TByte(n, 0xBE); //read scratchpad
char Data[9]; //данные термометра
char Crc = 0; //инициализация CRC
for(char i = 0; i < 9; i++)
{
char b = TByte(n, 0xFF); //чтение данных
Do_Crc(b, &Crc); //обновление CRC
Data[i] = b; //сохранение данных
}
int t = TEMP_MIN;
if(!Crc)
{
#ifdef DS18B20
t = WORD(Data[1], Data[0]); //температура с дискретностью 0.0625°C
t = (t * 10) / 16; //температура с дискретностью 0.1°C
#else
t = WORD(Data[1], Data[0]) / 2;
t = (t * 20 - 5 + (int)(Data[7] - Data[6]) * 20 / Data[7]) / 2;
#endif
}
Temp[n] = t;
return;
}
}
Temp[n] = TEMP_MIN; //термометр отсутствует
return;
}
//--------------------- Генерация импульса сброса: ---------------------------
void TReset(char n)
{
char m = Masks[n];
char si;
Present[n] = 0; //сброс флага присутствия термометра
Port_OWP_0(m); //OWP <- 0
Delay_us(500); //delay 500 uS
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP_Z(m); //OWP <- 1
Delay_us(14); //delay 14 uS
if(Pin_OWP(m)) //если OWP = 0, то ошибка
{
Delay_us(52); //delay 52 uS
if(!Pin_OWP(m)) //если OWP = 1, то ошибка
{
__restore_interrupt(si); //восстанавление прерываний
Delay_us(250); //delay 250 uS
if(Pin_OWP(m)) //если OWP = 0, то ошибка
{
Present[n] = 1; //если ошибок нет, термометр присутствует
}
}
}
__restore_interrupt(si); //восстанавление прерываний в случае ошибки
}
//-------------- Запись/чтение байта по однопроводной шине: ------------------
char TByte(char n, char dat)
{
char res;
char m = Masks[n];
for(char i = 0; i < 8; i++)
{
res = res >> 1;
if(TBit(m, dat & 1)) res |= 0x80;
else res &= ~0x80;
dat = dat >> 1;
}
return(res);
}
//--------------- Запись/чтение бита по однопроводной шине: ------------------
bool TBit(char m, bool b)
{
char si;
si = __save_interrupt();
__disable_interrupt(); //запрещение прерываний
Port_OWP_0(m); //OWP <- 0
Delay_us(2); //delay 2 uS
if(b) Port_OWP_Z(m); //bit = 1, OWP <- 1
Delay_us(13); //delay 13 uS
bool owp = Pin_OWP(m); //чтение порта
Delay_us(45); //delay 45 uS
Port_OWP_Z(m); //OWP <- 1
__restore_interrupt(si); //восстанавление прерываний
Delay_us(2); //delay 2 uS
return(owp);
}
//--------------------- Вычисление контрольной суммы: ------------------------
void Do_Crc(char b, char *crc)
{
for(char i = 0; i < 8; b = b >> 1, i++)
if((b ^ *crc) & 1) *crc = ((*crc ^ 0x18) >> 1) | 0x80;
else *crc = (*crc >> 1) & ~0x80;
}
//------------------------ Чтение температуры: -------------------------------
int Therm_GetT(char ch)
{
if(ch < CHANNELS)
return(Temp[ch]);
else return(0);
}
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Re: Двухканальный термометр на AtMega8
О, Леонид Иванович , большое спасибо за ликбез! Буду знать!
Re: Двухканальный термометр на AtMega8
В эту зиму был у меня установленный термометр измеряющий температуру в атомо и был такой мороз что жки, очевидно (как я понял-замерз). Девайс понравился, хочу собрать, но: 1-не могу считать печатную плату, 2-у меня куча индикаторов с общим катодом- возможно ли дополнить проект с индикатором с общим катодом?
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Re: Двухканальный термометр на AtMega8
Печатная плата дана в формате Sprint Layot. А для общих катодов может когда-нибудь и сделаю. Пока ничего не могу обещать.
Просто нет времени.
Просто нет времени.
-
friendless
- Открыл глаза
- Сообщения: 54
- Зарегистрирован: Чт янв 19, 2012 19:23:47
- Откуда: Poltava
Re: Двухканальный термометр на AtMega8
Доброе время суток.
Есть ли описание по работе с ошибками? У меня высвечивает Out и Err. Хотя последнее - это ошибка, но чего? Подскажите пожалуйста
Есть ли описание по работе с ошибками? У меня высвечивает Out и Err. Хотя последнее - это ошибка, но чего? Подскажите пожалуйста
- Nusik1975
- Электрический кот
- Сообщения: 1023
- Зарегистрирован: Чт мар 04, 2010 13:48:56
- Откуда: Недалеко от Тулы
Re: Двухканальный термометр на AtMega8
Сообщение Err выводится при ошибке чтения датчика. Причин тут может быть несколько - низкое напряжение питания датчика, неправильно распаян датчик, обрыв проводов до датчика, неисправность датчика. Программа 40 раз пытается считать данные с датчика, и если безуспешно, то выводится Err.
Сообщение Out будет выводиться, если температура превысит порог +120 градусов.
Проверьте, действительно ли у Вас подключен датчик DS18B20, именно с такой маркировкой. Работу датчиков DS1820 и DS18S20 я не гарантирую на этом термометре, поскольку на эти датчики своя библиотека в программе.
Сообщение Out будет выводиться, если температура превысит порог +120 градусов.
Проверьте, действительно ли у Вас подключен датчик DS18B20, именно с такой маркировкой. Работу датчиков DS1820 и DS18S20 я не гарантирую на этом термометре, поскольку на эти датчики своя библиотека в программе.
Re: Двухканальный термометр на AtMega8
Привет! Если это твой "первый шаг" в программировании, то, должен заметить, довольно-таки серьёзный
Я, например до сих пор не решился поковырять 1-wire, хотя уже года 4 работаю с AVR. По поводу защиты - поставь супрессор 0.6KE6.8CA по питанию МК и какой-нибудь диод Шоттки 1N5817 или SS14 с линии 1-wire на линию +Vcc и на землю, далее выходящие с платы к датчикам линии через резисторы 22-33Ом. Это и будет лучшая защита.


