[C] Atmega8 + ds18b20 błedny odczyt temperatury

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
hagop
-
Posty: 16
Rejestracja: 15 maja 2009, 18:53
Lokalizacja: Słupsk

[C] Atmega8 + ds18b20 błedny odczyt temperatury

Post autor: hagop » 21 lis 2009, 18:03

Witam!

Dwa tygodnie siedzę nad rozwiązaniem problemu z tym dallaskiem w C (w bascomie wszystko działa jak powinno)

Na początku próbowałem uruchomić jakiegoś gotowca lecz nic się nie udawało, później sam napisałem całą obsługę z pomocą datasheeta i dalej nie działa. Podejrzewam błąd odczytu (lub zapisu) z dallasa. na wyświetlaczu wyświetlają mi się albo krzaczki albo jakieś dziwne wartości b7, 159 -0.1 (modyfikuje konwersje odczytanej wartości) etc... gdy podgrzewam dska w palcach wartość na wyświetlaczu sie nie zmienia.


Programuje w eclipse avr, 8mhz wewnętrzny oscylator

Kod: Zaznacz cały

/*==============================================================================================*/
#define		SET_BIT(r,x)		r|=_BV(x);
#define		CLR_BIT(r,x)		r&=~_BV(x);
#define		TOG_BIT(r,x)		r^=_BV(x);
/*==============================================================================================*/

void send(char bit) //zapisanie pojedynczego bitu
{
   SET_BIT(H_DDR_1W,H_1W);
   CLR_BIT(H_PORT_1W,H_1W); // ustawiam port na wyjscie poziom 0
   _delay_us(15); //czekam
      if(bit==0) // jeżeli wysyłam zero to dalej czekam i dopiero wtedy ustawiam 1
      {
         _delay_us(60-15);
         SET_BIT(H_PORT_1W,H_1W);
      }
      else //gdy idzie jedynka to ustawiam 1 i czekam do konca okna transmisyjnego
         {
         SET_BIT(H_PORT_1W,H_1W);
         _delay_us(60-15);
         }
      _delay_us(1); // czekam 1us odstep miedzy oknami transmisyjnymi
}

unsigned char read(void) //odczytanie pojedynczego bitu
{
   unsigned char PRESENCE=0;
   SET_BIT(H_DDR_1W,H_1W);
   CLR_BIT(H_PORT_1W,H_1W); //ustawiam wyjscie stan niski na 1us
   _delay_us(1);
   CLR_BIT(H_DDR_1W,H_1W); // ustawiam wejscie podciagniete do 1
   SET_BIT(H_PORT_1W,H_1W);
   _delay_us(15);// po 15us sprawdzam czy stan na porcie wysylam 1 lub 0
   if(bit_is_set(H_PIN_1W,H_1W)) PRESENCE=1; else PRESENCE=0;
   _delay_us(60-15);// czekam do konca okna transmisyjnego
   _delay_us(1);// przerwa miedzy oknami
   return(PRESENCE);
}


void send_byte(char wartosc) //wyslanie bajtu
{
	unsigned char i;
	unsigned char pom;
	for (i=0;i<8;i++)
	{
		pom=wartosc>>i;
		pom&= 0x01;
		send(pom);
	}

}


unsigned char read_byte(void) odczytanie 2 bajtow
{
	unsigned char i;
	int wartosc = 0;
	for(i=0;i<16;i++)
	{
		if(read()) wartosc|=0x01<<i;

	}
	return(wartosc);
}
oto timeingi:
Załączniki
timing.JPG
timeingi przy odczytywaniu i zapisywaniu bitu.

ODPOWIEDZ