mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LM75 temperatursensor auslesen


Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  AdrHilf=AdrHilf>>1;
>  AdrHilf=AdrHilf<<1;      //Schreiben aktivieren

Da solltest du noch mal drüber nachdenken;)

Autor: steve (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
100n C direkt am LM75?
Bei mir war das der "Fehler".

Autor: steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.