| Автор |
Съобщение |
|
dasistvas
Ранг: Минаващ
Регистриран на: Сря Яну 23, 2013 12:27 am Мнения: 9
|
 ds18b20
Здравейте, имам проблем с кода за температурния сензор ds18b20. Микроконтролера който използвам е pic16f913.
|
| Сря Яну 23, 2013 12:30 am |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: ds18b20
И какъв е проблема?
_________________ Мразя да мразя ...
|
| Сря Яну 23, 2013 2:38 am |
|
 |
|
dasistvas
Ранг: Минаващ
Регистриран на: Сря Яну 23, 2013 12:27 am Мнения: 9
|
 Re: ds18b20
Проблема, е че LCD нито се инициализира, нито показва стойност.
|
| Сря Яну 23, 2013 3:00 am |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 Re: ds18b20
последно с датчика или с дисплея ти е проблема 
|
| Сря Яну 23, 2013 9:54 am |
|
 |
|
dasistvas
Ранг: Минаващ
Регистриран на: Сря Яну 23, 2013 12:27 am Мнения: 9
|
 Re: ds18b20
Ако пусна програмата за lcd отделно тя тръгва, но когато я прибавя към проекта със сензора нищо не става и не знам къде е проблема.
|
| Сря Яну 23, 2013 11:20 am |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: ds18b20
Ама колегите са си забраили боба в къщи, пък аз кокалчетата в офиса...
|
| Сря Яну 23, 2013 11:49 am |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: ds18b20
Опитай да зададеш посоките на пиновете 1 по 1. Особено на порт А, където е сензора и RS. Предполагам, че понеже сензорът използва 1 пин като вход и изход, това обръща RS и не го използваш като изход, когато трябва.
_________________www.elkran.com
|
| Сря Яну 23, 2013 11:53 am |
|
 |
|
dasistvas
Ранг: Минаващ
Регистриран на: Сря Яну 23, 2013 12:27 am Мнения: 9
|
 Re: ds18b20
#define Port_18B20 RA0 #define Tx_18B20 TRISA0 = 0 #define Rx_18B20 TRISA0 = 1 Aз съм ги задал.
|
| Сря Яну 23, 2013 11:58 am |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: ds18b20
Ами няма и да стане ... я си виж програмата, като измериш температурата от датчика дали си правиш труда да покажеш стойноста на LCD-то 
_________________ Мразя да мразя ...
|
| Сря Яну 23, 2013 12:30 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: ds18b20
Той казва, че LDC-то не се инициализира. Погледни из цялата програма дали не променящ посоките някъде другаде..
_________________www.elkran.com
|
| Сря Яну 23, 2013 12:33 pm |
|
 |
|
dasistvas
Ранг: Минаващ
Регистриран на: Сря Яну 23, 2013 12:27 am Мнения: 9
|
 Re: ds18b20
А можеш ли да ми кажеш как мога да покажа стойноста на LCD. Ако пусна само LCD и му пусна да чете някаква дума, го прави, но когато го сложа във програмата не става нищо.
|
| Сря Яну 23, 2013 12:39 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: ds18b20
А може ли да дадеш примерен код(няколко реда) как правиш едното(как задаваш дума) и как пращаш число?!
_________________www.elkran.com
|
| Сря Яну 23, 2013 12:56 pm |
|
 |
|
dasistvas
Ранг: Минаващ
Регистриран на: Сря Яну 23, 2013 12:27 am Мнения: 9
|
 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; }
|
| Сря Яну 23, 2013 12:58 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: ds18b20
Тук трябва да преобразуваш i до текст (примерно с itoa()) и след това да го покажеш с lcd_puts() Ама нали се сещаш, че ако трябва да ти обясняваме такива неща, нещо нищо не ти е ясно 
_________________ Мразя да мразя ...
|
| Сря Яну 23, 2013 2:09 pm |
|
 |
|
dasistvas
Ранг: Минаващ
Регистриран на: Сря Яну 23, 2013 12:27 am Мнения: 9
|
 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);
|
| Сря Яну 23, 2013 9:14 pm |
|
|