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


von Draco (Gast)


Angehängte Dateien:

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).:
1
 #define DATA PORTB.B5
2
 #define SCL  PORTB.B7
3
 //#define mdelay asm nop
4
 #define mdelay delay_ms(200);
5
 
6
 volatile int i = 0;
7
//       _____________________________________________________         ________
8
// DATA:                                                      |_______|
9
//          _    _    _    _    _    _    _    _    _        ___     ___
10
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
11
12
13
void messung(void)
14
{
15
    DATA = 1;                               // Reset
16
    SCL = 0;mdelay;
17
    SCL = 1;mdelay;
18
    SCL = 0;mdelay;
19
    SCL = 1;mdelay;
20
    SCL = 0;mdelay;
21
    SCL = 1;mdelay;
22
    SCL = 0;mdelay;
23
    SCL = 1;mdelay;
24
    SCL = 0;mdelay;
25
    SCL = 1;mdelay;
26
    SCL = 0;mdelay;
27
    SCL = 1;mdelay;
28
    SCL = 0;mdelay;
29
    SCL = 1;mdelay;
30
    SCL = 0;mdelay;
31
    SCL = 1;mdelay;
32
    SCL = 0;mdelay;
33
    SCL = 1;mdelay;
34
    SCL = 0;mdelay;
35
    delay_ms(50);
36
                      // Init fertig!
37
                      // Für Daten senden fertig machen
38
     SCL  = 1;mdelay;
39
     DATA = 0;mdelay;
40
     SCL  = 0;mdelay;
41
     SCL  = 1;mdelay;
42
     DATA = 1;mdelay;
43
     SCL  = 0;mdelay;
44
     delay_ms(50);
45
                              // Datensendung vorbereitet
46
                              // Termperatur messen senden (erste drei nullen)
47
     DATA = 0;SCL  = 0;mdelay;
48
     DATA = 0;SCL  = 1;mdelay;
49
     DATA = 0;SCL  = 0;mdelay;
50
     DATA = 0;SCL  = 1;mdelay;
51
     DATA = 0;SCL  = 0;mdelay;
52
     DATA = 0;SCL  = 1;mdelay;
53
     DATA = 0;SCL  = 0;mdelay;
54
                              // (erste drei nullen beendet)
55
                              // Command senden: 00101  (Feuchte)
56
     DATA = 0;SCL  = 1;mdelay;
57
     DATA = 0;SCL  = 0;mdelay;
58
     DATA = 0;SCL  = 1;mdelay;
59
     DATA = 1;SCL  = 0;mdelay;
60
     DATA = 1;SCL  = 1;mdelay;
61
     DATA = 0;SCL  = 0;mdelay;
62
     DATA = 0;SCL  = 1;mdelay;
63
     DATA = 1;SCL  = 0;mdelay;
64
     DATA = 1;SCL  = 1;//mdelay;               
65
66
                            // Senden der DATA leitung abgeschlossen... 
67
                            //SHT sollte nun DATA übernehmen... sollte!
68
     DDB5_bit = 0;
69
     
70
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
71
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
72
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
73
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
74
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
75
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
76
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
77
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
78
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
79
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
80
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
81
     SCL  = 1; i += PINB.B5; mdelay; uart1_write(PINB.B5);
82
     SCL  = 0; i += PINB.B5; mdelay; uart1_write(PINB.B5);
83
84
}
85
86
87
void main() {
88
 UART1_Init(38400);
89
90
 while(1)
91
   {
92
93
     delay_ms(5000);
94
     i = 0;
95
     messung();
96
     PORTC = i;
97
   }
98
}

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.

von Mattes (Gast)


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

von X- R. (x-rocka)


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

von Draco (Gast)


Angehängte Dateien:

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

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von Draco (Gast)


Angehängte Dateien:

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!? :/

von g457 (Gast)


Lesenswert?

Ist das der SHT11 von Sensirion [1]? Falls ja: Der will eine andere 
Synchronisation von DATA und SCL haben:
1
2.2.2 Serial data (DATA)
2
The DATA tristate pin is used to transfer data in and out of the
3
device. DATA changes after the falling edge and is valid on the
4
rising edge of the serial clock SCK. During transmission the DATA
5
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/Datasheets-29/DSA-566518.pdf

von Draco (Gast)


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.

von Draco (Gast)


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:
1
 //#define DATA PORTB.B5
2
 #define DATA DDB5_bit
3
 #define SCL  PORTB.F7
4
 #define mdelay asm nop
5
 //#define mdelay delay_ms(300);
6
 
7
 volatile unsigned int i = 0;
8
 volatile unsigned int j = 1;
9
10
void messung(void)
11
{
12
    DATA = 0;mdelay;
13
    SCL  = 0;mdelay;
14
    
15
    for(i=0;i<9;i++)               // SHT11 Reseten
16
    {
17
      SCL = 1;//mdelay;
18
      SCL = 0;//mdelay;
19
20
    }                               // SHT11 Reset beendet
21
    
22
  i = 0;
23
24
  SCL  = 0; DATA = 0; mdelay;                
25
  SCL  = 1; DATA = 0; mdelay;
26
  SCL  = 1; DATA = 1; mdelay;
27
  SCL  = 0; DATA = 1; mdelay;delay_ms(5);
28
  SCL  = 1; DATA = 1; mdelay;
29
  SCL  = 1; DATA = 0; mdelay;
30
  SCL  = 0; DATA = 0; mdelay;
31
32
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //a2       0
33
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //a1       0
34
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //a0       0
35
36
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //c4       0
37
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //c3       0
38
  SCL  = 0; DATA = 0; SCL  = 1; mdelay;      //c2       1
39
  SCL  = 0; DATA = 1; SCL  = 1; mdelay;      //c1       0
40
  SCL  = 0; DATA = 0; SCL  = 1; mdelay;      //c0       1
41
                                             // Übernahme SHT 11
42
  SCL = 0;i += PINB.F5;SCL = 1;delay_us(1);  // ACK
43
  SCL = 0;i += PINB.F5;SCL = 1;delay_us(1);
44
  SCL = 0;i += PINB.F5;delay_us(1);                            
45
  itoa(i,i);
46
  UART1_WRITE_TEXT(i);
47
  i = 0;
48
}
49
50
51
void main() {
52
 UART1_Init(38400);
53
 DATA = 0;
54
 while(1)
55
   {
56
     delay_ms(5000);
57
     i = 0;
58
     SCL = 1;
59
     DATA = 0;
60
     messung();
61
   }
62
}

von Draco (Gast)


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
1
         ldi r16, 0x00
2
         out DDRB, r16


schalte ich ja den ganzen Port auf eingang oder?!

von Draco (Gast)


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?

von I. E. (anfaenger69)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

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

sbi DDRB,1<<DDRB5

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von X- R. (x-rocka)


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!

von Michael H. (morph1)


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 :)

von Draco (Gast)


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!

von Michael U. (amiga)


Angehängte Dateien:

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

von Draco (Gast)


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.
1
  asm {
2
       ldi r16, 0x32
3
       out DDRB, r16
4
  }
5
  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:
1
in temp, DDRB
2
andi temp, 0b00100000
3
out DDRB, temp

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

sowie
1
cbi DDRB,1<<DDRB5

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

von Draco (Gast)


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?!

von Simon K. (simon) Benutzerseite


Lesenswert?

1
DDRB &= (1<<PD5);

von Draco (Gast)


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!

von Michael U. (amiga)


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

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.