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

Atmega32 + SHT11, błąd lub brak odczytu linii SDA

CRDReed 31 Gru 2009 19:37 1858 3
REKLAMA
  • #1 7465299
    CRDReed
    Poziom 11  
    Mam problem z odebraniem wartości linii SDA, odbieram zawsze same logiczne "1", proszę o pomoc.

    Definicja ustawiania i czyszczenia bitów na linii SDA i SCL

    #define SHT11Out PORTB
    
    #define SDA 2
    #define SCL 3
    //
    #define CLR_SDA   SHT11Out &= ~_BV(SDA) 
    #define SET_SDA   SHT11Out |= _BV(SDA)  
    
    #define CLR_SCL   SHT11Out &= ~_BV(SCL)  
    #define SET_SCL   SHT11Out |= _BV(SCL) 


    Definicja odbioru bitu na linii SDA <- Sprawdziłem poniższą funkcję i działa prawidłowo. SDA podpiąłem pod masę funkcja zwracała 0, jak podpiąłem pod 5V funkcja zwracała 1;

    char check(void)
    {
    	DDRB^=0b0000100; 
    	if(bit_is_clear(PINB,SDA))
    	{
    	DDRB^=0b0000100; 
    	return 0;
    	}
    	else
    	{
    	DDRB^=0b0000100; 
    	return 1;
    	}
    }


    Problem jest w funkcji wystawiającej bajt a mianowicie z odebraniem potwierdzenia (zawsze funkcja check() zwraca 1), układ SHT11 powinien wyzerować linię SDA, a funkcja check() powinna zwrócić 0.

    error = check();

    char SHT11_write(unsigned char value)
    {
    	unsigned char i,error=0,error2=0;
     
    	
    	for(i=0;i<8;i++,value<<=1) 
    	{
    		if(value & 0x80) 
    			{
    			SET_SDA;
    			} 
    		else 
    			{
    			CLR_SDA;
    			}
    		SET_SCL;
    		_delay_ms(0.1);
    		CLR_SCL;
    		
    	}
    	
     	SET_SDA;
    	SET_SCL;
    	_delay_ms(0.1);
    	error =  check();
    	_delay_ms(0.1);
    	CLR_SCL;
    return error;
    }



    Ogólnie to problem jest z odbiorem bitów, ponieważ w funkcji check() odczytującej bit z linii SDA są same wysokie stany, tak jakby układ SHT11 nie wstawiał 0. Co w konsekwencji uniemożliwia mi odbiór bajtów zawartych w rejestrach układu SHT11, każdy odebrany bajt to 0xFF.

    Atmega32 + SHT11, błąd lub brak odczytu linii SDA

    Grubszą linią zaznaczono na obrazie przejęcie linii SDA przez układ SHT11
    Proszę o pomoc
  • REKLAMA
  • REKLAMA
  • #3 7465548
    CRDReed
    Poziom 11  
    Dziękuje za zainteresowanie, ale z tym asm to ja nic nie rozumiem, jedno co mnie zdziwiło z tym przykładem to jak mało miejsca zawiera kod programu. Wdzięczny byłbym za przykłady w języku C

    Badałem poprawność funkcji odczytującej stan portu SDA (funkcja check()). Niestety nie rozumiem otrzymanych wyników.
    *Gdy wywołam funkcję check() i podepnę SDA na masę funkcja zwraca 0 - funkcja działa prawidłowo
    *Gdy wywołam funkcję check() i podepnę SDA na +5V funkcja zwraca 1 - funkcja działa prawidłowo
    *Gdy wyzeruje linię SCL (CLR_SCL) multimetr pokazuje 0V na linii, podpinam linię SDA pod SCL w celu detekcji stanu linii SCL i wywołuje funkcję check(), funkcja zwraca 1 - myślę że funkcja nie działa prawidłowo. Próbowałem linię SCL ściągnąć do masy przez rezystor 5kΩ ale rezultat jest taki sam.
  • #4 7476862
    CRDReed
    Poziom 11  
    Czy ma ktoś jakąś radę, albo pomysł dlaczego mi nie działa.
REKLAMA