ds18b20 i at89s8252 poszukiwany kod

Witam!

Niedawno pisalem o czujniku temp max6662 na spi nie udalo mi sie go uruchomic. Wiec przezucilem sie na ds18b20, mam jednak z nim problemy. Czy ktos z grupowiczow posiada kod do obslugi tegoz czujnika ? Bo juz nie wiem co nie dziala. Problowalem kodu z noty aplikacyjnej dallasa ale nie dziala mi...

kwarc 11.0592 podciaganie DQ 4.7k DQ mam na pinie 1.2 czujnik zasilany "normalnie" kompilator keil...

nie mam nawet mozliwosci czy odpowiada na reset

btw: czy mozna zbadac co dzieje sie na lini czyms takim jak winscope (na karcie muzycznej) ?

pozdr. LB

Reply to
drozdu
Loading thread data ...

Zobacz na to :

formatting link
Pozdrawiam. Artur

Reply to
Artur

Dnia 2004-09-13 12:45, Użytkownik drozdu napisał:

Zapomnij o oscyloskopie z karty dźwiękowej. Do analizy przebiegów cyfrowych możesz wykorzystać Analizator 4 kanałowy z tej strony:

formatting link
Po brakujący plik oscyloskop.zip zgłoś się na priva.

Reply to
badworm

Typuje na zla procedurke delay, bo reszta jest dokladnie tak jak w kilku przykladach (tego tez probowalem) i notach ktore znalazlem. Udalo mi sie odpalic czujnik pod bascomem wiec wiem na pewno ze dziala.

Jesli dobrze licze na kwarcu 11.0592Mhz i at89s8252: 11059200/12 mamy 921600 cykli/s wiec nop "trwa" ~0.9us tak ?

wiec na podstawie tych obliczen zrobilem sobie tak:

delay: // 3 (mov r7,... + call) djnz r7,delay // 2 ret // 2

razem 5 wywolanie + 2 na petle i to mi jakos nie dziala. Po paru eksperymentach udalo mi sie osiagnac tyle ze odczytuje kilka losowych wartosci w kolko. Probowalem oczywiscie zmienic argumenty delay tak aby funkcja trwala przez odpowiedni czas z zalozeniem ze cykl trwa 0.9us.

nowa prosba: prosze o procedure delay (najlepiej w asmie) !

pozdr. i dziekuje LB

Reply to
drozdu

Dnia 2004-09-14 19:56, Użytkownik badworm napisał:

Informuję, że brakujący plik znajduje się pod tym adresem:

formatting link

Reply to
badworm

Ano tak ;) pomylilem sie (921600/1000000)

Tak czy inaczej nie moge tego odpalic, delay sprawdzalem i dopasowywalem wedlug licznika czasu w symulatorze keil`a. Oto kod:

/* ---------------------------------------------------------------- implementacja magistrali 1wire ---------------------------------------------------------------- */

unsigned char ow_reset(void) { unsigned char result;

// wyslij rst DQ = 0; delay_us(_OW_TIME_RST_PULSE); // 480us DQ = 1;

// czekaj na presence delay_us(_OW_TIME_RST_PBEG); // 70us result = DQ;

// czekaj na zakonczenie delay_us(_OW_TIME_RST_PEND); // 210us

if (DQ == 0) // zwarcie ? return (2);

return (result); // 0 - brak | 1 - presence }

bit read_bit(void) { bit result;

DQ = 0; // rozpocznij slot rd nop(); DQ = 1;

delay_us(_OW_TIME_RD_SAMPLE); // 15us result = DQ; delay_us(_OW_TIME_RD_RECV); // 45us

return (result); }

void write_bit(bit b) { DQ = 0; // rozpocznij slot wr nop();

if (b) DQ = 1;

delay_us(_OW_TIME_WR_SAMPLE); // 30us DQ = 1; delay_us(_OW_TIME_WR_RECV); // 60us }

void write_byte(unsigned char val) { do { write_bit(val & 0x01); } while (val >>= 1); }

unsigned char read_byte(void) { unsigned char i; unsigned char value = 0;

for (i = 0; i < 8; i++) { if (read_bit()) value = value | (0x01 << i);

} return (value); }

/* ---------------------------------------------------------------- komunikacja ds18b20 ---------------------------------------------------------------- */

void read_temp(void) { int temp; unsigned char i = 0; unsigned char x;

/* tutaj normalnie wylapuje co wyszlo z reset pulse wiec wyglada na to ze jest ok, bo zwraca 0, teraz wyciolem ten fragment zeby nie zajmowac miejsca */

ow_reset(); write_byte(0xCC); // Skip ROM write_byte(0x44); // Start Conversion

delay_ms(800);

ow_reset(); write_byte(0xCC); // Skip ROM write_byte(0xBE); // Read Scratch Pad

// odczytaj 2bajty z scratchpad do { if (read_bit()) { temp |= (1 << i); }

} while (++i < 16);

ow_reset();

lcd_clrs(); printf("%X", (int) temp);

// konwersja i = (temp & 0x0F); if (temp < 0) { i |= 0xF0; }

i = (i * 10) / 16; temp = (((temp / 16) * 10) + i);

lcd_goto(0x40); printf( "C=%d ", (int) temp ); // print temp. C

temp = (((int) temp) * 9) / 5 + 32; printf( "F=%d", (int) temp ); // print temp. F }

to powinno chyba dzialac ?

pozdr. LB

Reply to
drozdu

delay_us(410); // 210us DQ = 1;

// nop();

delay_us(6);

delay_us(9); // 9us

delay_us(55); // 55us

// nop(); delay_us(6);

if(b){ DQ = 1; delay_us(64); } else{ delay_us(60); DQ = 1; delay_us(10); }

Reply to
mlodedrwale

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.