Hallo zusammen, habe ein Problem mit meinem Controller. Möchte mit meinem Programm die Werte von einem LM75 per TWI abfragen. LM75 ist ein Temperaturmessbaustein. Habe bei dem Programm einiges ausprobiert. Habe mich auch am Buch orientiert. Das Problem liegt meiner Meinung daran das nach dem übertragen der Slaveadresse die Sache nicht weiter läuft. Benutze übrigens einen ATmega 644 und AVR Studio Datenblatt vom LM75 hänge ich mal mit an! Hoffe mir kann jemand helfen!! Hier mein Code: #define F_CPU 16000000 // Taktfrequenz #include <avr\io.h> // AVR Register und Konstantendefinitionen #include "i2cmaster.h" #include "lcd.h" #include <stdlib.h> //Standard Libary integrieren #include <avr/interrupt.h> #include <inttypes.h> // leerstellen löschen #include <util/twi.h> #include <util/delay.h> #include <stdio.h> // für sprintf Befehl #define SLA_ADDRESS 0x91 //Slave Address 0b 1001000 und eine 1 als READ Befehl #define FAKTOR 0xD2 #define TEILER 0x01 unsigned int DATA; char Buffer [20]; unsigned int TWSRMODE; void init (unsigned char faktor, unsigned char teiler) { TWBR = faktor; //TWI initialisieren TWSR = teiler; } int main(void) { lcd_init(LCD_DISP_ON); TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //Startbedingungen while (!(TWCR & (1<<TWINT))); //warten bis Startbedingungen abgeschlossen if ((TWSR & 0x08) != TW_START) //Statusabfrage I2C bereit { lcd_gotoxy(0,0); lcd_puts( "ERROR 1"); //Statusanzeige Start übermittelt } TWDR = SLA_ADDRESS; //Slaveadresse senden TWCR = (1<<TWINT) | (1<<TWEN); while (!(TWCR & (1<<TWINT))); if ((TWSR & 0x40) !=TW_MT_SLA_ACK) { lcd_clrscr(); lcd_gotoxy(0,0); lcd_puts( "Daten uebertragen"); } DATA = TWDR; TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); while(1) { sprintf(Buffer,"%u",DATA); lcd_gotoxy(0,1); lcd_puts(Buffer); TWSRMODE = TWSR; //TWSR Register Status anzuzeigen sprintf(Buffer,"%u",TWSRMODE); lcd_gotoxy(10,0); lcd_puts(Buffer); } }
Hallo, Danke für die Antwort! Habe die Bitrate mit TWBR und TWSR eingestellt. Faktor und Teiler habe ich oben definiert. Emi S. schrieb: > void init (unsigned char faktor, unsigned char teiler) > > { > > TWBR = faktor; //TWI initialisieren > > TWSR = teiler; > > }
Hi Das rufst du aber nicht auf. Außerdem sind die Werte falsch. MfG Spess
Wie meinst du das? Was meinst du mit falschen Werten? Der LM75 kann 10kHz. Mit meinen Werten habe ich ungefähr 8,...kHz
Hi
>Was meinst du mit falschen Werten?
Das bezog sich auf 100kHz.
MfG Spess
Habe noch was vergessen. Möchte den LM75 ja auslesen. Wenn ich die Daten aus TWDR abrufen möchte, hat TWDR immer noch den Wert der Slaveadresse! Normalerweise müsste der dann doch die Daten aus dem LM75 haben. Kann mir einer sagen ob meine Programmierung den soweit i.O. ist?!?
Hi hast du mittlerweile dein Programm zum laufen gebracht ?? Ich habe nämlich fast das gleiche Problem verwende zwar einen anderen Temperatursensor aber selbst die Slaveaddresse ist gleich :). Wenn ja würde ich mich über deine Auflösung freuen. gruß c_l
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.