- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: I²C Bus und LM75

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    34
    Beiträge
    207

    I²C Bus und LM75

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo an alle

    Ich hab wieder ein Problem
    Ich hoffe ihr könnt mir helfen

    Ich hab hier einen LM75 Temperatursensor der über I²C angesteuert wird., Als Prozessor hab ich einen Mega 8.
    Als Basisaddresse hat der LM75 90.

    Jedoch verstehe ich die Ansteuerung noch nicht wirklich. Ich möchte damit nur Temperaturen auslesen

    Als I²C Lib will ich die Procyon Bibliothek verwenden.

    Nur leider komme ich damit überhaupt nicht zusammen. Kann mir bitte wer eine Funktions Code zum Auslesen der Temperatur zeigen??
    Oder kann mir wer das erklären?

    Danke im Voraus

    Gruß Robert

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    34
    Beiträge
    207
    Hallo an alle

    Ich hab nun mal etwas geschrieben:

    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include "i2c.h"	//Procyon I2C LiB 
    
    #define LM75_ADRESS 0x97
    
    int lm75_read(void);
    
    	TEMPERATUR struct {
    	uint8_t high;
    	uint8_t low;
    	} temp;
    
    int lm75_read(void)
    {
    	TEMPERATUR struct {
    	uint8_t high;
    	uint8_t low;
    	} temp;
    	
    	i2cSendStart();
    	i2cSendByte(LM75_ADRESS); //Sende Adresse
    	i2cSendByte(0X00); //Temperature Register
    	i2cSendSart();
    	
    	temp.high = i2cReceiveByte();
    	temp.low = i2cReceiveByte();
    	
    	i2cSendStop();
    		return(0)
    }
    Kann das so funktionieren??

    Danke im Voraus

    Gruß Robert

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    34
    Beiträge
    207
    Weiß das keiner???

    Ich würd mich echt über Hilfe freuen

    Gruß Robert

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    34
    Beiträge
    207
    Hallo an alle

    Ich hab das mal geändert:

    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include "i2c.h"	//Procyon I2C LiB 
    
    #define LM75_ADRESS 0x97
    
    int lm75_read(void);
    
      struct TEMPERATUR {
      uint8_t high;
      uint8_t low;
      } temp;
      
    int lm75_read(void)
    {
    
      i2cSendStart();
      i2cSendByte(LM75_ADRESS); //Sende Adresse mit write Bit
      i2cSendByte(0x00); //Temperature Register
      i2cSendStart();
    
      i2cSendByte(LM75_ADRESS | 1); //Sende Adresse mit read Bit
      temp.high = i2cReceiveByte(FALSE);
      temp.low = i2cReceiveByte(FALSE);
      i2cSendStop();
    }
    
    int main(void)
    {
    	i2cInit();
    	i2cSetBitrate(100);
    	lm75_read();
    	return(0);
    }
    Nur wenn ich es compilieren will, dann bekomm ich immer 2 Fehlermeldunden:
    lm75.c:23: error: void value not ignored as it ought to be
    lm75.c:24: error: void value not ignored as it ought to be

    Warum???

    Danke im Voraus

    Gruß Robert

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Als Basisaddresse hat der LM75 90.
    #define LM75_ADRESS 0x97
    Was ist nun richtig ?

    Warum benutzt Du nicht die util/twi.h damit geht das wunderbar Beispiel:

    Code:
    void read_data (uint8_t *buffer) {
      uint8_t status,twcr,len;
      
      /*Zuerst wird der MASTER in Transmitter Mode betrieben, um
        1. Die SLAVE Adresse zu senden
        2. UM den Adresspointer zu übergeben, ab den gelesen werden soll
        
        Sende Start Condition */
      TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
      while ((TWCR & (1<<TWINT)) == 0);
      
      /*Sende Slave Adresse (Hier DS1307 mit WRITE Bit */
      TWDR = DS1307 | TW_WRITE;
      TWCR = (1<<TWINT)|(1<<TWEN);
      while ((TWCR & (1<<TWINT)) == 0);
      
          /*Sende die zu lesende Adresse, als Adresspointer  */
      TWDR = 0x00;//Stelle den pointer auf adresse 0x00
      TWCR = (1<<TWINT)|(1<<TWEN);
      while ((TWCR & (1<<TWINT)) == 0);
      
      /*Ab jetzt wird der Master im Reciver Mode versetzt, um die 
        Bytes zu empfangen
        Es wirt die rep. START Condition gesendet*/
      TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
      while ((TWCR & (1<<TWINT)) == 0);
      
      /*Sende Slave Adresse (Hier DS1307 mit READ Bit */
      TWDR = DS1307 | TW_READ;
      TWCR = (1<<TWINT)|(1<<TWEN);
      while ((TWCR & (1<<TWINT)) == 0);
    
      len = 0;
      while (len  < 8){
        if (len == 6 ){
          twcr = (1<<TWINT)|(1<<TWEN);
        } else {
          twcr = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
        }
        TWCR = twcr;
        while ((TWCR & (1<<TWINT)) == 0);
        switch (status = TW_STATUS){
        case TW_MR_DATA_NACK:
          len = 8;
        case TW_MR_DATA_ACK:
          *buffer++ = TWDR;
          break;
        }
        len++;
      }
       TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
    }
    Damit lese ich 8 Bytes aus dem RTC DS1307 in einem Rutsch aus und speichere in einem Array ab.

    Um eventuelle Fehler zu Finden kann man nach jedem Schritt irgendwas über UART ausgeben, dann weißt Du an welcher Stelle es kracht.

    Das Beispiel ist nicht Perfekt, Die Endlosschleifen sind nicht gut, aber zum Testen sehr gut.
    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    34
    Beiträge
    207
    Hallo Sebastian

    Basisadresse ist 90. Wenn ich die 3 Pins zum einstellen des 2. Teils der Adresse auf high ege, hab ich 97.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Ja gut, Hauptsache die Adresse Stimmt überein

    Wie schon gesagt, versuch das so zu schreiben, wie im Beispiel von mir, und nach jedem Schritt gibst Du über UART irgendwas aus z.B. 1 2 3 4 5,
    danach siehst Du sofort wie weit das kommt, und wo es ev. ein Problem gibt.
    sonst melde Dich nochmal...

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    34
    Beiträge
    207
    Hallo

    Jap, die Adressen stimmen. Leider bekomm ich es gar nicht erfolgreich compiliert. Ich bekomm immer die Fehlermeldung

    lm75.c:21: error: void value not ignored as it ought to be

    Was heißt das. Kann das mit dem struct zusammenhängen?

    Gruß Robert

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Code:
    int main(void)
    {
       i2cInit();
       i2cSetBitrate(100);
       lm75_read();
       return(0); 
    }
    Ist das alles ?

    1. es muß heißen return 0; und nicht return(0); ,return ist keine Funktion
    2. Irgendwie fehlt mir hier eine Endlosschleife...
    Dein Programm beendet sich nach return 0 und was dann?

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    34
    Beiträge
    207
    Hi Sebastian

    Danke. Das Programm war eigentlich nur ein Test. Ist ja noch nicht fertig. Deshalb springt er nach dem return ins Nirvana.

    aber mit Schleife und richtiger Schreibweise von return bekomm ich es noch immer nicht richtig compiliert. Immer noch der gleiche Fehler

    Gruß Robert

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test