| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| ds18b20 http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=11014 |
Страница 1 от 4 |
| Автор: | dasistvas [ Сря Яну 23, 2013 12:30 am ] | |||
| Заглавие: | ds18b20 | |||
Здравейте, имам проблем с кода за температурния сензор ds18b20. Микроконтролера който използвам е pic16f913.
|
||||
| Автор: | palavrov [ Сря Яну 23, 2013 2:38 am ] |
| Заглавие: | Re: ds18b20 |
И какъв е проблема? |
|
| Автор: | dasistvas [ Сря Яну 23, 2013 3:00 am ] |
| Заглавие: | Re: ds18b20 |
Проблема, е че LCD нито се инициализира, нито показва стойност. |
|
| Автор: | didofen [ Сря Яну 23, 2013 9:54 am ] |
| Заглавие: | Re: ds18b20 |
последно с датчика или с дисплея ти е проблема |
|
| Автор: | dasistvas [ Сря Яну 23, 2013 11:20 am ] |
| Заглавие: | Re: ds18b20 |
Ако пусна програмата за lcd отделно тя тръгва, но когато я прибавя към проекта със сензора нищо не става и не знам къде е проблема. |
|
| Автор: | Cekins [ Сря Яну 23, 2013 11:49 am ] |
| Заглавие: | Re: ds18b20 |
Ама колегите са си забраили боба в къщи, пък аз кокалчетата в офиса... |
|
| Автор: | stoyanoff [ Сря Яну 23, 2013 11:53 am ] |
| Заглавие: | Re: ds18b20 |
Опитай да зададеш посоките на пиновете 1 по 1. Особено на порт А, където е сензора и RS. Предполагам, че понеже сензорът използва 1 пин като вход и изход, това обръща RS и не го използваш като изход, когато трябва. |
|
| Автор: | dasistvas [ Сря Яну 23, 2013 11:58 am ] | |||||||||
| Заглавие: | Re: ds18b20 | |||||||||
#define Port_18B20 RA0 #define Tx_18B20 TRISA0 = 0 #define Rx_18B20 TRISA0 = 1 Aз съм ги задал. |
||||||||||
| Автор: | palavrov [ Сря Яну 23, 2013 12:30 pm ] |
| Заглавие: | Re: ds18b20 |
Ами няма и да стане ... я си виж програмата, като измериш температурата от датчика дали си правиш труда да покажеш стойноста на LCD-то |
|
| Автор: | stoyanoff [ Сря Яну 23, 2013 12:33 pm ] |
| Заглавие: | Re: ds18b20 |
Той казва, че LDC-то не се инициализира. Погледни из цялата програма дали не променящ посоките някъде другаде.. |
|
| Автор: | dasistvas [ Сря Яну 23, 2013 12:39 pm ] | ||||||||||||||||||
| Заглавие: | Re: ds18b20 | ||||||||||||||||||
А можеш ли да ми кажеш как мога да покажа стойноста на LCD.
Ако пусна само LCD и му пусна да чете някаква дума, го прави, но когато го сложа във програмата не става нищо. |
|||||||||||||||||||
| Автор: | stoyanoff [ Сря Яну 23, 2013 12:56 pm ] |
| Заглавие: | Re: ds18b20 |
А може ли да дадеш примерен код(няколко реда) как правиш едното(как задаваш дума) и как пращаш число?! |
|
| Автор: | dasistvas [ Сря Яну 23, 2013 12:58 pm ] |
| Заглавие: | Re: ds18b20 |
#include <htc.h> #ifndef _XTAL_FREQ #define _XTAL_FREQ 8000000 #endif #include "lcd.h" #define Skip_ROM 0xCC #define Convert_T 0x44 #define Read_scratchpad 0xBE #define Port_18B20 RA0 #define Tx_18B20 TRISA0 = 0 #define Rx_18B20 TRISA0 = 1 unsigned char reset(); void write(char WRT); unsigned char read(); int main(void) { unsigned temp; unsigned short tempL, tempH, fraction; unsigned int i = 0; lcd_init(); lcd_goto(0); lcd_puts("DS18B20 sw1=rdy"); __delay_ms(1000); lcd_clear(); lcd_puts("DS18B20"); //LCD display for the starting part lcd_goto(0x40); lcd_puts(":Degree C"); while(1) // create an infinite loop { if(!reset()) { write(Skip_ROM); write(Convert_T); __delay_ms(750); reset(); write(Skip_ROM); write(Read_scratchpad); tempL = read(); //read low temp value tempH = read(); //read high temp value i=((unsigned int)tempH << 8 ) + (unsigned int)tempL; //put both value in one variable i = (float)i * 6.25 ; //calcuation from the table provided lcd_goto(0x40); } } while(1) continue; } unsigned char reset() { Tx_18B20; // Tris = 0 (output) Port_18B20 = 0; // set pin# to low (0) __delay_us(480); // 1 wire require time delay Rx_18B20; // Tris = 1 (input) __delay_us(60); // 1 wire require time delay if (Port_18B20 == 0) // if there is a presence pluse { __delay_us(480); return 0; // return 0 ( 1-wire is presence) } else { __delay_us(480); return 1; // return 1 ( 1-wire is NOT presence) } } void write(char WRT) { char i,Cmd; Cmd=WRT; Rx_18B20; // set pin# to input (1) for(i = 0; i < 8; i++) { if((Cmd & (1<<i))!= 0) { // write 1 Tx_18B20; // set pin# to output (0) Port_18B20 = 0; // set pin# to low (0) __delay_us(1); // 1 wire require time delay Rx_18B20; // set pin# to input (release the bus) __delay_us(60); // 1 wire require time delay } else { //write 0 Tx_18B20; // set pin# to output (0) Port_18B20 = 0; // set pin# to low (0) __delay_us(60); // 1 wire require time delay Rx_18B20; // set pin# to input (release the bus) } } } unsigned char read() { char i,result = 0; Rx_18B20; // TRIS is input(1) for(i = 0; i < 8; i++) { Tx_18B20; // TRIS is output(0) Port_18B20 = 0; // genarate low pluse for 2us __delay_us(2); Rx_18B20; // TRIS is input(1) release the bus if(Port_18B20 != 0) result |= 1<<i; __delay_us(60); // wait for recovery time } return result; } |
|
| Автор: | palavrov [ Сря Яну 23, 2013 2:09 pm ] | ||||||||||||||||||
| Заглавие: | Re: ds18b20 | ||||||||||||||||||
Тук трябва да преобразуваш i до текст (примерно с itoa()) и след това да го покажеш с lcd_puts() Ама нали се сещаш, че ако трябва да ти обясняваме такива неща, нещо нищо не ти е ясно |
|||||||||||||||||||
| Автор: | dasistvas [ Сря Яну 23, 2013 9:14 pm ] |
| Заглавие: | Re: ds18b20 |
След като съм събрал старшата и младшата част на числото, го преобразувам в десетично, но после не знам как да се прехвърли на LCD tempL = read(); //read low temp value tempH = read(); //read high temp value i=((unsigned int)tempH << 8 ) + (unsigned int)tempL; //put both value in one variable y=i%100; purva=(i-y)/100; treta=i%10; vtora=(y-treta)/10; i = (float)i * 6.25 ; //calcuation from the table provided lcd_goto(0x40); |
|
| Страница 1 от 4 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|