logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega8][C] Problem z DS18B20

m3 27 Sty 2009 23:30 1461 2
REKLAMA
  • #1 6064407
    m3
    Poziom 12  
    Witam, znalazłem w necie poniższy kod i dołączyłem go do swojego projektu. Niestety nie działa. Cały czas dostaje informacje na wyświetlacz że odczyt się nie powiódł.

    W kodzie nie ma funkcji inicjalizujących LCD i wyświetlających znak, żeby nie zaciemniać analizy.

    Używam wewnętrznego kwarcu, tj. 1 MHz. Zasilam DS18B20 w normalny sposób (bez zasilania pasożytniczego).

    Co może być nie tak? Wiem że to było wałkowane na elektrodzie ale nie znalazłem rozw. mojego problemu (tu jest podobny przypadek ale mi nie pomaga: https://www.elektroda.pl/rtvforum/topic1209476.html )

    #include "config.h"
    #include <stdlib.h>
    
    #define WE	2
    #define PORT_1WIRE PORTB
    #define SET_1WIRE	DDRB &= ~_BV(WE)
    #define CLEAR_1WIRE DDRB |= _BV(WE)
    
    char buf[8];
    
    unsigned char RESET_PULSE(void);
    unsigned char read_byte(void);
    void send_byte(char wartosc);
    void send(char bit);
    unsigned char read(void);
    
    int main(void){
    
    unsigned char sprawdz;
    char temp1 = 0, temp2 = 0;
    
    delay(100);
    
    
    PORTB &=~_BV(2); 
    
       delay(250);
        initLCD();
        
     
     while(1)
     {
     	sprawdz = RESET_PULSE();
     	if(sprawdz == 1)
    	{
    		//
    		RESET_PULSE();
    		send_byte(0xCC);
    		send_byte(0x44);
    		delay(750);
    
    		sprawdz = RESET_PULSE();
    		send_byte(0xCC);
    		send_byte(0xBE);
    
    		temp1 = read_byte(); // odczytanie LSB
    		temp2 = read_byte(); // odczytanie MSB
    
    		sprawdz = RESET_PULSE();
    
    		float temp=0;
    		temp=(float)(temp1+(temp2*256))/16;
    
    		dtostrf(temp, 1, 1, buf); //konwersja float na stringa
    
    		gotox(0x00);
    		writestr("udalo sie!");
    		gotox(0x40);
    		writestr(buf);
    		delay(250);
    	}
    	else
    	if(sprawdz == 0)
    	{
    		gotox(0x00);
    		writestr("lipa pany");
    	}
     };
    
    
    	return 0;
    }
    
    
    
     
    unsigned char RESET_PULSE()
    {
     unsigned char PRESENCE = 0;
     CLEAR_1WIRE;
     _delay_us(500);
     SET_1WIRE;
     _delay_us(60); 
     	if(bit_is_clear(PORT_1WIRE, WE))
     	{
    		PRESENCE = 0; 
     	}
    	else
    	{
    		PRESENCE = 1;
    	}
    
     delay(470);
    
     	if(bit_is_set(PORT_1WIRE, WE))
    	{
    		PRESENCE = 1;
    	}
    	else
    	{
    		PRESENCE = 0;
    	}
    	return PRESENCE;
    }
    
    
    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 send(char bit)
    {
     CLEAR_1WIRE;
     _delay_us(5);
    	if(bit == 1)
    		SET_1WIRE;
    
    		_delay_us(80);
    		SET_1WIRE;
    }
    
    unsigned char read(void)
    {
     unsigned char PRESENCE = 0;
    
     CLEAR_1WIRE;
     _delay_us(5);  
     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);
    }
    
  • REKLAMA
  • #2 6064558
    djkomprez
    Poziom 21  
    Ds-y są bardzo wrażliwe na czasy opóźnień ...

    Dobrze by było abyś tak samo taktował procesor
    jak w projekcie z którego zapożyczyłeś kod ..
  • #3 6067783
    m3
    Poziom 12  
    No i rzeczywiście, poprawiłem trochę czasówki... są inne niż te zaproponowane przez autora kodu. Program działa. Czasówki znalazłem na stronie maxima. ;]

    Dzięki za pomoc.
REKLAMA