Forum: Mikrocontroller und Digitale Elektronik Kommunikation mit TSL45315


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von D. R. (misterdimi1992)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich versuche gerade über den I2C Bus zwischen einem Atmega32 und dem 
Lichtsensor TSL45315 (Datenblatt im Anhang) über die i2cmaster.h von 
Peter Fleury zu kommunizieren.

Um festzustellen, ob die Kommunikation richtig ist möchte ich mir 
einfach nur das Highbyte des Sensors auf einem Display anzeigen lassen.

Leider funktioniert das noch nicht so, wie ich mir das vorstelle.

In dem Datenblatt des Lichtsensors befindet sich eine Veranschaulichung 
des Protokollaufbaues. Es wird dort angegeben, dass die Slave Adresse 
einen 7 Bit Wert darstellt. Jedoch wird im gleichen Dokument die Slave 
Adresse mit 0x29 angegeben. Binär wäre es ja somit 0b00101001. Das LSB 
wird aber doch als READ/WRITE Bit gesetzt?

Hat jemand zu diesem Problem eine Idee oder Lösung?


Vielen Dank schonmal im Voraus! Untenstehend befindet sich der 
Sourcecode im AtmelStudio.



1
#include  <avr/io.h>
2
#define    F_CPU 8000000
3
#include  <util/delay.h>
4
#include  <stdlib.h>
5
#include  "i2cmaster.h"
6
#include  "lcd-routines.h"
7
8
#define TSL45315 0x29
9
10
11
uint8_t DATAHIGH, DATALOW;
12
char  cBuffer;
13
14
15
int main(void)
16
{
17
    
18
    while (1) 
19
    {  /******Einlesen des Lichtsensors TSL4531*****/
20
21
    lcd_init();      // initialize LCD library
22
    i2c_init();      // initialize I2C library
23
24
    i2c_start(TSL45315 + I2C_WRITE);
25
    i2c_write(0x00);
26
    
27
    i2c_rep_start(TSL45315 + I2C_READ);
28
    DATALOW = i2c_readAck();
29
    DATAHIGH = i2c_readNak();
30
    i2c_stop();
31
    
32
    itoa(DATAHIGH,cBuffer,2);
33
    lcd_setcursor(0,1);
34
    lcd_string(cBuffer);
35
36
    
37
    _delay_ms(1000);
38
39
    
40
41
42
    }// end while
43
}// end main

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Bewertung
1 lesenswert
nicht lesenswert
D. R. schrieb:
> #define TSL45315 0x29

Probier mal 0x52, also alles eins nach links schieben. So erwartet es 
die Fleury Lib.

von derjaeger (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Du machst es falsch.

SO ist es richtig:


i2c_start((TSL45315 << 1)  | I2C_WRITE);


Du musst PLatz machen fuer das LSB

von Bernd (Gast)


Bewertung
1 lesenswert
nicht lesenswert
cBuffer sollte ein Array sein. In dem Mini Programm wird es trotzdem 
funktionieren, später in komplexeren Programmen aber zu unerklärlichen 
Fehlern führen.

von D. R. (misterdimi1992)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank dazu! Das hat schonmal geklappt!

Aber wie genau kann ich jetzt die veschiedenen Register ansprechen?

von derjaeger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Indem du dir das Datenblatt durchliest und das befolst was da steht.


I2C Register schreiben:

-Startbit mit Adresse
-Nach der Adresse schickst du ein Byte das ein Register anspricht:

Control Register (0x00)
Configuration Register (0x01)
ALS Data Registers (0x04 − 0x05)
ID Register (0x0A)

Dann schickst du nach dem Registerbyte den Inhalt des Registers als ein 
Byte
Dann beendest du die I2C Kommunikation.

Steht doch alles genaustens im Datenblatt, wo ist das Problem? Keine 
Lust zu lesen?

von derjaeger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich machs noch einfacher für dich:

Seite 7

von D. R. (misterdimi1992)


Bewertung
0 lesenswert
nicht lesenswert
1
          i2c_start_wait((TSL45315 <<1) | I2C_WRITE);      
2
    i2c_write(0x00);
3
    i2c_write(0x03);
4
    i2c_stop();

Also quasi so?


Ja ich habe mir das Datenblatt natürlich auch schon vor dem Tread 
angeguckt, verstehe es aber nicht wie ich genau Einstellungen in den 
Registern mache.

Das Control Register hat laut Datenblatt die Adresse 0x00 und wenn ich 
in den normal Operation Mode möchte muss ich 0b00000011 setzen. Wäre ja 
dementsprechend die 0x03. Aber ich überschreibe es dann doch?

von derjaeger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Also quasi so?
Ja so beschreibt man Register über I2C.

>Aber ich überschreibe es dann doch?

Du setzt den Inhalt des Registers, das willst du doch? Laut Datenblatt 
ist das Modul im Power Down beim Start, also musst du es mit 0x3 in 
Normal Operation bringen.

von D. R. (misterdimi1992)


Bewertung
0 lesenswert
nicht lesenswert
Das wollte ich wissen! Vielen Dank!

Hat nun alles geklappt!

: Bearbeitet durch User
von D. R. (misterdimi1992)


Bewertung
0 lesenswert
nicht lesenswert
Habe den Sourcecode erstellt, bekomme aber immer als cBuffer den Wert 
"771" ausgegeben. Einen neuen Sensor habe ich auch verbaut, um das 
Problem einzugrenzen, da ich dachte dieser ist defekt.

Aber es muss an der Programmierung liegen. Hat da jemand eine Idee, was 
ich falsch mache?
1
#include  <avr/io.h>
2
#define    F_CPU 8000000
3
#include  <util/delay.h>
4
#include  <stdlib.h>
5
#include  "i2cmaster.h"
6
#include  "lcd-routines.h"
7
8
// Register des Sensors
9
10
#define REG_CONTROL    0x00
11
#define REG_CONFIG    0x01
12
#define OP_NORMAL    0x03
13
14
#define TSL45315    0x29
15
16
17
uint8_t    DATAHIGH, DATALOW;
18
uint16_t  Light_Level;
19
char    cBuffer[16];
20
21
22
int main(void)
23
{
24
    
25
26
    while (1) 
27
    {  /******Einlesen des Lichtsensors TSL4531*****/
28
29
    lcd_init();      // initialize LCD library
30
    lcd_clear();    // LCD löschen
31
32
    i2c_init();      // initialize I2C library
33
34
35
    i2c_start((TSL45315 <<1) | I2C_WRITE);    // Shift the slave address left
36
    i2c_write(0x00);              // Defaults Power On
37
    i2c_write(0x03);              // Normal Operation Mode
38
    i2c_rep_start((TSL45315 <<1) | I2C_READ);
39
    DATALOW = i2c_readAck();
40
    DATAHIGH = i2c_readNak();
41
    i2c_stop();
42
    
43
    Light_Level = (DATAHIGH << 8) | DATALOW;
44
45
    lcd_setcursor(0,1);
46
    itoa(Light_Level,cBuffer,10);
47
    lcd_string(cBuffer);
48
    
49
    _delay_ms(1000);
50
51
52
    }// end while(1)
53
}// end main

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]
  • [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.