PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LM75A am RN-Control - Fehler bei I2C Verbindung



Pille456
25.04.2011, 01:32
Hi!

Ich nutze momentan das RN-Control mit dem atmega32. Ich versuche die Temperatur aus einem LM75A mittels I2C auszulesen und diese dann per rs232 an meinen PC zu übertragen. Und das alles in C-Code.
Dummerweise klappt schon das Auslesen des LM75A nicht so wie es soll, aber fangen wir mal von vorne an:

Erstmal zur Verkabelung:

Ich habe den 5 Volt-Ausgang des RN-Control an den VCC-Eingang vom LM75A gesteckt. Weiterhin hängen an diesem 5Volt-Ausgang parallel 2 10kOhm Widerstände. Hinter diesen Widerständen hängt jeweils die SDA-Leitung(bzw. SCL) vom LM75A und die vom atmega32.
Der Aufbau entspricht eigentlich fast 1zu1 diesem hier: http://www.ermicro.com/blog/?p=744
Wenn es an der Verkabelung liegen sollten, kann ich auch gerne noch ein Foto nachreichen.

Zur Ansteuerung im Quellcode nutze ich die Libs von Peter Fleury, die ja auch schon öfter im Forum genannt wurden. Die sollten ja ganz normal funktionieren. Ich habe den Port auch extra auf Port C und Pin 1 (SDA) und Pin 0 (SCL) in seinen Dateien umgestellt.
Hier mal der Quellcode:


unsigned char MSByte;
unsigned char LSByte;
double temp;
char s[255];
init_USART();
i2c_init();


sendUSART("Hallo Welt!!");
while(1) {
if (i2c_start((0x48)+I2C_READ)) sendUSART("Fehler!");
else {
MSByte = i2c_read(1); //höherwertige Bits
LSByte = i2c_read(0);
//temp = calcTemp(MSByte, LSByte); //soll später die Temp in °C rein

//itoa(temp,s,10);
sendUSART("Die aktuelle Temperatur lautet: ");
//sendUSART(s);
sendUSART(MSByte);
sendUSART((char) 13); //New Line!
}
sleep_ms(2000); //eine ziemlich ungenaue Sleep Funktion, aber hauptsache es gibt ne kleine Pause zwischen den einzelnen connect-Versuchen
}
Die Adresse ist ja laut Datenblatt vom LM75A: 1001ABC, wobei A,B und C beliebig beschaltbar sind. Ich habe A,B,C gar nicht angeschlossen, also gilt A=0,B=0,C=0 => Die Adresse ist 1001000, was Hexadezimal eine 48 sein sollte.
(Ich hab die Anschlüsse A,B und C auch mal direkt auf Masse gezogen, auch ohne Erfolg)

Bisher sehe ich eigentlich keinen Fehler, sofern ich nicht irgendwo irgendwelche Anschlüsse verwechselt habe. Der einzige Unterschied ist, dass überall 4.7k Widerstände verwendet werden und ich hier 10k Widerstände habe, was aber doch nicht das Problem sein sollte, oder?

Die Ausgabe ist nun über rs232 immer "Fehler", d.h. es kommt erst gar keine Verbindung zum LM75A zustande - ist die Adresse evt. falsch?

Dass die Ausgabe von MSByte später eigentlich keinen Sinn macht, ist mir klar. Jedoch wollte ich erstmal irgendeine ("vernünftige") Ausgabe haben, bevor ich anfange die konkrete Temperatur zu berechnen.

Hat jemand eine Idee woran es liegen könnte?

Gruß
Pille

Pille456
25.04.2011, 17:32
Hi,

Um sicher zu gehen, dass die Schaltung korrekt funktioniert, habe ich gerade per Bascom versucht den LM75 auszulesen, jedoch auch ohne Erfolg!

Der Quellcode hierzu ist:

$lib "i2c_twi.lbx"
$regfile = "m32def.dat"
$crystal = 16000000 ' frequency used
$baud = 9600
Config Twi = 100000
Config Scl = Portc.0 ' Ports fuer IIC-Bus, nicht Standard !
Config Sda = Portc.1

' Startausgabe
Print "Hallo Welt!"

Dim X As Byte
Dim Y As Byte

I2cinit

Do
I2cstart

I2cwbyte &H91
I2crbyte X , Ack
I2crbyte Y , Nack
I2cstop

Print Hex(x)
Print Hex(y)
Print "======"
Wait 2
Loop
In dem Thread (hier aus dem Forum) wo ich mir Teile für den Code geklaut habe, war von der Adresse 10010000(=0x90) die Rede. Ich habe extra nochmal im Datenblatt geschaut und dort steht 1001000 (also eine Null am Ende weniger). Ich habe mit Bascom beide Adressen probiert und nichts ging.
In X und Y steht jedes mal der Wert, den ich vorher mit I2cwbyte geschrieben haben.

Anscheinend ist doch etwas an der grundsätzlichen Schaltung falsch. Ich habe im Anhang mal ein Bild gepostet, ich hoffe man erkennt alles.
Die blauen Leitungen verbinden die SDA-Ports und die SCL die gelben.

Hubert.G
25.04.2011, 18:41
Zu einen lt. Datenblatt: A2–A0, are not internally biased, it is
important that they should not be left floating in any application.
Also die Adressleitungen nicht offen lassen.
Die Adresse ist 0x90, steht im Datenblatt Seite 8 unter Slave Adress
Spannungen am Steckbrett kontrolliert?

Pille456
25.04.2011, 18:50
Ah okay, gut dann ist das jetzt auch mal klar. Ich hatte A2-A0 zeitweise auch per Kabel auf GND gezogen, aber auch ohne Erfolg.
Hab die Kabel jetzt gerade mal wieder drangesteckt - auch ohne Erfolg.
Spannung am Steckbrett ist vorhanden, wobei ich momentan nicht sagen kann wie viel - hab gerade kein Multimeter zur Hand. Hab stattdessen eine kleine Dioden-Testschaltung gebaut.
Die LED1 am RN-Control blinkt übrigens alle 2 Sek, die LED2 jedoch gibt nichts von sich