Hallo erst mal, ich bin gerade dabei ein projekt für die schule zu machen und versuche verzwiefelt zwei LM75 auszulesen aber irgentwie will das nicht so wie ich will, ich hab mir jetzt bestimmt schon 100 beiträge zu den thema durchgelesen und das datenblatt kann ich bald auswendig aber ich bekomm immer noch keine daten ich leg euch mal den quellcode bei vieleicht kann ja ein intelligenterer mensch als ich mir meinen fehler zeigen ach ja ich verwende einen ATmega8 der LM75 ist an portc angeschlossen die ersten beiden bit sind seriell und takt, #define F_CPU 3686400 #include <avr\io.h> #include <util\delay.h> #include <avr\interrupt.h> #include <inttypes.h> // folgende Befehle sind Standartbibliothek von myavr twi //////////////////////////////////////////////////////////////////////// //////////////////// //////////////////////////////////////////////////////////////////////// //////////////////// #define _TWINT 0b10000000 #define _TWEA 0b01000000 #define _TWSTA 0b00100000 #define _TWSTO 0b00010000 #define _TWWC 0b00001000 #define _TWEN 0b00000100 #define _TWIE 0b00000001 void twiStart() { uint8_t x; x=TWCR; x&=_TWEN|_TWIE; TWCR=x|_TWINT|_TWSTA; while( !(TWCR & _TWINT)) { } } void twiStop() { uint8_t x; x=TWCR; x&=_TWEN|_TWIE; TWCR=x|_TWINT|_TWSTO; } void twiWriteByte(uint8_t data, uint8_t ackn) { uint8_t x; TWDR=data; x=TWCR; x&=_TWEN|_TWIE; x|=_TWINT; if(ackn) x|=_TWEA; TWCR=x; while( !(TWCR & _TWINT)) { } } int twiReadByte(uint8_t ackn) { uint8_t x; x=TWCR; x&=_TWEN|_TWIE; x|=_TWINT; if(ackn) x|=_TWEA; TWCR=x; while( !(TWCR & _TWINT)) { } return TWDR; } //////////////////////////////////////////////////////////////////////// ////////////////////mein code///////////////////////////////////////////////// int GetTempemperatur(uint8_t twiAdr) { uint8_t highByte; uint8_t lowByte; uint8_t AdrHilf; uint8_t highByteHilf; twiStart(); AdrHilf=twiAdr; AdrHilf=AdrHilf>>1; AdrHilf=AdrHilf<<1; //Schreiben aktivieren twiWriteByte(AdrHilf,0); //Adresse +write twiWriteByte(0x00,0); //Register Temperatur auswählen twiStart(); twiWriteByte(twiAdr,0); //Sensor Auswählen highByte=twiReadByte(0); //byte 1 lesen lowByte=twiReadByte(0); //byte 1 lesen twiStop(); highByteHilf=highByte; highByteHilf=highByteHilf>>7; if (highByteHilf==0x01) { highByte=-highByte; } return highByte; } uint16_t Licht() { uint16_t licht; licht=GETADC(1); return licht; } uint8_t TemperaturInnen() { uint8_t temp; temp=GetTempemperatur(0x9f); return temp; } uint8_t TemperaturAussen() { uint8_t temp; temp=GetTempemperatur(0x97); return temp; } danke schon mal,
> AdrHilf=AdrHilf>>1; > AdrHilf=AdrHilf<<1; //Schreiben aktivieren Da solltest du noch mal drüber nachdenken;)
ja danke, das hab ich auch gerade gemerkt, aber daran liegt es nicht
Zur Hardware: Wie ist alles genau angeschlossen? Die Pull-ups sitzen wo und sind wie groß? Das beeinflusst die Zuverlässigkeit der TWI Übertragung. Und wie sind die Adressleitungen A0 bis A2 angeschlossen? Das beeinflusst ob der LM75 überhaupt ansprechbar ist. Zum Code: Bis zu welcher Funktion arbeitet sich dein Atmega8 denn vor und ab wo stockt es? twiAdr ist wie definiert? 0x9f... diese slave address kann ich mir aus dem Datenblatt nicht erklären. Dort steht 1 0 0 1 A2 A1 A0 MSB LSB Obacht: Das sind nur sieben Bits 0b1001xxx, d.h. man muss Bit 8 (0) ergänzen: 0b01001xxx, d.h. gültige Adressen sehen IMHO im oberen Nibble so aus: 0x4x Was das >>1 <<1 Gewurschtel dann damit macht, musst du selbst herausfinden.
also ich hab 10k wiederstände am takt und an der datenleitung, die den 100n condensatur hab ich auch dran, ich hab die adressen 7 und 3, den A2 hab ich bei der 3 auf masse; ich dachte das letzte bit ist R/W also so 1 0 0 1 A2 A1 A0 1/0 MSB LSB R/W danke für die fielen lösungsvorschläge
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.