SHTxx + ATmega16 + TWI

Gast #474848
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;


Gast #475225
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

Gast #475243
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!
Gast #475251
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

Gast #475851
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren