Микроконтролери и електроника
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.

Прикачени файлове:
lcd (2).c [2.43 KiB]
241 пъти
main.c [2.6 KiB]
231 пъти

Автор:  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

Цитат:
Опитай да зададеш посоките на пиновете 1 по 1. Особено на порт А, където е сензора и RS. Предполагам, че понеже сензорът използва 1 пин като вход и изход, това обръща RS и не го използваш като изход, когато трябва.


#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.

Цитат:
Той казва, че LDC-то не се инициализира. Погледни из цялата програма дали не променящ посоките някъде другаде..


Ако пусна само 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

dasistvas написа:
Код:
         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);


Тук трябва да преобразуваш 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/