rrata:?:

G

Guest

Guest
Hej, et par dage til at blive træt af DS18B20, pakket den på en plade test, alle gode forbindelser, ikke bare parasitære af den normale strømforsyning.Dette svarer til reset nu og da for ingenting.

Jeg tog et kort kursus i at håndtere kortene og
http://tnij.org/ds18b20
Very nice pdf.

Programmet er skrevet på grundlag af denne pdf.Da der kun er én 's ikke noget jeg ikke har adresse.Programmet ser således ud:

De funktioner af trykte og fejl kun at vise tal, jeg har det hele til afprøvning på en test plade og to dioder, så jeg var nødt til at en eller anden måde at løse output;)

Code:

# Inkluder <avr/io.h>

# Inkluder <avr/delay.h>

# Inkluder <avr/signal.h>

# Inkluder <stdlib.h>

# Inkluder <lcd.h>

# Definer f_CPU 8000000# Definer RED _BV (7)

GREEN # define _BV (5)

# Definer i 4

# Definer DEL_TIME 500# Definer EF 6

# Definer PORT_1Wire PINB

# Definer sæt DDRB & = ~ _BV (EF)

# Definer klare DDRB | = _BV (EF)char buf [8];//************************************************ *************************************

void print (int x);

wyswietl_temp void (void);

void send (char bit);

unsigned char read (void);

send_byte void (char værdi);

unsigned char read_byte (void);

void fejl (int i);

//************************************************ *************************************int main (void)

(

DDRD = 255 / / output

DDRC = 0, / / input

PORTC | = _BV (IN) / / pullupwhile (1)

(

if (bit_is_clear (PINCs, IN)) / / Pressede

(

_delay_ms (500);

wyswietl_temp ();

)

andet

(

PORTD & = ~ RED;

PORTD | = GREEN;

)

)

)//************************************************ *************************************

void print (int x)

(

int i;if (x> 100)

(

/ / For nu er der ikke en sådan mulighed

)

else if (x> 10)

(

int tiere = x / 10;

int dem = x% 10;

x = 10% x, / / Enhedslistenfor (i = 0; i <dem; i )

(

PORTD | = RED;

_delay_ms (DEL_TIME);

PORTD & = ~ RED;

_delay_ms (DEL_TIME);

)_delay_ms (1000);

/ / Brejk

for (i = 0; i <5; i )

(

PORTD | = RED;

PORTD & = ~ GREEN;

_delay_ms (50);

PORTD & = ~ RED;

PORTD | = GREEN;

_delay_ms (50);

)

_delay_ms (1000);for (i = 0; i <tiere i )

(

PORTD | = RED;

_delay_ms (DEL_TIME);

PORTD & = ~ RED;

_delay_ms (DEL_TIME);

)

_delay_ms (1000);/ / Brejk

for (i = 0; i <5; i )

(

PORTD | = RED;

PORTD & = ~ GREEN;

_delay_ms (50);

PORTD & = ~ RED;

PORTD | = GREEN;

_delay_ms (50);

)

_delay_ms (1000);

)

else / / (0 0,10)

(

for (i = 0; og <x, i )

(

PORTD | = RED;

_delay_ms (DEL_TIME);

PORTD & = ~ RED;

_delay_ms (DEL_TIME);

)

_delay_ms (1000);/ / Brejk:

for (i = 0; i <5; i )

(

PORTD | = RED;

PORTD & = ~ GREEN;

_delay_ms (50);

PORTD & = ~ RED;

PORTD | = GREEN;

_delay_ms (50);

)

_delay_ms (1000);

)

)

//************************************************ *************************************

unsigned char RESET_PULSE (void)

(

unsigned char tilstedeværelse;

klar;

_delay_us (500);

sæt;

_delay_us (30);

if (bit_is_clear (PORT_1Wire, EF)) (TILSTEDEVÆRELSE = 1;) har ellers (tilstedeværelse = 0;)

_delay_us (470);

if (bit_is_set (PORT_1Wire, EF)) (TILSTEDEVÆRELSE = 1;)

andet (TILSTEDEVÆRELSE = 0;)

tilbagevenden tilstedeværelse;

)

//************************************************ *************************************

void send (char bit)

(

klar;

_delay_us (5);

if (bit == 1)

sæt;

_delay_us (80);

sæt;

)

//************************************************ *************************************

unsigned char read (void)

(

TILSTEDEVÆRELSE usignerede char = 0;

klar;

_delay_us (2);

sæt;

_delay_us (15);

if (bit_is_set (PORT_1Wire, EF)) TILSTEDEVÆRELSE = 1;

TILSTEDEVÆRELSE ellers = 0;

afkast (tilstedeværelse)

)

//************************************************ *************************************

send_byte void (char værdi)

(

unsigned char i;

unsigned char pom;for (i = 0; i <8; i )

(

pom = værdi>> i;

pom & = 0x01;

send (pom);

)

_delay_us (100);

)

//************************************************ *************************************

unsigned char read_byte (void)

(

unsigned char i;

unsigned char værdi = 0;for (i = 0; i <8; i )

(

if (læs ()) værdi | = 0x01 <<1;

_delay_us (15);

)

afkast (værdi);

)

//************************************************ *************************************

wyswietl_temp void (void)

(

int i;

unsigned char check;

char temp1 = 0, temp2 = 0;

_delay_ms (200);

RESET_PULSE = check ();

if (check == 1)

(

send_byte (0xCC);

send_byte (0x44);

_delay_ms (750);

RESET_PULSE = check ();

send_byte (0xCC);

send_byte (0xBE);read_byte temp1 = ();

read_byte temp2 = ();int t = (temp1 (temp2 * 256)) / 16;print (t);

)

andet

(

/ / Error

fejl (1);

)

)

//************************************************ *************************************

void fejl (int i)

(

for (int a = 0 og <i, en )

(

_delay_ms (500);

PORTD | = RED;

PORTD & = ~ GREEN;

_delay_ms (500);

PORTD & = ~ RED;

PORTD | = GREEN;

)

)

//************************************************ *************************************//************************************************ *************************************
 
Bestemt kaffe oprettet den korrekt?
Namieszałeś smule i koden, jeg ved ikke, om det ville hjælpe, men kig på http://mikrokontrolery.net/avr_c_10.htm

Og lave den link du gav ikke virker, fordi
 
Hey.
Jeg ved ikke, om du kender, men disse blokke er meget følsomme, når det kommer til gange mellem kommandoer.
Ved første øjekast ser jeg du har problemer med dette.Læs lidt om kommandoen i dokumentationen biblioteket _delay_ms avr-libc.
Ifølge dokumentationen:

Code:

Den størst mulige forsinkelse 262,14 ms / F_CPU i MHz.
 
Jeg tror, fejlen her:
Code:

unsigned char read_byte (void)

(

unsigned char i;

unsigned char værdi = 0;for (i = 0; i <8; i )

(

if (læs ()) værdi | = 0x01 <<1 / / forkerte linje

_delay_us (15);

)

afkast (værdi);

)
 
Og jeg tror fejlen er i den linje, hvor variablen er angivet med char Du multipliest 256 gange:

Code:

int t = (temp1 (temp2 * 256)) / 16;
 
@ Up:

Ikke i dette problem, skal du ringe hver read_byte () returnerer 2
Printowanie temp1, temp2 også giver to
 
Pitrija skrev:

...
Hvert opkald read_byte () returnerer 2 ...
 
Nu, ja.
rrata havde ret.Indtil en sådan simpel dum fejl, at jeg ikke har fundet tidligere.

Jeg ved, at _delay_ms (400) kan producere forskellige resultater, men hidtil alt fungerer fejlfrit

Tak til alle for rådgivning.
 

Welcome to EDABoard.com

Sponsor

Back
Top