Forum: Mikrocontroller und Digitale Elektronik SHTxx + ATmega16 + TWI


von Steffen (Gast)


Lesenswert?

Morchen,
wir ham enn problem mit dem sensor, er gibt nicht das richtige ergebnis 
aus. er durchlauft die routine ohne probleme.
Aber es scheint als ob der sensor keine daten sendet. koennte mal jemand 
ueber unseren code drueber schauen.


BYTE *HData,*LData;
unsigned char S[14];

        TWCR = 0xE4;//0b11100100;     //Start
        while(!(TWCR & (1 << 7)));
        if (TWSR = 0x08) {
           TWDR = 0x04;                 //Adresse
           TWCR = 0xC5;
           while(!(TWCR &(1 << 6)));
           TWCR = 0xC5;
           }
        if (TWSR = 0x40) {
           while(!(TWCR &(1 << 7)));     //Daten1
           if (TWSR = 0x50) {
                *LData = TWDR;
                sprintf(buff,"1:%i",TWDR);
                LCD_sendS(2,1,buff);
                LED_signal(LED1);}

           TWCR = 0xC5;

           while(!(TWCR &(1 << 7)));     //Daten2
           if (TWSR = 0x50) {
                *HData = TWDR;
                sprintf(buff,"1:%i",TWDR);
                LCD_sendS(2,2,buff);
                LED_signal(LED2);}
           }
        TWCR = 0xD4;



von unbeschreiblicher Rahul (Gast)


Lesenswert?

Ist Euch aufgefallen, dass der Sensor nicht ganz I²C-konform ist?

von Patrick (Gast)


Lesenswert?

Ich hab für den ATMega in Verbindung mit einem anderen Projekt
einen Treiber geschrieben, vielleicht hilft der weiter...

http://www.dehof.de/eib/index.html

siehe unter EIB mit ATMEL

von Steffen (Gast)


Lesenswert?

Ich weis das der Sensor nicht I2C konform ist.
Aber wie soll ich ihn denn dann ansprechen, wenn nicht über TWI?

von Falk (Gast)


Lesenswert?

@ Steffen

> Ich weis das der Sensor nicht I2C konform ist.
> Aber wie soll ich ihn denn dann ansprechen, wenn nicht über TWI?

"Per Hand", sprich du muss zwei IO-Pins mit den entspechenden Mustern 
ansteuern.

MfG
Falk


von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Da gibt es eine Appnote auf der Sensirion Seite. Versuch mich gerade 
selbst daran.

Mfg Sascha

von Steffen (Gast)


Lesenswert?

Das heisst ich muss die einzelnen Taktfolgen programmieren für den SCK 
und DATA? Das Beispiel von sensirion is auch so ähnlich aufgebaut.
Ich dachte das könnte mit TWI funkionieren.
Hier im Forum haben das auch schon welche gemacht!

von Falk (Gast)


Lesenswert?

@ Steffen

> Das heisst ich muss die einzelnen Taktfolgen programmieren für den SCK
> und DATA? Das Beispiel von sensirion is auch so ähnlich aufgebaut.

Ja.

> Ich dachte das könnte mit TWI funkionieren.
> Hier im Forum haben das auch schon welche gemacht!

Dann musst du dich aber SEHR gut mit dem TWI Modul auskennen, um es 
etwas abseits seiner Normalfunktion zu benutzen. Machs per Hand und du 
hast Ruhe. Ist auch nicht sonderlich aufwändig.

MfG
Falk


von Steffen (Gast)


Lesenswert?

Also doch an den Code von Sensirion halten.
Kann man das auch auf AVR-GCC protieren?
Schonmal gemacht Falk?

von Falk (Gast)


Lesenswert?

@ Steffen

> Also doch an den Code von Sensirion halten.

Wahrscheinlich.

> Kann man das auch auf AVR-GCC protieren?

Wahrscheinlich.

> Schonmal gemacht Falk?

Nein, bab auf dem AVR bisher nur in ASM programmiert. Wie richtige 
Männer ;-)

MfG
Falk


von Steffen (Gast)


Lesenswert?

Aber andere richtige Männer versuchen sich halt auch in C.
Na jut dann werd ich das mal versuchen. Trotzdem Danke.

Wenn trotzdem jemand nen Tip hat, her damit.

von Steffen (Gast)


Lesenswert?

So haben uns jetz an den Code von sensirion gehalten mit allen zeiten 
usw.
Es geht immernoch nix. Selbst wenn wir eine slave adresse angeben die es 
nicht gibt meldet er erfolgreich gesendet.
Kann bitte jemand nochmal drüberschauen.
Danke

void S_SDA() {
DDRC  |= (1<<SDA);
PORTC |= (1<<SDA);
}

void C_SDA(){
DDRC  |= (1<<SDA);
PORTC &= ~(1<<SDA);
}

void S_SCL(){
DDRC  |= (1<<SCL);
PORTC |= (1<<SCL);
}

void C_SCL(){
DDRC  |= (1<<SCL);
PORTC &= ~(1<<SCL);
}

unsigned char G_SDA(){
DDRC &= ~(1<<SDA);
if ((PORTC & (1 << SDA)) == 1) { return 1;} else  { return 0;};
}

void SHT7Start(void) {
S_SDA();
C_SCL();
delay_us(5);
S_SCL();
delay_us(5);
C_SDA();
delay_us(5);
C_SCL();
delay_us(5);
S_SCL();
delay_us(5);
S_SDA();
delay_us(5);
C_SCL();
}


void SHT7Reset(void) {

}

unsigned char SHT7Read(unsigned char SHTACK) {
unsigned char i, tempvalue=0;
S_SDA();                           //release DATA-line
  for (i=0x80;i>0;i/=2)             //shift bit for masking
  { S_SCL();                          //clk for SENSI-BUS
    if (G_SDA == 1) {tempvalue = (tempvalue | i);};        //read bit
    delay_ms(10);
    C_SCL();
    delay_ms(100);
  }
  if (SHTACK == 0){S_SDA();}
  else {C_SDA();};                //in case of "ack==1" pull down 
DATA-Line
  S_SCL();                            //clk #9 for ack
  delay_us(5);                            //pulswith approx. 5 us
  C_SCL();
  delay_us(5);
  S_SDA();                           //release DATA-line
  return tempvalue;
}




char SHT7Write(unsigned char Data) {
unsigned char i,error=0;
  for (i=0x80;i>0;i/=2)             //shift bit for masking
  { if ((i & Data) == i) {S_SDA();}//masking value with i , write to Bus
    else {S_SDA();};
    S_SCL();                          //clk for SENSI-BUS
    delay_us(5);                        //pulswith approx. 5 us
    C_SCL();
    delay_ms(100);
  }
  S_SDA();                           //release DATA-line
  S_SCL();                            //clk #9 for ack

  error=G_SDA();           //check ack (DATA will be pulled  down by 
SHT11)

  C_SCL();
  return error;                     //error=1 in case of no acknowledge
}

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.