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 ;)
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.