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][WinAVR] ADS1110, i2cmaster - problem z połączeniem

pawel221 17 Maj 2009 12:32 1953 0
REKLAMA
  • #1 6540253
    pawel221
    Poziom 2  
    Zmontowałem układ jak w załączniku. Jest to czujnik odległości. W zależności od odległości powinien zapalać odpowiednią ilość diód. Porogramu jeszcze nie napisałem ponieważ zatrzymał mnie poważny problem.

    Problem polega na tym, że i2c_start(Device+I2C_READ) zwraca 1, czyli (jak można przeczytać tutaj: http://homepage.hispeed.ch/peterfleury/group__pfleury__ic2master.html#ga2) "failed to access device".
    oto mój kod:
    #include <avr/io.h>
    #include <util/delay.h> 
    #include "i2cmaster.h"
    
    #define Device  0x4B      // adres urzadzenia
    
    int main(void)
    {
        unsigned char ret;
        
        DDRD  = 0xff;                               
        i2c_init();                                
    	//zapalam jedna diode
    	PORTD=0x7c;							
    	_delay_ms(1000);
    	
    	while(1)
    	{
    		ret = i2c_start(Device+I2C_READ);
    		//zwraca 1 jeżeli nie udało sie polaczyc z urzadzeniem
    		if ( ret ) 
    		{
    			//zapalam wszystkie diody
    			i2c_stop();
    			PORTD=0x00;
    		}
    		else 
    		{
    			ret = i2c_readNak();                    
    			i2c_stop();
    			PORTD = ~ret;                           
    		}
    	}
    }

    ELEMENTY:
    Czujnik odległości: Sharp GP2Y0A02YK0F, PDF
    Przetwornik A/D: ADS1110 PDF

    Dodam że na schemacie te dwa elementy zaznaczone są jako pinheady, a nad nimi znajduje się legenda który pin jest który.

    Podsumowując nie wiem z czego wynika błąd. Sprawdzałem czy wszystkie ścieżki są połączone, oraz czy nie ma gdzieś zwarcia. Program też wydaje się być napisany poprawnie. Adres urządzenia też jest chyba dobry - sprawdziłem w dokumentacji (mój przetwornik ma na obudowie ED3).

    [atmega8][WinAVR] ADS1110, i2cmaster - problem z połączeniem


    edit
    Po wielu próbach doszedłem do prostego programu, który być może jest bliższy rozwiązania problemu:

    #include <avr/io.h> 
    #include <util/delay.h>
    #include <compat/twi.h>
    
    int main(void) 
    { 
    	TWSR = 0;                         
    	TWBR = ((1000000/100000)-16)/2;  
    
    	// wysylanie sekwencji start
    	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    
    	// oczekiwanie na ustawienie flagi TWINT
    	while(!(TWCR & (1<<TWINT)));    // PROGRAM NIE PRZECHODZI DO NASTEPNEJ LINIJKI
    
        return 0;
    }
  • REKLAMA
REKLAMA