Witam, napiąłem program do obsługi termometru cyfrowego DS18B0, program kompiluje się bez błędu a po wgraniu na wyświetlaczu wyświetla się tylko -1.0. Proszę o sprawdzenie kodu bo nie wiem już gdzie jest błąd.
DS18B20.H
DS18B20.C
MAIN.C
inventco.eu - regulamin p.11.1. Poprawiłem.
DS18B20.H
#ifndef ds18b20
#define ds18b20
#define WE 0
#define PORT_1WIRE PINC
#define SET_1WIRE DDRC &= ~_BV(WE)
#define CLEAR_1WIRE DDRC |= _BV(WE)
void delayms(long t);
void delayus(long t);
unsigned char RESET_PULSE(void);
void send(char bit);
void send_byte(char wartosc);
unsigned char read(void);
unsigned char read_byte(void);
#endif
DS18B20.C
#include <avr/io.h>
#include <util/delay.h>
#include "ds18b20.h"
/*************************************** Opoznienia **********************************/
void delayms(long t)
{
while(t)
{
_delay_ms(10);
t--;
}
}
void delayus(long t)
{
while(t)
{
_delay_us(1);
t--;
}
}
/*************************************** Magistrala 1-wire **********************************/
unsigned char RESET_PULSE(void) ////reset magistrali i oczekiwanie na impuls PRESENCE
{
char PRESENCE;
CLEAR_1WIRE; //magistrala - stan niski
delayus(500);
SET_1WIRE; //magastrala - stan wysoki
delayus(30); //oczekiwanie na stan niski od DS
if(bit_is_clear(PORT_1WIRE, WE))//sprawdzamy stan linii (LOW)
{
PRESENCE = 1; //1 - odebrano bit
}
else
{
PRESENCE = 0; //0 - stan nieaktywny
}
delayus(470); //MASTER na stan wysoki od DS
if(bit_is_set(PORT_1WIRE, WE)) //sprawdza stan linii (HIGH)
{
PRESENCE = 1;
}
else
{
PRESENCE=0;
}
return(PRESENCE); //zwraca wartosc funkcji
}
void send(char bit) ////wysyłanie pojedynczego bitu do DS
{
CLEAR_1WIRE;
delayus(5);
if(bit == 1)
{
SET_1WIRE; //zwolnienie magistrali - wysylanie 1
delayus(80); //przetrzymanie
CLEAR_1WIRE; //wysylanie zera
}
}
void send_byte(char wartosc) ////wysyla caly bajt na magistrale
{
unsigned char i=0; //zmienna licznikowa
unsigned char pom; //pomocnicza
for(i=0; i<8; i++)
{
pom = wartosc>>i; //przesuniecie bitowe
pom = 0x01; //skopiowanie bitu do zmiennej pomocniczej
send(pom); //wyslanie bitu na magistrale
}
delayus(100);
}
unsigned char read(void) ////zczytuje bit z magistralii
{
unsigned char PRESENCE = 0;
CLEAR_1WIRE; //ustawienie w stan niski DS
delayus(2); //oczekiwanie
SET_1WIRE; //zwolnienie magistrali
delayus(15); //oczeliwanie
if(bit_is_set(PORT_1WIRE, WE)) //odbior 1 lub 0
{
PRESENCE = 1;
}
else
{
PRESENCE = 0;
}
return(PRESENCE); //zwracanie wartosci funkcjii
}
unsigned char read_byte(void) ////zczytuje bajt z magistralii
{
unsigned char i = 0; //zmienna licznikowa
unsigned char wartosc = 0; //pomocnicza
for(i=0; i<8; i++)
{
if(read())
{
wartosc |= 0x01<<i; //zczystywanie po jednym bicie
}
delayus(15);
}
return(wartosc); //zwrot wartosci funkcjii
}
MAIN.C
#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "hd44780.h"
#include "ds18b20.h"
/*************************************** Zmienne i prototypy **********************************/
void sys_init(void);
char buf[8];
/*************************************** Program glowny **********************************/
void main(void)
{
unsigned char sprawdz;
char LSB = 0, MSB = 0;
sys_init();
for(;;)
{
sprawdz = RESET_PULSE();
if(sprawdz)
{
send_byte(0xCC); //SKIP ROM
send_byte(0x44); //CONVERT T
delayms(75); //oczekiwanie - czas konwersji
sprawdz = RESET_PULSE();//wysylanie sygnalu reset
send_byte(0xCC); //SKIP ROM
send_byte(0xBE); //READ SCRATCHPAD
LSB = read_byte(); //odczyta czesci mlodszej
MSB = read_byte(); //odczyta czesci starszej
sprawdz = RESET_PULSE();//zwolnienie magistrali
float temp = 0;
temp = (float)(LSB | (MSB<<8));
dtostrf(temp,1,1,buf); //konswersja FLOAT na STRING
LCD_LOCATE(0,0);
lcd_puts(buf);
delayms(100);
}
}
}
/*************************************** Funkcje **********************************/
void sys_init(void)
{
lcd_init();
LCD_DISPLAY(LCDDISPLAY);
LCD_CLEAR;
LCD_LOCATE(0,0);
}
inventco.eu - regulamin p.11.1. Poprawiłem.
