Hallo
Ja I2C Erwartet ein Argument. das ist das AckFlag
TRUE -- Ack
FALSE -- Nack
Gruß Robert
Worauf bezieht sich der Fehler ?
Darauf ?
erwartet i2cReceiveByte ein Argument ?Code:temp.high = i2cReceiveByte(FALSE); temp.low = i2cReceiveByte(FALSE);
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
Linus TorvaldSoftware is like s e x: its better when its free.
Hallo
Ja I2C Erwartet ein Argument. das ist das AckFlag
TRUE -- Ack
FALSE -- Nack
Gruß Robert
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
Hi uC
Das hat leider nichts gebracht. Der Compiler spuckt noch immer die gleiche Fehlermeldung aus
Gruß Robert
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; }
Hallo
Hier nun der Protyp aus der Lib
Villeicht hilft das. Ich hoffe ihr könnt mir helfenCode: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)); } }
Danke im Voraus
Gruß Robert
Hallo an alle
So es funktioniert jetzt so einigermaßen. Nur die Temperaturs stimmt noch nicht wirklich.
Hier nun die read Funktion:
Der Prototyp von i2cGetReceivedByte():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(); }
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??Code:inline u08 i2cGetReceivedByte(void) { // retieve received data byte from I2C TWDR return( inb(TWDR) ); }
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
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.
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ähltZitat von linux_80
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??
Kann das funktionieren??Code:temp.low >>= 1; temp.high <<= 7; temp.low = temp.low | temp.high;
Gruß Robert
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
Lesezeichen