www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LM75 an ATMega 8


Autor: René P. (speedy909)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Nach ein paar Monaten ohne Erfolg komme ich jetzt zu meinem 2. Versuch.
Ich will die Temperatur aus einem LM75 auslesen.

Software: AVR Studio 4.13 (GCC)
Hardware: ATMega 8

Programmausschnitt:
#define LM75_write  144
#define LM75_read 145
#define FAKTOR 44
#define TEILER 0

void init (unsigned char faktor, unsigned char teiler)
{
 TWBR = faktor;
 TWSR = teiler;
}

unsigned char empf (unsigned char adres)
{
 unsigned char daten;              //hilfsvariable
 TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);   //startbedingung
 loop_until_bit_is_set(TWCR, TWINT);      //warte bis fertig

 TWDR = adres;                  //adresse
 TWCR = (1<<TWINT) | (1<<TWEN);          //senden
 loop_until_bit_is_set(TWCR, TWINT);      //warten bis fertig

 TWCR = (1<<TWINT) | (1<<TWEN);          //empfang starten
 loop_until_bit_is_set(TWCR, TWINT);      //warte bis fertig

 daten = TWDR;                  //daten abholen
 TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);    //ack impuls senden
 loop_until_bit_is_set(TWCR, TWINT);      //warte bis fertig

 TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);  //stoppbedingung
 return daten;
}

init(FAKTOR,TEILER);

wert1 = empf(LM75_read);
wert2 = empf(LM75_read);

Die Werte lasse ich mir direkt von einem LCD anzeigen.
leider sind beide Werte immer gleich (ca. 247) und Schwanken nur leicht

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim TWI-Interface der AVRs musst du schon vor dem lesen wissen, ob der 
Master ACK'en soll:
    //empfang starten, mit ACK antworten:
    TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
    loop_until_bit_is_set(TWCR, TWINT); //warte bis fertig

    daten = TWDR;                       //daten abholen
    TWCR = (1<<TWINT) | (1<<TWEN);      // KEIN ack impuls senden
    loop_until_bit_is_set(TWCR, TWINT); //warte bis fertig

hth. Jörg

Autor: René P. (speedy909)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort,

Jetzt habe ich das GANZE Datenblatt durchgelesen und komme immer noch zu 
keinem Ergebnis!

hat keiner einen funktionierende Code um einen LM75 auszulesen?

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: René P. (speedy909)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es jetzt soweit hinbekommen das Ich die Temperatur (1. Byte) 
anzeigen kann, aber wie kann ich jetzt das 2. Byte auslesen?
void init (unsigned char faktor, unsigned char teiler)
{
 TWBR = faktor;
 TWSR = teiler;
}


void i2c_start (unsigned char adres)
{
 TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);    //start
 loop_until_bit_is_set(TWCR, TWINT);
 TWDR = adres;                    //adresse eingeben
 TWCR = (1<<TWINT) | (1<<TWEN);            //freigeben (senden)
 loop_until_bit_is_set(TWCR, TWINT);
}

void i2c_stopp (void)
{
 TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);    //stopp 
}


void ack (void)
{
 TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);      //ack senden
 loop_until_bit_is_set(TWCR, TWINT);
}


unsigned char empf (void)
{
 unsigned char daten;

 TWCR = (1<<TWINT) | (1<<TWEN);            //freigeben (empfangen)
 loop_until_bit_is_set(TWCR, TWINT);
 daten = TWDR;                    //daten empfangen
 return daten;
}

 init(44,1);

 i2c_start(0x91);
 ewert = empf();
 ack();
 //ewert2 = empf();
 i2c_stopp();


Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo René.

Jörg sagte ja bereits, daß du das ACK flag setzen mußt. Also ein empfang 
mit TWEA und eins ohne.
   i2c_start(0x91);
   event1=empf_ACK();
   event2=empf_NACK();
   i2c_stop();

Olaf

Autor: Jörg X. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hätte dann noch eine 'etwas' weiter entwickelte Version (im Anhang).
Aber sobald du richtig begriffen hast wie das TWI funktioniert, schau 
dir mal die TWI-Library von P. Fleury an (http://jump.to/fleury), die 
funktioniert dann mit Interrupts -- ohne jedesmal das ganze Programm 
aufzuhalten.
Außerdem gibt's für den Interruptbetrieb noch zwei (Master/Slave) 
Appnotes von Atmel (u.a. AVR315, IIRC).

hth. Jörg

Autor: René P. (speedy909)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, jetzt funktionierts!
habe wohl zu kompliziert darüber nachgedacht ;-)

Autor: René P. (speedy909)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich noch vergessen zu erwähnen!

in deinem Code hat sich ein Fehler eingeschlichen! (aber trotsdem Danke 
für den Code!)

und zwar bei dieser zeile:
uint8_t ret_val, status;    //return-wert, temp. Variable fuer TWSR

sollte so aussehen:
uint16_t ret_val, status;    //return-wert, temp. Variable fuer TWSR

Autor: dom_lech (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IMHO müsste folgende Zeile auch anders sein:
#define TW_ERROR_MSK 0x1F
sollte
#define TW_ERROR_MSK 0x7F
sein

weil die untersten 7 bit des Temperaturwerte undefiniert (siehe 
Datenblatt) sind. Damit die Abfrage auf Kommunikationsfehler 
funktioniert muss man ausserdem beim Lesen diese letzten 7bit def. auf 0 
setzen.
return ret_val & ~0x7f;  
statt
return ret_val;

Das nur so am Rande... wenn mans nicht so macht kanns funktionieren... 
muss aber nicht. Hat bei mir zu Beginn in 90% der Fälle funktioniert, 
dann hab ich ein paar Änderungen an meiner Schaltung gemacht und dann 
war desshalb ein kompletter Ausfall.

Autor: Kurt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich probier den Ledtreiber TLC59116 zu beschreiben, klapt aber nicht so 
ganz mit dem I2C Bus:
Könnt Ihr mir bitte sagen was da nicht stimmt?
Mit dem Oszilloskop mess ich keinen Takt an SCL und auch nichts an SDA.

lg Kurt

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.