Witam
Mam pytanie dlaczego poniższy kod nie pozwala mi dogadać się z DS18B20. Napisałem/przepisałem go na bazie opracowania Pana Cezarego Klimasz "Obsługa interfejsu 1-wire na przykładzie obsługi DS18B20".
Proszę o pomoc.
Dziękuję
Mam pytanie dlaczego poniższy kod nie pozwala mi dogadać się z DS18B20. Napisałem/przepisałem go na bazie opracowania Pana Cezarego Klimasz "Obsługa interfejsu 1-wire na przykładzie obsługi DS18B20".
Proszę o pomoc.
Dziękuję
#include <string.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdlib.h>
//#include <avrlibc.h>
#define WE 0
#define Port1wire PINB
//Magistrala 1-WIRE jest zrobiona na podstawie:
//"INTERFEJS 1-WIRE" - autor CEZARY KLIMASZ
void Set1wire(void)
{
DDRB&=~_BV(WE);
}
void Clear1wire(void)
{
PORTB&=~_BV(WE);
DDRB|=_BV(WE);
}
//===========RESET szyny=================================
unsigned char Reset1w(void)
{
unsigned char Presence;
Port1wire|=_BV(WE);
Clear1wire; //ustawiamy 0 na porvie 1WIRE
_delay_us(500); // w sumie 500us opoznienia
Set1wire; //ustawiamy 1 na porcie 1WIRE
_delay_us(30); //(30)opozninie -czekanie na reakcje DS
if (bit_is_clear(Port1wire,WE))
{
Presence=1;
}
else
{
Presence =0;
}
_delay_us(470); //(470) czekamy czy DS podniesioe line
if (bit_is_set(Port1wire,WE)) //spawdzamy czy linia jest ustawiona
{
Presence=1;
}
else
{
Presence =0;
}
return Presence; //zwracamy wartosc funkcji
}
//============ wysyłanie bitu ======================
void Send1w(char bit)
{
Clear1wire; // ustawienie lini na 0
_delay_us(5);
if (bit==1)
Set1wire;
_delay_us(80);
Set1wire;
}
//=========== odbieranie bitu===========================
unsigned char Read1w(void)
{
unsigned char Presence =0;
Clear1wire; //ustawienie DQ stan niski
_delay_us(2);
Set1wire; // zwolnienie magistrali
_delay_us(15);
if (bit_is_set(Port1wire,WE))
Presence=1;
else
Presence=0;
return Presence;
}
//========== wystłanie BAJTU danych ======================
void SendByte1w(char wartosc)
{
unsigned char i,pom;
for (i=0;i<8;i++)
{
pom=wartosc>>1; //przesunięcie w prawo
pom&=0x01; // KOPIA NAJMNIEJ znaczaczego bitu do zmiennej POM
Send1w(pom); //wysylanie bitu
}
_delay_us(100);
}
//============Odbieranie BAJTU danych ==============
unsigned char ReadByte1w(void)
{
unsigned char i,wartosc =0;
for (i=0;i<8;i++)
{
if (Read1w())
wartosc|=0x01<<i; // odczytywanie po 1 bicie
_delay_us(15);
}
return (wartosc);
}
//=============== PROCEDURA ODCZYTU TEMPERATURY ==========
float OdczytajTemperature(void)
{
unsigned char sprawdz;
char temp1=0, temp2=0;
sprawdz=Reset1w;
SendByte1w(0xCC); //pomin ROM
SendByte1w(0x44); //wystartuj pomiar
_delay_ms(750); //odczekaj czas konwersji w sumie 750us
sprawdz=Reset1w; //ponownie resetuj linie ....
SendByte1w(0xCC); // ...i pomin ROM
SendByte1w(0xBE); // ...i czytaj...
temp1=ReadByte1w(); // ... mlodszy bajt ...
temp2=ReadByte1w(); //... satrszy bajt
sprawdz=Reset1w; //zwolnij linie
float temp=0; //zmienna pomocnicza do obliczen
temp=(float)(temp1+(temp2*256))/16; //OBLICZANIE TEMPERATURY
return temp;
}
int main(void)
{
DDRD=0xff;
DDRC=0x0f;
DDRB=0xff;
PORTD=0xfe;
PORTC=0xfe;
bit_is_clear(Port1wire,WE);
while(1)
{
if (OdczytajTemperature>24)
{
PORTD=0x33;
}
}
}
