Отговори на тема  [ 14 мнения ] 
DS18S20 
Автор Съобщение
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Съб Май 17, 2008 11:01 pm
Мнения: 238
Мнение DS18S20
Колеги здравейте.От няколко дена вече се опитвам да пусна един температурен дадчик .Използвам за компилатор "MicroC for PIC" ,контролер Pic18f452 и дисплей LCD HD44780 пуснат на 4бит данова шина,шината за данни на DS18S20 е свързан към порт "A" на контролера - 5 извод.DS18S20 му подавам +5в както и на процесора.Проблема е когато го пусна на дисплея извежда "0.5" градуса и не мърда .Когато затопля DS18S20 със запалка ,отчита температури над 50 градуса .Кода е стандартен и използван от библиотеката в хелпа на компилатора.DS18S20 е пуснат на 9бит резолюция.
Колеги ако имате опит с пускането и инициализацията на DS18S20 споделете мнението си.Някъде бъркам но незнам къде.На симулация на "ISIS Proteus " , нещата са наред - показва си температурата .Пробвах и с друг DS18S20 но проблема остана.Благодаря предварително :) .


Последна промяна nikolovs на Съб Мар 20, 2010 7:15 pm, променена общо 1 път



Съб Мар 20, 2010 3:16 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Съб Май 17, 2008 11:01 pm
Мнения: 238
Мнение 
Процесора се тактува с 20mhz кварц, +5в добре филтрирано захрандване от адаптер .Ето погледнете и кода на програмата :) :

// Set TEMP_RESOLUTION to the corresponding resolution of your DS18x20 sensor:
// 18S20: 9
// 18B20: 12 (default setting; can be 9,10,11,or 12)
const unsigned short TEMP_RESOLUTION = 9;

const int RES_FACTOR_1[4] = {5000, 2500, 1250, 625};
const unsigned int RES_FACTOR_2[4] = {0x0001, 0x0003, 0x0007, 0x000F};
const unsigned int RES_FACTOR_3[4] = {0x8000, 0xC000, 0xE000, 0xF000};

unsigned temp;
unsigned short j, RES_SHIFT;

void Display_Temperature(unsigned int temp) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
unsigned int temp_whole, temp_fraction;
unsigned short i;
char text[8];

// Isolate the fraction and make it a 4-digit decimal integer (for display)
temp_fraction = temp & RES_FACTOR_2[RES_SHIFT - 1];
temp_fraction = temp_fraction * RES_FACTOR_1[RES_SHIFT - 1];
//portc = temp_fraction;
// Handle the whole part of temperature value
temp_whole = temp;

// Is temperature negative?
if ((temp_whole & 0x8000) != 0u) i = 1; // Yes, i = 1
else i = 0; // No, i = 0
PORTC = i;
// Remove the fractional part
temp_whole >>= RES_SHIFT;

// Correct the sign if necessary
if (i) temp_whole |= RES_FACTOR_3[RES_SHIFT - 1];

//portd = temp_whole;
IntToStr(temp_whole, text); // Convert whole part to string
Lcd_Out(2, 6, text); // Print whole part on LCD
Lcd_Chr_Cp('.'); // Print dot to separate fractional part


IntToStr(temp_fraction, text); // Convert fractional part to string

// Add leading zeroes (we display 4 digits fractional part)
if (temp_fraction < 1000u) Lcd_Chr_Cp('0');
if (temp_fraction < 100u) Lcd_Chr_Cp('0');
if (temp_fraction < 10u) Lcd_Chr_Cp('0');

Lcd_Out_Cp(text); // Print fractional part on LCD

Lcd_Chr_Cp(223); // Print degree character
Lcd_Chr_Cp('C'); // Print 'C' for Centigrades
}//~

void main() {
ADCON1 = 0xFF; // Configure RA5 pin as digital I/O
PORTE = 0xFF;
TRISE = 0x0F; // PORTE is input
PORTB = 0;
TRISB = 0; // PORTB is output

// Initialize LCD on PORTB and prepare for output
Lcd_Init(&PORTD);
Lcd_Cmd(Lcd_CURSOR_OFF);
Lcd_Out(1, 1, " Temperature: ");

do { // main loop

Ow_Reset(&PORTА,5); // Onewire reset signal
Ow_Write(&PORTА,5,0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTА,5,0x44); // Issue command CONVERT_T
Delay_us(120);

Ow_Reset(&PORTА,5);
Ow_Write(&PORTА,5,0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTА,5,0xBE); // Issue command READ_SCRATCHPAD
Delay_ms(400);

j = Ow_Read(&PORTА,5); // Get temperature LSB
temp = Ow_Read(&PORTА,5); // Get temperature MSB
temp <<= 8; temp += j; // Form the result
Display_Temperature(temp); // Format and display result on LCD
Delay_ms(500);

} while (1);

}//~!


Последна промяна nikolovs на Съб Мар 20, 2010 7:38 pm, променена общо 2 пъти



Съб Мар 20, 2010 3:46 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Бах маа му 3 пъти ти прочетох въпроса и може би от правописните гршки ли кво нищо не разбрах


Съб Мар 20, 2010 4:00 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Нед Апр 26, 2009 2:24 pm
Мнения: 398
Мнение 
Промени този код:
За твоя процесор.


Прикачени файлове:
One Wire.rar [8.77 KiB]
132 пъти
Нед Мар 21, 2010 12:24 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Съб Май 17, 2008 11:01 pm
Мнения: 238
Мнение 
Хмм колега странно . Този код е от "Micro C for PIC " най новия компилатор .Пробвал съм и с него проблема остава 8O .Даже го сложих на по стара версия на "Micro C 6.2" нещо от сорта, малко го попромених но проблема е същия . Дали е възможно DS18s20 да е повреден .Дали може да не иска да тръгне на някой портове на процесора , чак пък толкова не ми се вярва .Интересното е че само при загряване над 50-60 градуса DS18s20 отговаря .Съмнявам се да не е менте , понеже на корпуса пише само DS1820, а от там кадето го купих го водят DS18s20 :? .Пробвах и на "PIC16f874A" същата работа .


Нед Мар 21, 2010 12:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Сеп 15, 2009 10:44 am
Мнения: 1034
Мнение 
Чети и търси преди да пишеш. На втора страница има тема със същия проблем за същия чип.


Нед Мар 21, 2010 12:37 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Юни 21, 2009 2:25 pm
Мнения: 17
Местоположение: G.Orqhovica
Мнение 
Нали не си забравил резистор 4К7 от DATA към VCC ?


Нед Мар 21, 2010 9:55 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Съб Май 17, 2008 11:01 pm
Мнения: 238
Мнение 
:D От всичко почти възможно пробвах .За резистора пробвах с 20к,10к,4,7к даже и 1,5 няма ефект. Като го запаля с запалката и си отчита всичко над 50 градуса :? .Странно.При други идей споделете . Мисля да се откажа от това дърво DS18s20 , много капризен ми се струва . Поправете ме :)


Нед Мар 21, 2010 10:29 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Нед Апр 26, 2009 2:24 pm
Мнения: 398
Мнение 
Не е дърво аз го ползувам с LCD и с 7seg съм го ползувал работи много добре .

Пускал съм и два сензора заедно без проблем


Нед Мар 21, 2010 10:44 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Е защо се мъчиш с One Wire немога да разбера? :)
С TCN75 не е ли по-добре.
Че и можеш да му пуснеш дълъг кабел. :)

_________________
Ангел Димитров 95


Нед Мар 21, 2010 10:48 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение 
darkshy написа:
Е защо се мъчиш с One Wire немога да разбера? :)
С TCN75 не е ли по-добре.
Че и можеш да му пуснеш дълъг кабел. :)

Не знам в случая каки са причините за избор на DS1820, но мога да ти кажа, че съм пробвал с няколко вида термодатчици между които и TCN74 и от всичките които съм пробвал само DS1820 не се нуждаят от калибриране на устройството. За опит който иска може да си направи 2 еднакви устройства с еднакви сензори ида види, че има нужда от калибровка. Единствено DS1820 бяха единствените които не се нуждаеха, даже и при 12 битов режим (вярно, че при тях е нужно малко повечко време)

А за другото питане - със С на Микроелектроника не съм си играл много защото работя с това на HI-TECH, но в MicroPascal намерих доста грешки в готовите библиотеки и едната беше точно за One Wire.... Та се наложи там да си пиша на ново всичките функции, а на времето го купих тъкмо заради готовите функции... Но май в новатта версия са оправени. Нямам спомени, защото отдавна не съм го пускал....


Пон Мар 29, 2010 12:14 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
darkshy написа:
Е защо се мъчиш с One Wire немога да разбера? :)
С TCN75 не е ли по-добре.
Че и можеш да му пуснеш дълъг кабел. :)
Съгласен съм с @eddiesoft за калибровките. Също, това за дългия кабел важи и за DS-а, даже "предполагам", че може и по-дълъг да е :-) , а и на един кабел може да се навържат много DS-и.
Нека колегата, дето е задал въпроса, да не се обижда, но мисля, че ако "се мъчи" с One Wire, то и с TCN75 ще се мъчи.
DS1820 го ползвам на много места и нямам никакъв проблем... и никога не съм ползвал готови библиотеки за него (предполагам, че за това при мене си върви без ядове :-)).


Пон Апр 05, 2010 9:22 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Дек 01, 2004 12:44 am
Мнения: 2811
Местоположение: София
Мнение 
Gogo написа:
......
DS1820 го ползвам на много места и нямам никакъв проблем...

Имаш ли разработени някакви корпуси за него?

_________________
www.bsms.bg - SMS услуги за фирмите с модерно мислене.


Пон Апр 05, 2010 11:29 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Нед Юли 22, 2007 8:57 pm
Мнения: 607
Местоположение: Белград
Мнение 
Виж си настройките на проекта. По подразбиране, кварцът е 8MHz.
---------------------------------------
Направих експеримент с PIC16F887, както е в примера и с PIC18F4520, защото него имам. 16-цата тръгна веднага и без проблеми. 18-цата, обаче, ме въртя малко, заради конфигурациите, но след няколко минути и тя започна да работи. В началото даваше само нули. Със сигурност имаш проблем с конфигурациите.
Ето кодът за PIC18F4520. Има корекции в оригиналния пример на "Микроелектроника", заради дисплея и процесора. Компилатор MicroC PRO 2.5. По мои си причини го предпочитам пред 3.2. Но няма никаква разлика за този пример. Можеш да компилираш с всяко "PRO". Kварцът е 8MHz:

/*
* Project name:
OneWire (Interfacing the DS1820 temperature sensor - all versions)
* Copyright:
(c) Mikroelektronika, 2008.
* Revision History:
20080930:
- initial release;
* Description:
This code demonstrates one-wire communication with temperature sensor
DS18x20 connected to RA5 or RE2 pin.
MCU reads temperature from the sensor and prints it on the LCD.
The display format of the temperature is 'xxx.xxxx°C'. To obtain correct
results, the 18x20's temperature resolution has to be adjusted (constant
TEMP_RESOLUTION).
* Test configuration:


*/

/// LCD module connections
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections

// Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
// 18S20: 9 (default setting; can be 9,10,11,or 12)
// 18B20: 12
const unsigned short TEMP_RESOLUTION = 9;

char *text = "000.0000";
unsigned temp;

void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;

// check if temperature is negative
if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
}

// extract temp_whole
temp_whole = temp2write >> RES_SHIFT ;

// convert temp_whole to characters
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = '0';

text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
text[2] = temp_whole%10 + 48; // Extract ones digit

// extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;

// convert temp_fraction to characters
text[4] = temp_fraction/1000 + 48; // Extract thousands digit
text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
text[7] = temp_fraction%10 + 48; // Extract ones digit

// print temperature on LCD
Lcd_Out(2, 5, text);
}

void main() {
// ANSEL = 0; // Configure AN pins as digital I/O
// ANSELH = 0;
// C1ON_bit = 0; // Disable comparators
// C2ON_bit = 0;
ADCON1=0xFF;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, " Temperature: ");
// Print degree character, 'C' for Centigrades
Lcd_Chr(2,13,223); // different LCD displays have different char code for degree
// if you see greek alpha letter try typing 178 instead of 223

Lcd_Chr(2,14,'C');

//--- main loop
do {
//--- perform temperature reading
Ow_Reset(&PORTA, 5); // Onewire reset signal
Ow_Write(&PORTA, 5, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 5, 0x44); // Issue command CONVERT_T
Delay_us(120);

Ow_Reset(&PORTA, 5);
Ow_Write(&PORTA, 5, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 5, 0xBE); // Issue command READ_SCRATCHPAD

temp = Ow_Read(&PORTA, 5);
temp = (Ow_Read(&PORTA, 5) << 8) + temp;

//--- Format and display result on Lcd
Display_Temperature(temp);

Delay_ms(500);
} while (1);
}


Сря Апр 07, 2010 2:27 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 14 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни