Перейти к содержанию

Рекомендуемые сообщения

Здравствуйте. В общем тема избитая но не получается хоть убей. Есть 1 датчик ds18b20 микроконтроллер ATmega8515. Программирую в CodevisionAVR. Между линией данных DQ и плюсом питания поставил резистор на 4.7кОМ. Пишу,копирую программы для того чтобы сделать хоть термометр, а упорно микроконтроллер не видит датчика. Думал уже что датчик не рабочий купил второй, все равно не работает мой термометр. Вот пример программ.

#include <mega8515.h> //библиотека ввода\вывода

#include <delay.h> //библиотека задержки

#asm //сообщаем куда подключен датчик

.equ __w1_port=0x1b; PORTA

.equ __w1_bit=0

#endasm

#asm //сообщаем куда подключён экран PORTC

.equ __lcd_port=0x15

#endasm

#include <lcd.h> //библиотека для LCD

#include <1wire.h> //библиотека работы с 1Wire

#include <ds18b20.h> //библиотека для работы с датчиком ds18b20

#include <stdio.h>

char lcd_buffer[33]; //масив с данными для экрана

void main(void)

{

unsigned char devices; //переменная в которой количество присоеденённых датчиков

int temp; //переменная для хранения температуры

lcd_init(16); //инициилизация LCD, и говорим что он на 16 символов

devices=w1_init(); //ищим датчики

while(devices>0) //бесконечный цикл, если датчик подключон

{

temp=ds18b20_temperature(0); //читаем температуру

if (temp>1000){ //если датчик выдаёт больше 1000

temp=4096-temp; //отнимаем от данных 4096

temp=-temp; //и ставим знак "минус"

}

sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записуемв масив для экрана температуру и всё такое

lcd_clear(); //чистим дисплей перед выводом

lcd_puts(lcd_buffer); //выводим масив на LCD

delay_ms(500); //ждём 500мс

};

}

Хотя судя по всему неправильно подключен датчик. Но почему непонятно. Датчик подключен выводом GND к минусу DQ к выводу микроконтроллера, VDD к плюсу, причем выводы DQ и VDD соединены через резистор на 4.7 кОМ. На проводе DQ микроконтроллер выдает напряжение 5 вольт тестером мерял. Может кто знает в чем проблема, я уже чуть ли не с бубном прыгал. Номинал резисторов тоже кстати менял, чет не помогает.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Вот так всегда пока не напишеш на форум ничего не получается. Выставил 2 МГц частоту микроконтроллера и заработал датчик.

Да он кароче орет с меня падла. Не хотел работать на 1,4,8 МГц а щас работатет на этих частотах.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

В общем чтобы не плодить новых тем хотел спросить. У меня термостат на DS18B20 и ATmega8515. Программа написана в CоdevisionAVR. Датчик при измерении температуры периодически начинает показывать -112.9 градусов. Когда такое происходит обогреватель перестает работать, а потом через секунды 3 снова включается. Такой режим вреден как для обогревателя так и для поддержания нужной температуры. Хотел бы как то программно исправить такой баг, но вот не могу понять как. Что самое примечательное 2 дня назад очень редко появлялась такая помеха в виде -112.9. Кроме того в погребе где термостат с обогревателем находятся в принципе не может быть больших помех, связи телефонной и той нету. А вот пару часов назад зашел ну прям пипец, 5 минут от силы поработает и начинает термостат колбасить по полной. Может кто поможет и подскажет почему такие проблемы начались, а то сначала думал виноваты соседи с колонками на всю громкость и включенными инструментами но сейчас ночь уже никто не работает? Вот код программы.

#include <mega8515.h> //Библиотека меги8

#include <ds18x20_v2.h> //Библиотека датчика

#include <lcd.h> //Библиотека LCD

#include <stdio.h> //Библиотека ввода/вывода

#include <delay.h> //Библиотека задержек

#asm

.equ __lcd_port=0x15 ;//Индикатор подключаем к PORTС

.equ __w1_port=0x1b ;//Датчики подключаем к PORTА

.equ __w1_bit=0 //Датчики подключаем к биту 0

#endasm

#define MAX_DEVICES 8 //Сколько можно подключить датчиков

unsigned char rom_code[MAX_DEVICES][9];//Область памяти (9 байт) для хранения ROM-кода датчиков

char lcd_buffer[33];

unsigned char i, devices, celie, drob;

int temperature;

unsigned int temp, drob_tmp;

void main(void){//Главная функция

DDRA=0b00000010;

PORTA=0x00;

lcd_init(16);//Инициализация дисплея

devices=w1_search(0xf0,rom_code);//Ищим датчики

sprintf(lcd_buffer,"%u DS18B20",devices);//Готовим строку для вывода

lcd_puts(lcd_buffer);//Выводим строку

delay_ms(2000);//Ждем 2 сек

lcd_clear();//Очистим дисплей

while (1){//Вечный цикл

for (i=0;i<devices;){//Прокрутим этот цикл столько раз, сколько у нас датчиков

temperature=ds18b20_temperature(&rom_code[0]);//Вытаскиваем показания датчика

temp = (unsigned int) temperature;//Присвоим переменной temp значение переменной temperature с явным указанием типа данных

if (temperature<0)temp = ( ~temp ) + 0x0001; // если число отрицательное перевести его в норм.вид

celie = temp >> 4; // целая часть числа

drob_tmp = temp & 0x000F; // дробная часть числа с точностью 1/16 градуса

drob = (unsigned int) ((drob_tmp * 10) / 16); // преобразование дробной части в формате "1/16 градуса" в десятичный формат с точностью 0,1 градуса

if (celie<=19 && drob<=3 && i==0)PORTA.1=1;

if (celie>=21 && drob>=1 && i==0)PORTA.1=0;

if (temperature>=0) {//Если темп. плюсовая или 0

sprintf(lcd_buffer,"t%u=%u.%u",++i,celie,drob);//Если темп. плюсовая или 0, то покажем эту строку

}

else{

sprintf(lcd_buffer,"t%u=-%u.%u",++i,celie,drob);//Если темп. минусовая, то покажем эту строку

}

lcd_clear();

lcd_puts(lcd_buffer);//Выводим строку на дисплей

delay_ms (500);

}

};

}

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Что-то я не увидел в Вашем коде команду "конвертировать температуру - 0x44h", которая должна выполняться каждый раз перед чтением результата.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...