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

DS1820 + Atmega32, Problemy z odczytem temperatury.

jbikincho 31 Sie 2010 10:23 1166 0
REKLAMA
  • #1 8459235
    jbikincho
    Poziom 1  
    Witam.

    Mam problemy z obsługą transmisji linii 1-Wire. Układ mój wyposażony jest w Atmege32, czujnik temperatury DS1820 podłączony do portu A0, oraz tymczasowo zestaw diod sygnalizacyjnych podłączonych do portu B ( docelowo zamierzam dokupić wyświetlacz LCD). Obsługę lini 1-wire starałem się pisać zgodnie ze zaleceniami manuala DS1820. Czujnik reaguje na sygnał reset (wystawia sygnał presence na linii). Wydaje mi się iż problem leży w funkcjach zapisu lub odczytu danych z linii. Niestety pomimo licznych prób nie udało mi się uzyskać poprawnego wyniku pomiaru temperatury. Za każdym razem w wyniku otrzymuje same jedynki (zarówno bajt starszy jaki i młodszy). Poniżej zamieszczam plik główny oraz napisaną przeze mnie bibliotekę do obsługi linii 1-wire. Cały projekt dołączam także w załączniku. Będę wdzięczny za wszelkie uwagi.

    //PLIK main.c
    
    #include <avr\io.h>
    #include <inttypes.h>
    #include <util\delay.h>
    #include "senslib.h"
    #include "makra.h"
    
    int main(void){
    
    	uint8_t i = 0, wynik_l = 0, wynik_m = 0x00;
    	DDRB = 0xff;
    	DDRA = 0xff;
    	_delay_ms(200);
    	
    	SENS_DDR |= (1<<SENS_PIN);
    	
    	//i = init();
    	if(init()){PORTB = 0x02;}
    	else{
    		write_byte(0XCC); 		//pominięcie ROM
    		write_byte(0x44); 		// konversja temperatury
    		_delay_ms(25);
    		if (check_line()){PORTB = 0x08;} 	//sprawdzenie stanu lini w trakcie konwersji
    		_delay_ms(255);
    		_delay_ms(255);			//oczekiwanie do końca konwersji
    		_delay_ms(255);
    	}
    	
    	if(init()){PORTB = 0x03;}
    	else {
    		write_byte(0XCC);
    		write_byte(0xBE);			// odczyt temperatury
    		wynik_l = read_byte();		// pierwszy bajt
    		wynik_m = read_byte();		// drugi bajt
    		init();						//reset 
    	//PORTB = wynik_l;
    	//PORTB = wynik_m; 
    	
    	}
    	
    	while(1){}
    	
    return 0;
    
    }
    
    // PLIK senslib.c
    
    #include "makra.h"
    #include "senslib.h"
    
    void set_low(uint8_t delay){		//generuje sygnał low (0) na lini
    	
    	_delay_us(delay);
    	SENS_PORT &= ~(1<<SENS);
    	SENS_DDR |= (1<<SENS);		
    
    }
    
    void set_high(uint8_t delay) {		// generuje sygnał high (1) na lini
    
    	_delay_us(delay);
    	//SENS_PORT |= (1<<SENS);
    	SENS_DDR &= ~(1<<SENS);
    }
    
    //generacja sygnału init
    
    uint8_t check_line (void){
    
    		uint8_t state;
    		state = ((SENS_PIN & (1<<SENS))) ? 1 : 0 ;
    		return state;
    }
    
    uint8_t init(void){
    	
    	uint8_t presence = 0x00; 
    	
    	set_low(0);							// generuje impuls low na lini						
    	set_high(500);						// ustawienie stanu high na lini po 500 us
    	_delay_us(100);						// oczekiwanie na sygnał presence
    	presence = check_line();			// wykrycie sygnału presence
    	_delay_us(360);						// oczekiawnie na zakończenie sygnału presence 
    	return presence;
    }
    	
    	// odczyt danych z magistrali one wire
    
    uint8_t read(void) {
    
    	uint8_t read_bit = 0x00;
    	
    		set_low(0);
    		set_high(3);
    		_delay_us(6);
    		read_bit = check_line();
    		_delay_us(80);
    		
    	return read_bit;
    }
    
    uint8_t read_byte(void) {
    
    	uint8_t wynik = 0x00, i = 0x00;
    	
    		for (i=0; i<8 ;i++) {		//do zmiennej wynik wpisywane są kolejne bity w odwrotnej kolejnośći
    			if(read()){
    				wynik |= (1<< i); 	//  (pierwszy zczytany bit jest ostatni)
    			}					
    
    		}
    	return wynik;
    }
    
    	// zapis danych na magistralę one wire
    
    void write(uint8_t bit) {
    
    	set_low(0);
    	if(bit) {
    	
    		set_high(5);
    		_delay_us(60);
    	}
    	else{
    	
    		set_high(60);
    		_delay_us(5);
    	}
    	_delay_us(2);
    	return;
    }
    
    void write_byte(uint8_t byte) {
    
    	uint8_t i = 0x00;
    	
    	for (i=0; i<8; i++){
    	
    		write((byte & (1<<i)));
    		_delay_us(2);
    	}
    }


    //PLIK MAKRA.h

    Proszę pamiętać o używaniu znaczników code. - arnoldziq

    Przeniesiono z Programowanie Ogólne. - arnoldziq
  • REKLAMA
REKLAMA