Forum: Mikrocontroller und Digitale Elektronik TWI (I2C) Problem bekomme den TWI nicht ans laufen


von Emi S. (emit5)


Angehängte Dateien:

Lesenswert?

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

}

}

von Emi S. (emit5)


Lesenswert?

Hat keiner eine Idee?

von spess53 (Gast)


Lesenswert?

Hi

Irgendwie sehe ich keine Einstellung der Bitrate. Verträgt der LM75 
1MHZ?

MfG Spess

von Emi S. (emit5)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Das rufst du aber nicht auf. Außerdem sind die Werte falsch.

MfG Spess

von Emi S. (emit5)


Lesenswert?

Wie meinst du das?

Was meinst du mit falschen Werten?

Der LM75 kann 10kHz. Mit meinen Werten habe ich ungefähr 8,...kHz

von spess53 (Gast)


Lesenswert?

Hi

>Was meinst du mit falschen Werten?

Das bezog sich auf 100kHz.

MfG Spess

von Emi S. (emit5)


Lesenswert?

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?!?

von Fred (Gast)


Lesenswert?

Info

von closed_loop (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.