Skocz do zawartości
Trawienny

Ds18b20 Na Pic18f452 W Mplab C18

Rekomendowane odpowiedzi

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 przez Trawienny

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...