Hallo!
Ich habe ein Problem bei der Verbingung zw. meinen AtMega32 und dem
Temperatursensor TC74. Bein schon einige Variaten durchgegangen, doch
leider noch zu keinen Ergebnis gekommen. Offenbar habe ich etwas
übersehen.
Ziel ist es, die vom TC74 gemessene Temperatur zum MC zu übertragen.
Bitte helft mir weiter.
Untenstehend der verwendete Code. Bin auch schon verschiedene Varianten
der einzelnen Flags durchgegangen (Transmitter, Receiver) doch leider
ohne Ergebnis.
Der Start am Bus wird gesendet und mit einem ACK bestätigt. Beim
nächsten Schritt, nämlich dem finden des TC74 hängt das ganze. Habe auch
schon eine Schleife mit allen möglichen Adressen darüber laufen lassen,
bekomme jedoch immmer ein NACK zurück. Der Bauteil wird also definitiv
nicht gefunden.
Danke für Eure Hilfe.
#define F_CPU 10000000
#include <avr/io.h>
int START = 0x08;
int MT_SLA_ACK = 0x40;
int MT_DATA_ACK = 0x50;
int temperaturgemessen;
int main(void)
{
//TWI Start
TWBR = 0b10;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Sendet Start
while(!(TWCR & (1<<TWINT))) //Wartet bis Startbit übertragen
;
if ((TWSR & 0xF8) != START) //Statusregister wird überprüft
Error();
TWDR = 0b10011010; //SLA_W bzw. SLA_R wird geladen
TWCR =(1<<TWINT) | (1<<TWEN); //Übertragung vorbereiten
while(!(TWCR & (1<<TWINT))) //Wartet bis Übertragung abgeschlossen
;
if((TWSR & 0xF8) != MT_SLA_ACK) //Übertragung wird überprüft
Error();
TWCR = (1<<TWINT) | (1<<TWEN); //Datenübertragung starten
while (!(TWCR & (1<<TWINT))) //Wartet bis Datenübertragung zu ende
;
if((TWSR & 0xF8) != MT_DATA_ACK) //Datenübertragung erfolgt?
Error();
temperaturgemessen = TWDR; //Data wird geladen
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //Übertragung abgeschlossen
//TWI Ende
return 0;
}
1. Wie schnell ist Dein Bus? Ich hoffe, das er nur 100kHz hat, denn das
ist die max. Geschwindigkeit Deines Sensors. In Deinem Code steht keine
Initialisation.
2. Ich würde die Temp.-Abfrage aus der Main nehmen und sie per Funktion
aufrufen. Zwischen den Funktionsaufrufen eine Wartezeit einlegen, damit
der Sensor auch Zeit hat die neuen Daten zu wandeln.
3. lt. Datenblatt muß man erst die Slaveadresse senden, dann ein
Command-Byte und dann das Datenbyte senden bzw. empfangen. Da ich mich
mit C nicht so auskenne, hast du eigentlich in Deinem Programm von MT
auf MR umgeschaltet?
4. Wieviele Sensoren hast Du an dem Bus und benutzt Du Pull-Up's?
Mehr Fragen später ;)
Metaller danke für die schnelle Antwort.
1.) Ja, sollten nur 100kHz sein
2.) Stimmt, Temperaturabfrage wird sicher nicht im Main stattfinden,
steht im Moment aber noch drin.
3.) Genau da liegt das Problem: wenn ich die Slaveadresse sende, dann
wird das nicht mit einem ACK bestätigt, was die weiteren Schritte
sinnlos macht - also die Datenübertragung erst gar nicht gestartet
werden kann. Wenn ich das aus dem Datenblatt richtig rausgelesen habe,
dann sollte die Auswahl zw. MT und MR durch folgendes stattfinden (hier
als MR) START = 0x08; MT_SLA_ACK = 0x40;MT_DATA_ACK = 0x50;
4.) Ja, habe auch Pull-up-Widerstände verwendet und benutzte nur den
einen Sensor
5.) Auch die Adresse sollte stimmen (siehe TWDR = 0b10011010). Habe auch
schon eine Schleife mit allen möglichen Adressen laufen lassen, nur der
Sensor meldet sich einfach nicht!
> sollten nur 100kHz sein
eine höhere Datenrate als 100kHz verträgt der Sensor nicht, also
solltest Du Dir sicher sein wie schnell Dein Bus ist.
> Auch die Adresse sollte stimmen
sollte? Stimmt die Adresse oder stimmt sie nicht? Wenn die nicht paßt,
dann kannst Du machen was Du willst, aber Du bekommst kein ACK zurück.
> MT und MR durch folgendes stattfinden (hier als MR) START = 0x08; MT_SLA_ACK =
0x40;MT_DATA_ACK = 0x50;
Ähhm, sollte es nicht so aussehen?
Start = 0x08
MT_SLA_ACK = 0x18
MT_DATA_ACK = 0x28
MR_SLA_ACK = 0x40
MR_DATA_ACK = 0x50
MR_DATA_NAK = 0x58
Meine ersten Versuche mit I2C habe ich auch mit einem Temperatursensor
(LM75) gemacht. Ich habe das Ding einfach nicht zum laufen gebracht, bis
ich die faxen dicke hatte und es per Software selber geschrieben habe.
Und siehe da, es lief auf einmal. Rate mal was das für ein Gefühl war,
als der Sensor mit mir sprach. Und es war nur ein "ACK" :) Mit dem
Wissen, welches ich mir dadurch angeeignet habe, konnte ich auch die
TWI-Schnittstelle danach sinnig benutzen.
Ja, habe alles noch einmal durchgesehen - es stimmt definitiv.
Auch mit den von Metaller oben angegebenen Hexcodes habe ich es schon
versucht.
Trotzdem funktioniert es leider nicht.
Kann ich den Sensor alleine überprüfen ob diesr überhaupt
funktionstüchtig ist?
> Kann ich den Sensor alleine überprüfen ob diesr überhaupt funktionstüchtig ist?
Nein :(
Damit Du sehen kannst, was passiert und wo Dein Programm evtl. hängt,
würde ich Dir empfehlen ein RS232-Debugger mit einzubinden. Also das
z.B. bei einem bestimmten Punkt etwas über die RS-Scgnittstelle
übertragen wird und das dann in einem Terminalprogramm anzeigen zu
lassen.
Ich habe Dir mal im Anhang mein "Debugger" für die TWI-Schnittstelle
gestellt, damit Du sehen kannst wie soetwas zum Beispiel aussehen kann.
Mir hat er sehr gute Dienste geleistet.
Damit Dir andere auch helfen können, wäre es vlt. angebracht, wenn Du
Deinen kompletten Code hier posten würdest (im Anhang), sonst wird ds
weiter ein Frage-Antwort-Spiel bleiben.
nach langen hin und her sowie mühsamer Fehlersuche habe ich einen neuen
Sensor probiert - und siehe da, es funktioniert!!!!!
danke für eure Bemühungen.