Hej Kupilem termometr ds18B20. Wiedzia³em, ¿e bêd± problemy, ale nie, ¿e a¿ tak d³ugo. Robiê zgodnie z instrukcja, mam at89s52, kwarc 12MHz, wiêc instrukcja ¶rednio w 1us (inkrementacja timera tez). Dostaje presence pulse, ale jak wyswietlam odebrane dane po kolei ze scratchpada to dostaje: 0, 128, 128, 0,
128, 128, 0, 0 dziesiêtnie.
Pro¶ba moja jest taka, czy kto¶ móg³by tylko sprawdziæ czy funkcje do wysy³ania i odbierania bitów i bajtów s± poprawne? Bajtów pewnie tak, ale nie wiem jak z bitami.
A mo¿e kto¶ ma jaki¶ dzia³aj±cy, jednomodu³owy kod i móg³by mi przes³aæ chocia¿ te dwie funkcje do obioru i nadania bitu?
pozdrawiam
P.S.(disp() wyswietla liczbe na lcd); czê¶c programu:
void low() { P0 &= ~0xC0; }
void high() { P0 |= 0xC0; }
void transmit(unsigned char _bit) { if(_bit) //if '1' { low(); TH1=0xFF; //60us TL1=0xC3; //60us high(); TF1=0; TR1=1; while(!TF1){} TR1=0; TF1=0; } else //if '0' { low(); TH1=0xFF; //60US TL1=0xC3; //60US TF1=0; TR1=1; while(!TF1){} high(); TR1=0; TF1=0; } }
void send(unsigned char _byte) { unsigned char i; for(i=0;i<8;i++) { transmit((_byte)&(1<<i)); }
}
unsigned char receive() { unsigned char retval=0; low(); //TH1=0xFF; //TL1=0xF8;//6; //7us dla ostatniego whilea
TH1=0xFF; TL1=0xF8;
high(); TF1=0; TR1=1; while(!TF1){} retval=(P0 & 0x80); TF1=0; TR1=0; return retval; }
unsigned char read() { unsigned char dana=0; unsigned char i; for(i=0;i<8;i++) { dana|=((receive())<<i); } return dana; }
void main() {
TMOD=0x11;
while(1) { high();
TH1=0xFE; TL1=0x1F; low(); TF1=0; TR1=1;
while(!TF1){} //czekaj 480us high(); TR1=0; TF1=0; P0|=0x01; P0&=~0x02; while(!(P0 & 0x80)){} //czekaj az bedzie high a ma byc
while(P0 & 0x80){} //czekaj na presence pulse
while(!(P0 & 0x80)){} //czekaj az zwolni for(k=0;k<400;k++){} //razem z presence pulse ma byc 480 us, to damy wiecej
send(0xCC); send(0xBE);
t1=read(); t2=read(); t3=read(); t4=read(); t5=read(); t6=read(); t7=read(); t8=read();
clr(); home(); disp(t1); write('/'); disp(t2); write('/'); disp(t3); write('/'); disp(t4);
for(k=0;k<1000;k++){} }
}