PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 143 grad im büro...ja super!



what?
19.02.2008, 06:42
hallo
und erstmal kompliment für das board.
weil ich absoluter anfänger bin, habe ich mich tage durch die beiträge hier gelesen und schon gelernt :-$

ich habe den mega2560 und möchte den temperatur sensor ds1621 über ic2 ansprechen bzw. dessen daten auswerten.
es gibt ja einige codebeispiele, wie man das in bascom macht.
bei mir kommt leider immer nur der wert null an, bzw andere, unsinnige werte
leider zeigt er bei der zuletzt am besten funktionierenden codevariante sagenhafte 143 grad an.


hier mein zusammengeschraubter code.

was mir eigenlich fehlt, ist eine gut zu verstehende erklärung des befehlaufbaus in bascom für i2c.
muss der ic2master eingesetzt werden?





'Diese Anweisung setzt die Fusebits automatisch korrekt (Syntax $PROG LB, FB , FBH , FBX )
$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus

$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44

$crystal = 16000000 'Quarzfrequenz


Config Pine.5 = Input
Usb Alias Pine.5 'Ist 1 wenn USB angeschlossen

Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4 'USB Buchse

'-------------------------------------------------------------------------------

'$lib "I2C_TWI.LBX" 'Bibliothek einbinden
'---------- I²C Einsatellungen ----------
$lib "i2c_twi.lbx" 'Einbindung der I2C-Bibliothek (Hardware)
'Config Twi = 100000 'i2c Frequenz einstellen

'*** I2C Config ***
Config Scl = Portd.0 'Ports an eigene Hardware anpassen!
Config Sda = Portd.1
'Config I2cdelay = 0
I2cinit 'entbehrlich
'-------------------------------------------------------------------------------
Declare Sub Readtemp(byval Device As Byte)
Declare Sub Convertvalue_komma1()

Dim Value As Word
Dim Ton As Integer
Dim Convert_strg As String * 10

Const Ds1 = 142 'ggf. anpassen
'----------------------------- Hauptprogramm -----------------------------------

Do
Call Readtemp(ds1)
Call Convertvalue_komma1()
Print #4 , Convert_strg
Waitms 500
Loop

End

'----------------------------- Subroutinen -------------------------------------

'Readtemp liest die Temperatur und stellt sie nach Aufruf in der Variable Value
'in 10tel Grad zu Verfügung. Übergeben wird die Deviceadresse des Sensors.

Sub Readtemp(byval Device As Byte)
Local Deviceread As Byte
Local Lowtemp As Byte
Local Hightemp As Byte

Deviceread = Device + 1

I2cstart
I2cwbyte Device
I2cwbyte &HEE 'Temperaturmessung anstoßen
I2cstop

I2cstart
I2cwbyte Device
I2cwbyte &HAA 'Temperaturmessung Lesekommando
I2cstop

I2cstart
I2cwbyte Deviceread
I2crbyte Lowtemp , Ack 'LSByte holen (Ganze Grad)
I2crbyte Hightemp , Nack 'MSByte holen (0,5 Grad Indikator)
I2cstop

Value = Lowtemp * 10
If Hightemp = 128 Then
Value = Value + 5
End If




End Sub

'-------------------------------------------------------------------------------
'Convertvalue_komma1 wandelt Value in einen String mit einer Nachkommastelle.
'Es wird gezeigt wie ein Zahlenwert in ein String gewandelt wird und dieser
'formatiert werden kann.
'Alternativ kann natürlich auch die "/10, Mod 10 Methode" angewandt werden.

Sub Convertvalue_komma1()

Convert_strg = Str(value)
Convert_strg = Format(convert_strg , " 0.0")

End Sub
'---------------------------------

und diesen schaltplan habe ich für den ds1621 benutzt.
http://www.avrprojects.net/img/DS1621_Thermometer_sch.jpg

habe alles gewissenhaft angeschlossen und weiss jetzt nicht mehr weiter.

vielen dank im voraus für hinweise...:o)
gruss, edgar

linux_80
19.02.2008, 19:10
Hallo,

wie man mit einem AVR einen I2C-Master bekommt dazu hab ich (für Bascom) im Wiki ein paar Beispiele angelegt. Für eine entscheiden und alle nötigen Befehl ins Programm übernehmen, nicht alles mischen!

Zum DS1621, der braucht zum messen einige Zeit, man darf(sollte) nicht gleich nach dem Messanstoss den Wert auslesen, da kommt max. der Wert von der letzten Messung zurück, oder -96° am Anfang !
Temp. >125 gibts sowieso nicht, evtl. nochmal ins DB schauen wie der Wert zu wandlen ist.


Hier hatte ich mal ein Beispiel dazu, musst nur das notwendige rausholen:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=26774

what?
20.02.2008, 05:16
hi und danke für die erste hilfe...:o)

so! ich glaube, der sensor ist am a....
egal, welche der möglichkeiten ich wähle, den sensor zu starten, beim ersten byte, dass gesendet wird, kommt err=1.

kann ich den ds1621 irgendwie testen ob der noch funktioniert?

linux_80
20.02.2008, 11:48
Hallo,

ich teste den mit genau diesem Programm,
wenn alles richtig verkabelt ist, sollte es auch so tun wie es gewollt ist.
Bei der ersten Messung kommt immer -96° raus, ausser man wartet noch etwas länger.

Man könnte zB. messen ob im Ruhezustand die beiden I2C-Leitungen High sind, oder ob sich darauf was tut, wenn das Programm läuft,
oder ob die Adressjumper und die Adresse im Prog zusammenpassen...

what?
20.02.2008, 12:20
jumper habe ich keine eingesetzt.
die drei a liegen auf gnd. käme also nur &h90/91 in frage.

liege ich mit der schaltung eigentlich richtig?
http://www.avrprojects.net/img/DS1621_Thermometer_sch.jpg

linux_80
20.02.2008, 18:53
Mit dem Beispiel aus dem anderen Thread sollte es gehen,
nur die Zeile mit der Lib entfernen, und die richtigen Pins beim I2C angeben, dann geht der Teil für den DS1621 schonmal.
Die ganzen Prints aktivieren, dann kommt es an UART0 raus.

Der Schaltplan stimmt schon so.

Sonst kann man aus der Ferne erstmal nix genaueres sagen.

Was hast Du für ein Board, wie lange sind die I2C-Leitungen ?
Hast Du irgendein Messgerät, um am Bus zu messen ob sich da was tut ?

what?
20.02.2008, 19:03
Was hast Du für ein Board, wie lange sind die I2C-Leitungen ?
Hast Du irgendein Messgerät, um am Bus zu messen ob sich da was tut ?

board ist ein mega2560 und die leitungen von den ports zum ds1621 sind geschätzte 7cm kurz/lang.
multimeter ist vorhanden :arrow:

LLiinnuuxx
22.02.2008, 18:03
Ich denke mit Board dürfte das Board im Sinne der Platine gemeint sein.
Sprich ob du zB eine RN Controll verwendest STK oder eine selbst auf Lochraster oder Steckbrett aufgebaute Schaltung hast

what?
22.02.2008, 18:10
achsooo...
ist ein rn-mega.

what?
04.03.2008, 00:55
hallo,

so, den sensor habe ich zum reden gebracht... =D>

hier der funktionierende code

'Diese Anweisung setzt die Fusebits automatisch korrekt (Syntax $PROG LB, FB , FBH , FBX )
$prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus

$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44

$crystal = 16000000 'Quarzfrequenz


Config Pine.5 = Input
Usb Alias Pine.5 'Ist 1 wenn USB angeschlossen

Config Com4 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com4:" For Binary As #4 'USB Buchse

'-------------------------------------------------------------------------------

$lib "i2c_twi.lbx" ' Für Hardware TWI

Config Twi = 400000 ' Init TWBR und TWSR

' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = Twen

Waitms 500

Config Scl = Portd.0 ' Ports fuer IIC-Bus
Config Sda = Portd.1

'Config I2cdelay = 100 ' je höher der Wert umso langsamer der Bus
' 10 ergibt ca. 100kHz (sollte zumindest)

I2cinit

Const Ds1621w = &H90
Const Ds1621r = &H91

Dim Lowtemp As Byte
Dim Hightemp As Byte


' Messen anstossen
I2csend Ds1621w , &HEE
I2cstart
I2cwbyte Ds1621w
I2cwbyte &HEE
I2cstop

If Err = 1 Then Print #4 , "I2C-Err11111 "

Do
' der DS1621 braucht mind. 400ms zum Temperatur umwandeln !
Waitms 500
' Wert auslesen
I2cstart
I2cwbyte Ds1621w
I2cwbyte &HAA
I2cstart
I2cwbyte Ds1621r
I2crbyte Lowtemp , Ack
I2crbyte Hightemp , Nack
I2cstop

'Print #4 , "low1: " ; Lowtemp
'Print #4 , "high1 :" ; Hightemp

If Err = 0 Then
' Negativer Wert ?
If Lowtemp.7 = 1 Then
Lowtemp = Not Lowtemp
If &H80 > Hightemp Then
Incr Lowtemp
End If
' Print #4 , "-" ; Lowtemp.7
Else
'Print #4 , "+" ; Lowtemp.7
End If

Print #4 , "temp:" ; Lowtemp ; "," ;

If Hightemp = &H80 Then
Print #4 , "5"
Else
Print #4 , "0"
End If
Else
Print #4 , "I2C-Err ! "
End If

Wait 60

Loop


End

die temperaturmessungen werden im bascom-terminalfenster mit 0.5 grad genauigkeit angezeigt. da gibt es ja noch eine möglichkeit, die auflösung des temperaturwertes noch auf stellen hinter dem komma zu erhöhen.
das habe ich bis jetzt aber leider noch nicht verstanden.
ist aber nicht so schlimm, erstmal reichen die 0.5 grad.

ich möchte nun gerne die temperaturwerte zur späteren auswertung speichern. in einer logdatei oder anders. wie muss ich da ansetzen?
welche möglichkeiten gibt es, die vom chip erhaltenen daten zu speichern?

vielen dank für eure hilfe.
ciao, edgar