PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DS18B20 zu hoher Temperaturwert!



Douser182
28.09.2009, 08:27
Hallo Leute,
Hab schon in ganzen Forum geschaut aber leider hat bis jetzt noch keiner so was geschrieben!

Habe an einem ATmega8-16 einen DS18B20 1-Wire Temperatursensor angeschloss, leider bekomme ich aber nicht den richtigen Wert von dem Sensor. Wenn ich den Sensor länger in der Hand halte zeit er mehr als 100 Grad an. Kann es sein, dass sich der Sensor selber aufheitzt, denn heute früh wurde die Reumtemperatur angezeit und nach ein paar Secunden ist sie wieder auf mehr als das doppelte angestiegen.

Den verwendeten Code habe ich aus der Elektor Zeitschrift:


$regfile = "m8def.dat"
$baud = 19200
$hwstack = 32
$swstack = 32
$framesize = 32
$crystal = 8000000

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

'Config Portd.5 = Output 'LED 1
'Portd.5 = 1
'Led1 Alias Portd.5
'Config Portd.6 = Output 'LED 2
'Portd.6 = 1
'Led2 Alias Portd.6
'Config Portd.7 = Output 'LED 3
'Portd.7 = 1
'Led3 Alias Portd.7
'Config Portd.2 = Output 'Motor1, Pin 1 und 2 am Motorboard
'Portd.2 = 0
'Config Pinb.0 = Input 'Taster 1
'Portb.0 = 1
'Taster1 Alias Pinb.0
'Config Pinb.1 = Input 'Taster 2
'Portb.1 = 1
'Taster2 Alias Pinb.1
'Config Pinb.2 = Input 'Taster 3
'Portb.2 = 1
'Taster3 Alias Pinb.2

Config 1wire = Portd.2

Dim Rom(8) As Byte
Dim Temp1 As Single
Dim Temp2 As Single
Dim Tempdif As Single
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim I As Integer

Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()

I = 1wirecount()
Lcd I

For I = 1 To 8
Locate 1 , 1
Lcd Hex(id1(i));
Next
For I = 1 To 8
Locate 2 , 1
Lcd Hex(id2(i));
Next

Wait 1

Do

1wreset
1wwrite &HCC

1wwrite &H44
Ddrd.2 = 1
Waitms 800
Ddrd.2 = 0

1wreset
1wwrite &H55

For I = 1 To 8
1wwrite Id1(i)
Next I
1wwrite &HBE

Rom(1) = 1wread(1)
Temp1 = Rom(1) / 2
Locate 1 , 4
Lcd "T1: " ; Temp1


1wreset
1wwrite &H55

For I = 1 To 8
1wwrite Id2(i)
Next I
1wwrite &HBE

Rom(1) = 1wread(1)
Temp2 = Rom(1) / 2
Locate 2 , 4
Lcd "T2: " ; Temp2



Loop


End

Ich Verwende ein externes Crystal und die Fusebits hab ich auch richtig eingestellt!

Hat von euch jemand eine Idee woran das liegen kann?

Gruss Douser

vistauser
28.09.2009, 12:57
Hallo Douser,
habe das Programm mal auf einem Pollinboard ausprobiert.
Geändert nur die LCD_Ansteuerung und den Takt auf 16Mhz.
Klappt prima mit meinem DS1820.
fg vistauser

Douser182
29.09.2009, 08:26
Dann gibts ja nur noch zwei möglichkeiten, Taktung oder der Sensor!
In der Elektor werden die DS18S20 verwendet, hab schon ins Datenblatt gesehen aber da steht auch nicht wirklich was drinnen.
Welchen Port hast du verwendet?
Gruß Douser

Douser182
29.09.2009, 08:30
Dann gibts ja nur noch zwei möglichkeiten, Taktung oder der Sensor!
In der Elektor werden die DS18S20 verwendet, hab schon ins Datenblatt gesehen aber da steht auch nicht wirklich was drinnen.
Welchen Port hast du verwendet?
Gruß Douser

vistauser
29.09.2009, 11:48
Hallo Douser,
ich habe Port D2 für den DS1820 verwendet.
Hast du vom Datenpin auch einen Pullup-Widerstand gegen +5V
verwendet (hier habe ich 3,9K genommen da nur einer dran ist)?
Zerstört habe ich bisher noch keinen dieser Sensoren. Die sind äußerst robust.
Viel Erfolg
vistauser

Douser182
30.09.2009, 09:33
Ich habe einen 4,65k Widerstand drann, im Datenblatt heist es ja, dass man 4,7k verwenden soll.
(den hab ich leider nicht, 1,5k + 1,5k + 1k + 680 = 4,65k dank Abweichung) in den nächsten Tagen soll der 4k7 kommen dann versuch ich es mit dem noch mal

stekolos
18.11.2009, 09:28
Hallo zusammen,

ich habe das gleiche Problem.
Wenn ich das richtig versanden habe ist der 4,7KOhm Widerstand zwingend notwendig?

Gruß
SteKoLos

Rofo88
18.11.2009, 09:52
Ja, den Widerstand braucht man sonst geht nichts. Baue mal ne CRC-Prüfung mit in dein Programm ein um Übertragungsstörungen auszuschliesen.

sato
18.11.2009, 12:22
Hallo

Nicht vergessen das D18S20 nicht gleich DS1820 ist. Die S variante hat 12 bit und das andere 9 bit Auflölung, siehe Datenblatt

Gruss
Sato

for_ro
18.11.2009, 18:20
Die S variante hat 12 bit und das andere 9 bit Auflölung, siehe Datenblatt

Wo hast du denn diese Info her?
Laut Maxim:
Specification Differences: The primary specification difference between the two parts is the temperature conversion time: DS1820 = 500ms (max) and DS18S20 = 750ms (max).

Du meinst sicherlich den Unterschied zum DS18B20, den man im 12bit Modus betreiben kann. 12bit Auflösung kann man beim DS1820 und DS18S20 nur über die Zusatzregister COUNT_REMAIN und COUNT_PER_°C bekommen.

Socke
19.11.2009, 11:39
Hallo zusammen,
beim DS18B20 müssen 2 Bytes gelesen werden und dann durch 16 geteilt werden.
Gruß Socke

stekolos
19.11.2009, 11:59
Hi Leute,
ich habe jetzt den Wirdestand drin, leider bekomme ich nur am LCD 255 angezeigt. Ich verwende übrigend den DS18S20+
Muss ich da am Code was anders machen?

Gruß
SteKoLos

for_ro
19.11.2009, 15:32
Muss ich da am Code was anders machen?

Welchen Code benutzt du denn?

Mitch64
03.12.2009, 19:37
Hi,

so wie ich deinen Code interpretiere, liest du nur 1 byte aus. Der Sensor liefert aber 2 Byte als Temperaturwert. Am besten das komplette Scratchpad auslesen (also 9 Byte einschließlich CRC).

Ich hab das so gemacht:

' ROM-Kommandos
Const DS_SEARCH_ROM = &hF0
Const DS_READ_ROM = &h33
Const DS_MATCH_ROM = &h55
Const DS_SKIP_ROM = &hCC
Const DS_APARL_SEARCH = &hEC

' Funktions-Kommandos
Const DS_CONVERT = &h44
Const DS_WRITE_SCRATCHPAD = &h4E
Const DS_READ_SCRATCHPAD = &hBE
Const DS_COPY_SCRATCHPAD = &h48
Const DS_RECALL = &hB8
Const DS_READ_POWER_SUPPLY = &hB4

Dim BusData(9)
Dim DSTemp as Integer at DSData(1) Overlay
Dim Temperatur as Single

1wreset pind , 4
1wwrite DS_SKIP_ROM , 1 , pind , 4
1wwrite DS_READ_SCRATCHPAD , 1 , PinD , 4
BusData(1) = 1wread(9 , PinD , 4) ' 9 Datenbyte ins Array laden
Waitms 800
1wreset pind , 4
1wwrite DS_SKIP_ROM , 1 , pind , 4
1wwrite DS_CONVERT , 1 , pind , 4

' Temperatur aus Array BusData lesen und umrechnen
Temperatur=DSTemp/2

Das Programm ist auf einen einzelnen Sensor am Bus ausgelegt (Skip Rom). Das kannste aber umschreiben für deine Zwecke.

Mitch.

stekolos
28.12.2009, 21:46
Hallo zusammen,

nach längerem melde ich wieder zurück.
Ich habe den Code von Mitch64 getestet, leider geht es nicht.

Ich benutze das AVRFunk Board von Pollin mit einem Mega8 und Bascom.

Weiter habe ich den Temperatursensor DS18S20+ an PortB4 über die parasitäre Stromversorgung angeschlossen. (direkte Versugrung geht leider auch nicht)

Meine Fragen: Laut Datenblatt muss ich dem 1Wire Bus mitteilen wie die Stromversorgung erfolgt. Wie kann ich das machen?

Kann ich den 1Wire Bus an einem beliebigen PIN des Mega8 machen?
Hat jemand das Pollin Board mit dem DS18S20+ im Einsatz?

Muss der exterene Quartz einen bestimmten Wert haben? Derzeit habe ich einen 12MHz drin.

Der Sensor wurde auch nicht mit dem Code gefunden:
http://www.rn-wissen.de/index.php/Bascom_und_1-Wire#SerienNr_aller_Ger.C3.A4te

Ich verzweifle langsam, aber ich denke es muss eine rationale Lösung geben.

Für eure Ideen schon mal besten Dank.

Gruß SteKoLos

Mitch64
28.12.2009, 22:46
Hallo SteKoLos,

Beim 1Wire-Bus muss das Timing stimmen. Du kannst da nicht einfach irgend ein Quarz rein drücken nach belieben.

Du must unbedingt in den Fusebits den externen Quarz einstellen. Und in deinem Code muss dann auch der 12MHz angegeben werden ($Crystal=12000000), sonst wird das nichts.

Wenn das nicht stimmt, geht natürlich nichts. Den Temperatursensor kannste im Prinzip an jeden Pin hängen, allerdings muss das im Source dann auch so konfiguriert bzw. angepasst werden.

Vielleich postest du mal deinen Code. Dann kann man dir bestimmt besser helfen.

Mitch.

stekolos
28.12.2009, 23:20
Hallo Mitch,

das dachte ich mir eben, ich habe gerade im Netz gesucht.

Kannst du mir sagen wie ich die Fusebits einstellen muß?
Ich benutze Bascom und PonyProg. Ich habe gelesen, dass das mit den FuseBits nicht ganz ohne Gefahr verbunden ist. Ich kenne mich damit leider noch garnicht aus. Bin eben neu in der Materie.

Gruß
SteKoLos

Mitch64
28.12.2009, 23:40
Ich stelle die Fuses immer mit Bascom ein. Mit Poniprog geht das auch, aber ich kenne das Teil zu wenig.

Ich vermute einfach mal, dass dein Atmega mit 1MHz internem Takt läuft. Du kannst ja mal spaßeshalber im Code den Wert von $Crystal auf 1000000 einstellen, compilieren und Proggen. Wenns dann geht, liegt es an den Fuses.

Hab da etwas gefunden, was dir weiter helfen sollte:http://wiki.ctbot.de/index.php/Ponyprog

Soweit ich das auf die schnelle Blicke musst du die Fuses CKSEL3 bis CKSEL0 einstellen. Wenn du mit Bascom Flashen kannst, kann ich dir besser weiter helfen.

Bascom zeigt mir an, beim ATmega8, wenn ich den auf externes Quarz schalten würde, dass die Einstellung SUT=11 und CKSEL=1111 in Ordnung wäre. Diese Bits setzen. Ob ein gesetztes Häkchen=1 entspricht muste noch raus bekommen.

stekolos
21.01.2010, 20:19
Hallo zusammen,

ich habe folgende Konfiguration der Fuse Bits:
(in PonyProg)
BOOTSZ1
BOOTSZ0
SUT0
CKSEL3
CKSEL2
CKSEL1
Häcken drin, was beutet: BIT = 0
Bei den Andern FuseBits ist nichts aktiviert was BIT =1 bedeutet.

An meinem Pollin Board habe ich ein zweizeiliges LCD dran, diese funktioniert auch.
Ich habe verwende den internen Quarz, hoffe ich jedenfalls.

Nach dem ich jetzt das Programm (siehe unten) hochgeladen habe, erhalte ich auch die Seriennummern der Sensoren.
Wenn ich einen Sensor abklemme erhalte ich auch die Fehlermeldung, das der entsprechende Sensor nicht am Bus ist.

Leider erhalte ich nur irgendwelche Werte als Min, MAX und aktuelle Temperatur.
Kann es sein, dass der Code mit der Umwandlung der 9 Bits falsch ist?
oder muss ich einen speziellen Quarz verwenden?
Im Anhang ist die LCD Ausgabe.
Das Beispiel ist von dem BASCOM Hersteller MCS.


Folgenden Code habe ich drin:


$regfile "m8def.dat"
$crystal = 1000000

Declare Sub Init
Declare Sub Convallt ' Convert T on ALL sensors
Declare Function Decigrades(byval Sc(9) As Byte) As Integer


Config Lcd = 16 * 2 'wir verwenden ein 16*2 Zeichen Display
' Im I/O Mode wird jeder Prozessor Pin einzeln angegeben
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portd.5 , Rs = Portd.6

Cursor Off Noblink

Config 1wire = Portd.4 '0,1,2 NOP 3,4,5,6,7 works good ON MY Equipment

'Temp variables
Dim B As Byte
Dim W As Word

'Program variables
'Implicit Err created by compiler
Dim Dg As Integer 'DECIgrades, I call it, cause I have no space for commas on the display....
Dim Min1 As Integer
Dim Min2 As Integer
Dim Max1 As Integer
Dim Max2 As Integer

Dim Dsid1(8) As Byte 'Dallas ID 64 bits incl CRC
Dim Dsid2(8) As Byte
'When used like this : DsId(1) = 1wread(8)
'DsId(1) = family code 'Ds1820 10h, DS18B20 28h, Ds18s20 10h
'DsId(2) '48 Bits Serial, LSB
'DsId(3)
'DsId(4)
'DsId(5)
'DsId(6)
'DsId(7) '48 Bits Serial, MSB
'DsId(8) '8 CRC

Dim Sc(9) As Byte
'Scratchpad 0-8 72 bits incl CRC, explanations for DS18b20
'Sc(1) 'Temperature LSB
'Sc(2) 'Temperature MSB
'Sc(3) 'TH/user byte 1 also SRAM
'Sc(4) 'TL/user byte 2 also SRAM
'Sc(5) 'config also SRAM x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care
'Sc(6) 'res
'Sc(7) 'res
'Sc(8) 'res
'Sc(9) '8 CRC

'DALLAS DS18B20 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite....
'&H 33 read rom - single sensor
'&H 55 match rom, followed by 64 bits
'&H CC skip rom
'&H EC alarm search - ongoining alarm >TH <TL
'&H BE read scratchpad
'&H 44 convert T

Cls

Lcd "This is a 2sensor DS18B20 thermometer"
Locate 2 , 1
Lcd " by gote@sys-op.com"

For B = 1 To 20
Shiftlcd Left
Waitms 250
Next

Cls
W = 1wirecount()

' Here I assume 2 sensors - no errorcontrol made, but would be easy to do with the "Err"-variable
' Getting the two sensors IDs.
Dsid1(1) = 1wsearchfirst()
Do
Dsid2(1) = 1wsearchnext()
Loop Until Err = 1

' If displayed, everything went well.
' First sensor identified and stored in variable
If Dsid1(8) = Crc8(dsid1(1) , 7) Then ' Control that the received CRC match the calculated
Locate 1 , 1
Lcd "CRC OK Sensor 1 ID"
Wait 1
Locate 1 , 1
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If

' Second sensor
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Locate 2 , 1
Lcd "CRC OK Sensor 2 ID"
Wait 1
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
Wait 1
Cls

Init

' Main loop
Do
Convallt ' "Convert ALL T on the 1w-bus"
Waitms 800 'if you use 2-wire, could be reduced to 200us

1wverify Dsid1(1) 'Issues the "Match ROM "
Locate 1 , 1
If Err = 1 Then
Lcd "Err " 'Err = 1 if something is wrong
Elseif Err = 0 Then 'lcd " Sensor found"
1wwrite &HBE
Sc(1) = 1wread(9) 'read bytes into array
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
If Min1 > Dg Then Min1 = Dg
If Max1 < Dg Then Max1 = Dg
Lcd Dg : Locate 1 , 7 : Lcd Min1 : Locate 1 , 14 : Lcd Max1
End If
End If

1wverify Dsid2(1)
Locate 2 , 1
If Err = 1 Then
Lcd "DsId2 not on bus "
Elseif Err = 0 Then ' lcd " Sensor found "
1wwrite &HBE
Sc(1) = 1wread(9)
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
If Min2 > Dg Then Min2 = Dg
If Max2 < Dg Then Max2 = Dg
Lcd Dg : Locate 2 , 7 : Lcd Min2 : Locate 2 , 14 : Lcd Max2
End If
End If
Wait 1
Loop
End 'end program

'Sets variables and LCD for further use'''''''''''''''''''''''''''''''''''''''''
Sub Init
Cls
Lcd " Min Max"
Locate 2 , 1
Lcd " Min Max"
Min1 = 999 ' to get a real value from start
Min2 = 999
End Sub

'Makes the Dallas "Convert T" command on the 1w-bus configured in "Config 1wire = Portb. "
'WAIT 200-750 ms after issued, internal conversion time for the sensor''''''''''
'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously
'When leaving this sub, NO sensor is selected, but ALL sensors has the actual
'temperature in their scratchpad ( within 750 ms )
Sub Convallt
1wreset ' reset the bus
1wwrite &HCC ' skip rom
1wwrite &H44 ' Convert T
End Sub

'Makes a integer value of the first two bytes in scratchpad'''''''''''''
'Works on DS18 B 20 , observe "B". The R0 and R1 in Sc(5) tells you how many bits are accurate


Function Decigrades(byval Sc(9) As Byte)
Decigrades = 0
Decigrades = Makeint(sc(1) , Sc(2))
Decigrades = Decigrades * 10
Decigrades = Decigrades / 16
End Function

' If you have DS1820 or DS18 S 20 , you can use this algo instead:
' Observe that DsId1(1) contains the info value of which sensor is used.

'(
Function Decigrades(byval Sc(9) As Byte)
Dim Tmp As Byte , T As Integer , T1 As Integer

Tmp = Sc(1) And 1 ' 0.1C precision
If Tmp = 1 Then Decr Sc(1)
T = Makeint(sc(1) , Sc(2))
'Print Hex(t)
'Print T
T = T * 50 'here we calculate the 1/10 precision like
T = T - 25 'DS18S20 data sheet
T1 = Sc(8) - Sc(7)
T1 = T1 * 100
T1 = T1 / Sc(8)
T = T + T1
Decigrades = T / 10
'As integer, this routine gives T*10, with 1/10 degree precision
End Function
')

[/code]

Mitch64
21.01.2010, 20:53
Hallo,

du machst aber ne komische Umrechnung.
Da braucht man doch garnix viel rechnen.

Definier doch einfach eine Integervariable als Overlay auf die Arrayadresse. Das ist viel bequemer.

Du hast ja dein Array so definiert:
Dim Sc(9) as Byte

Wenn die Daten eingelesen sind, ist der Temperaturwert in Sc(1) und Sc(2) und zwar in der Reihenfolge Lowbyte dann Highbyte.

Definier eine Variable z.B.

Dim TemperaturInteger as Integer at Sc(1) overlay

und eine Single-variable für den Realwert.

Dim Temperatur as Single

Dann die Variable lesen und du hast fast den Temperaturwert. Noch durch 2 Teilen bei Auflösung 0,5°C oder durch 10 bei Auflösung 0,1°C.

Temperatur=TemperaturInteger/2 ' in °C mit Kommastelle

Das sollte bei allen DS18xxx funktionieren.

Mitch

stekolos
21.01.2010, 21:34
Hallo Mitch,

ich habe jetzt nach dem
' Main loop
Do
Convallt ' "Convert ALL T on the 1w-bus"
Waitms 1000
'if you use 2-wire, could be reduced to 200us

Die 1000 Ms eingebaut, jetzt kommem 169 bzw. 170 am LCD an.
Hab leider kein Termometer zur hand, aber das könnte doch 16,9 Grad heissen. (Ich hab die Heizung im Bastelzimmer aus 8=) )
Werde mir morgen mal analoges Termometer besorgen und mich wieder melden.
Dein Tipp werde ich ebenfalls noch testen.
Danke für deine sehr schnelle Antwort.

stekolos
25.01.2010, 12:28
Hallo Leute,
ich habe es jetzt tatsächlich hinbekommen.
Mit dem Code den ich oben gepostet habe.
Die Temperatur wird als Integer (Ganzzahl) angezeigt:
zum Beispiel 169 ist 16.9 °C

Danke für eure Antworten.
Als nächstes möchte ich eine DCF77 Uhr von Pollin (DCF1) anschließen.

Habe hierzu schon im Forum gesucht.
Mal schauen ob ich das auch hinbekomme. 8=)

Gruß
SteKoLos

stefan_Z
25.01.2010, 15:53
DCF77 geht eigentlich sehr gut und komfortabel mit den eingebauten Routinen.
Welches Modul nutzt du? Das von Conrad geht sehr gut, das von Pollin braucht nen Schmitt-Trigger weil der Ausgang rauscht wie irre. Auch hat es meiner Erfahrung nach ein Invertiertes Signal - kann man in Bascom konfigurieren.

Am besten erstmal die reine DCF77-Routine einbauen und sehen ob das Signal kommt.

stekolos
25.01.2010, 16:13
Hi
ich verwende das Pollin DCF1 und es kommt in der Tat nichts an.
was für einen Schmitt Trigger kann ich verwenden?

stefan_Z
25.01.2010, 16:19
Meiner ist ein LM314 mit zwei Widerständen. Halt ganz Einfach, reicht aus um den Mist zu filtern.

stekolos
28.01.2010, 23:23
Hi,

das Pollin DCF1 hat ja eine Betriebsspannung von 3 V ist das korrekt?
Kann ich den Schmitt Trigger auch durch Transistoren irgendwie ersetzen?

Gruß
SteKoLos

stefan_Z
28.01.2010, 23:42
och, sehs auch grad erst :-)
Tats aber auch immer mit 5V bei mir...

stekolos
28.01.2010, 23:50
Kann ich mit einer alternativen Schaltung das dcf1 an den microkontroller anschalten? Ich Jan leider kein Schmitt Triger zur Hand. Wie sieht denn deine Schaltung mit Schmitt Trigger aus? Brauch ich noch mehr Bauteile?

stekolos
14.02.2010, 18:19
Hi Stefan_Z,

ich habe mir jetzt einen UA741CN besorgt.
Der soll gleich sein wie dein LM314.
Wie muss ich den jetzt verdrahten?
Ich glaub ich kappier das nicht?

Gruß
SteKoLos

stekolos
15.02.2010, 21:03
Hallo zusammen,

ich habe jetzt das DCF1 Modul von Pollin manuell zum laufen gebracht:
1.) ich habe 5 Volt und GND angeschlossen.
2.) PON auf GND angeschlossen
3.) Spannungsversorgung mit 5 Volt angeschlossen.
4,) nach ca. 10 Sekunden PON von GND getrennt.
5.) per Osszi DATA geprüft, siehe da es kommen saubere Implue zwischen 0,3 Volt und 5Volt
6.) DATA auf PORT2 gelegt, DATA keine Impluse ca 0,3 Volt????


Wie muss ich den UA741cn verdrahten?

Grüße
SteKoLos

for_ro
15.02.2010, 21:29
Was meinst du mit "Port2"?

Hast du den Pin vielleicht als Ausgang und auf Low gesetzt?

stekolos
15.02.2010, 21:42
Ich habe folgende Code:
$regfile "m8def.dat"
$crystal = 1000000

Config Dcf77 = Pind.2 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
'Config Date = Dmy , Separator = .
Reset Portd.2
'Config Dcf77 = Pind.2 , Timer = 1 ,
Config Date = Dmy , Separator = .

Config Lcd = 16 * 2 'wir verwenden ein 16*2 Zeichen Display
' Im I/O Mode wird jeder Prozessor Pin einzeln angegeben
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portd.5 , Rs = Portd.6

Dcfpon Alias Portd.3
Config Dcfpon = Output
Set Dcfpon

Set Dcfpon
Reset Dcfpon

Enable Interrupts


Do


Waitms 1000

Locate 1, 1
'intern
Lcd Time$ ; " " ; Date$ ; " "
Locate 2, 1
'DCF:
Lcd Time(dcf_sec) ; " " ; Date(dcf_day) ; " "



Loop

End

'optional, is called every second by the library
Sectic:

'If Dcf_status.7 = 0 Then
' Locate 2 , 1
' Lcd "synchronisiere"
' Wait 2
'End If

Return

da ist doch Port2 der DCF Eingang oder?

for_ro
15.02.2010, 21:56
Hallo SteKoLos,
der benutzte Pin dort ist PortD.2 oder besser gesagt, PinD.2. Port2 gibt es nicht.

Im Programm sehe ich jedenfalls keinen Grund hierfür


5.) per Osszi DATA geprüft, siehe da es kommen saubere Implue zwischen 0,3 Volt und 5Volt
6.) DATA auf PORT2 gelegt, DATA keine Impluse ca 0,3 Volt????

was ich so interpretiere, dass die Ausgangsspannung von deinem DCF-Modul zusammenbricht, wenn du es den µC anschließt.
Die Eingänge sind sehr hochohmig, sodass ich nicht glaube, dass das Modul die nicht treiben könnte. Daher denke ich, dass der Fehler irgendwo anders ist.
Kannst du mal ein simpel Programm laden, welches nur den PinD.2 einliest und den Zustand an einem anderen Pin wieder ausgibt, am besten mit einer LED dran.

stekolos
15.02.2010, 22:00
Hi PortD2 ist aber schon PINnr 4?

for_ro
15.02.2010, 22:12
Hi PortD2 ist aber schon PINnr 4?
Klar.
Was du der Einfachheit halber auch mal machen kannst, ist den µC nur zu löschen. Dann mit dem Oszi überprüfen, ob das Signal einknickt.