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
}
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.