dalem korekcje CRC i czas miedzy pomiarami 1s..
gdy oziebiam schodzi do 11.5 i koniec ...
crc nie przepuszcza dalej chyba w takim razie..
od czasu do czasu pojawiaja sie wtedy wyniki przerozne
27.5 -87.5 +33.0 niewiadomo skad...
przy starcie pokazuje temperature prawidlowa...
jak zwiekszam tez (nie probowalem wiecej niz 10 st)
chociaz przy przycisnieciu palcami temp sie zwieksza tylko kilka stopni
a jak przyloze cos zimnego dziwnie skacze..tzn <+14 stopni ok..
pokaze wartosci,70,80... na przemian z wartoscia prawidlowa...
w ten sposob ze ledwo co widac...
oto caly kod.. jakby ktos mogl zerknac..no wiem ze kolejny raz ds1820
moze ktorych z opoznien jest za male dla nizszych temperatur...
wogole wydaje mi sie ze źle przetwarzam ujemna temperature..
bardzo prosze o o pomoc..
jestem w stanie dac troche punktow
Kod:
gdy oziebiam schodzi do 11.5 i koniec ...
crc nie przepuszcza dalej chyba w takim razie..
od czasu do czasu pojawiaja sie wtedy wyniki przerozne
27.5 -87.5 +33.0 niewiadomo skad...
przy starcie pokazuje temperature prawidlowa...
jak zwiekszam tez (nie probowalem wiecej niz 10 st)
chociaz przy przycisnieciu palcami temp sie zwieksza tylko kilka stopni
a jak przyloze cos zimnego dziwnie skacze..tzn <+14 stopni ok..
pokaze wartosci,70,80... na przemian z wartoscia prawidlowa...
w ten sposob ze ledwo co widac...
oto caly kod.. jakby ktos mogl zerknac..no wiem ze kolejny raz ds1820
moze ktorych z opoznien jest za male dla nizszych temperatur...
wogole wydaje mi sie ze źle przetwarzam ujemna temperature..
bardzo prosze o o pomoc..
jestem w stanie dac troche punktow
Kod:
#include <avr/io.h>
#include "delay.h"
char bajt[8];
char nr;
void licz_CRC(char bajt,unsigned char *CRC) //procedura wyliczania CRC
{ //wielomian generujący jest równy: x^8 + x^5 + x^4 + 1
unsigned char zp1,zp2,i; //zmienne pomocnicze
zp1=bajt;
for(i=0;i<8;i++)
{
bajt^=*CRC; //wskaźnik *CRC wyznacza aktualnie wyliczony CRC
zp2=bajt&0x01; //wydzielenie bitu do obliczeń
bajt=*CRC;
if(zp2)
{
bajt^=0x18;
}
bajt=((unsigned char)(bajt)>>1)+0x80*zp2; //konwersja uch jest potrzebna do
//prawidłowego wykonania przesunięcia
*CRC=bajt;
zp1=(bajt=zp1>>1);
}
}
void instrukcja1w(unsigned char instr)
{
unsigned char i;
unsigned char znak;
for(i=0;i<8;i++)
{
znak=instr & _BV(i);
if(znak)
{
DDRD|=_BV(6);
delay_us(11);
DDRD&=~_BV(6);
delay_us(60);
}else{
DDRD|=_BV(6);
delay_us(70);
DDRD&=~_BV(6);
}
}
}
void czytaj1w_temp()
{
unsigned char znak;
unsigned char temp_calk;
unsigned char temp_ulam;
unsigned char bit;
unsigned char l;
unsigned char i;
temp_calk=0x00;
for(l=0;l<9;l++) //kolejny z 2 bajtow
{
for(i=0;i<8;i++) //kolejny z 8 bitow
{
DDRD|=_BV(6);
delay_us(1);
DDRD&=~_BV(6);
delay_us(14);
if(bit_is_clear(PIND,6)) bit=0; else bit=1;
delay_us(60);
if ((l==0) && (i==0)) //ulamek
{
if (bit==0) temp_ulam=".0"; else temp_ulam=".5";
}
if ((l==0) && (i>0)) //calkowita
{
if (bit==0) temp_calk&=~_BV(i-1); else temp_calk|=_BV(i-1);
}
if (l==1) //znak
{
if (bit==0) znak&=~_BV(i); else znak|=_BV(i);
}
if (bit==0) bajt[l]&=~_BV(i); else bajt[l]|=_BV(i);
}
}
//jezeli ujemna
if (znak==0xFF)
{
temp_calk=((~temp_calk)|0x01);
znak="-";
}else
{
znak="+";
}
//wyswietlanie
unsigned char zp;
zp=0; //w zp będzie liczone CRC - wstępne zerowanie
for(i=0;i<9;i++)
{
licz_CRC(bajt[i],&zp); //licz CRC ze wszystkich bajtów odebranych
}
if (zp==0){
//liczba calkowita
unsigned char temp1;
unsigned char temp2;
unsigned char wynik;
unsigned char bajt_j;
unsigned char bajt_dz;
tekst(znak);
//temp1=temp_calk & 0x0F;
//temp2=(temp_calk>>4) & 0x0F;
//temp2=temp2*16;
//wynik=temp1 + temp2;
wynik=temp_calk;
bajt_j=wynik % 10;
wynik=wynik/10;
bajt_dz=wynik % 10;
bajt_j= bajt_j + 48;
bajt_dz=bajt_dz + 48;
dana(bajt_dz);
dana(bajt_j);
//char string[16];
//utoa(temp_calk,string,16);
//tekst(string);
//tekst(temp_calk);
//koniec liczby calkowitej
tekst(temp_ulam);
}
}
unsigned char reset1w()
{
unsigned char jest;
jest=0;
DDRD|=_BV(6);
delay_us(480);
DDRD&=~_BV(6);
delay_us(65);
if(bit_is_clear(PIND,6)) jest=1;
delay_us(415);
if(bit_is_clear(PIND,6)) jest=0;
return jest;
}
int main(void) //program główny
{
DDRA|=_BV(LCD_LED_PIN);
PORTA|=_BV(LCD_LED_PIN);
PORT_DB6|=_BV(PIN_DB6);
PORT_DB7|=_BV(PIN_DB7);
DDRC|=_BV(PIN_RS);
DDRC|=_BV(PIN_E);
DDRC|=_BV(PIN_DB4);
DDRC|=_BV(PIN_DB5);
DDRD|=_BV(PIN_DB6);
DDRA|=_BV(PIN_DB7);
DDRD &=~_BV(6);
PORTD&=~_BV(6);
ini_lcd();
instrukcja(0x0c); //0f
instrukcja(0x01);
instrukcja((0*0x40+0)|0x80);
//tekst("poczatek");
//instrukcja((1*0x40+0)|0x80);
//tekst("2'ga linia :P");
while(1)
{
delay_us(1000000);
if(reset1w())
{
instrukcja((0*0x40+0)|0x80);
instrukcja1w(0xCC); //zaadresowanie na wszystkie
instrukcja1w(0x44); //konwersja temp.
delay_us(600000); //czas na pomiar
reset1w();
instrukcja1w(0xCC); //readscrable
czytaj1w_temp();
}else{
instrukcja((0*0x40+0)|0x80);
tekst("Brak pastylki ");
}
delay_us(1000000);
}
}