[ATmega8] [C] Problem med DS18B20

M

m3

Guest
Hej, jeg fandt følgende kode i nettet og sluttede den til dit projekt. Desværre virker ikke. Hele tiden de oplysninger kommer til det skærmbillede, der læste mislykkedes.

I koden er der ingen initialisering funktion LCD display et tegn, for ikke at skabe uklarhed om analysen.

Jeg bruger en intern kvarts, dvs 1 MHz. DS18B20 leverancer på normal vis (uden parasitære magt).

Hvad der kunne være galt? Jeg ved, at det var rullet på elektroden, men fandt ikke udviklingen. mit problem (der er en lignende sag, men det hjælper ikke mig: <a href="http://www.elektroda.pl/rtvforum/viewtopic.php?t=1209476&highlight=ds18b20&sid=" target="_blank">http://www.elektroda.pl/rtvforum/viewtopic.php?t=1209476&highlight=ds18b20&sid =</a> )

<table width="90%" cellspacing="1" cellpadding="3" border="0" align="center"><tr><td> <b>Kode:</b> </td></tr><tr><td class="code"> # Include "config.h"
# Medtag stdlib.h

# Definer EF 2
# Definer PORTB PORT_1WIRE
# Definer SET_1WIRE DDRB & = ~ _BV (EF)
# Definer CLEAR_1WIRE DDRB | = _BV (EF)

char buf [8];

usignerede char RESET_PULSE (void);
usignerede char read_byte (void);
send_byte void (char værdi);
void send (char bit);
usignerede char read (void);

int main (void) {

usignerede CHAR kontrol;
char temp1 = 0, temp2 = 0;

forsinkelse (100);

PORTB & = ~ _BV (2);

forsinkelse (250);
initLCD ();

mens (1)
{
check = RESET_PULSE ();
if (check == 1)
{
/ /
RESET_PULSE ();
send_byte (0xCC);
send_byte (0x44);
forsinkelse (750);

check = RESET_PULSE ();
send_byte (0xCC);
send_byte (0xBE);

temp1 = read_byte () / / læse LSB
temp2 = read_byte () / / læse MSB

check = RESET_PULSE ();

float temp = 0;
temp = (float) (temp1 (temp2 * 256)) / 16;

dtostrf (temp, 1, 1, BUF) / / konvertere float til string

gotox (0x00);
writestr ("Vi gjorde det!");
gotox (0x40);
writestr (BUF);
forsinkelse (250);
}
andet
if (check == 0)
{
gotox (0x00);
writestr ("kalk somheden");
}
};

return 0;
}
usignerede char RESET_PULSE ()
{
usignerede char NÆRVÆR = 0;
CLEAR_1WIRE;
_delay_us (500);
SET_1WIRE;
_delay_us (60);
if (bit_is_clear (PORT_1WIRE, EF))
{
NÆRVÆR = 0;
}
andet
{
NÆRVÆR = 1;
}

forsinkelse (470);

if (bit_is_set (PORT_1WIRE, EF))
{
NÆRVÆR = 1;
}
andet
{
NÆRVÆR = 0;
}
NÆRVÆR vende tilbage;
}

usignerede char read_byte (void)
{
usignerede CHAR i;
usignerede char værdi = 0;

for (i = 0; i <8; i )
{
if (læs ()) værdi | = 0x01 <<i;
_delay_us (15);
};
returværdi;
}

void send (char bit)
{
CLEAR_1WIRE;
_delay_us (5);
if (bit == 1)
SET_1WIRE;

_delay_us (80);
SET_1WIRE;
}

usignerede char read (void)
{
usignerede char NÆRVÆR = 0;

CLEAR_1WIRE;
_delay_us (5);
SET_1WIRE;
_delay_us (15);

if (bit_is_set (PORT_1WIRE, EF)) tilstedevaerelsen = 1; ellers NÆRVÆR = 0;

afkast (tilstedeværelse)
}

send_byte void (char værdi)
{
usignerede CHAR i;
usignerede CHAR POM;

for (i = 0; i <8; i )
{
pom = værdi>> i;
Måling & = 0x01;
send (POM);
}
_delay_us (100);
}
</td></tr></table>
 
Ds-y er meget følsomme over for forsinkelser ...

Det ville være ligesom du taktował processor
som i projektet fra hvor koden zapożyczyłeś ..
 
Tja, faktisk, jeg fast en lidt tidskørsel ... er anderledes end foreslået af forfatteren af koden. Programmet virker. Jeg fandt tidskørsel på maksima. ;]

Tak for din hjælp.
 

Welcome to EDABoard.com

Sponsor

Back
Top