Skocz do zawartości

Problem z ds18b20


TomXV

Pomocna odpowiedź

Witam,
Chciałbym zamontować do swojego robota jakiś czujnik temperatury i zdecydowałem się na ds18b20 korzystając z strony: http://www.jaglarz.com/ja/elektronika/ds18b20.pdf napisałem kod. Lecz niestety on niedziała (nie odczytuje temperatury tylko wskazuje temp1 i temp2 równe 255, natomiast wykrywa urządzenie) czy mógłby ktoś wskazać błąd?

#ifndef F_CPU
#define F_CPU 16000000UL
#endif
// prędkość transmisji 9600
#define UART_BAUD_RATE      9600  

#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "uart.h"

#define WE 6
#define PORT_1wire	PIND
#define SET_1wire	DDRD&=~_BV(WE)
#define CLEAR_1wire	DDRD|=_BV(WE)
#define DELAYUS(x)	_delay_us(x)

unsigned char reset_pulse(void){
unsigned char PRESENCE=0;
CLEAR_1wire;
DELAYUS(500);	//500us
SET_1wire;
DELAYUS(30);
if(bit_is_clear(PORT_1wire,WE)) {PRESENCE=1;} else {PRESENCE=0;}
DELAYUS(470);
if(bit_is_set(PORT_1wire,WE))	{PRESENCE=1;} else {PRESENCE=0;}
return PRESENCE;
}
void send(char bit){
CLEAR_1wire;
DELAYUS(5);
if(bit==1)	SET_1wire;
DELAYUS(80);
SET_1wire;
}
unsigned char read(void){
unsigned char PRESENCE=0;
CLEAR_1wire;
DELAYUS(2);
SET_1wire;
DELAYUS(15);
if(bit_is_set(PORT_1wire,WE)) PRESENCE=1; else PRESENCE=0;
return(PRESENCE);
}
void send_byte(char wartosc){
unsigned char y;
unsigned char pom;
for (y=0;y<8;++y){
	pom = wartosc>>y;
	pom &= 0x01;
	send (pom);
}
DELAYUS(100);
}
unsigned char read_byte(void){
unsigned char y;
unsigned char wartosc=0;
for(y=0;y<8;++y){
	if(read()) wartosc |= 0x01<<y;
	DELAYUS(15);
}
return (wartosc);
}

int main(void)
{
uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU)); 				// włączenie modułu UART, ustawienie prędkości transmisji

   sei();															//wlaczenie obslugi przerywan
   uart_puts("start ");

unsigned char sprawdz;
char temp1=0;
char temp2=0;
char buf[10]={0,0,0,0,0,0,0,0,0,0};

   while(1)
   {
	int i=0;
	int y=0;
	sprawdz=reset_pulse();
	if(sprawdz){
		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();
		float temp=0;
		temp=(float)(temp1+(temp2*256))/16;
		//dtostrf(temp,1,1,buf);
		uart_putc(temp1);
		uart_putc(temp2);
		uart_putc('\n');
		_delay_ms(200);
	}
	else{
		uart_puts("\npresence: ");
		uart_putc(sprawdz);
		_delay_ms(750);
	}			
   }
}

Bardzo proszę o pomoc.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.