Требуется небольшая помощь с ATmega16 и DS1820

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

вообще-то почитайте доку... и запишите в регистры TH & TL другие значения... и посмотрите что получится...
потом я не нашёл как переводить датчик в термостат... вот именно в доке на ds18b20... значит делаем вывод, что TH & TL это есть диапазон измеряемых температур...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Mozart писал(а):потом я не нашёл как переводить датчик в термостат... вот именно в доке на ds18b20... значит делаем вывод, что TH & TL это есть диапазон измеряемых температур...
DS18B20 не надо переводить в режим термостата. этот режим всегда включен и так. только понимается он извращенно: надо послать команду поиска адресов датчиков, у которых сработал Alarm (т.е. температура вышла за преджелы TH-TL), и тогда сработавшие ответят... бред какой-то...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

DS18B20 не надо переводить в режим термостата. этот режим всегда включен и так. только понимается он извращенно: надо послать команду поиска адресов датчиков, у которых сработал Alarm (т.е. температура вышла за преджелы TH-TL), и тогда сработавшие ответят... бред какой-то...

да это всё ясно... и идея хорошая... и далеко не бред... единственно они могли бы сделать более быстрое преобразование не 750mS а хотя бы 100...

и ещё на сколько ему можно доверять?... вот это проверить бы ещё...
кто проверит скажите...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

я где-то читал, что датчики эти внесены в госреестр средств измерений, так что получается, верить им можно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
traun
Родился
Сообщения: 12
Зарегистрирован: Вт мар 18, 2008 10:50:03

ATmega + DS18B20

Сообщение traun »

Всем здраствуйте, просьба заранее не пинать.
У меня вопрос к тем кто умеет работать с DS18B20.

Написал вот такую программу для работы с этим термодатчиком:

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

Код:   
Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 1,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <mega8535>
#include <wh>

#asm
   .equ __w1_port=0x1B ;PORTA
   .equ __w1_bit=1
#endasm
#include <1wire>
#include <ds1820>
#include <stdlib>
 
 /* maximum number of DS18B20 connected to the bus */
#define MAX_DEVICES 6       

unsigned char rom_codes[MAX_DEVICES][9];



void Init_ports(void) // Указываем необходимые порты как выходы
{
DDRD=0b11111111;
DDRC=0b00000111;
DDRA=0b11111111;
}
   
       char str1[16]="end";
       char str[]=" Dev found";
   
      char devices;
 //---------- ----------       
void main(void)
{

Init_ports();
lcd_init();



/* detect how many DS18B20 devices
   are connected to the bus and
   store their ROM codes in the rom_codes array */ 

//lcd_putsxy(5,0,st_do);
#asm("cli");
devices=w1_search(0xf0,rom_codes);   
#asm("sei");

if (devices>0)  {
lcd_clear();
lcd_puts(str);   
}


lcd_putsxy(5,0,str1);

while (1)
      {     
      };
}   


как видите в теории вроде все правильно, если нет то поправте меня.

К порту А на 1 контакт вешаю датчик выводом DQ, GND - земля, и еще +5 волт на Vdd, а так же сопротивлятор между DQ и Vdd на 4.7 кОм. Вроде бы тоже все верно, если что не правильно - поправьте.

Так вот, при включении питания мега виснет при поиске датчика, почему не знаю, помоги плиз. И еще если резистор отключить то на экране дисплеея сразу получаю end, типо прога работать закончила.

А при запросе температуры получаю -9999.

Помогите пожалуйста советом как все таки правильно работать с этим датчиком и что я сделал не так.
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

ну ёпрст... конечно она у вас будет виснуть... потому что прерываний у вас нет... ну я по крайне мере их не увидел... а второе в цикле while(1) надо что-то написать...
а в третьих она у вам не виснит просто выполняет не известные вам инструкции...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
traun
Родился
Сообщения: 12
Зарегистрирован: Вт мар 18, 2008 10:50:03

Сообщение traun »

Прерываний у меня в программе нету, на что они должны срабатывать? Все делал как в примере cvavr. Можете тогда продемонстрировать полностью рабочую прогу?
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

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

/* detect how many DS18B20 devices 
   are connected to the bus and
   store their ROM codes in the rom_codes array */ 

//lcd_putsxy(5,0,st_do);
#asm("cli");
devices=w1_search(0xf0,rom_codes);   
#asm("sei");

if (devices>0)  {
lcd_clear();
lcd_puts(str);   
}


lcd_putsxy(5,0,str1);

вот это вота надо запихать вот сюда

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

for(;;) {

}

точнее вот сюда

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

whie(1) {

}
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
traun
Родился
Сообщения: 12
Зарегистрирован: Вт мар 18, 2008 10:50:03

Сообщение traun »

Тогда может лучше вот так, типа пока не найдено хотя бы одно устройство - искать...

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

whie(!devices) { 
/* detect how many DS18B20 devices
   are connected to the bus and
   store their ROM codes in the rom_codes array */ 

//lcd_putsxy(5,0,st_do);
#asm("cli");
devices=w1_search(0xf0,rom_codes);   
#asm("sei");

if (devices>0)  {
lcd_clear();
lcd_puts(str);   
}
}

lcd_putsxy(5,0,str1);
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

Тогда может лучше вот так, типа пока не найдено хотя бы одно устройство - искать...

это ваше личное дело... но работать так не будет...
ну найдёт устройство хотф бы одно два три не важно... а дпльше что??? нарисуйте себе алгоритм...

з.ы. читайте книги по Си...!!! ибо ответ на этот вопрос можно найти в книге...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
traun
Родился
Сообщения: 12
Зарегистрирован: Вт мар 18, 2008 10:50:03

Сообщение traun »

Ясно, за совет про алгоритм спасибо.
Это просто начальная стадия, дальше будет цикл где будет считываться информация с датчика и воводится на дисплей.
Ну скажем раз в секунду...
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

вообще я что-то похожее не давно делал... я сделал на прерывании по таймеру...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
traun
Родился
Сообщения: 12
Зарегистрирован: Вт мар 18, 2008 10:50:03

Сообщение traun »

Только что переписал код, как выше, зашил, но результат тот же...
МК в ступоре, я тоже. он по прежнему не находит не одного устройства, оно кстати всего одно...
Виснет на строчке:

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

devices=w1_search(0xf0,rom_codes); 
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

у вас джтаг есть?
покажите функцию... w1_search(0xf0,rom_codes);
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
traun
Родился
Сообщения: 12
Зарегистрирован: Вт мар 18, 2008 10:50:03

Сообщение traun »

Mozart писал(а):у вас джтаг есть?
покажите функцию... w1_search(0xf0,rom_codes);


функция стандартная из библиотеки 1-wire, что такое джтаг? Я с мк работаю всего пару месяцев...
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

я не телепат... что такое 0xF0 и rom_codes в этой функции??
и как работает ваша стандартная функция я тоже не знаю.

потом вы уверены что собрали свою конструкцию прально?? точно ничего не перепутали?

порты правильно настроили??? напишите ещё на всякий случай PORTx =0x00;
а ЖК работает?

джтаг что такое?? смотрите на сайте www.atmel.com

ну и писатель же вы!!!

вместо этого...

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

if (devices>0)  { 
lcd_clear();
lcd_puts(str);   
}
lcd_putsxy(5,0,str1);


напишите это

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

if (devices>0)  { 
lcd_clear();
lcd_puts(str);   
}
else
  lcd_putsxy(5,0,str1);
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

заработало?
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
traun
Родился
Сообщения: 12
Зарегистрирован: Вт мар 18, 2008 10:50:03

Сообщение traun »

Устройство собрано верно... проверил несколько раз. Если убрать строку поиска датчика, то на него сразу выводится END. так что все тут в порядке... Но работать все равно не хочет... Сегодня попробую реализовать Функцию поиска датчика самостоятельно... Наткнулся вчера на статью ARV, хотя может даже просто датчик дохлый...
Аватара пользователя
Mozart
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Пт мар 10, 2006 12:23:05
Откуда: Moscow
Контактная информация:

Сообщение Mozart »

напишите вот так ...

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

if (devices > 0)  { 
lcd_clear();
lcd_puts(str);   
}
else
  lcd_putsxy(5,0,str1);

добавьте else почле if(devices > 0)
а то ваша прога опред датчик после вывода str она выводит str1
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
traun
Родился
Сообщения: 12
Зарегистрирован: Вт мар 18, 2008 10:50:03

Сообщение traun »

Mozart писал(а):напишите вот так ...

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

if (devices > 0)  { 
lcd_clear();
lcd_puts(str);   
}
else
  lcd_putsxy(5,0,str1);

добавьте else почле if(devices > 0)
а то ваша прога опред датчик после вывода str она выводит str1


Мой термометр заработал....
Дело было вовсе не в программе, а как раз наооборот в аппаратной части...
Когда я первый раз подключал этот датчик к Мк, я не правильно подпаял сам датчик и подтягивающий резистор...
Датчик сгорел... свою ошибку я понял, но вот совсем не подумал о том, что мог сгореть и порт... Что в последствии я и обнаружил. :cry: Тогда я прошил новый МК, все заработало почти сразу... :))
Закрыто

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