Witam, znalazłem w necie poniższy kod i dołączyłem go do swojego projektu. Niestety nie działa. Cały czas dostaje informacje na wyświetlacz że odczyt się nie powiódł.
W kodzie nie ma funkcji inicjalizujących LCD i wyświetlających znak, żeby nie zaciemniać analizy.
Używam wewnętrznego kwarcu, tj. 1 MHz. Zasilam DS18B20 w normalny sposób (bez zasilania pasożytniczego).
Co może być nie tak? Wiem że to było wałkowane na elektrodzie ale nie znalazłem rozw. mojego problemu (tu jest podobny przypadek ale mi nie pomaga: https://www.elektroda.pl/rtvforum/topic1209476.html )
W kodzie nie ma funkcji inicjalizujących LCD i wyświetlających znak, żeby nie zaciemniać analizy.
Używam wewnętrznego kwarcu, tj. 1 MHz. Zasilam DS18B20 w normalny sposób (bez zasilania pasożytniczego).
Co może być nie tak? Wiem że to było wałkowane na elektrodzie ale nie znalazłem rozw. mojego problemu (tu jest podobny przypadek ale mi nie pomaga: https://www.elektroda.pl/rtvforum/topic1209476.html )
#include "config.h"
#include <stdlib.h>
#define WE 2
#define PORT_1WIRE PORTB
#define SET_1WIRE DDRB &= ~_BV(WE)
#define CLEAR_1WIRE DDRB |= _BV(WE)
char buf[8];
unsigned char RESET_PULSE(void);
unsigned char read_byte(void);
void send_byte(char wartosc);
void send(char bit);
unsigned char read(void);
int main(void){
unsigned char sprawdz;
char temp1 = 0, temp2 = 0;
delay(100);
PORTB &=~_BV(2);
delay(250);
initLCD();
while(1)
{
sprawdz = RESET_PULSE();
if(sprawdz == 1)
{
//
RESET_PULSE();
send_byte(0xCC);
send_byte(0x44);
delay(750);
sprawdz = RESET_PULSE();
send_byte(0xCC);
send_byte(0xBE);
temp1 = read_byte(); // odczytanie LSB
temp2 = read_byte(); // odczytanie MSB
sprawdz = RESET_PULSE();
float temp=0;
temp=(float)(temp1+(temp2*256))/16;
dtostrf(temp, 1, 1, buf); //konwersja float na stringa
gotox(0x00);
writestr("udalo sie!");
gotox(0x40);
writestr(buf);
delay(250);
}
else
if(sprawdz == 0)
{
gotox(0x00);
writestr("lipa pany");
}
};
return 0;
}
unsigned char RESET_PULSE()
{
unsigned char PRESENCE = 0;
CLEAR_1WIRE;
_delay_us(500);
SET_1WIRE;
_delay_us(60);
if(bit_is_clear(PORT_1WIRE, WE))
{
PRESENCE = 0;
}
else
{
PRESENCE = 1;
}
delay(470);
if(bit_is_set(PORT_1WIRE, WE))
{
PRESENCE = 1;
}
else
{
PRESENCE = 0;
}
return PRESENCE;
}
unsigned char read_byte(void)
{
unsigned char i;
unsigned char wartosc = 0;
for(i=0; i<8; i++)
{
if(read()) wartosc |= 0x01 << i;
_delay_us(15);
};
return wartosc;
}
void send(char bit)
{
CLEAR_1WIRE;
_delay_us(5);
if(bit == 1)
SET_1WIRE;
_delay_us(80);
SET_1WIRE;
}
unsigned char read(void)
{
unsigned char PRESENCE = 0;
CLEAR_1WIRE;
_delay_us(5);
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);
}