www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SHT11 am ATMega16 - ich dreh gleich durch :(


Autor: Draco (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also ich drehe gleich am Rad :(

ärgere mich hier mit einem SHT11 rum, die diversen anderen Threads habe 
ich schon besucht und gelesen, sowie die verschiedenen Codes probiert, 
jedoch habe ich das Problem das man manche nicht verwenden kann (Beim 
M16 muß der Pin seperat auf Eingang geschaltet werden) oder nicht 
compilierbar (verwende MicroC).

Ich habe mir nun mal aus lauter Verzweiflung eine super simple Init des 
SHT11 geschrieben. (DATA an PB5, CLOCK am PB7).:
 #define DATA PORTB.B5
 #define SCL  PORTB.B7
 //#define mdelay asm nop
 #define mdelay delay_ms(200);
 
 volatile int i = 0;
//       _____________________________________________________         ________
// DATA:                                                      |_______|
//          _    _    _    _    _    _    _    _    _        ___     ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______


void messung(void)
{
    DATA = 1;                               // Reset
    SCL = 0;mdelay;
    SCL = 1;mdelay;
    SCL = 0;mdelay;
    SCL = 1;mdelay;
    SCL = 0;mdelay;
    SCL = 1;mdelay;
    SCL = 0;mdelay;
    SCL = 1;mdelay;
    SCL = 0;mdelay;
    SCL = 1;mdelay;
    SCL = 0;mdelay;
    SCL = 1;mdelay;
    SCL = 0;mdelay;
    SCL = 1;mdelay;
    SCL = 0;mdelay;
    SCL = 1;mdelay;
    SCL = 0;mdelay;
    SCL = 1;mdelay;
    SCL = 0;mdelay;
    delay_ms(50);
                      // Init fertig!
                      // Für Daten senden fertig machen
     SCL  = 1;mdelay;
     DATA = 0;mdelay;
     SCL  = 0;mdelay;
     SCL  = 1;mdelay;
     DATA = 1;mdelay;
     SCL  = 0;mdelay;
     delay_ms(50);
                              // Datensendung vorbereitet
                              // Termperatur messen senden (erste drei nullen)
     DATA = 0;SCL  = 0;mdelay;
     DATA = 0;SCL  = 1;mdelay;
     DATA = 0;SCL  = 0;mdelay;
     DATA = 0;SCL  = 1;mdelay;
     DATA = 0;SCL  = 0;mdelay;
     DATA = 0;SCL  = 1;mdelay;
     DATA = 0;SCL  = 0;mdelay;
                              // (erste drei nullen beendet)
                              // Command senden: 00101  (Feuchte)
     DATA = 0;SCL  = 1;mdelay;
     DATA = 0;SCL  = 0;mdelay;
     DATA = 0;SCL  = 1;mdelay;
     DATA = 1;SCL  = 0;mdelay;
     DATA = 1;SCL  = 1;mdelay;
     DATA = 0;SCL  = 0;mdelay;
     DATA = 0;SCL  = 1;mdelay;
     DATA = 1;SCL  = 0;mdelay;
     DATA = 1;SCL  = 1;//mdelay;               

                            // Senden der DATA leitung abgeschlossen... 
                            //SHT sollte nun DATA übernehmen... sollte!
     DDB5_bit = 0;
     
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);

}


void main() {
 UART1_Init(38400);

 while(1)
   {

     delay_ms(5000);
     i = 0;
     messung();
     PORTC = i;
   }
}

Jedoch zieht der SHT11 die Leitung nicht auf Null, für den ersten ACK, 
runter :/

Ich habe DATA mit 10K gegen 5V VDD stehen. Kommt der SHT11 dagegen 
eventuell nicht an?! Wenn ich den Pullup jedoch garnicht gegen VDD 
stelle funktioniert er auch nicht.

Kann es sein das der SHT11 defekt ist?! Die Pins des SHT habe ich gegen 
die Pins am Atmega durchgeklingelt, das sitzt alles, so das ich nen 
Verdrahtungsfehler eigentlich ausschließen kann.

Autor: Mattes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

mal die Kabel zum Sensor verkürzt?
100nF Blockkondensatoren an Vcc?
Bei mir waren entweder die Signalflanken zu schlecht aufgrund des Kabels 
oder weil ich den 100nF weggelassen habe.

Gruss

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne nur die Sensirion SHT7x Sensoren.
Da wird gesagt, dass man Data gar nicht High treiben soll, sondern sich 
wie ein Open Collectro verhalten soll.
Also:
1) Data Pegel immer = 0
2) Pull-up dran
3) für Data = input oder data = output high : data pin auf input 
schalten
4) für Data = output low : data pin auf output schalten.

Vielleicht liegt's daran, habe gerade keine Lust auf deinen C-code.
C-Code wird meist mit Schleifen ein wenig übersichtlicher, was zB Anzahl 
an CLKs und so angeht...

Autor: Draco (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mattes schrieb:
> Hi,
>
> mal die Kabel zum Sensor verkürzt?
> 100nF Blockkondensatoren an Vcc?
> Bei mir waren entweder die Signalflanken zu schlecht aufgrund des Kabels
> oder weil ich den 100nF weggelassen habe.
>
> Gruss


Kabel gibt es keine und der 100nf steht auch ziemlich in der Nähe des 
SHT. :/

X- Rocka schrieb:
> Ich kenne nur die Sensirion SHT7x Sensoren.
>
> Da wird gesagt, dass man Data gar nicht High treiben soll, sondern sich
> wie ein Open Collectro verhalten soll.
>
>Also:
>
> 1) Data Pegel immer = 0
>
> 2) Pull-up dran
>
> 3) für Data = input oder data = output high : data pin auf input
> schalten
>
> 4) für Data = output low : data pin auf output schalten.
>
> Vielleicht liegt's daran, habe gerade keine Lust auf deinen C-code.
> C-Code wird meist mit Schleifen ein wenig übersichtlicher, was zB Anzahl
> an CLKs und so angeht...

Danke für diesen Hinweis! Werde ich mal probieren.

Ist Richtig, ich mach das ja normalerweiße auch mit Schleifen, aber ich 
bin mir schon so unsicher das ich dies einfach so machen musste um 
Nerven zu beruhigen :D

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wie x-rocka schon bemerkt hat die Portpins dürfen nicht auf Ausgang 
programmiert sein.

MfG Spess

Autor: Draco (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sooo.. habe ihn nur noch am Pullup laufen und nehme diesen mit dem µC 
runter. Der Port B5 wird nun nicht mehr vom µC auf High gesetzt. Dennoch 
übernimmt der SHT nicht die Kontrolle über den Port :/

Wie lautet nochmal der ASM Befehl um den Port auf ausgang zu schalten? 
Vielleicht macht mein MicroC da die Probleme!? :/

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das der SHT11 von Sensirion [1]? Falls ja: Der will eine andere 
Synchronisation von DATA und SCL haben:
2.2.2 Serial data (DATA)
The DATA tristate pin is used to transfer data in and out of the
device. DATA changes after the falling edge and is valid on the
rising edge of the serial clock SCK. During transmission the DATA
line must remain stable while SCK is high.

Demnach ist (u.a., aber insbesondere) folgendes flasch:
Draco schrieb:
> // Command senden: 00101  (Feuchte)
>      DATA = 0;SCL  = 1;mdelay;
>      DATA = 0;SCL  = 0;mdelay;
>      DATA = 0;SCL  = 1;mdelay;
>      DATA = 1;SCL  = 0;mdelay;
>      DATA = 1;SCL  = 1;mdelay;
>      DATA = 0;SCL  = 0;mdelay;
>      DATA = 0;SCL  = 1;mdelay;
>      DATA = 1;SCL  = 0;mdelay;
>      DATA = 1;SCL  = 1;//mdelay;

Stattdessen müsste es heissen..:
SCL  = 0; DATA = 0; SCL  = 1; mdelay;
SCL  = 0; DATA = 0; SCL  = 1; mdelay;
SCL  = 0; DATA = 1; SCL  = 1; mdelay;
SCL  = 0; DATA = 0; SCL  = 1; mdelay;
SCL  = 0; DATA = 1; SCL  = 1; mdelay;

Das selbe gilt natürlich analog für alle anderen Übertragungen.

HTH

[1] 
http://www.datasheetarchive.com/pdf-datasheets/Dat...

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Quasi der hälfte der Flanke soll DATA seinen Wert erhalten. Ach du 
meine Güte, was ist das denn für nen verkorkstes serielles Interface. 
-.-


Hier mal der Ausschnitt aus dem deutschen Datenblatt:

2.2.2 Serial data (DATA)
Der DATA Tristate-Pin wird für das Auslesen der Daten
verwendet. Auf diesem Pin werden die Daten zum Ende der
abfallenden Flanke des SCK bereitgestellt und sind während
der ansteigenden Flanke gültig. Ein externer “pull-up”
Widerstand wird benötigt um das Signal auf „high“ zu
schalten (vgl. Abb. 2). „Pull-up” Widerstände finden in I/O
Schaltkreisen eines μC häufig Anwendung.

Ich werde es mal umsetzen.

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So also es läuft immernoch nicht :/ Gehe nun langsam wirklich davon aus 
der SHT nicht funzt oder irgendwo nen Lötfehler vorhanden ist... kann 
nochmal jemand drüber schauen?! Achtung auf DATA ist 0 und 1 vertauscht, 
da ich den Port ja auf Null runter ziehe:
 //#define DATA PORTB.B5
 #define DATA DDB5_bit
 #define SCL  PORTB.F7
 #define mdelay asm nop
 //#define mdelay delay_ms(300);
 
 volatile unsigned int i = 0;
 volatile unsigned int j = 1;

void messung(void)
{
    DATA = 0;mdelay;
    SCL  = 0;mdelay;
    
    for(i=0;i<9;i++)               // SHT11 Reseten
    {
      SCL = 1;//mdelay;
      SCL = 0;//mdelay;

    }                               // SHT11 Reset beendet
    
  i = 0;

  SCL  = 0; DATA = 0; mdelay;                
  SCL  = 1; DATA = 0; mdelay;
  SCL  = 1; DATA = 1; mdelay;
  SCL  = 0; DATA = 1; mdelay;delay_ms(5);
  SCL  = 1; DATA = 1; mdelay;
  SCL  = 1; DATA = 0; mdelay;
  SCL  = 0; DATA = 0; mdelay;

  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //a2       0
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //a1       0
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //a0       0

  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //c4       0
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //c3       0
  SCL  = 0; DATA = 0; SCL  = 1; mdelay;      //c2       1
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //c1       0
  SCL  = 0; DATA = 0; SCL  = 1; mdelay;      //c0       1
                                             // Übernahme SHT 11
  SCL = 0;i += PINB.F5;SCL = 1;delay_us(1);  // ACK
  SCL = 0;i += PINB.F5;SCL = 1;delay_us(1);
  SCL = 0;i += PINB.F5;delay_us(1);                            
  itoa(i,i);
  UART1_WRITE_TEXT(i);
  i = 0;
}


void main() {
 UART1_Init(38400);
 DATA = 0;
 while(1)
   {
     delay_ms(5000);
     i = 0;
     SCL = 1;
     DATA = 0;
     messung();
   }
}

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich müsste mir die Zahl 2 augeben, macht er aber nicht, er gibt 
halt immer 3 aus. :/ Also kommt kein ACK zu stande.

Kann mir jemand dem Assembler Befehler geben das ich diesen Pin (PB5) 
nur auf lesen für Open Collector bzw. Tristate stellen kann?!

mit
         ldi r16, 0x00
         out DDRB, r16     


schalte ich ja den ganzen Port auf eingang oder?!

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
X- Rocka schrieb:
> 1) Data Pegel immer = 0
>
> 2) Pull-up dran
>
> 3) für Data = input oder data = output high : data pin auf input
>
> schalten
>
> 4) für Data = output low : data pin auf output schalten.


Nochmal nachgedacht...

Wenn ich nun denn 10k gesicherten Pullup mit dem µC auf low ziehe und 
dann wieder auf high setze - registriert dann der SHT überhaupt den 
Pegelwechsel?!

Laut Datenblatt:

Low  level input voltage Negative going:     0     20% Vdd
High level input voltage Positive going:    80%   100% Vdd

Da reicht es doch nicht aus, den Pin einfach wieder auf PullUp zu 
schalten bei 5V VDD oder?

Autor: I. E. (anfaenger69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in temp, DDRB
andi temp, 0b00100000
out DDRB, temp

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>in temp, DDRB
>andi temp, 0b00100000
>out DDRB, temp

sbi DDRB,1<<DDRB5

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Stop. Natürlich: cbi DDRB,1<<DDRB5

MfG Spess

Autor: X- Rocka (x-rocka)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Draco schrieb:

> Da reicht es doch nicht aus, den Pin einfach wieder auf PullUp zu
> schalten bei 5V VDD oder?

deswegen besser 10k oder gar 4k7 externen pull-up!

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm

logisch 0 ausgeben -> pin auf ausgang und auf 0 setzen
logisch 1 ausgeben -> auf eingang schalten, der pull-up sorgt dann für 
den 5V pegel

es recht also das DDR oder TRIS register zu manipulieren. dann hat man 
einen pseudo-open-drain ausgang :)

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
> Stop. Natürlich: cbi DDRB,1<<DDRB5
>
> MfG Spess


Vielen Dank! Das setzt PortB Pin 5 nun auf Eingang, dann dürfte ja

sbi DDRB,1<<DDRB5

den Pin wieder auf Ausgang schalten?! Denn wenn im DDRx Register die 1 
für Ausgang und die 0 für Eingang steht dann hab ich ja folgende 
Zusammensetzung:

sbi        - wird das angegebene Bit auf 1 gesetzt
DDRB       - Datenrichtungsregister für PortB


1<<DDRB5 = kann ich mir noch nicht erklären.. Bedeutet das der Pin B5 
auf 0 gestellt wird? Also für Ausgang auf High 1>>DDRB?!


Ich hänge morgen auch mal ein Oszi drann. Hatte vorhin mal einen 
Logiktester dranne, und habe gesehen das er den Pin nicht ganz auf Grund 
zieht und dann auch nicht mehr freigibt, so das der SHT übernehmen kann.

Heute Abend ist erst mal ruhe von dem Ding angesagt. ;)

Vielen vielen Dank erstmal für eure Hilfe!

Autor: Michael U. (amiga)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

soweit ich weiß ost der SHT11 das "original" meiner benutzten FOST02.
Im Anhang mal der Code, den ich bei meinen Sensoren benutze.

http://www.avr.roehres-home.de/sensoren/i_uni_sensor.html

Gruß aus Berlin
Michael

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hrr Hrr Hrr.... :D

Er lebt!

Sooo heute Oszi dran gehabt und festgstellt das.: Wenn der DATA Pin als 
Eingang definiert ist, er denn Pullup runterzieht und ihn wieder gehen 
läßt, nur noch Schrott auf der Leitung liegt. Also ich muß beim 
Schreiben den Pin wirklich auf Ausgang setzen. Und beim lesen den Pin 
auf Eingang schalten. Anderst klappt es nicht - zumindest bekomme ich 
dann keine sauberen Signale auf der Leitung (die highs liegen dann so 
irgendwo zwischen 2V und 4V).

Also ich bekomme nun mein ACK Signal rein. Danach lasse ich momentan 
noch eine 2 Sekunden Schleife laufen mit einem ripple auf der SCK 
Leitung alle zwei nop. Bekomme dann auch zwischen 4-6 bit auf high, muß 
nun halt nur noch gescheit den ACK abfragen und dann die 12 bzw 14 Bit 
abfragen.
  asm {
       ldi r16, 0x32
       out DDRB, r16
  }
  DDRB = 0x80;

So nun hab ich noch zwei Schönheitsfehler. Mit obigen ASM Code sollte 
ich doch eigentlich PortB Pin5 auf Eingang schalten oder? Er schaltet 
aber den gesamten Port auf eingang, was nun wiederrum auf Pin7 für 
Probleme sorgt, deswegen muß ich dann noch mit "DDRB = 0x80" den Pin7 
wieder auf ausgang schalten. Kann ich das irgendwie umgehen? Es 
funktioniert zwar - aber schön ist das nicht!

Mein Inline Asembler kann leider die oben aufgeführten Snipets nicht 
verarbeiten:
in temp, DDRB
andi temp, 0b00100000
out DDRB, temp

hier möchte mein Compiler die Variable "temp" definiert haben, jeglicher 
Versuch sie zu defnieren scheitert allerdings :/

sowie
cbi DDRB,1<<DDRB5

hier kann er leider mit DDRB5 überhaupt nichts anfangen :/

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael U. schrieb:
> Hallo,
>
> soweit ich weiß ost der SHT11 das "original" meiner benutzten FOST02.
> Im Anhang mal der Code, den ich bei meinen Sensoren benutze.
>
> http://www.avr.roehres-home.de/sensoren/i_uni_sensor.html
>
> Gruß aus Berlin
>
> Michael

Jep, danke dir, werde mir das mal näher anschauen! Mit AVR GCC 
compiliert?!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRB &= (1<<PD5);

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon K. schrieb:
> DDRB &= (1<<PD5);

Vielen Dank, jedoch funktioniert dies in MicroC so leicht leiter nicht 
:D
Auch die normale Pinabfrage / Konfiguration mit PINB.B5 geht so leider 
nicht. Da ist MicroC definitiv arg verschandelt. Selbst die Hilfe zu 
MicroC bringt keinerlei Infos zu einzelnen Pin Befehlen. :/ Wie gesagt, 
nächstes Projekt steige ich auf AVR-GCC um, um solche Probleme von 
vornherein zu vermeiden!

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Draco schrieb:
> Michael U. schrieb:
>> soweit ich weiß ost der SHT11 das "original" meiner benutzten FOST02.
>> Im Anhang mal der Code, den ich bei meinen Sensoren benutze.
>>
>> http://www.avr.roehres-home.de/sensoren/i_uni_sensor.html
> Jep, danke dir, werde mir das mal näher anschauen! Mit AVR GCC
> compiliert?!

Ja, die komplette Source ist auf meiner Webseite falls was fehlt.
PS: waren so ziemlich meine ersten C-Übungen, programmiere sonst den AVR 
in ASM...

Gruß aus Berlin
Michael

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.