| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| DS18S20 http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=7661 |
Страница 1 от 1 |
| Автор: | nikolovs [ Съб Мар 20, 2010 3:16 pm ] |
| Заглавие: | 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 3:46 pm ] |
| Заглавие: | |
Процесора се тактува с 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); }//~! |
|
| Автор: | valioman [ Съб Мар 20, 2010 4:00 pm ] |
| Заглавие: | |
Бах маа му 3 пъти ти прочетох въпроса и може би от правописните гршки ли кво нищо не разбрах |
|
| Автор: | Наско [ Нед Мар 21, 2010 12:24 am ] | ||
| Заглавие: | |||
Промени този код: За твоя процесор.
|
|||
| Автор: | nikolovs [ Нед Мар 21, 2010 12:19 pm ] |
| Заглавие: | |
Хмм колега странно . Този код е от "Micro C for PIC " най новия компилатор .Пробвал съм и с него проблема остава |
|
| Автор: | 741 [ Нед Мар 21, 2010 12:37 pm ] |
| Заглавие: | |
Чети и търси преди да пишеш. На втора страница има тема със същия проблем за същия чип. |
|
| Автор: | dimityra [ Нед Мар 21, 2010 9:55 pm ] |
| Заглавие: | |
Нали не си забравил резистор 4К7 от DATA към VCC ? |
|
| Автор: | nikolovs [ Нед Мар 21, 2010 10:29 pm ] |
| Заглавие: | |
| Автор: | Наско [ Нед Мар 21, 2010 10:44 pm ] |
| Заглавие: | |
Не е дърво аз го ползувам с LCD и с 7seg съм го ползувал работи много добре . Пускал съм и два сензора заедно без проблем |
|
| Автор: | darkshy [ Нед Мар 21, 2010 10:48 pm ] |
| Заглавие: | |
Е защо се мъчиш с One Wire немога да разбера? С TCN75 не е ли по-добре. Че и можеш да му пуснеш дълъг кабел. |
|
| Автор: | eddiesoft [ Пон Мар 29, 2010 12:14 am ] | |||||||||
| Заглавие: | ||||||||||
Не знам в случая каки са причините за избор на DS1820, но мога да ти кажа, че съм пробвал с няколко вида термодатчици между които и TCN74 и от всичките които съм пробвал само DS1820 не се нуждаят от калибриране на устройството. За опит който иска може да си направи 2 еднакви устройства с еднакви сензори ида види, че има нужда от калибровка. Единствено DS1820 бяха единствените които не се нуждаеха, даже и при 12 битов режим (вярно, че при тях е нужно малко повечко време) А за другото питане - със С на Микроелектроника не съм си играл много защото работя с това на HI-TECH, но в MicroPascal намерих доста грешки в готовите библиотеки и едната беше точно за One Wire.... Та се наложи там да си пиша на ново всичките функции, а на времето го купих тъкмо заради готовите функции... Но май в новатта версия са оправени. Нямам спомени, защото отдавна не съм го пускал.... |
||||||||||
| Автор: | Gogo [ Пон Апр 05, 2010 9:22 pm ] | |||||||||
| Заглавие: | ||||||||||
Нека колегата, дето е задал въпроса, да не се обижда, но мисля, че ако "се мъчи" с One Wire, то и с TCN75 ще се мъчи. DS1820 го ползвам на много места и нямам никакъв проблем... и никога не съм ползвал готови библиотеки за него (предполагам, че за това при мене си върви без ядове |
||||||||||
| Автор: | Lupus [ Пон Апр 05, 2010 11:29 pm ] | |||||||||
| Заглавие: | ||||||||||
Имаш ли разработени някакви корпуси за него? |
||||||||||
| Автор: | E1 [ Сря Апр 07, 2010 2:27 pm ] |
| Заглавие: | |
Виж си настройките на проекта. По подразбиране, кварцът е 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); } |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|