<html><body><p>Dobrý den všem,</p><p><br></p><p>mějme následující kus kódu, běžící ve dříve zmíněném bastlu s ATmega8 a displejem:</p><p><br></p><p>si7020_measure(&H, &T);<br>dispXY(0, 0);<br>dispInk(GLCD_CL_BLACK);<br>dispUInt(i2cAck);</p><p>dispX=100;<br>dispCas("cas: ", sec);<br>dispX=180;<br>if (TRI2_out==0) {<br>. dispTextF("2vyp ");<br>. dispUInt(secPer/60); dispChr('/'); dispUInt(PER_vyp/60); dispChr(32);<br>} else {<br>. dispTextF("2zap ");<br>. dispUInt(secPer/60); dispChr('/'); dispUInt(PER_zap/60); dispChr(32);<br>}<br>dispX=16;<br>dispInk(GLCD_CL_BLUE);<br>dispTextF("RH x10 ");<br>dispUInt(H); dispChr(32); dispChr(32);<br>dispPt(H-300, y1);<br>dispPt(H-300, y2);<br>dispInk(GLCD_CL_WHITE);<br>dispXY(0, y2+1);<br>dispLine(240, 0);<br>dispInk(GLCD_CL_GREEN);<br>dispXY(0, y2+2);<br>dispLine(240, 0);</p><p>dispXY(16, 8);<br>dispInk(GLCD_CL_RED);<br>dispTextF("T x100 ");<br>dispUInt(T); dispChr(32); dispChr(32);<br>dispPt((T-2100)/2, y1);<br>dispPt((T-2100)/2, y2);<br></p><p><br></p><p>Který je uvnitř while(1). Všechny proměnné jsou signed int. Je tam ještě čekání 1 s, mazání konce předchozích grafů a jejich zacyklení. Volané funkce zde:</p><p><br></p><p>void dispUInt(unsigned long x) { // ----------------------------------------------------<br>. unsigned char n;<br>. unsigned long L=1000000000, M;</p><p>. if (x==0) {dispChr('0'); return;}<br>. for (L=1000000000; L>0; L/=10) if (x>=L) break;<br>. for (M=x; L>0; L/=10) {<br>. n=M/L;<br>. if (L==1000 || L==1000000 || L==1000000000) dispMezera=2;<br>. dispChr(n+'0');<br>. M-=n*L;<br>. }<br>}</p><p><br></p><p>// mereni RH a T: vysledek ulozen do *H a *T. RH v % x10, T ve st.C x100. Pri OK je i2cAck=0.<br>void si7020_measure(signed int *H, signed int *T) { // ---------------------------------<br>. unsigned char a, b;<br>. signed long L;</p><p>. i2cAck=0;<br>. i2cByteWS(SI7_adr+I2C_wr);<br>. i2cByteW(0xf5);</p><p>. if (i2cAck>0) return;<br>. a=0;<br>. do {<br>. i2cStop();<br>. SI7020_wait(2);<br>. i2cAck=0;<br>. i2cByteWS(SI7_adr+I2C_rd);<br>. a++;<br>. } while (i2cAck>0 && a<200);<br>. if (i2cAck>0) return;</p><p>. a=i2cByteR(0);<br>. b=i2cByteRS(1);<br></p><p>. L=((unsigned long)a<<8)+b;<br>. L*=1250;<br>. L=(L>>16)-60;<br>. *H=(signed int)L;</p><p>. i2cByteWS(SI7_adr+I2C_wr);<br>. i2cByteW(0xe0);<br>. i2cStop();</p><p>. i2cByteWS(SI7_adr+I2C_rd);<br>. a=i2cByteR(0);<br>. b=i2cByteRS(1);</p><p>. L=(unsigned long)(a<<8)+b;<br>. L*=17572;<br>. L=(L>>16)-4685;<br>. *T=(signed int)L;<br>}<br></p><p><br></p><p>Problém je následující: Všechno funguje jak má, nahoře jsou zobrazeny txt údaje, dole pod sebou rychlý a pomalý graf, ... ale: Někdy se stane, že se hodnota RH x10 jaksi zasekne: Prostě tam je stále třeba 343, jako zrovna teď. graf ovšem vesele jezdí, jako by nic, takže hodnota H se zjevně stále mění. Ostatní hodnoty se taky normálně mění a to na grafech i zobrazovaná čísla.</p><p><br></p><p>Když zařízení resetnu, všechno funguje OK, ale RH x10 zas po nějakém čase vytuhne. Ale ne úplně. Někdy na čas "obživne" a mění s spolu s grafem.</p><p><br></p><p>WTF?</p><p><br></p><p>Děkuji,</p><p>PH</p><p><br></p><p><br></p></body></html>