Forum: Mikrocontroller und Digitale Elektronik habe auch Probs mit DS1620


von Rick Dangerous (Gast)


Lesenswert?

Habe die Suchfunktion schon genutzt, aber konnte mein Problem trotzdem
nicht lösen.
Ich kann den Temperatur-Sensor einfach nicht auslesen, bzw. bekomme nur
Nullen zurück. Würde gerne wissen wollen, ob ich da komplett was falsch
gemacht habe, oder ob die Initialisierung nicht stimmt.
Ich progge in Assembler, also bitte keine Lösungen in C anbieten, kann
damit leider nichts anfangen :-(
Habe mal alles nach der Holzhammermethode geproggt, hoffe ihr könnt mir
helfen.
So sieht meine Initialisierung vom DS1620 aus (wird nur 1mal beim
Programmstart ausgeführt):
------------
    setb p1.0    ;clk high
    setb p1.1    ;rst high

    clr p1.2    ;dq 0
    clr p1.0    ;clk low
    setb p1.0    ;clk high
    clr p1.0    ;clk low ->> "00" auf dq ausgegeben

    setb p1.2    ;dq 1
    setb p1.0    ;clk high
    clr p1.0    ;clk low
    setb p1.0    ;clk high
    clr p1.0    ;clk low ->> "11" auf dq ausgegeben

    clr p1.2    ;dq 0
    setb p1.0    ;clk high
    clr p1.0    ;clk low
    setb p1.0    ;clk high
    clr p1.0    ;clk low
    setb p1.0    ;clk high
    clr p1.0    ;clk low
    setb p1.0    ;clk high
    clr p1.0    ;clk low ->> "0000" auf dq ausgegeben ->> write config
;----------------------------------
    call zeit2    ;"warten"

    clr p1.2    ;00000010->Ausgabe
    setb p1.0
    clr p1.0

    setb p1.2
    setb p1.0
    clr p1.0

    clr p1.2
    setb p1.0
    clr p1.0
    setb p1.0
    clr p1.0
    setb p1.0
    clr p1.0
    setb p1.0
    clr p1.0
    setb p1.0
    clr p1.0
    setb p1.0
    clr p1.0
    clr p1.1    ;rst low

    call zeit2

    setb p1.1    ;rst high
    setb p1.0    ;clk high
    setb p1.1    ;rst high

    clr p1.2    ;dq 0
    clr p1.0    ;clk low

    setb p1.2    ;dq 1
    setb p1.0    ;clk high
    clr p1.0    ;clk low
    setb p1.0    ;clk high
    clr p1.0    ;clk low
    setb p1.0    ;clk high
    clr p1.0    ;clk low ->> "111" auf dq ausgegeben

    clr p1.2    ;dq 0
    clr p1.0    ;clk low

    setb p1.2    ;dq 0
    setb p1.0    ;clk high
    clr p1.0    ;clk low
    setb p1.0    ;clk high
    clr p1.0    ;clk low
    setb p1.0    ;clk high
    clr p1.0    ;clk low ->> "0000" auf dq ausgegeben ->> write config
    clr p1.1    ;rst low
------------------------------
Und so sieht meine Routine aus, zum regelmäßigen Auslesen des Sensors:
temp_lesen:  mov temperatur1, #0h
    setb p1.0
    setb p1.1

    clr p1.2
    clr p1.0
    setb p1.0

    setb p1.2
    clr p1.0
    setb p1.0

    clr p1.2
    clr p1.0
    setb p1.0

    setb p1.2
    clr p1.0
    setb p1.0

    clr p1.2
    clr p1.0
    setb p1.0

    setb p1.2
    clr p1.0
    setb p1.0

    clr p1.2
    clr p1.0
    setb p1.0

    setb p1.2
    clr p1.0
    setb p1.0

    call zeit2

    mov p1, #7

read_temp:  mov a, p1
    anl a, #4

    cjne a, #4, null_grad
ein_grad:    setb c
    jmp grad_shiften

null_grad:  clr c
    jmp grad_shiften

grad_shiften:  mov a, temperatur1
    rlc a
    mov temperatur1, a
    setb p1.0
    clr p1.0
    inc bit_stelle2
    mov a, bit_stelle2
    cjne a, #8, read_temp
    setb p1.0
    clr p1.0

    mov a, p1
    anl a, #4
    cjne a, #4, kein_vorzeichen
    mov vorzeichen, #1
    clr p1.1
    ret
kein_vorzeichen:  mov vorzeichen, #0
    clr p1.1
    ret
----------------------------------------

von Michi (Gast)


Lesenswert?

Hi,
kennst du nur die Befehle setb und clr? ;o)
Also tut mir leid da steige ich nicht mehr durch!
mfg

von Beeblebrox (Gast)


Lesenswert?

Ich habe auch mal so einen 1-Wire Temperatursensor ausgelesen (hiess
glaube ich ds1820 ??) Wie auch immer. Das funktioniert ganz gut, aber
ich habe es auch erst mit Speicheroszilloskop hinbekommen, man muß das
Timing sehr genau beachten, sonst verliert der Sensor seinen Strom und
wird resettet.

von Rick Dangerous (Gast)


Lesenswert?

Michi, habe auch extra "Holzhammer-Methode" geschrieben, weil's
anders nie funktioniert hat. So wollte ich halt jedes Signal einzeln
ausgeben, und beobachten. Nicht mehr durchsteigen? also bitte, so
erkennt man jedes einzelne clocken und ausgeben schritt für schritt.
Ist ja wohl einfacher zu blicken als Sub-Routinen!

Das mit dem Timing hab ich auch schon unter Verdacht, allerdings will
ich erstmal ausschließen, dass es nicht ein dummer Fehler in der
Initialisierung ist.
hüüülfee :-(

von Rick Dangerous (Gast)


Angehängte Dateien:

Lesenswert?

Leute ich bekomme den Müll einfach nicht hin!
Habe mir jetzt die C-Quellcodes aus älteren Beiträgen genommen,
angepasst, aber das Ding will einfach nicht! Ich habe keine Ahnung wo
der Fehler liegt.... :-(
Jetzt sagt aber bitte nicht: 30cm vom Bildschirm entfernt sitzt der
Fehler ! :-))
Habe jetzt mal das neue Programm hochgeladen im Anhang, bitte schaut es
euch mal an. Vielleicht ist da ja einen RIESEN DENKFEHLER, der ganz
einfach zu erkennen ist !!

ich brauch hilfeeeeeee

von Rick Dangerous (Gast)


Angehängte Dateien:

Lesenswert?

und hier die initialisierung

von ToniT (Gast)


Lesenswert?

Hi,

hast Du mal in das Beispiel von www.mikrocontroller.com geschaut ??
Da gibt es beispiel Code für das AVRCtrl Board mit DS1820. Hat bei mir
auf anhieb hingehauen.

von Rick Dangerous (Gast)


Lesenswert?

der 1820 hat doch aber einen 1-Wire Bus und der 1620 einen 3-Wire... ?!

von Michi (Gast)


Lesenswert?

Hi,
So wie ich das aus deinem 2. Quelltext erkennen konnte, Startest und
die Temperatur umwandlung (Start Conversion), dann liest du die
Temperatur und dann stoppst du die umwandlung (Stop conversion) wieder.
Ist das richtig? Im Datenblatt steht: Umwandlung starten, dann stoppen,
dann auslesen! Noch besser wäre es wenn man auf das "DONE" Bit im
Configbyte wartet bevor man ausliest.

Noch was zu deiner "Holzhammer-Methode". Es mag ja ganz einfach
geschrieben sein, aber ein aussenstehender hat wenig lust sich ne
vieltel Stunde mit deinem Quelltext zu beschäftigen, nur damit er
rausfindet welche Bytes du wofür in den Chip reinschiebst. Dazu kommt
noch das niemand weiß was du an P1.0,P1.1... angeschlossen hast! Es
muss auf einen Blick erkannbar sein, was du in jenen Augenblick in den
Chip eingibst bzw ausliest. Dein 2. Quelltest war schon
übersichtlicher! Modulweise programmieren, in unterprogrammen so wie du
es im 2. Quelltext gemachthast, ist immernoch am übersichtlichsten!
mfg
michi

von Markus_8051 (Gast)


Lesenswert?

Hi Rick,

habe selbst noch nicht mit dem DS1620 gearbeitet, nur gerade mal ins
Datenblatt geschaut.

1. Wie schnell läuft Dein µC? Was für einen nimmst Du überhaupt?
Irgendwas 8051-kompatibles, das ist klar. Nun, die sind ja eh recht
langsam und sollten den DS1620 nicht überfordern. Aber trotzdem:
fCLKmax ist 1,75 MHz und die Setupzeiten sollten eingehalten werden.

2. In Deinen ASM-PRGs sind ein paar Bugs drin:
Im ersten:
Die Daten werden vom 1620 mit steigender CLK-Flanke übernommen, nach
deinem Programm müßte es erher die fallende sein. Dadurch verschieb
sich das Datenwort was Du sendest um ein Bit. Der DS1620 empfängt also
0110000x. Damit kann er natürlich nix anfangen.
Im zweiten:
Ich habe mir nur die Routine put1620byte angesehen: hier fehlt das
Rücksetzen der CLK. Hast Du kein Oszi? Damit hätte das eigentlich
auffallen müssen. Außerdem geht es vom LSB zum MSB. Du fängst zwar mit
dem LSB an (and #1) dann folgt aber direkt das MSB (rl acc). Du mußt
aber rechtsrum rotieren. Mit mov-bit Befehlen geht es kürzer und
eleganter:


put1620byte:  setb p1.0    ; CLK High
    setb p1.1    ; RST = HIGH
    mov b, #8               ; Schleifenzähler in b
                mov a, ds1620byte

wordlength:  clr p1.0                ; CLK low
                rrc a                   ; auszugebenes Bit ins Carry
                mov p1.2,c              ; Carry an dq
    setb p1.0               ; CLK high
    djnz b,wordlength
go_back:  ret

Wichtig ist noch, daß der DS1620 zur initialisierung eine positive
RST-Flanke bekommt, während CLK=High. Ist RST auf low, bevor
put1620byte aufgrufen wird, ist das gegeben. Also am besten am Anfang
vom HP ein mov p1,#0

Hoffe das hilft,

viel Spaß beim proggen,

Markus_8051

von Rick Dangerous (Gast)


Lesenswert?

ok das alles muss ich erstmal verdauen... :-)
mal sehen, ob ich's hinbekomme. halte euch auf dem Laufenden...

von Rick Dangerous (Gast)


Angehängte Dateien:

Lesenswert?

habe soweit jetzt alle fehler beseitigt. Da waren auch noch paar mehr
drinne, die konnte ich dann mit dem Oszi sehen.
Habe aber jetzt noch folgendes Problem:
Initialisierung scheint zu gehen, das Oszgi zeigt mir schonmal das
richtige Bild an.
Das senden vom "Start Convert" und "Stop Convert" scheint auch zu
gehen.
Dann kommt der Befehl 0xAAh, der dem DS1620 auch eingeclockt wird und
laut Oszi läuft das auch. Und genau ab diesem Punkt, spielen Clock und
DQ verrückt. Reset bleibt weiterin oben (so sollte es auch sein), aber
es finden keine 8 Clock zyklen statt bis Reset wieder low wird!

Bekomme vom Sensor "1 1000 0000" zurück in meine "temperatur"
Variable. Also das Vorzeichenbit und MSB kommt, aber ist nur Müll.
Der Fehler muss irgendwo in der "get1620byte" Funktion liegen. Bitte
helft mir mal das Teil zum laufen zu kriegen! Ich kotz gleich ab!!!!
:-(

Im Anhang sind nochmal die Funktionen.

von Rick Dangerous (Gast)


Lesenswert?

und nochmal die INIT:

    mov p1, #0    ;| RST, CL, DQ = Low - OUTPUT
    mov ds1620byte, #0Ch
    call put1620byte  ;|->write config

    mov ds1620byte, #03h
    call put1620byte  ;|->set to CPU & 1SHOT
    mov p1, #0    ;| RST, CL, DQ = Low - OUTPUT

von Markus_8051 (Gast)


Lesenswert?

Hi Rick,

Deine Vermutung war richtig, der Fehler liegt in der
get1620byte-Prozedur: Schau mal ins Datenblatt, da ist das
Read-Timing-Diagramm abgedruckt. Während des ganzen Read-Kommandos darf
RST nicht low werden, das passiert aber am Anfang der get16.... mit dem
Befehl mov p1,#2 !!! (müsste für DQ doch eh #4 gewesen sein, oder? na,
dann war aber mein Kommentar wegen RST low falsch?!?) Egal, besser:
setb p1.2

Genauso weiter unten: Mit anl a,#2 liest Du natürlich die RST-Leitung
und nicht die DQ-Leitung aus.Um da nicht durcheinanderzukommen
definiere doch mal oben im Prog
RST   EQU   P1.1
CLK   EQU   P1.0
DQ    EQU   P1.2

Außerdem dachte ich, mit meiner Hilfe in der put-Prozedur könntest Du
die get-Prozedur genauso umschreiben:

;----------------------------------------------------------------------- 
-----------------
;** Funktionen: get1620byte -> liest den Wert von DS1620 in 1620byte
;----------------------------------------------------------------------- 
-----------------

get1620byte:  setb DQ            ;| DQ = HIGH=INPUT
  ;  setb p1.0        ; Sowohl CLK als auch RST
      ;  setb p1.1        ; sollten noch HIGH sein!!!

    mov b, #8
wordlength2:  clr CLK      ;|CLOCK= LOW
    setb CLK    ;|CLOCK= HIGH
    mov c, DQ
                rrc a
    djnz b,wordlength2

vorzeichenbit:  clr CLK      ;|CLOCK= LOW
    setb CLK    ;|CLOCK= HIGH
    mov c, DQ
    mov vorzeichen, c       ; ACHTUNG: vorzeichen ist BIT-Variable
                mov ds1620byte,a
    mov p1, #0    ;|OUTPUT
    ret

Soweit die Fehler, die mir noch aufgefallen sind. Ich muß aber zugeben,
das ist noch keine Erklärung dafür, warum die CLK-Impulse aufhören. Doch
halt, da ist nochwas: cjne a,#7,vorzeichenbit ist der Fehler: a bzw
bit_stelle2 ist nur beim ersten Schleifendurchlauf 7. Danach springt er
immer zu vorzeichenbit. Es wird also nur ein weiterer CLK-Impuls
generiert. Stimmt das mit Deinen Beobachtungen am Oszi überein?

Wenn ja sollte ja jetzt alles laufen.

Gut progg!

Markus_8051

von Rick Dangerous (Gast)


Lesenswert?

juhu es klappt!!!
mußte noch mit dem Oszi noch einen letzten Fehler suchen. Hatte immer
0xFF eingelesen, aber am Ozsci war der richtige Wert zu erkennen. Das
einlesen, nachdem Clock auf High gesetzt wurde war falsch! Ich muss
lesen wenn Clock auf Low ist, also bevor er High wird liegt das Signal
an.
So sieht jetzt die get... Funktion aus:

get1620byte:    setb DQ              ;| DQ = HIGH=INPUT

        mov b, #8
wordlength2:    clr CLK          ;|CLOCK= LOW
    mov c, DQ
    setb CLK        ;|CLOCK= HIGH

                 rrc a
        djnz b,wordlength2

vorzeichenbit:  clr CLK          ;|CLOCK= LOW
    mov c, DQ
    setb CLK        ;|CLOCK= HIGH
    mov vorzeichen, c         ;
                mov ds1620byte,a
        mov p1, #0        ;|OUTPUT
        ret

VIELEN DANK MARKUS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

von Markus_8051 (Gast)


Lesenswert?

Jo, Du hast recht!

Steht auch so im Datenblatt: Spätestens 150ns nach CLK_Low liegen die
Daten an und 50ns nach CLK_High wird DQ hochohmig, sprich der µC liest
ne 1. Wenn der µC schneller wird, muß Du zwischen clr CLK und mov c,DQ
noch etwas warten.

Aber schön, daß es jetzt klappt.

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.