problem z DS1820

May 11, 2006 1 Replies

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


snipped-for-privacy@wp.pl napisał(a):

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<

//#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.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required