www.mikrocontroller.net

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


Autor: Emi S. (emit5)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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);

}

}

Autor: Emi S. (emit5)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner eine Idee?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Emi S. (emit5)
Datum:

Bewertung
0 lesenswert
nicht 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;
>
> }

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Emi S. (emit5)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie meinst du das?

Was meinst du mit falschen Werten?

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Was meinst du mit falschen Werten?

Das bezog sich auf 100kHz.

MfG Spess

Autor: Emi S. (emit5)
Datum:

Bewertung
0 lesenswert
nicht 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?!?

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Info

Autor: closed_loop (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.