Forum: Mikrocontroller und Digitale Elektronik DHT22 bzw. DHT11 - Problem - Luftfeuchtigkeit - Sensor - C-Code


von Sebastian M. (seba777)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin neu hier als Mitglied und auch neu in der µC-Programmierung. 
Daher seht mir bitte nach, dass mein Code vermutlich noch nicht sehr 
sauber ist.
Ich habe mich an die Programmierung des Luftfeuchtigkeitssensors DHT22 
gemacht. Und eigentlich funktioniert auch alles soweit, aber es kommen 
keine richtigen Werte heraus und ich kann seit Tagen keinen Fehler mehr 
finden. Ich habe mir auch schon andere Code-Beispiele angeschaut aber 
auch dann finde ich bei meinem Code keinen Fehler, zum verzweifeln.
Zum Code: Er ist soweit geschrieben, dass er mir die übertragenen 
Binär-Werte auf einem LCD-Display ausgibt.
Das Problem ist, dass er immer nur konstant folgende Werte auf dem LCD 
ausspuckt, auch wenn ich ihn 1min lang anhauche obwohl er etwa alle 6 
Sekunden eine Messung durchführt:

10000000
10000000
00000000
10000000
10000000    Checksumme

Den LCD-Display-Code habe ich nicht mit dazugepackt weil der problemlos 
funktioniert.
Da das Programm auch ganz durchläuft kann es auch nicht sein, dass er 
irgendwo in einer while-Schleife hängen bleibt. Wenn ich die 
for-Schleife 40 mal statt 39 mal durchlaufen lasse bleibt er auch 
erwartungsgemäß hängen. Also muss er die 40 Datensignale genau 
empfangen. Aber warum gibt er dann so konstante Werte aus?
Ich bin für jeden Tip sehr dankbar und werde den Code natürlich sobald 
er grundsätzlich funktioniert noch deutlich weiter verbessern evtl. auch 
mit einem Timer. Und dann natürlich auch hier zur Verfügung stellen.

Nur gerade verzweifel ich total weil ich einfach nicht mehr weiß wo ich 
noch ansetzen könnte um den Fehler zu finden.

von Dario B. (abcd)


Lesenswert?

wie schnell läuft dein prozessor denn?

von Sebastian M. (seba777)


Lesenswert?

µC Taktrate = 8 MHZ

von Dario B. (abcd)


Lesenswert?

probier's mal so:

unsigned short readByte(){
  unsigned short byte = 0;
  for (i=0;i<8;i++){
    while(!(PINB&0x4));
    TCNT0=0;
    while(PINB&0x4);
    if (TCNT0>40){
    //eine 1 wurde gesendet
      byte |= (1<<(7-i));
    }else{
    //eine 0 wurde gesendet

    }
  }
  return byte;
}

von Sebastian M. (seba777)


Lesenswert?

Danke, werde ich mal machen. Wird aber kurz dauern.

von Sebastian M. (seba777)


Lesenswert?

Ok, da muss ich mich wenn ich deinen Code richtig verstehe, wie gesagt 
bin recht neu in der µC-Programmierung, in die Timer-Programmierung 
einarbeiten. Das hatte ich ohnehin vor, allerdings wird es etwas länger 
dauern.
Ich würde trotzdem gerne wissen wo der Fehler bei meinem Code ist, denn 
ich will ja besser werden und meine Fehler erkennen und dann möglichst 
nie wieder machen. Daher wäre ich sehr dankbar, wenn jemand auch meinen 
Code auf Fehler überprüft.

von Sebastian M. (seba777)


Angehängte Dateien:

Lesenswert?

Ok, ich habe deinen Code bei mir eingearbeitet (siehe Anhang). Und jetzt 
gibt er das erste Datenbyte so aus:

00000001

Also gleiches Problem, nur die 1 ist jetzt im niedrigsten Bit. Das macht 
doch keinen Sinn. Ich weiß einfach nicht weiter.
Trotzdem danke für die Hilfe, ist ja recht einfach mit dem Timer, aber 
ich weiß einfach nicht wo es jetzt noch hakt.

von Sebastian M. (seba777)


Lesenswert?

Hat vielleicht noch jemand eine Idee woran es liegen könnte?
Der µC ist sonst eigentlich richtig angeschlossen und taktet auch 
richtig. Hab vorher eine Uhr drauf programmiert, die sehr genau lief. 
Und habe am Aufbau dann nichts geändert außer den DHT22 anzuschließen. 
Also kann es auch nicht an einer falschen Zeitgenerierung bzw. 
µC-Installation liegen.

von Drobel (Gast)


Lesenswert?

Es gibt einiges zu deinem Code zu schreiben. U. a. gehört in die 
Headerdatei kein C-Code.

Dein Startsignal stimmt nicht. Der Ausgang muss min. 1000 µS Lowpegel 
führen.

von Sebastian M. (seba777)


Lesenswert?

Danke für den Hinweis. Wusste ich nicht, werde es aber in Zukunft 
berücksichtigen.

Aber mein Startsignal ist doch 20ms auf Low-Pegel. Im Datenblatt stehen 
zwei widersprüchliche Angaben drin: Im Text steht mind. 18 ms und in der 
Grafig steht mind. 500µs. Aber dann müsste ich mit 20ms auf der sicheren 
Seite sein, oder hab ich grad wirklich Kakao im Kopf und sehe die 
offensichtlichen Fehler nicht mehr?

von Sebastian M. (seba777)


Lesenswert?

Ich glaube es funktioniert mit deinem Code, Dario. Jetzt habe ich sich 
verändernde Bytes. Werde den Code jetzt mal weiter schreiben und dann 
sehe ich ja ob die Werte Sinn machen.
Also schon mal vielen Dank für die Hilfe. Werde den Code wenn er funzt 
dann nochmal reinstellen da man für den DHT22 bzw. 11 nicht wirklich 
viel findet im Netz.

von Drobel (Gast)


Angehängte Dateien:

Lesenswert?

Es gibt eine ganze Reihe von "Datenblättern" zu diesen Sensoren. Im 
Datenblatt des von mir verwendeten DHT22 (siehe Anhang) stehen 1000 µs.

von Sebastian M. (seba777)


Lesenswert?

Hey, super. Das ist deutlich ausführlicher und klarer geschrieben als 
meins. Das hilft mir auf jeden Fall noch weiter.
Das Forum hier ist echt klasse.

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.