na pcozatku mam pytanie czy czujnik DS18B20 ma jakies rejestry ktore nie są zerowane po wylaczeniu zasilania. Pytam bo kupilem 2 czujniki na allegro(cena 3,50) i wogole nie wiadomo co z nich odczytuje.... kazdy inaczej pokazuje. Poszedlem do kolegi, pozyczyl mi na chwile swoj czujnik i pokazuje dobrze temeperature na moim sofcie i sprzecie. Wiec kupilem nowy w sklepie (10 PLN) i pokazuje temperature (chyba dobrze) ale w fahrenheit'ach. Takze przed tym jak zaczne cos ustawiac wole sie upewnic Was czy aby to zmienic na celcjusze nalezy poustawiac rejestry..?
Wg. tego co wyczytalem z Datasheeta kod korygujacy powinien wygladac tak:
Dobrze???
A oto dla pewności mój cały kod:
Dziekuje za wypowiedzi:)
Wg. tego co wyczytalem z Datasheeta kod korygujacy powinien wygladac tak:
wire1_init();
wire1_write_byte(0x4e);
wire1_write_byte(0x00);
wire1_write_byte(0x00);
wire1_write_byte(0x07);
Dobrze???
A oto dla pewności mój cały kod:
#include <util\delay.h>
#include <avr/io.h>
//#include <util/delay_basic.h>
//
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))
#define WIRE1_PORT PORTD
#define WIRE1_DDR DDRD
#define WIRE1_PIN PIND
#define WIRE1_CONNECT 7
#define WIRE1_0 sbi(WIRE1_DDR,WIRE1_CONNECT);cbi(WIRE1_PORT,WIRE1_CONNECT); //0 na wyjscie
#define WIRE1_1 sbi(WIRE1_DDR,WIRE1_CONNECT);sbi(WIRE1_PORT,WIRE1_CONNECT); //1 na wyjscie
unsigned char test, tout;
unsigned char test2;
volatile unsigned char przycisk=0, menu=0;
volatile unsigned char temp=0;
volatile unsigned char liczba=0;
unsigned char wire1_init(void)
{
unsigned char stan=0;
WIRE1_0;
//_delay_loop_2(1000); //
_delay_us(500);
WIRE1_1;
//_delay_loop_1(0xA0);//
_delay_us(60); //60
if(bit_is_clear(WIRE1_PIN,WIRE1_CONNECT))
{
stan=1;
}
//_delay_loop_2(600);//
_delay_us(300);
if(bit_is_set(WIRE1_PIN,WIRE1_CONNECT))
{
stan+=2;
}
return stan;
}
// procedura zapisu pojedynczego bitu
void wire1_write_bit(unsigned char bit)
{
WIRE1_0;
// _delay_loop_2(30);
_delay_us(15);
if (bit==0)
{
// _delay_loop_2(120);
_delay_us(60);
WIRE1_1;
//_delay_loop_2(4);
_delay_us(2);
} // przedluzenie dla zera
else
{
WIRE1_1;
// _delay_loop_2(140);
_delay_us(70);
}
// jesli 1 koncz i czekaj
}
// procedura zapisu bajtu do urzadzenia
void wire1_write_byte(unsigned char bajt)
{
unsigned char i;
for(i = 0; i<8; i++)
{
wire1_write_bit(bajt & 0x01); // wyslij bit zerowy bajtu
bajt>>=1; // przesun w prawo i tak osiem bitow
}
}
// procedura odczytu bitu od urzadzenie 1wire
unsigned char wire1_read_bit(void)
{
unsigned char bit;
WIRE1_0;
// _delay_loop_2(4);
_delay_us(2);
WIRE1_1;
// _delay_loop_2(40);
_delay_us(20);
if(bit_is_clear(WIRE1_PIN,WIRE1_CONNECT))
{
bit=0;
}
else
{
bit=1;
}
//_delay_loop_2(40);
_delay_us(20);
return bit;
}
//procedura odczytu bajtu z urzadzenia
unsigned char wire1_read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(wire1_read_bit()) value|=0x01<<i;
}
return(value);
}
void xy_lcd(unsigned char x, unsigned char y)
{
write_command((x*0x40+y)|0x80);
}
// program główny
int main(void)
{
// konfiguracja portów we/wy
DDRC = 0xC0; //11000000 //ustawienie E=1 oraz RS=1
DDRA= 0xF0; //11110000 ustawienie D4=1 oraz D5=1 oraz D6=1 oraz D7=1
DDRD=0; //czujnik jest na PD7
lcd_init(); // inicjalizacja LCD
int ill=0;
while(1)
{
ill++;
wire1_init();
wire1_write_byte(0xcc);
wire1_write_byte(0x44);
_delay_ms(750);
wire1_init();
wire1_write_byte(0xcc);
wire1_write_byte(0xbe);
test=wire1_read_byte();
wire1_read_byte();
test2= (test>>1);
xy_lcd(0,0);
char d[4];
itoa(ill,d, 10);
write_text(d);
xy_lcd(1,0);
char c[4];
itoa(test2,c, 10);
write_text(c);
write_text(" ");
}
return 0;
}
Dziekuje za wypowiedzi:)