Forum: Mikrocontroller und Digitale Elektronik Kommunikation mit TSL45315


von D. R. (misterdimi1992)


Angehängte Dateien:

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)


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)


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)


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)


Lesenswert?

Vielen Dank dazu! Das hat schonmal geklappt!

Aber wie genau kann ich jetzt die veschiedenen Register ansprechen?

von derjaeger (Gast)


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)


Lesenswert?

Ich machs noch einfacher für dich:

Seite 7

von D. R. (misterdimi1992)


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)


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)


Lesenswert?

Das wollte ich wissen! Vielen Dank!

Hat nun alles geklappt!

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


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

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.