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