- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: I²C Bus und LM75

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Anzeige

    E-Bike
    Worauf bezieht sich der Fehler ?
    Darauf ?
    Code:
    temp.high = i2cReceiveByte(FALSE);
      temp.low = i2cReceiveByte(FALSE);
    erwartet i2cReceiveByte ein Argument ?
    Weil im erstem Post hast Du die Funktion ohne Parameter aufgerufen...
    Und FALSE ? Wo ist Das definiert in i2c.h ?

    Naja sonst kann ich da nicht weiter helfen, weil ich die Bibliothek nicht kenne.
    So was triviales mache ich "zu Fuß", so wie oben schon beschrieben,es sind
    2 oder 3 Register die da mitspielen, aber vielleicht wird hier jemand noch helfen können.

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

  2. #12
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    35
    Beiträge
    207
    Hallo

    Ja I2C Erwartet ein Argument. das ist das AckFlag

    TRUE -- Ack
    FALSE -- Nack

    Gruß Robert

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    15.04.2006
    Beiträge
    18
    Im Zweifelsfall schmeiss das Ding übers Hauseck, und probier nen anderen aus... Habe auch mal damit zu tun gehabt, und hab den nicht zum sprechen gekriegt - obwohl das Mistvieh einen Acknowledge von sich gab...

    Gruß
    uC

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    35
    Beiträge
    207
    Hi uC

    Das hat leider nichts gebracht. Der Compiler spuckt noch immer die gleiche Fehlermeldung aus

    Gruß Robert

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    15.04.2006
    Beiträge
    18
    Ach so Du hast ein Compiler Problem....
    Anbei findest Du den Inhalt meiner i2c.h ist selbstgeschrieben, funzt, und
    ist im Prinzip das was izaseba meint, einfach mit den armen Registern des
    Atmels reden... sollte funzen

    Code:
    //
    #define I2C_STA 	\
    do              	\
    {                    \
    TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);          \
    while (!(TWCR&(1<<TWINT)));                	\
    }					\
    while(0)
    //       
    #define I2C_STO 	\
    do              	\
    {                    \
    TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);          \
    }					\
    while(0)
    //ADRESSE SENDEN
    #define I2C_ADR(X) 	\
    do          		 \
    {               	 \
    TWDR=X;\
    TWCR=(1<<TWINT)|(1<<TWEN);\
    while (!(TWCR&(1<<TWINT)));\
    					\
    }\
    while(0)
    //DATUM SENDEN
    #define I2C_SENDDATA(X) 	\
    do          		 \
    {               	 \
    TWDR=X;\
    TWCR=(1<<TWINT)|(1<<TWEN);\
    while (!(TWCR&(1<<TWINT))); \
    }\
    while(0)
    //DATUM EMPFANGEN	
    #define I2C_GETDATA(X) 	\
    do          		 \
    {               	 \
    TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);\
    while (!(TWCR&(1<<TWINT))); \
    X=TWDR; \
    }\
    while(0)	
    
    void ADS1100INIT()
    {
    I2C_STA;
    I2C_ADR(0x96);
    //TWDR=0xaa;
    //TWCR=(1<<TWINT)|(1<<TWEN);
    //while (!(TWCR&(1<<TWINT)));
    I2C_SENDDATA(0x0d);
    I2C_STO;
    }

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

    Hier nun der Protyp aus der Lib

    Code:
    inline void i2cReceiveByte(u08 ackFlag)
    {
    	// begin receive over I2C
    	if( ackFlag )
    	{
    		// ackFlag = TRUE: ACK the recevied data
    		outb(TWCR, (inb(TWCR)&TWCR_CMD_MASK)|BV(TWINT)|BV(TWEA));
    	}
    	else
    	{
    		// ackFlag = FALSE: NACK the recevied data
    		outb(TWCR, (inb(TWCR)&TWCR_CMD_MASK)|BV(TWINT));
    	}
    }
    Villeicht hilft das. Ich hoffe ihr könnt mir helfen

    Danke im Voraus

    Gruß Robert

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

    So es funktioniert jetzt so einigermaßen. Nur die Temperaturs stimmt noch nicht wirklich.

    Hier nun die read Funktion:
    Code:
    int lm75_read(void)
    {
    
      i2cSendStart();
      i2cSendByte(LM75_ADRESS | 1); //Sende Adresse mit read Bit
      i2cSendStart();
      i2cReceiveByte(FALSE);
      temp.high = i2cGetReceivedByte();
      i2cReceiveByte(FALSE);
       temp.low = i2cGetReceivedByte();
      i2cSendStop();
    }
    Der Prototyp von i2cGetReceivedByte():
    Code:
    inline u08 i2cGetReceivedByte(void)
    {
    	// retieve received data byte from I2C TWDR
    	return( inb(TWDR) );
    }
    temp.low ist ja die Kommastelle. Sie steht linksbündig in der Variable temp.low. Wenn ich sie nach Rechts verschiebe und mit 5 Multipliziere, hab ich die Kommastelle oder??

    temp.low = (temp.low>>=7)*5;

    Soe meine ich das.

    Die High Variable macht mir jedoch noch mehr Sorgen. Ich bekomm immer 0xFF (255) empfangen. Den empfangenen Wert muss ich ja durch 2 Teilen, oder??

    125°C entspricht 1111 1010 = 0xFA = 250
    25°C enspricht 110010 = 32 = 50

    Daraus schleiße ich, dass ich den Wert durch 2 dividieren muss, oder?? Muss ich sonst noch etwas mit der Zahl machen??

    Danke im Voraus

    Gruß Robert

  8. #18
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Du bist dir sicher das Datenblatt mal auch nur kurz überflogen zu haben ?
    Denn da sticht mir gleich eine Tabelle ins Auge (auch wenn man, so wie ich, nicht aus dem engl.sprachigen Raum stammt):
    1.4 TEMPERATURE DATA FORMAT
    da steht, das letzte Bit (LSB) gibt 0,5 Grad an,
    also stimmt das im Prinzip mit dem durch 2 Teilen.

  9. #19
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2006
    Ort
    Gratkorn
    Alter
    35
    Beiträge
    207
    Zitat Zitat von linux_80
    1.4 TEMPERATURE DATA FORMAT
    da steht, das letzte Bit (LSB) gibt 0,5 Grad an,
    Bist du dir sicher das Datenblatt überflogen zu haben?? Das LSB ist das erste Bit. Nicht das letzte. (Least Significant Bit). Die Bits werden von Rechts nach Links gezählt

    Zuerst muss ich prüfen ob das erste Bit gesetzt oder gelöscht ist. Bzw in eine neue VAriable kopieren.

    Dann kann ich doch den low Wert um 1 Bit nach Rechts verschieben. Nun verschiebe ich den High Wert um 7 Stellen nach Links. Danach füge ich beide Variablen mit einer Oder Verknüpfung zusammen. Kann das Funktionieren??

    Code:
    temp.low >>= 1;
    temp.high <<= 7;
    temp.low = temp.low | temp.high;
    Kann das funktionieren??

    Gruß Robert

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

    Ich Bitrechnung funktioniert. Ich hab einfach für temp.low und temp.high Zahlen eingesetzt und das ausgeben lassen.

    Jedoch bekomme ich wenn ich den LM 75 auslesn will nur falsche Werte. Am Display steht 127.5. Wenn ich low und high und Rechnung ausgebe, liest er immer 0xFF = 255 aus.

    Als stimmt da etwas nicht. Was kann den da los sein??

    Ich hoffe es kann mir wer helfen

    Gruß Robert

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress