Forum: Mikrocontroller und Digitale Elektronik ATmega 8 mit LM75 (TWI bzw. I²C)


von René P. (speedy909)


Lesenswert?

Hallo ich bin neu hier,
ich bin seit ein paar monaten im besitz eines atmega8.
jetzt habe ich entlich mal zeit mich mit "atmel" zu beschäftigen. bisher 
habe ich mit PIC gearbeitet.

jetzt stehe ich vor dem problem das ich den TWI baustein LM75 nicht 
auslesen kann.

ich weiß das es bei euch im forum viele beiträge zu dem thema gibt, aber 
irgentwie hilft mir keiner dieser beiträge weiter. gibt es irgentwo ein 
tutorial in dem alles schrittweise erklärt wird?

kann in C oder in ASM programmiert sein!
wobei mir C lieber wäre (versuche ich gerade zu lernen)

ich will einfach nur mal zum auslesen des LM75 kommen.

mein versuchsaufbau ist folgendermaßen:
SDA mit ATmega8 verbunden (PC4)
SCL mit ATmega8 verbunden (PC5)
+ auf +5V verbunden
- ist mit GND verbunden
A0, A1, A2 sind auf GND verbunden

die ausgabe der temperatur erfolgt mit LED´s auf portB

bin für jede hilfe dankbar......

von Falk B. (falk)


Lesenswert?

@ René Paterno (Firma www.pre1.eu) (speedy909)

>irgentwie hilft mir keiner dieser beiträge weiter. gibt es irgentwo ein
>tutorial in dem alles schrittweise erklärt wird?

Keine Ahnung. Du musst eben den I2C Bus ansprechen. Zunächst erstmal 
Leseoprationen, dann Schreiboperationen.

>mein versuchsaufbau ist folgendermaßen:

Das fehlen wahrscheinlich die Pull-Up Widerstände and SDA und SCL. 10K 
sind OK.

>die ausgabe der temperatur erfolgt mit LED´s auf portB

Schlecht. Nutze den UART mit dem PC als Debugschnittstelle. Da kannst du 
dir auch Zwischenergebniss anzeigen lassen. Wenn du einen richtigen 
Debugger hast gehts natürlich auch damit.

MFG
Falk

von René P. (speedy909)


Lesenswert?

@ Falk Brunner
oh, die habe ich vergessen zu erwähnen pullup mit 10k hab ich drin!

von Falk B. (falk)


Lesenswert?

@ René Paterno (Firma www.pre1.eu) (speedy909)

>oh, die habe ich vergessen zu erwähnen pullup mit 10k hab ich drin!

Tja, was geht denn dann nicht? Sinnvollerweise sollte man systematisch 
vorgehen. Ein Zugriff beginnt immer mit der Übertragung der Adresse + RW 
Bit. Wenn sich der LM75 angesprochen fühlt, generiert er ein ACK. Tut er 
das nicht, ist schon was faul. Das kann man leicht und schnell 
rausfinden. In der Art kann man nach und nach die Kommunikation prüfen. 
Mit Digitaloszi wird das ein Kinderspiel, geht aber auch ohne.

MFG
Falk

von René P. (speedy909)


Lesenswert?

Falk Brunner wrote:
> Mit Digitaloszi wird das ein Kinderspiel, geht aber auch ohne.

ja, ein digitaloszi konnte ich mir bis jetzt leider noch nicht leisten 
(> 800€)

ein punkt warum nichts funktioniert könnte vieleicht die adresse vom 
LM75 sein (ich habe ja  A0, A1, A2 auf GND) also ist das die adresse 0?

A0 = 1
A1 = 2
A2 = 4

oder wie wird sonst gezählt?

von Jörg X. (Gast)


Lesenswert?

> [...] (ich habe ja  A0, A1, A2 auf GND) also ist das die adresse 0?
Dazu aus dem Datenlblatt (bei mir S. 8):
>> Therefore, the complete slave address is:
>>    1   0   0   1   A2  A1  A0
>> MSB                        LSB
Also mit A2=A1=A0=0:
0x90 schreiben / 0x91 lesen ;)

hth. Jörg

von Gast (Gast)


Lesenswert?

Hallo Jörg,
im Datenblatt hat es bestimmt auch einen Taktplan, mit Start, Adresse,
Daten, Stop, usw.

Die Adresse beinhaltet noch das R/W-Bit. Das macht aus Deinen
0x90 / 0x91 in Wirklichkeit 0xA0 und 0xA1.

von Jörg X. (Gast)


Lesenswert?

@Gast:
>Das macht aus Deinen 0x90 / 0x91 in Wirklichkeit 0xA0 und 0xA1.
 nee, macht es nicht ...

hth. Jörg

von René P. (speedy909)


Angehängte Dateien:

Lesenswert?

hmm, irgentetwas ist bei mir da doch noch faul!
ich bekomme als ergebnis 10100001 also 145

ich habe mal mein code im anhang hinzugefügt, vieleicht findet jemand 
von euch den fehler?!?!

von Jörg X. (Gast)


Lesenswert?

Ich hatte doch "0x90 schreiben / 0x91 lesen" schon gepostet:
0x90 -> 1001 0000
        8  1    W
0x91 -> 1001 0001
        8  1    R
(Timing diagram s.12)
R\W ist das 8. gesendete bit, die Adresse hat 7 Bit (auch im 
Datenblatt)-

Weitere Vorschläge:
in empf() sind die Zeilen
> "TWCR=(1<<TWINT)|(1<<TWEN);
> loop_until_bit_is_set(TWCR,TWINT);"
einmal zuviel
1
#define LM75_ADR 0x48 // SIEBEN Bits! 
2
#define READ 1
3
#define WRITE 0   // besser lesbar
4
5
//LM75 Register
6
#define TEMP 0
7
#define CONF 1
8
#define T_HYST 2
9
#define T_OS 3
10
11
//...
12
// main().
13
send( (LM75_ADR<1)|WRITE, TEMP);
14
ewert = empf( (LM75_ADR<1)|READ);
15
PORTB = ewert;
16
//...

hth. Jörg
ps.: Sobald das läuft, nimm eine 'richtige' I2C-Lib (z.B. von 
http://jump.to/fleury)

von Kaktus (Gast)


Lesenswert?


von Kaktus (Gast)


Lesenswert?


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.