Nieudane odczyty temperatury z czujnika DS1820 - czy to kwestia programowania?
problem z DS1820
From: jaromir146_at_nospam_wp.pl
Subject: problem z DS1820
Date: 11 May 2006 09:36:01 -0700
Mam taki problem z DS1820 ot=F3=BF nie moge odczyta=E6 temperatury.
Czujnik jest chyba dobry bo po resecie i otrzymaniu komendy wy=B6lij ROM
-33h wysy=B3a sw=F3j numer seryjny.
Natomiast po komendach
1=2EReset
2=2EPomi=F1 ROM -CCh
3=2EZmierz temperatur=EA -44h
4=2EUstawiam 1 na lini=EA 1-wire i czekam 500ms (pr=F3bowalem te=BF czeka=
=E6
200m 700m a nawet ponad sekund=EA i nic)
5=2EReset
6=2EPomi=F1 ROM -CCh
7=2EOdczyt temperatury -BEh
uk=B3ad wysylka same 1 czyli tak jakby nic nie wysyla=B3.
Mo=BFe mia=B3 kto=B6 podobny problem i pomo=BFe.
Program pisz=EA w c jednak zak=B3adam =BFe funkcje wysy=B3ania bajt=F3w jak
i odczytuj=B1ca s=B1 poprawne skoro otrzyma=B3em numer seryjny.
Acha i jeszcze jedno ot=F3=BF rozkazy wysy=B3am do ds1820 od najbardziej
znacz=B1cgo bitu czyli np. komend=EA wy=B6lij numer seryjny(33h) wysy=B3am
po koleji 0,0,1,1,0,0,1,1 cho=E6 w instrukcji pisze =BFe powinienem od
LSB ale jak wysy=B3am od LSB to mi ds nie odpowiada, i to tak=BFe budzi
m=F3j niepok=F3j.
Z g=F3ry dzi=EAkuje za pomoc.
Pozdrawiam
From: pioneer <pioneer007_at_nospam_wytnij_to_i_to.poczta.onet.pl>
Subject: Re: problem z DS1820
Date: Thu, 11 May 2006 23:51:24 +0200
jaromir146_at_nospam_wp.pl napisał(a):
Mam taki problem z DS1820 otóż nie moge odczytać temperatury.
Czujnik jest chyba dobry bo po resecie i otrzymaniu komendy wyślij ROM
-33h wysyła swój numer seryjny.
Natomiast po komendach
1.Reset
2.Pomiń ROM -CCh
3.Zmierz temperaturę -44h
4.Ustawiam 1 na linię 1-wire i czekam 500ms (próbowalem też czekać
200m 700m a nawet ponad sekundę i nic)
5.Reset
6.Pomiń ROM -CCh
7.Odczyt temperatury -BEh
układ wysylka same 1 czyli tak jakby nic nie wysylał.
Może miał ktoś podobny problem i pomoże.
Program piszę w c jednak zakładam że funkcje wysyłania bajtów jak
i odczytująca są poprawne skoro otrzymałem numer seryjny.
Acha i jeszcze jedno otóż rozkazy wysyłam do ds1820 od najbardziej
znaczącgo bitu czyli np. komendę wyślij numer seryjny(33h) wysyłam
po koleji 0,0,1,1,0,0,1,1 choć w instrukcji pisze że powinienem od
LSB ale jak wysyłam od LSB to mi ds nie odpowiada, i to także budzi
mój niepokój.
Z góry dziękuje za pomoc.
Pozdrawiam
na jakim procku to masz zrobione?
przesymał Ci moja biblioteke dla ds18b20 dla avr z kwarcem 14.7456MHz,
bardzo ważne są tutaj czasy. Podłączony pod PORTB.0
#include <avr/delay.h>
#include <avr/1wire.c>
void main(void)
{
uint8_t a, b, c;
uint16_t e;
sbi(DDRB,0);
sbi(PORTB,0);
cbi(PORTB,0);
cbi(DDRB,0);
while(1)
{
onewire_reset();
_delay_ms(50);
onewire_write(0xCC); //SKIP ROM
onewire_write(0x44); //READ SCRATCHPAD
_delay_ms(50);
_delay_ms(50);
_delay_ms(50);
onewire_reset();
_delay_ms(50);
onewire_write(0xCC); //SKIP ROM
onewire_write(0xBE); //READ SCRATCHPAD
a = onewire_read();
b = onewire_read();
c = a & (0x0F); // wartości
dziesiętne (po przecinku)
a >>= 4;
b <<= 4;
a = a | b;
e = 625 * c;
write_text(" ");
lcd_powrot();
char str[5];
sprintf(str, "%d", a);
write_text(str);
write_text(".");
sprintf(str, "%d", e/100);
write_text(str);
write_char(223);
write_text("C");
}
while(1);
}
---------
1wire.c:
#include "1wire.h"
#define sbi(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define cbi(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
void _delay(unsigned int useconds)
{
unsigned int s;
for(s=0;s<useconds; s++)
;
}
unsigned char onewire_reset(void)
{
unsigned char i = 200;
sbi(DDRB, 0);
sbi(PORTB, 0);
_delay_us(10);
cbi(PORTB, 0);
_delay_us(50);
_delay_us(50);
_delay_us(50);
_delay_us(50);
_delay_us(50);
_delay_us(50);
_delay_us(50);
_delay_us(50);
_delay_us(50);
_delay_us(50);
sbi(PORTB, 0);
_delay_us(50);
cbi(DDRB, 0);
_delay_us(50);
while(i--)
{
if (bit_is_clear(PINB, 0))
{
return ONEWIRE_OK;
}
_delay_us(1);
}
return ONEWIRE_BUS_ERROR;
}
//y=-1.5x+40.5
//x zegar
//y wywołanie
//czyli dla zegara 14.7456MHz
//wywołanie 18us
//w=18us
//y=-0.77x+24.47
//x - zegar
//y - opoznienie
//czyli dla zegara 14.7456MHz
//opoznienie 13us
//o=13us
//liczenie opóźnienia
//np 480
//(480-18)/13=35,53 piszemy delay(36);
void onewire_write_bit(unsigned char bit)
{
sbi(DDRB,0);
cbi(PORTB,0);
if(bit == 1) sbi(PORTB,0); else cbi(PORTB,0);
_delay_us(50);
_delay_us(50);
sbi(PORTB,0);
cbi(DDRB,0);
}
unsigned char onewire_read_bit(void)
{
sbi(DDRB,0);
cbi(PORTB,0);
sbi(PORTB,0);
cbi(DDRB,0);
_delay_us(15);
if (bit_is_clear(PINB,0)) return(0); else return(1);
cbi(DDRB,0);
}
void onewire_write(unsigned char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) // writes byte, one bit at a time
{
temp = val>>i; // shifts val right 'i' spaces
temp &= 0x01; // copy that bit to temp
onewire_write_bit(temp); // write bit in temp into
}
_delay_us(50);
_delay_us(50);
}
unsigned char onewire_read(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(onewire_read_bit()) value|=0x01<<i;
_delay_us(50);
_delay_us(50);
}
return(value);
}
---------------------
1wire.h
//#include <avr/io.h>
//#include "delay.h"
#ifndef __1WIRE_H
#define __1WIRE_H
#define ONEWIRE_OK 0
#define ONEWIRE_BUS_ERROR 1
unsigned char onewire_reset(void);
void onewire_write_bit(unsigned char bit);
unsigned char onewire_read_bit(void);
void onewire_write(unsigned char byte);
unsigned char onewire_read(void);
//unsigned char onewire_wait(void);
#endif
pozdro.