Forum: Mikrocontroller und Digitale Elektronik LM75 temperatursensor auslesen


von Steve (Gast)


Lesenswert?

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,

von holger (Gast)


Lesenswert?

>  AdrHilf=AdrHilf>>1;
>  AdrHilf=AdrHilf<<1;      //Schreiben aktivieren

Da solltest du noch mal drüber nachdenken;)

von steve (Gast)


Lesenswert?

ja danke, das hab ich auch gerade gemerkt, aber daran liegt es nicht

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Bastler (Gast)


Lesenswert?

100n C direkt am LM75?
Bei mir war das der "Fehler".

von steve (Gast)


Lesenswert?

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

von steve (Gast)


Lesenswert?

vielen

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
Noch kein Account? Hier anmelden.