SHT75 Codeproblem

Gast #476223
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.
Is es eigentlich egal an welche Pins man den Sensor anschließt? Wir 
haben ihn jetz an den Pins PC1 und PC0 vom ATmega16.
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
}
Gast #476574
Lesenswert?

Du machst da einen mächtigen Fehler:
Du darfst den AVR-Port nicht auf H-Pegel legen, wenn er als Ausgang 
geschaltet ist - das gibt einen netten Kurzschluß, wenn der Sensor die 
Leitung auf 0V herunterzieht.
Eigentlich mußt du die Datenleitung nur per DDR umschalten, das 
Port-Register auf 0 setzen und einen vielleicht noch einen externen 
Pullup spendieren.
Der 8051 hat keine Push-pull-Ausgänge, sondern nur einen 
Open-Collector/-Drain-Ausgang mit einem relativ hochohmigen Pullup.
Gast #476579
Lesenswert?

Danke für die Antwort.
Aber nochmal, ist es egal welche Pins ich dem Sensor gebe oder müssen 
die TWI Pins sein. Hab irgendwo gelesen, dass man diese Pins nicht 
benutzen sollte aus welchen Gründen auch immer.

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