Witam potrzebny jest mi sprawdzony chodzący kod do pomiaru temperatury na ds1820 znalazłem kilka owych ale żadem nie działa poprawnie tzn wyświetla 85,6 stopni podobno to wina opóźnień ale mimo poprawek i tak dalej to samo.
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tam
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL // 8 MHz
#define LCD PORTD
#define E 3
#define RS 1
#define SET_E LCD |= _BV(E)
#define CLR_E LCD &= ~_BV(E)
#define SET_RS LCD |= _BV(RS)
#define CLR_RS LCD &= ~_BV(RS)
void write_to_lcd(char x)
{ SET_E; LCD = ((LCD & 0x0F) | (x & 0xF0)); CLR_E; SET_E; LCD = ((LCD & 0x0F) | ((x & 0x0F) << 4)); CLR_E; _delay_ms(2); }
void write_command(char x) {CLR_RS; write_to_lcd(x); }
void write_char(char x) {SET_RS; write_to_lcd(x); }
void write_text(char * s) {while(*s) { write_char(*s); s++; }}
void lcd_init(void) {_delay_ms(25); CLR_E; CLR_RS; SET_E; LCD &= 0x3F; CLR_E; _delay_ms(5); SET_E; LCD &= 0x2E; CLR_E;
_delay_ms(2); write_command(0x28); write_command(0x08); write_command(0x01); write_command(0x06); write_command(0x0C); }
#define DQ 2
#define SET_DQ DDRB &= ~_BV(DQ)
#define CLR_DQ DDRB |= _BV(DQ)
#define IN_DQ PINB & _BV(DQ)
void ow_reset(void)
{
CLR_DQ; // stan niski na linii 1wire
_delay_us(480); // opóźnienie 480us
SET_DQ; // stan wysoki na linii 1wire
_delay_us(480); // opóźnienie 480 us
}
void ow_write_bit(char b) // procedura zapisu bitu na linię 1wire
{
CLR_DQ; // stan niski na linii 1wire
_delay_us(10); // opóźnienie 10us
if(b) SET_DQ; // jeśli b<>0 to ustaw stan wysoki na linii
_delay_us(100); // opóźnienie 100us
SET_DQ; // stan wysoki na linii 1wire
}
char ow_read_bit(void)
{
CLR_DQ;
_delay_us(2);
SET_DQ;
_delay_us(12);
if(IN_DQ) return 1; else return 0;
}
unsigned char ow_read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(ow_read_bit()) value|=0x01<<i;
_delay_us(47);
}
return(value);
}
void ow_write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++)
{
temp = val >> i;
temp &= 0x01;
ow_write_bit(temp);
}
}
int main(void)
{
DDRD = 0xFE;
lcd_init();
char msb, lsb, temp;
float celcius;
while(1)
{
ow_reset();
ow_write_byte(0xCC);
ow_write_byte(0x44);
for (uint8_t a = 0; a < 25; a++) _delay_ms(40); // (30) =750ms (40) =1000ms
ow_reset();
ow_write_byte(0xCC);
ow_write_byte(0xBE);
lsb = ow_read_byte();
msb = ow_read_byte();
celcius = msb << 8 | lsb ;
celcius/=16;
temp = msb << 4| lsb >> 4;
write_command(0x01);
unsigned char tab[6];
write_text("Temp: ");
write_text(dtostrf(celcius, 2, 4, tab));
}
return 0;
}