Atmega1284p и датчик ds18b20 нет показаний температуры

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 29, 2011 09:52:59
Откуда: Ангарск

Сообщение KamomeDono »

Доброго времени суток!
Бьюсь над проблемой уже 3-й день.
CVAVR.
Не работает датчик как надо. Что есть он, что нет его результат тот же.
Библиотеки подключены.

Очень прошу помочь. Кончились варианты.
Заранее спасибо!
Вложения
new term.rar
(617.4 КБ) 139 скачиваний
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Почему не используете стандартные либы кодвижна для датчиков?

А так - проверяйте инициализации, чтобы все временные промежутки выдерживались как надо.
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 29, 2011 09:52:59
Откуда: Ангарск

Сообщение KamomeDono »

Этот проект сделан на основе другого. Потому и библиотеки не родные.
Библиотеки заменены, функции переписаны, датчик так и не работает.

Что посоветуете?
Вложения
EventSystemCV-term.rar
(514.82 КБ) 132 скачивания
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Посоветую отлаживать - проверьте вообще вызывается ли инициализация, проходит ли оно ее...
Да и еще - ножка данных датчика подтянута 4.7к к "+" питания?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 29, 2011 09:52:59
Откуда: Ангарск

Сообщение KamomeDono »

Я так понимаю, функция инициализации из библиотки ds18b20 - ds18b20_init.
Так вот, эта функция должна выдавать 1 в случае присутствия датчика.
Если всё верно, то датчик не видится. Инициализация не проходит.
Вот часть кода:

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

#asm("cli");
if( ds18b20_init( 0, 10, 29, DS18B20_12BIT_RES ) )
{delay_ms( 500 );
 temperature=ds18b20_temperature( 0 ); //Чтение температуры, адрес нуль
   // delay_ms( 30 );
  //Анализ на отрицательную температуру
        LCD_Goto(7,0); tp=temperature;
    if ( tp<1000 ){
      LCD_WriteData('+');
    }
    else{
      LCD_WriteData('-');
      tp = 4096-tp;
    }
}
else {temperature=0;}
  //считываем результат
  LCD_Goto(8,0);
  BCD_3Lcd(temperature);
   #asm("sei");

естественно в начале:

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

#include <ds18b20.h>
// 1 Wire Bus functions
#asm
   .equ __w1_port=0x0B ;PORTD
   .equ __w1_bit=7
#endasm
Где ошибка?

Датчик впрочем подключен верно. Подтяжка в 4,7 кОм на месте.
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

w1_init() делаете перед этим всем?
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 29, 2011 09:52:59
Откуда: Ангарск

Сообщение KamomeDono »

Однократно или при каждом преобразовании?
После того, как вначале процедуры была добавлена w1_init датчик по крайней мере стал опрашиваться (визуально в протеусе), но результат так и не отображается.
Может слишком часто происходит прерывание (250 мс) по которому происходит преобразование?
Вот код:

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

void TIM_Init(void)
{
  TIMSK0 = (1<<OCIE0A);     //разрешаем прерывание таймера т0 при событии совпадение
  TCCR0A = (1<<WGM01)|(0<<WGM00);
  TCCR0B = (1<<CS02)|(0<<CS01)|(1<<CS00); //режим СТС, прескалер - 1024
  TCNT0 = 0;              //обнуляем счетный регистр
  OCR0A = 0x4D;            //прерывания каждые ~ 10 мс
  
  TIMSK1 |= (1<<OCIE1A);                 //разрешаем прерывание таймера т1 при событии совпадение
  TCCR1A = (0<<WGM11)|(0<<WGM10);       
  TCCR1B = (0<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);  //режим работы СТС, прескалер - 1024
  TCNT1H = 0;  TCNT1L = 0;
  OCR1AH = 0x07;
  OCR1AL = 0xA0;
   #asm("sei");          //250 мс
}


interrupt [TIM1_COMPA] void Timer1_compa(void)
{
  ES_PlaceEvent(EVENT_TIMER); 
  TCNT1H = 0;  TCNT1L = 0;}
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Однократно.
Конечно часто, преобразование длится примерно 750 мс!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 29, 2011 09:52:59
Откуда: Ангарск

Сообщение KamomeDono »

Однократно в начале main так и было в начале.
Теперь прерывание раз в 1 минуту.
Результат тот же. Программа не инициализирует датчик. Показывает 0.

Что делать?
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Дайте проект в протеусе тогда уж, посмотрим вечером.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 136
Зарегистрирован: Пн дек 17, 2007 13:15:43

Сообщение john_rise »

Возможно я слишком бегло просмотрел код, но... когда вы работаете с термодатчиком то после некоторых действий вы выводите на дисплей, далее снова работаете с термодатчиком. Дисплей требует довольно приличных времён для вывода информации в результате чего программа работы с термодатчиком ждёт дисплей. Попробуйте читать в буфер, а выводить уже по готовности всех обращений к термодатчику.
Боишся - не делай. Делаешь - не бойся.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 29, 2011 09:52:59
Откуда: Ангарск

Сообщение KamomeDono »

john_rise - попробую переделать.
Проект прилагаю.
Вложения
new term.rar
(114.58 КБ) 145 скачиваний
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 29, 2011 09:52:59
Откуда: Ангарск

Сообщение KamomeDono »

Датчик просто не определяется. Не проходит инициализацию. Думаю дело здесь не в дисплее.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

А проблема оказалась в совершенно тупом фузе :)))
CKDIV8 надо установить в "1" (незапрограммирован)
Ибо сейчас он работает на 1 мгц, соответственно все временные задержки отрабатыватся неправильно, потому и не видит датчик, ибо проект собран под 8 мгц!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 29, 2011 09:52:59
Откуда: Ангарск

Сообщение KamomeDono »

Вот блин... Видать потому, что я не в теме.
Огромное спасибо! Не подскажите ещё как его запрограммировать?
Контактная информация:
Закрыто

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