Четверг, 28.03.2024, 11:34
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Микроконтроллеры » Вопросы по МК » Термометр ds18b20 (руки из жопы)
Термометр ds18b20
kiberДата: Понедельник, 25.03.2013, 04:21 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
Вся проблема в том что на лсд пишет нет датчика , но я то знаю что он есть . Код интуитивно понятен но в протеусе неопределяется на шине датчик. Шина моргает идет опрос и код компилируется. Подскажите где я накасячил

#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x15; PORTC
#endasm
#include <ds18b20.h>
#asm
.equ __w1_port=0x12; PORTD
.equ __w1_bit=3
#endasm

#pragma rl+
char *str1="ЧТЕНИЕ ТЕМПЕРАТУРЫ";
char *str2="No SENSOR!";
#pragma rl-

unsigned char devices;
unsigned char LcdBuffDevices[20];
unsigned char RomCode[2][9];
unsigned char LcdBuff1[20];
unsigned char LcdBuff2[20];
float t1;
float t2;
float t3;
float t4;
float t5;
float t6;

void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
lcd_init( 16 );
lcd_clear( );
while (1)
{
devices=w1_search( DS18B20_SEARCH_ROM_CMD, RomCode ); //поиск датчиков на линии 1-wire

if( devices )
{
sprintf( LcdBuffDevices,"DS18B20 = %u", devices ); //выводим информацию о кол-ве датчиков

lcd_gotoxy( 0,1 ); lcd_puts( LcdBuffDevices ); lcd_gotoxy( 0,0 ); lcd_puts( str1 );

ds18b20_init( &RomCode[0][0], 30, 60, DS18B20_12BIT_RES ); //инициализация первого датчика
ds18b20_init( &RomCode[1][0], 30, 60, DS18B20_12BIT_RES ); //инициализация второго датчика
ds18b20_init( &RomCode[2][0], 30, 60, DS18B20_12BIT_RES ); //инициализация третьего датчика
ds18b20_init( &RomCode[3][0], 30, 60, DS18B20_12BIT_RES ); //инициализация четвертого датчика
ds18b20_init( &RomCode[4][0], 30, 60, DS18B20_12BIT_RES ); //инициализация пятого датчика
ds18b20_init( &RomCode[5][0], 30, 60, DS18B20_12BIT_RES ); //инициализация шестого датчика

while( 1 )
{
//чтение температуры первого датчика
t1 = ds18b20_temperature( &RomCode[0][0] );
if( t1 > 1000 ) { t1 = 4096- t1; t1 = -t1; }
sprintf( LcdBuff1,"t1 %.2f \xefC", t1 );
lcd_gotoxy( 0,2 ); lcd_puts( LcdBuff1 );

//чтение температуры второго датчика
t2 = ds18b20_temperature( &RomCode[1][0] );
if( t2 > 1000 ) { t2 = 4096-t2; t2 = -t2; }
sprintf( LcdBuff2,"t2 %.2f \xefC", t2 );
lcd_gotoxy( 0,3 ); lcd_puts( LcdBuff2 );



//чтение температуры третьего датчика
t3 = ds18b20_temperature( &RomCode[1][0] );
if( t3 > 1000 ) { t3 = 4096-t3; t3 = -t3; }
sprintf( LcdBuff2,"t2 %.2f \xefC", t3 );
lcd_gotoxy( 0,2 ); lcd_puts( LcdBuff1 );

//чтение температуры четвертого датчика
t4 = ds18b20_temperature( &RomCode[1][0] );
if( t4 > 1000 ) { t4 = 4096-t4; t4 = -t4; }
sprintf( LcdBuff2,"t2 %.2f \xefC", t4 );
lcd_gotoxy( 0,3 ); lcd_puts( LcdBuff2 );

//чтение температуры пятого датчика
t5 = ds18b20_temperature( &RomCode[1][0] );
if( t5 > 1000 ) { t5 = 4096-t5; t5 = -t5; }
sprintf( LcdBuff2,"t2 %.2f \xefC", t5 );
lcd_gotoxy( 0,2); lcd_puts( LcdBuff1 );

//чтение температуры шестого датчика
t6 = ds18b20_temperature( &RomCode[1][0] );
if( t6 > 1000 ) { t6 = 4096-t2; t6 = -t6; }
sprintf( LcdBuff2,"t2 %.2f \xefC", t6 );
lcd_gotoxy( 0,3 ); lcd_puts( LcdBuff2 );
}

}else{ lcd_gotoxy( 0,0 ); lcd_puts( str2 ); }

}
}
 
HiSERДата: Понедельник, 25.03.2013, 20:51 | Сообщение # 2
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
У всех датчиков серийные номера поменял?
 
kiberДата: Вторник, 26.03.2013, 01:03 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
пордон но про серийные номера я ничего не слышал

тут такая ситуация я нашол простейший пример в сети:

#include <mega8.h> //библиотека ввода\вывода
#include <delay.h> //библиотека задержки
#asm //сообщаем куда подключен датчик
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm //сообщаем куда подключён экран
.equ __lcd_port=0x18
#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мс
};
}

Дак вот он компилируется в авр симулируется в протеусе и температура выводится но как толко я меняю чип на atmegu16 датчик не определяется и переменная девайсов равна нулю. если можно поподробнее на простом примере что за номера я не тупой  поисковиком пользоватся умею. кстати при замене чипа я правильно указываю новые пин шины и порт.((((
 
HiSERДата: Четверг, 28.03.2013, 15:04 | Сообщение # 4
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Почитай про 1wire шину и полистай даташит по датчикам. Пример тебе ни чего не даст без знания как это все работает.
 
Форум » Микроконтроллеры » Вопросы по МК » Термометр ds18b20 (руки из жопы)
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz