Trawienny Opublikowano 24 Listopada 2006 Zgłoś Opublikowano 24 Listopada 2006 (edytowane) Witam, Wlasnie jestem w trakcie pisania programu w MPLABie w C18 pod PIC18F452 ktorego zadaniem bedzie odczyt temperatury z cyfrowego termometru Dallasa DS18B20. Ma on pracowac jako zabezpieczenie silnikow ktore maja tendencje do silnego nagrzewania sie co moze sie dla nich skonczyc nienajlepiej. No i napisalem caly program ale problem w tym ze.. nie dziala :| Procedury obslugujace DSa na 1-Wire wygladaja nastepujaco: /***********************Reset 1Wire**************************/void M1W_Reset(void){ PORTEbits.RE0=0; Delay100TCYx(25); PORTEbits.RE0=1; Delay100TCYx(25);}/***********************Odczyt bitu*******************************/unsigned char M1W_ReadBit(void){ unsigned char data; PORTEbits.RE0=0; Delay1TCY(); Delay1TCY(); Delay1TCY(); Delay1TCY(); PORTEbits.RE0=1; Delay10TCYx(4); data=PORTEbits.RE1; Delay100TCYx(3); return(data);}/***********************Zapis bitu********************************/void M1W_WriteBit(unsigned char data){ PORTEbits.RE0=0; Delay1TCY(); Delay1TCY(); Delay1TCY(); Delay1TCY(); PORTEbits.RE0=data; Delay100TCYx(3); PORTEbits.RE0=1;}/***********************Odczyt bajtu*******************************/unsigned char M1W_ReadData(void){ unsigned char i; unsigned char data=0; for (i=0;i<8;i++) { if(M1W_ReadBit()) { data|=0x01<<i; } } return(data);}/***********************Zapis bajtu*******************************/void M1W_WriteData(unsigned char data){ unsigned char i; unsigned char temp; for (i=0; i<8; i++) { temp = data>>i; temp &= 0x01; M1W_WriteBit(temp); }}/***********************Konwersja temperatury*********************/void M1W_Convert(void){ M1W_WriteData(0xCC); M1W_WriteData(0x44); Delay10KTCYx(0); Delay10KTCYx(0);}/***********************Pomiar temperatury**************************/void M1W_Measure(void){ M1W_WriteData(0xCC); M1W_WriteData(0xBE); dane1=M1W_ReadData(); dane2=M1W_ReadData(); M1W_Reset();}/********************************************************************/ Wywolywane sa w glownej petli: void main(void){ Delay10KTCYx(0); TRISA=0xFF; TRISB=0xFF; TRISC=0x00; TRISD=0x00; TRISEbits.TRISE0=0; TRISEbits.TRISE1=1; INTCON=0x90; INTCON2=0x00; INTCON3=0x00; RCON=0x00; VFD_Init(); VFD_MiniLogo(0,0); while(1) { M1W_Reset(); M1W_Convert(); M1W_Reset(); M1W_Measure(); VFD_SetRow(3); VFD_SetColumn(0); VFD_WriteData(0xFF); VFD_WriteData(dane1); VFD_WriteData(dane2); }} Prosze pominac funkcje VFD_* ktorych zadaniem jest obsluga wyswietlacza VFD. Zmienne dane1 oraz dane2 sa globalne. Czestotliwosc taktowania to 20MHz (czyli okres cyklu rozkazowego to 1/(20000000/4)=0.2us) no i problem jest w tym ze DS nie odpowiada. Tzn przy resecie magistrali zglasza sie ale to tyle.. nie chce podawac wartosci.. Prosilbym o pomoc i przepraszam za rozmiar posta. Edytowane 24 Listopada 2006 przez Trawienny Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...