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 ----------------------------------------
Hi, kennst du nur die Befehle setb und clr? ;o) Also tut mir leid da steige ich nicht mehr durch! mfg
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.
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 :-(
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
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.
der 1820 hat doch aber einen 1-Wire Bus und der 1620 einen 3-Wire... ?!
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
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
ok das alles muss ich erstmal verdauen... :-) mal sehen, ob ich's hinbekomme. halte euch auf dem Laufenden...
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.
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
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
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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.