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.