Forum: Mikrocontroller und Digitale Elektronik DS1820 und ATmega32 Bascom Temp immer =0


von Barracuda (Gast)


Lesenswert?

Hi Leute

Der DS1820 ist nicht parasitär angeschlossen, d.h. GND an Pin1, Port D.6 
an Pin 2 und 5V+ an Pin 3.

Hier mein COde

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 14745600
$baud = 9600


 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , 
Db7 = Portc.6 , E = Portc.2 , Rs = Portc.0
 Config 1wire = Portd.6



Dim Ar(2) As Byte , A As Byte , I As Byte , Temperatur As Integer
Dim Halb As Byte
Cls

Lcd "Temp:"
Do
Waitms 300
1wreset 'reset the device
1wwrite &HCC 'read ROM command
1wwrite &H44
Waitms 200 'read ROM command
1wreset 'reset the device
1wwrite &HCC 'read ROM command
1wwrite &HBE 'read ROM command
For I = 1 To 2
Ar(i) = 1wread() 'place into array
Next

Locate 2 , 1
Temperatur = Ar(1)

If Ar(2) > 0 Then Temperatur = 0 Else Shift Temperatur , Right

Lcd Temperatur ; ".";

Halb = Ar(1) And 1

If Halb = 1 Then Lcd "5" Else Lcd "0"

Lcd " C"
Loop

End

Quelle für den COde: 
http://www.roboternetz.de/phpBB2/viewtopic.php?t=2401

Wieso wird mir als Temperatur immer 0.0 Grad angezeigt? Der Sensor wird 
und wurde übrigens nicht warm!

Liebe Grüsse

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

1. Widerstand von D6 nach plus eingebaut ??
2. die Berechnung sieht irgendwie merkwürdig aus
     Temp = (ar(2) << 7) + (ar(1) >> 1)  ;MSB u. LSB zusammen, Bit0 
entfernen
     if ar(1) and 7 then Temp = Temp or 0x8000  ;wenn negativ - 
Vorzeichen
                                                 anpassen
     if ar(1) and 1 then Temp=Temp+0.5

## mit dem shiften musst du mal nach Bascom umsetzten, da kenne ich mich 
nicht aus !

PS: wenn die Kommandos schon kommentiert sind, dann bitte richtig - und 
nicht alles falsch übernehmen !

Sascha

von Sascha W. (sascha-w)


Lesenswert?

achso ...

ich weiß ja nich wie das bei Bascom ist, aber ein DIM ar(2) definiert 
ein Feld mit 2 Elementen, und die sind dann eingenlich ar(0) und ar(1) 
!!

Sascha

von Barracuda (Gast)


Lesenswert?

also, ich habe einen 4.7k Ohm Widerstand eingelötet und dann einen Wert 
von 0.5 Grad bekommen.

Dann habe ich den MC den ich hatte durch ne falsce fuse-bit einstellung 
geschrottet, n'neuer ist bestellt.

(Wie lautet in AVR-Studio schon wieder die richtige Einstellung für nen 
externen Quarz?)

Ich werde den Code dann anpassen sobald ich den neuen MC hab.

Liebe Grüsse!

PS: Kann die falsche Temperatur auch an der falschen Taktfrequenz 
liegen?

Liebe Grüsse

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Barracuda schrieb:

> PS: Kann die falsche Temperatur auch an der falschen Taktfrequenz
> liegen?

Grundsätzlich ja. Das 1-Wire Protokoll ist zeitabhängig und damit 
abhängig von genauen Warteschleifen für Timeslots etc.. Wenn die 
Taktquelle falsch angegeben ist, klappt die Kommunikation nicht.

1-Wire Tutorial
http://www.maxim-ic.com/products/1-wire/flash/overview/index.cfm

von Sascha W. (sascha-w)


Lesenswert?

Barracuda schrieb:
> Dann habe ich den MC den ich hatte durch ne falsce fuse-bit einstellung
> geschrottet, n'neuer ist bestellt.
glaube ich kaum, dann hast du ihm wohl den Takt abgedreht - evl. mal 
einen Takt extern einspeisen
oder SPIEN abgeschaltet - dann nur mit HighVoltage-Prog. noch 
anzusprechen

> (Wie lautet in AVR-Studio schon wieder die richtige Einstellung für nen
> externen Quarz?)
für 14MHz ->ext. Crystal/Resonator  high Freq.


Sascha

von Barracuda (Gast)


Lesenswert?

hm sascha, leidr deinen Eintrag zu spät gesehen, neue schon bezahlt und 
alte schon aufgeschnitten in der hoffnung was sehen zu können - naja, 
hab auch schon für blödere sachen geld ausgegeben;p

>>für 14MHz ->ext. Crystal/Resonator  high Freq.

da hab ich aber verschiedenene auswahlmöglichkeiten...

von Uwe (Gast)


Lesenswert?

Hi Barracuda,

ich hatte neulich das gleiche Problem, mit 2 verschiedenen Sensoren.
Grund war bei mir letztlich das die sensoren kaputt waren (hatte ich 
schon mal dauerhalft benutzt). neuer Sensor hat geholfen. Vielleicht hat 
er tatsaechlich einen klitsch weg...

bye uwe

von Barracuda (Gast)


Lesenswert?

So, konnte das Problem lösen, das Problem lag an der quarz-sache.

Alles richtig eingestellt, hier oben ists nun 22.5 Grad Celsius warm:D

hier nochmals der funktionierende Code für alle andern;)

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 14745600
$baud = 9600


 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , 
Db7 = Portc.6 , E = Portc.2 , Rs = Portc.0
 Config 1wire = Portd.6



Dim Ar(2) As Byte , A As Byte , I As Byte , Temperatur As Integer
Dim Halb As Byte
Cls

Lcd "Temp:"
Do
Waitms 300
1wreset                                                     'reset the 
device
1wwrite &HCC                                                'read ROM 
command
1wwrite &H44
Waitms 200                                                  'read ROM 
command
1wreset                                                     'reset the 
device
1wwrite &HCC                                                'read ROM 
command
1wwrite &HBE                                                'read ROM 
command
For I = 1 To 2
Ar(i) = 1wread()                                            'place into 
array
Next

Locate 2 , 1
Temperatur = Ar(1)

If Ar(2) > 0 Then Temperatur = 0 Else Shift Temperatur , Right

Lcd Temperatur ; ".";

Halb = Ar(1) And 1

If Halb = 1 Then Lcd "5" Else Lcd "0"

Lcd " C"
Loop

End

von wimmer (Gast)


Lesenswert?

hallo,
danke für die DArstellung des funktionierenden Codes.

Ich habe versucht mein DS mit diesem Code zu steuern.
Es klappt nicht!

Erst nachdem ich die Zeile

$baud = 9600

gelöscht habe, hat es fiunktioniert.

Woran liegt es?
Was ist überhaupt die Bedeutung dieser Zeile.
Kann es sie einfach löschen ohne Wirkung?

Kann eine Anfängerfrage sein, bitte sei nicht böse;) , denn ich bin 
einer!

Grüße

Wimmer

von Herbert K. (avr-herbi)


Lesenswert?

Hallo,
ich habe bereits an anderen Stellen hier gelesen, das es bei $baud=9600 
zu div. Randerscheinungen kommen soll. Woran es liegt, habe ich bisher 
nicht weiter untersucht.
Für Anfänger immer schön, wenn so was wie $baud=9600 alles mögliche 
macht, und man sich nicht kümmern muß, das die RS232 funktioniert. Wenn 
man tiefer einsteigt, beißt sich manchmal was, so wie in diesem Fall.
Viele Grüße Herbert

von Paul Baumann (Gast)


Lesenswert?

Zitat aus der Bascom-Hilfe:
The baud rate is selectable from the Compiler Settings. It is stored in 
a configuration file. The $BAUD directive overrides the setting from the 
Compiler Settings.

Damit kann man zum Beispiel die Baudrate während der Programmausführung
verändern. Das Einstellen und Errechnen der Baudrate braucht auch
Zeit und deswegen vermute ich, daß die Wait_Befehle in dem Programm
nicht mehr stimmen und der Temperaturfühler dann nicht richtig
gelesen wird. Wenn man nichts seriell übertragen will, braucht man
auch diese Kompilerdirektive ($Baud) nicht einzutragen und handelt sich
dadurch keinen Ärger ein.

MfG Paul

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.