Forum: Mikrocontroller und Digitale Elektronik ATMega8 - SHT71


von Martin A. (maugrau)


Angehängte Dateien:

Lesenswert?

Guten Tag,

ich habe folgendes Problem: Ein funktionierendes Beispielprojekt mit 
CodeVisionAVR für einen ATMega8 + SHT71-Temperatur-Feuchte-Sensor 
bekomme ich ums verderben nicht unter dem AVR Studio zum laufen. Fuses, 
Clock etc. habe ich in beiden Fällen mit dem AVR Studio einstellt. Beim 
CodeVision-Code bekomme ich korrekte Werte für T und RH, beim 
Studio-Code bekomme ich jeweils nur 0.

Meine Vermutung ist, dass in der SHT_Measure(..), SHT_WriteByte(..), 
bzw. der SHT_ReadByte(..) irgendwas nicht stimmt, vielleicht einen Pin 
falsch gesetzt oder gelesen.

Wäre dankbar wenn mal einer rüber schauen könnte, ich bin langsam 
code-blind.

Hier noch mal die Einstellungen: STK500, ATMega8-16, 8MHz/IntOsc., 
SCK=PC1, DATA=PC0 gemäß funktionierendem Beispielprojekt.

Vielen Dank im voraus,

Martin  / ahrensma@web.de

: Verschoben durch Admin
von Karl H. (kbuchegg)


Lesenswert?

> #define  DATA_HI    DDRC  |=  (1<<PC0)
> #define  DATA_LO    DDRC  &= ~(1<<PC0)


Du willst den PORT umstellen um die Datenleitung auf High bzw. Low zu 
ziehen und nicht das DDR Register.

von Karl H. (kbuchegg)


Lesenswert?

>   DDRC = 0b00000011;
keine gute Idee. Aber da das im Original auch so war, würde ich das 
jetzt erst mal so lassen, bis alles läuft.

von (prx) A. K. (prx)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Du willst den PORT umstellen um die Datenleitung auf High bzw. Low zu
> ziehen und nicht das DDR Register.

Eigentlich will man so den Port als Open Drain mit externem Pullup 
betreiben und tut dies dann völlig korrekt per DDR. Allerdings 
andersrum, d.h. DDRx=1 liefert als Ausgang dann DATA=0 und DDRx=0 
liefert als Eingang dank des Pullups DATA=1. PORTx setzt man einmalig 
auf 0 und belässt es dabei.

Die Datenleitung der SHTx ist bidirektional orientiert an I2C. Sie aktiv 
hochzuziehen ist der falsche Weg. Wenn man sowas bei 8051-Beispielcode 
findet, dann liegt das an dessen eigenwilligen Ports ohne starkem 
aktivem Pullup.

von Martin A. (maugrau)


Lesenswert?

Moin,

vielen Dank für die Mühe mir da zu helfen - leider hat es nicht 
geklappt.

Ich habe mit aus dem Beitrag Beitrag "Tempertur/Feuchte Display/Logger mit ATMega128  SHT75  SD-Karte" 
jedoch die SHT71.zip geholt und diese ausprobiert - zunächst auch ohne 
Erfolg. Schlussendlich war hier - und vielleicht auch bei meinen 
vorherigen Versuchen das Problem der float-Wert Konvertierung. Ich bekam 
stehts ? als Werte. Die Lösung hier ist die "Aktivieren der Floating 
Point Version von sprintf beim WinAVR mit AVR-Studio" 
(http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio) 
im Detail für das AVR Studio 6 hier erklärt: 
http://blog.ib-rohde.de/tag/atmel-studio-printf/ .

Grüße,

Martin Ahrens



****  BEITRAG ZUENDE ***

von Karl H. (kbuchegg)


Lesenswert?

Martin Ahrens schrieb:
> Moin,
>
> vielen Dank für die Mühe mir da zu helfen - leider hat es nicht
> geklappt.

Dann gibt es immer noch die Methode: abspecken!
Dein komplettes Programm ist viel zu groß und macht viel zu viele Dinge, 
die (höchst wahrscheinlich) mit dem Problem gar nichts zu tun haben und 
nur das Debuggen erschweren.

Abspecken auf das unbedingte Minimum und nachsehen, worin sich dann die 
Ergebnisse vom IAR-Programm und GCC-Programm unterscheiden. Und dann 
noch mal intensives Code-Studium, welche IAR Konstrukt falsch nach GCC 
übertragen wurde.

Das war ja nur das, was mir beim Drüberlesen auf die Schnelle 
aufgefallen ist, dass du ein

   PORTC.0 = 1

offenbar mittels

   DDRC  |=  (1<<PC0)

übersetzt. Und das ist dann nun mal die falsche 'Übersetzung'.
Da kann durchaus noch mehr im Code sein.

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.