PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bascom und ds1820



team
09.07.2004, 12:45
hallo

habe diese soft im netz gefunden. Damit soll man die temp. eines ds1820 auslesen können. Leider funkt das bei mir nicht. Auf dem display kommt nur Temp: und 0.0C. Habe auch mit einem mega8 getestet genau das selbe.
Vieleicht weiss jemand was ich falsch mache und kann mir helfen.

'*******************************************
'* Compiler : BasCom *
'* Hardware : AVR-Ctrl *
'* Temp.Sens : DS1820 *
'* Chip type : MEGA128 *
'* Clock frequency : 16,000000 MHz *
'* http://www.mikrocontroller.com *
'*******************************************

'$include "ac_lcd.inc"
$regfile = "m128def.dat"
$crystal = 16000000

Config 1wire = Portc.0 'use this pin

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

Mfg. team

x-ryder
10.07.2004, 11:03
Hi

Wie sieht denn deine Schaltung aus?

Kannste nen Bild machen?

Oder wirklich am besten die Schaltung posten!

MfG
Martin

Trabukh
10.07.2004, 11:29
$regfile = "m128def.dat"

Das Prog ist für den MEGA128 gemacht. Wenn du das auf einem anderen Controller testen willst, musst du die regfile ändern.

EDIT:
Ich denke, du musst in der "ac_lcd.inc"-Datei auch die Taktfrequenz entsprechend anpassen.

Trabukh
10.07.2004, 12:03
So, ich hab mir grad mal das Datenblaat runtergeladen und mir ist folgendes aufgefallen:

Waitms 300
1wreset 'reset the device
1wwrite &HCC 'read ROM command <- FALSCHER BEFEHL!
1wwrite &H44
Waitms 200 'read ROM command
1wreset 'reset the device
1wwrite &HCC 'read ROM command <- FALSCHER BEFEHL!
1wwrite &HBE 'read ROM command

Versuchs mal mit 1wwrite &H33. Ich weiß nicht, obs funktioniert, aber einen Versuch wärs wert.

team
10.07.2004, 13:07
hallo

danke für die antworten fehler gefunden. Es gehört ein wiederstand vom ausgang des ds1820 auf plus.

Mfg. theam

team
20.07.2004, 08:48
hallo

wieder einmal. Da es nun doch noch sommer geworden ist und ich im urlaub zuhause bin und natürlich viiiiel zeit habe, möchte ich mich wieder mit Atmel und Bascom beschäftigen.
Da ich es ja entlich geschaft habe mit ds1820 die temp. auf einem lcd displ. anzuzeigen währe die nächste aufgabe wie gehts mit mehreren sensoren und was mir noch wichtiger ist wie kann ich negative temperaturen anzeigen. Habe ja schon das datenblatt angeschaut aber zu einen erfolg bin ich noch nicht gekommen.
Währe schön wenn mir wer helfen könnte.

Mfg. team

x-ryder
20.07.2004, 13:54
Hallo,

Das steht eigentlich beides im Datenblatt........

1. Wenn du mehrere Sensoren hast hängst du sie alle an den einen Pin des µc. Dann musst du noch ins Prog schreiben:


maxsensors = 1wirecount()
Ar(1) = 1wsearchfirst()
For i = 2 to maxsensors
Ar(i) = 1wsearchnext()
Next i

2. Wenn du wissen willst, ob deine Temperatur Negativ ist, musst du erst 8 Bit lesen. Wenn diese 8 Bits alle 1 oder alle 0 sind weisst du erstmal, dass es sich bei den Bits nicht um Zahlen, sondern ums Vorzeichen handelt. Beispiel: 11111111 = neg. Temp.; 00000000 = pos. Temp.

Ich hoffe das hilft dir!

Martin

Marko1704
19.11.2004, 09:37
Hi Erstmal,

ich hab das mit der Temperaturmessung mit DS1820 hinbekommen, wie normal angegeben 0,5°C Genauigkeit.
Nun hab ich im Netz verschiedentlich gelesen, das der auch 0,1°C kann!
Nur wie das steht natürlich nie dabei. Hat da jemand evtl. nen tip für mich?

x-ryder
19.11.2004, 17:43
http://www.mcselec.com/an06.htm

14.12.2004, 09:58
Hallo zusammen!
Auch ich habe den Mega8 mit dem DS18S20 zum Laufen gebracht. Jetzt möchte die Temperaturanzeige nur "so nebenbei" haben.

Wichtiger sind andere Programmfunktionen, die schnell abgearbeitet werden sollen. Wenn ich den DS18S20 per Interrupt auf einen Timer lege, hält das Hauptprogramm ja solange an, wie die Interruptroutine (also das Auslesen des Sensors) läuft. Und das sind ja schon aufgrund der beiden Wartezeiten insgesamt 500mS!

Baue ich die Sensorabfrage in das Hauptprogramm ein, warte ich ja auch mind. 500ms. Wie kann ich den DS18S20 "unabhängiger" auslesen, sodaß mein Hauptprogramm nicht gestört wird? (Da war doch mal was mit Freilauftimern, oder???)

Übrigens reicht es völlig, wenn die Temperaturanzeige alle 1-2 Sekunden aktualisiert wird.

Hat jemand eine Idee für BASCOM?

Vielen Dank!

14.12.2004, 09:59
Nachttrag:

Gruß Stefan! ;-)

14.12.2004, 12:54
Hi Stefan,

bin zwar auch Anfänger in Bascom un Co., aber Multitasking am Mega8

währ ne tolle Sache, wenn ich's mir auch nicht so recht vorstellen kann.

Was natürlich nicht heiß, das ein Crack auch das hinbekommt.

Aber warum nimmste nicht einfach nen zweiten Mega und lässt den

dann das Messergebnis per UART rüber schieben? Haste auch gleich

nen Interrupt bei ;o)

mfg

Marko

14.12.2004, 13:15
Hi Marko!

Ganz so aufwendig wollt eich's dann auch nicht treiben. ;-) Ich hab' jetzt mal probiert statt der 200ms einfach meinen übrigen code "reinzuschieben". Das geht sogar ganz gut. Aber je nach codelänge vertut sich der Sensor immer um ein paar Grad!?! Momentan wären es nämlich 37°C Raumtermperatur bei mir. ;-D Ist der Code länger, klappt's komischer Weise...

Allerdings wird mein Hauptprogramm immer wieder durch einen externen Interrupt unterbrochen. (Es wird aber nur ein Befehl "incr zähler" ausgeführt. Dann "return") Und wenn diese Interrupts nun sehr schnell sind, "steigt" meine Temperatur?? Wie geht das? "Return" heißt doch, gehe zurück, wo Du aufgehört hast.



...
on int0 Int0_Interrupt
...
Do
1wreset 'reset the device
1wwrite &HCC 'read ROM command
1wwrite &H44

'weiterer code etc
'...
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 ; ".";

'restlicher code

loop

'#############
Int0_Interrupt:
incr zähler
return

End



Gruß Stefan

Alf_Wuffi
15.12.2004, 01:36
Hallo,

erhöhe mal die Stackwerte. Dann stimmts wahrscheinlich. Die Interrupts fressen mindestens 32 Bytes

Wolfgang

15.12.2004, 10:39
Hallo Wolfgang! :-)

Sorry für die blöde Frage, aber wie (?) erhöht man Stackwerte?

Gruß Stefan

Alf_Wuffi
15.12.2004, 11:56
in Bascom unter Options -Compiler-Chip findest Du unten die drei Werte. Die sind von Haus aus viel zu klein gestellt. Jetzt spielt es noch eine Rolle, welchen Chip Du benutzt -SRAM Größe - . Wenn Du nicht mindestens einen Mega 8 benutzt, kann es verdammt eng werden.

Wolfgang