Witam!
Pierwsze co chciałbym powiedzieć to wiem, że informacji o tym czujniku jest pełno na forum, ale ja już stosowałem wiele sposobów i nic. Otóż mój problem jest taki, że czujnik cały czas podaje mi temperaturę -0.1 . Czujnik jest podłączony w trybie z zewnętrznym zasilaniem (trzy przewody) . Do szyny danych podciągnięty jest plus przez rezystor 4,7k . Szyna danych podłączona do PIND0 . Zegar 16MHz .
Oto kod:
Siedzę już nad tym dość długo i nie mogę nic wymyślić , może to jest jakiś głupi błąd którego nie mogę znaleźć. Dzięki za pomoc.
Pierwsze co chciałbym powiedzieć to wiem, że informacji o tym czujniku jest pełno na forum, ale ja już stosowałem wiele sposobów i nic. Otóż mój problem jest taki, że czujnik cały czas podaje mi temperaturę -0.1 . Czujnik jest podłączony w trybie z zewnętrznym zasilaniem (trzy przewody) . Do szyny danych podciągnięty jest plus przez rezystor 4,7k . Szyna danych podłączona do PIND0 . Zegar 16MHz .
Oto kod:
#define F_CPU 16E6
#include <avr\io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "lcd.h"
#define WE 0
#define PORT_1wire PIND
#define SET_1wire DDRD&=~_BV(WE)
#define CLEAR_1wire DDRD|=_BV(WE)
char buf[8];
unsigned char RESET_PULSE(void)
{
unsigned char PRESENCE;
CLEAR_1wire;
_delay_us(500);
SET_1wire;
_delay_us(30);
if(bit_is_clear(PORT_1wire,WE)){PRESENCE=1;}else{PRESENCE=0;}
_delay_us(470);
if(bit_is_set(PORT_1wire,WE)){PRESENCE=1;}else{PRESENCE=0;}
return PRESENCE;
}
void send(char bit)
{
CLEAR_1wire;
_delay_us(5);
if (bit==1)
{
SET_1wire;
_delay_us(80);
SET_1wire;
}
}
unsigned char read()
{
unsigned char PRESENCE;
CLEAR_1wire;
_delay_us(2);
SET_1wire;
_delay_us(15);
if(bit_is_set(PORT_1wire,WE)){PRESENCE=1;}else{PRESENCE=0;}
return PRESENCE;
}
void send_byte(char wartosc)
{
unsigned char i;
unsigned char pom;
for(i=0;i<8;i++)
{
pom = wartosc>>i;
pom &= 0x01;
send(pom);
}
_delay_us(100);
}
unsigned char read_byte()
{
unsigned char i;
unsigned char wartosc=0;
for(i=0;i<8;i++)
{
if(read()) wartosc|=0x01<<i;
_delay_us(15);
}
return wartosc;
}
int main()
{
static char tekst[128]="OK";
static char tekst2[128]="NO";
unsigned char sprawdz;
char temp1=0 , temp2=0;
LCD_init();
LCD_control(ON, BLINK, SHOW);
for(;;)
{
sprawdz=RESET_PULSE();
if(sprawdz==1)
{
send_byte(0xCC);
send_byte(0x44);
_delay_ms(800);
sprawdz=RESET_PULSE();
send_byte(0xCC);
send_byte(0xBE);
temp1=read_byte();
temp2=read_byte();
sprawdz=RESET_PULSE();
float temp=0;
temp=(float)(temp1+(temp2*256))/16;
dtostrf(temp,1,1,buf);
LCD_clear();
LCD_setpos(0);
LCD_putstring(buf);
}
else if (sprawdz==0)
{
LCD_clear();
LCD_setpos(0);
LCD_putstring(tekst2);
}
}
for(;;)
return 0;
}
Siedzę już nad tym dość długo i nie mogę nic wymyślić , może to jest jakiś głupi błąd którego nie mogę znaleźć. Dzięki za pomoc.