Witam,
Zgodnie z lekturą http://www./ja/elektronika/ds18b20.pdf
próbuję odczytać temperaturę. Przepisałem wszystko tak jak jest w dokumencie, sprawdziłem kilka razy - wydaje mi się że błędu nie popełniłem. Mimo to odczyt temp. nie działa. Otrzymuję wynik -0.1
Oto kod:
main.c
Ściągnąłem jakąś inną bibliotekę obsługującą ten czujnik i działa.. ale ciekaw jestem dlaczego w tym przypadku nie działa prawidłowo.
Zgodnie z lekturą http://www./ja/elektronika/ds18b20.pdf
próbuję odczytać temperaturę. Przepisałem wszystko tak jak jest w dokumencie, sprawdziłem kilka razy - wydaje mi się że błędu nie popełniłem. Mimo to odczyt temp. nie działa. Otrzymuję wynik -0.1
Oto kod:
/*
* ds18s20.h
*
*/
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
// makra
#define WE 0
#define PORT_1wire PINB
#define SET_1wire DDRB&=~_BV(WE)
#define CLEAR_1wire DDRB|=_BV(WE)
char buf[8]; // zmienna potrzebna przy konwersji temp.
// resetujemy magistralę - czekamy na impuls PRESENCE
unsigned char RESET_PULSE(void)
{
unsigned char PRESENCE;
CLEAR_1wire; // ustawiamy magistralę w stan niski
_delay_us(480);
SET_1wire;
_delay_us(30);
// sprawdzamy poziom lini ( czy w stanie niskim )
if (bit_is_clear(PORT_1wire, WE)) {
PRESENCE=1;
}else{
PRESENCE=0;
}
_delay_us(480); //czekanie przez mastera
if (bit_is_set(PORT_1wire, WE))
{
PRESENCE=1;
}else{
PRESENCE=0;
}
return PRESENCE;
}
// wysyła do ukaładu pojedynczy bit.
void send(char bit) {
CLEAR_1wire; // ustawienie magistrali w stan niski
_delay_us(10);
if (bit)
{
SET_1wire; // zwolnienie magistrali - wysłanie jedynki
_delay_us(100); // przetrzymanie
SET_1wire; // wyslanie zera
}
}
// zaczytuje bit z magistrali
unsigned char read(void)
{
unsigned char PRESENCE=0;
CLEAR_1wire; //ustawienie w stan niski
_delay_us(2); // oczekiwanie 2us
SET_1wire; // zwolnienie magistrali
_delay_us(12);
//odbiór jedynki lub zera
if (bit_is_set(PORT_1wire,WE)) {
PRESENCE=1;
}else{
PRESENCE=0;
}
return (PRESENCE);
}
// wysyła cały bajt do układu
void send_byte(char wartosc)
{
unsigned char i;
unsigned char pom;
for (i=0;i<8;i++)
{
pom = wartosc>>i;
pom &=0x01; // skopiowanie bitu do zmiennej pomocniczej
send(pom); // wysłanie bitu na magistrale
}
_delay_us(100); // odczekanie 100us
}
// zaczytuje cały bajt z układu.
unsigned char read_byte(void)
{
unsigned char i;
unsigned char wartosc = 0;
for (i=0;i<8;i++)
{
if (read()) wartosc|=0x01<<i; // zaczytuje po jednym bicie
_delay_us(15);
}
return(wartosc); //zwrot wartosci do funcji
}
main.c
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include "HD44780.h"
#include "ds18s20.h"
int main(void)
{
unsigned char sprawdz;
char temp1=0, temp2=0;
float celcius;
LCD_Initalize();
LCD_Clear();
LCD_WriteText("1-wire");
_delay_ms(2000);
LCD_Clear();
while(1) {
sprawdz = RESET_PULSE();
if (sprawdz==1){
send_byte(0xCC); // SKIP ROM
send_byte(0x44); // CONVERT_T
_delay_ms(750); // czas konwersji
sprawdz = RESET_PULSE(); // wysłanie impulsu reset
send_byte(0xCC); // SKIP ROM
send_byte(0xBE); // READ SCRATCHPAD
temp1=read_byte(); // LSB
temp2=read_byte(); // MSB
sprawdz = RESET_PULSE(); // zwolnienie magistrali
float temp=0; // zmienna do obliczen
temp = (float) (temp1+(temp2*256))/16; // obl. temp
dtostrf(temp,1,1,buf); // konwersja float do stringa
LCD_GoTo(0,0);
LCD_WriteText(buf);
_delay_ms(200);
}else{
LCD_GoTo(0,0);
LCD_WriteText("cisza");
}
}
return 0;
}
Ściągnąłem jakąś inną bibliotekę obsługującą ten czujnik i działa.. ale ciekaw jestem dlaczego w tym przypadku nie działa prawidłowo.