-         

Ergebnis 1 bis 3 von 3

Thema: Ich habe ein Problem mit dem DS1621

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.11.2006
    Ort
    NRW
    Alter
    32
    Beiträge
    54

    Ich habe ein Problem mit dem DS1621

    Anzeige

    Hallo zusammen,

    ich versuche den Temperatur Sensor DS1621 via I2C zum laufen zu bringen, aber irgendwas mache ich falsch.

    Hier erstmal der Code:

    Code:
    void main(void)
    {
    ...
    i2c_init();
    ...
    i2c_start();
    i2c_sendbyte(0x96,0xEE);
    i2c_start();
    ...
    while(1)
    {
    i2c_start();
    i2c_sendbyte(0x96,0xAA);
    i2c_start();
    word = i2c_receivebyte(0x96);
    i2c_stop();
    }
    }
    
    
    void i2c_init(void)
    {
    
    // 100 kHz SCL bei 4MHz CPU
    	TWBR = 12;
    	TWSR = 0;
    }
    
    void i2c_start(void)
    {
    	// I2C-Startbedingung
    	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    	// Warten bis fertig ist
    	loop_until_bit_is_set(TWCR,TWINT);
    }
    
    void i2c_stop(void)
    {
    	// Stoppe Übertragung
    	TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
    }
    
    void i2c_sendbyte(uint8_t adresse,uint8_t byte)
    {
    
    	// Schreibe zu Adresse
    	TWDR = (adresse & 0xFE);
    	
    	// Senden
    	TWCR = (1<<TWINT) | (1<<TWEN);	
    
    	// Warten bis fertig ist
    	loop_until_bit_is_set(TWCR,TWINT);
    
    
    	// Lege Daten an
    	TWDR = byte;
    
    	// Senden
    	TWCR = (1<<TWINT) | (1<<TWEN);	
    
    	// Warten bis fertig ist
    	loop_until_bit_is_set(TWCR,TWINT);
    
    }
    
    uint16_t i2c_receivebyte(uint8_t adresse)
    {
    uint16_t data;
    	// Schreibe zu Adresse
    	TWDR = (adresse | 0xFF);
    
    	// Senden
    	TWCR = (1<<TWINT) | (1<<TWEN);	
    
    	// Warten bis fertig ist
    	loop_until_bit_is_set(TWCR,TWINT);
    
    	// Empfange Daten
    	TWCR = (1<<TWINT) | (1<<TWEN);	
    
    	// Warten bis fertig ist
    	loop_until_bit_is_set(TWCR,TWINT);
    
    	data = (TWDR<<8);
    
    	// Empfange Daten
    	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);;	
    
    	// Warten bis fertig ist
    	loop_until_bit_is_set(TWCR,TWINT);
    
    	data |= (TWDR);
    
    	// Empfange Daten
    	TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);;	
    
    	// Warten bis fertig ist
    	loop_until_bit_is_set(TWCR,TWINT);
    
    	return data;
    }
    Also laut Datenblatt muss ich erst 0xEE senden damit dieser mit dem Wandeln anfängt, und mit 0xAA kann ich anschließend 2 Bytes abholen.

    Das Sensen scheint auch zu funktionieren, da er dort wieder rausläuft, aber wenn er in die Receive Routine geht, so hängt er sich auf.

    Es wäre toll wenn mit jemand helfen könnte.

    Gruß
    Michael

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    Du schreibst immer 0x96 als SlaveAdresse, beim lesen muss man das RW-Bit darin setzen, damit der Daten raus rückt.

    Und ich glaub das mit dem | 0xFF kommt nicht gut in i2c_receivebyte, denn danach sind alle Bits gesetzt !

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    15.11.2006
    Ort
    NRW
    Alter
    32
    Beiträge
    54
    Ah,

    da ist also diese sch... kleine Fehler.
    Dann ist mir auch klar das es nicht fuzt.

    Danke für deine Antwort.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •