problem z DS1820

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

Reply to
jaromir146
Loading thread data ...

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

Reply to
pioneer

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.