mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SHTxx + ATmega16 + TWI


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;



Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist Euch aufgefallen, dass der Sensor nicht ganz I²C-konform ist?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab für den ATMega in Verbindung mit einem anderen Projekt
einen Treiber geschrieben, vielleicht hilft der weiter...

http://www.dehof.de/eib/index.html

siehe unter EIB mit ATMEL

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weis das der Sensor nicht I2C konform ist.
Aber wie soll ich ihn denn dann ansprechen, wenn nicht über TWI?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Sascha Focus (sascha_focus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gibt es eine Appnote auf der Sensirion Seite. Versuch mich gerade 
selbst daran.

Mfg Sascha

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also doch an den Code von Sensirion halten.
Kann man das auch auf AVR-GCC protieren?
Schonmal gemacht Falk?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Steffen

> Also doch an den Code von Sensirion halten.

Wahrscheinlich.

> Kann man das auch auf AVR-GCC protieren?

Wahrscheinlich.

> Schonmal gemacht Falk?

Nein, bab auf dem AVR bisher nur in ASM programmiert. Wie richtige 
Männer ;-)

MfG
Falk


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber andere richtige Männer versuchen sich halt auch in C.
Na jut dann werd ich das mal versuchen. Trotzdem Danke.

Wenn trotzdem jemand nen Tip hat, her damit.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.