kiber | Дата: Понедельник, 25.03.2013, 04:21 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: 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
Статус: Offline
| У всех датчиков серийные номера поменял?
|
|
| |
kiber | Дата: Вторник, 26.03.2013, 01:03 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: 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
Статус: Offline
| Почитай про 1wire шину и полистай даташит по датчикам. Пример тебе ни чего не даст без знания как это все работает.
|
|
| |