Forum: Mikrocontroller und Digitale Elektronik TWI: keine Verbindung zw. AtMega32 und Temp.sensor TC74


von dagobert (Gast)


Lesenswert?

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;
}

von Metaller (Gast)


Lesenswert?

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 ;)

von Metaller (Gast)


Lesenswert?

Hast Du die richtige Adresse gewählt (Datenblatt S.9)?

TC74A0-3.3VCT   1001 000   V0
TC74A1-3.3VCT   1001 001   V1
TC74A2-3.3VCT   1001 010   V2
TC74A3-3.3VCT   1001 011   V3
TC74A4-3.3VCT   1001 100   V4
TC74A5-3.3VCT  1001 101*   V5
TC74A6-3.3VCT   1001 110   V6
TC74A7-3.3VCT   1001 111   V7

TC74A0-5.0VCT   1001 000   U0
TC74A1-5.0VCT   1001 001   U1
TC74A2-5.0VCT   1001 010   U2
TC74A3-5.0VCT   1001 011   U3
TC74A4-5.0VCT   1001 100   U4
TC74A5-5.0VCT  1001 101*   U5
TC74A6-5.0VCT   1001 110   U6
TC74A7-5.0VCT   1001 111   U7

von dagobert (Gast)


Lesenswert?

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!


von Metaller (Gast)


Lesenswert?

> 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.

von dagobert (Gast)


Lesenswert?

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?

von Metaller (Gast)


Angehängte Dateien:

Lesenswert?

> 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.

von dagobert (Gast)


Lesenswert?

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.

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.