Witam wszystkich forumowiczów dobrej woli
.
Mój układ składa się z atmegi16 i czujnika ds18b20, całość złożona na płytce stykowej. Problem polega na tym, że przy odczycie temperatury sczytywany jest LSB a zamiast MSB otrzymuję 0 (słownie "zero"). Czujnik testowany w temperaturze poniżej zera, w temperaturze pokojowej i we wrzątku i cały czas otrzymuję jedynie wartość LSB. Układ chyba reaguje prawidłowo ponieważ wartości LSB zmieniają się wraz z temperaturą od ok 49 w temp pokojowej poprzez 17 w temp ok zera i ponad 100 w temp ok 100 stopni. Wartość MSB cały czas jest równe 0.
Poniżej zamieszczam kod.
Tylko proszę o wyrozumiałość. Kod bardzo kombinowany i słabo czytelny ale wierzę, że doświadczeni programiści dadzą rade:).
Dodam jeszcze, że próbowałem z dwoma czujnikami i cały czas to samo.
Nie przetestuje w BASCOM ponieważ nigdy w nim nie programowałem;/.
Pozdrawiam
Michał
Mój układ składa się z atmegi16 i czujnika ds18b20, całość złożona na płytce stykowej. Problem polega na tym, że przy odczycie temperatury sczytywany jest LSB a zamiast MSB otrzymuję 0 (słownie "zero"). Czujnik testowany w temperaturze poniżej zera, w temperaturze pokojowej i we wrzątku i cały czas otrzymuję jedynie wartość LSB. Układ chyba reaguje prawidłowo ponieważ wartości LSB zmieniają się wraz z temperaturą od ok 49 w temp pokojowej poprzez 17 w temp ok zera i ponad 100 w temp ok 100 stopni. Wartość MSB cały czas jest równe 0.
Poniżej zamieszczam kod.
Tylko proszę o wyrozumiałość. Kod bardzo kombinowany i słabo czytelny ale wierzę, że doświadczeni programiści dadzą rade:).
Dodam jeszcze, że próbowałem z dwoma czujnikami i cały czas to samo.
Nie przetestuje w BASCOM ponieważ nigdy w nim nie programowałem;/.
#define F_CPU 1000000L
#include<avr/io.h>
#include<stdlib.h>
#include<util/delay.h>
//#include "lcd.h"
#define WE 7
#define PORT_1Wire PIND
#define SET_1Wire DDRD&=~_BV(WE)
#define CLEAR_1Wire DDRD|=_BV(WE)
#define LCD PORTA
#define E 3
#define RS 2
#define SET_E LCD |= _BV(E)
#define CLR_E LCD &= ~_BV(E)
#define SET_RS LCD |= _BV(RS)
#define CLR_RS LCD &= ~_BV(RS)
char buf[8];
void write_to_lcd(char x)
{
SET_E;
LCD = ((LCD & 0x0F) | (x & 0xF0));
CLR_E;
SET_E;
LCD = ((LCD & 0x0F) | ((x & 0x0F) << 4));
CLR_E;
_delay_ms(1);
}
void write_command(char x)
{
CLR_RS;
write_to_lcd(x);
}
void write_char(char x)
{
SET_RS;
write_to_lcd(x);
}
void write_text(char * s)
{
while(*s)
{
write_char(*s);
s++;
}
}
void lcdxy(short int w, short int k)
{
write_command((w*64+k)|128);
}
void lcd_init(void)
{
_delay_ms(15);
CLR_E;
CLR_RS;
char i;
for(i = 0; i < 3; i++)
{
SET_E;
LCD &= 0x3F;
CLR_E;
_delay_ms(5);
}
SET_E;
LCD &= 0x2E;
CLR_E;
_delay_ms(1);
write_command(0x28);
write_command(0x08);
write_command(0x01);
write_command(0x06);
write_command(0x0C);
}
unsigned char RESET_PULSE(void)
{
unsigned char PRESENCE;
CLEAR_1Wire;
_delay_us(500);
SET_1Wire;
_delay_us(50);
if(bit_is_clear(PORT_1Wire,WE))
{
PRESENCE=0;
}
else
{
PRESENCE=1;
}
_delay_us(410);
if(bit_is_set(PORT_1Wire,WE))
{
PRESENCE=1;
}
else
{
PRESENCE=0;
}
return PRESENCE;
}
void send(char bit)
{
CLEAR_1Wire;
_delay_us(1);
if(bit==1)
SET_1Wire;
_delay_us(60);
SET_1Wire;
}
unsigned char read(void)
{
unsigned char PRESENCE=0;
CLEAR_1Wire;
_delay_us(1);
SET_1Wire;
_delay_us(15);
if(bit_is_set(PORT_1Wire,WE))
{
PRESENCE=1;
}
else
{
PRESENCE=0;
}
return PRESENCE;
}
void send_byte(char wartosc)
{
unsigned char i;
unsigned char pom;
for(i=0;i<8;i++)
{
pom=wartosc>>i;
pom &= 0x01;
send(pom);
}
_delay_us(100);
}
unsigned char read_byte(void)
{
unsigned char i;
unsigned char wartosc=0;
for(i=0;i<8;i++)
{
if(read())wartosc|=0x01<<i;
_delay_us(15);
}
return wartosc;
}
void clear_lcd(void)
{
int i;
for(i=0;i<100;i++)
{
write_char(32);
}
}
int main()
{
DDRA = 0xFF;
PORTA = 0xFF;
unsigned char sprawdz;
int i=0, temp1=0, temp2=0, pom1, pom2;
lcd_init();
write_text("1-wire");
_delay_ms(1000);
clear_lcd();
while(1)
{
sprawdz=RESET_PULSE();
if(sprawdz==1)
{
send_byte(0xcc);
send_byte(0x44);
_delay_ms(750);
sprawdz=RESET_PULSE();
send_byte(0xcc);
send_byte(0xbe);
temp1=read_byte();
temp2=read_byte();
sprawdz=RESET_PULSE();
int temp=0;
temp=(temp1+(temp2*256))/16;
//temp=temp1|pom1;
//pom2=pom1*0,0625;
/*int d,f,i,e,r,t,y,u;
i=temp1;
d=i;
if(d>100)
{
f=d/100+48;
e=(d%100)/10+48;
r=d%10+48;
}
else
{
f=32;
e=d/10+48;
r=d%10+48;
}*/
char bufor1[7];
char bufor2[7];
itoa(temp1,bufor1,10);
itoa(temp2,bufor2,10);
//r=d%10+48;
//dtostrf(temp,1,1,buf);
_delay_ms(200);
clear_lcd();
lcdxy(0,0.8);
write_text(bufor1);
lcdxy(1,0.8);
write_text(bufor2);
//write_char(temp1);
/*lcdxy(0,0.8);
write_text("temp1=");
write_char(f);
write_char(e);
write_char(r);
t=temp2*256;
y=t+49;
u=t;
//e=(d%10);
lcdxy(1,0.8);
write_text("temp2=");
write_char(t);
write_char(y);*/
}
else
{
lcdxy(0,0.8);
write_text(" kupa:) ");
}
}
//return 0;
}
Pozdrawiam
Michał
