Forum: Mikrocontroller und Digitale Elektronik SHT75 Codeproblem


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.
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
}

von Steffen (Gast)


Lesenswert?

Bitte schaut sich das doch mal jemand an!

von fieser, klugscheissender Rahul (Gast)


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.

von Steffen (Gast)


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.

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

Die Pinauswahl sollte egal sein, solange da nur der Sensor dranhängt.

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Port C???

JTAG abgeschaltet?

Mfg Sascha

von unbeschreiblicher Rahul (Gast)


Lesenswert?

>JTAG abgeschaltet?

Das betrifft PC0 und PC1 nicht...

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.