Hi, ich benutze ein Atmel Evaluationboard V2.0, mit einem ATmega16 (8 MHz Quarz) und einem 1-wire-Tempsensor (DS1820). Header für temp sensor: #asm .equ __w1_port=0x18 .equ __w1_bit=0 #endasm #include<ds1820.h> jetzt habe ich zur Probe den C-Code aus dem CodeVisionAVR-Manual geschrieben. Der Tempsenor wird auch erkannt, doch in dem CodeVision-Termial ( über RS232 ) wird mir immer der gleiche Wert angezeigt: 1023.5 folgender C-Code wird zur Ausgabe benutzt: while(1) { for(i=0;i<devices;) { temp=ds1820_temperature_10(&rom_code[i][0]); j='+'; if(temp<0) { j='-'; temp=-temp; } printf("t%u=%c%i.%u\n\r",++i,j,temp/10,temp%10); } } WARUM ändert sich der Wert nicht, bei unterschiedlichen Temperaturen?? Kann mir bitte jemand helfen.
Sorry, aber die 1023 geben mit schon zu denken. Denke mal selber drüber nach ;-)
hi, wäre es möglich, dass ich vergessen habe irgendetwas zu initialisieren. Oder ist mein Tempsenor defekt, ich meine wenn ich ein Feuerzeug 20 cm 5 sekunden drunter halte, müsste sich doch was ändern.
Kleiner Tip: 1023,5 schreibt sich binär als 1111111111.1.
in dem CodeVisionAVR Manual soll UCR=8 sein, bei mir ist es UCSRB=0x08. sollte das gleiche sein. ABER UBRR=xtal/16/baud-1 Bei mir: UBRRL=0x33; dient aber nur zur Übertragung mit RS232, oder? wenn ich diese weg lasse, kommt auch nichts mehr am terminal an. Die baud Rate hat doch nichts mit der one-wire Datenübertragung des DS1820 zu tun?!?
Verstehe den Tip nicht, trotzdem danke für die Mühe. Ich meine, mir schon klar, dass der maximalwert angezeigt wird, also das der tempsenor den maximalwert ausgibt, ich weiss aber nicht warum, es wäre mir lieber, wenn er temperaturabhängige werte liefern würde:)
Er liefert offensichtlich überhaupt keinen Wert (offener Eingang = 1). Die 1-Wire Routinen funktionieren nicht oder werden falsch verwendet. Mehr lässt mangels Code nicht sagen.
hier, wenn du kurz zeit hast könntest du ja mal drüber sehen, ist nicht viel text. vielen dank
wenn ich resete, erscheint auf dem terminal von codvision avr: 1 DEVICE(S) DETECTED // also findet er den Sensor doch t1=+1023.5C t1=+1023.5C t1=+1023.5C ...
Habe das Board so gekauft, Pull-up-R sagt mir nichts, bin eher anfänger
Ja ja, 4,7K Pullup-Resistor, sollte richtig angeschlossen sein
Lt. Datenblatt gehört der 1WireBus mit einem 4k7-PullUp-Widerstand auf Versorgung gezogen...aber das wird fertig gekauft doch wohl eh schon gemacht sein...weiß nicht, habe mit den EvalBoards bzw. 1Wire bzw. dem DS1820 noch nichts gemacht. Nachtrag: uups, zu langsam, aber wenn die Hardware passt, kann's nur an der Software liegen.
Könnte es sein, dass es sich um einen DS18B20 oder DS18S20 handelt, und das da der Hund begraben liegt?
Tja - ist der Originalcode aus dem Handbuch. Der kurioserweise die eigene Initialisierung vergisst (w1_init, überflüssig?). Kannst mal probieren, ob bei ...read_spd was anderes als Einsen rauskommt. Und mal die Variante ohne Adressierung, also nur 1 DS18x20 dran und mit addr=NULL probieren. Taktfrequenz korrekt dem Compiler/Projekt mitgeteilt?
Hab jetzt <ds18b20.h> und ds18b20_temperature(...) ersetzt. jetzt liefert er mir t1=+12.7C reagiert aber immer noch nicht auf wärme
Taktfrequenz stimmt, den Mittelteil hab ich zwar nicht verstanden, aber an init hab ich auch schon gedacht, weiß aber nicht was ich in die klammern schreiben muss
Ach ja: Wie lautet denn die ID? Wenn die auch bloss aus Einsen besteht... Erstes Byte muss 0x10 (DS18S20) oder 0x28 (DS18B20) sein, sonst schon hier Mist.
> weiß aber nicht was ich in die klammern schreiben muss
Welche Klammern?
Wenn die Funktionen vom CV etwas taugen kann's die Hardware nicht sein, denn jede auch nur halbwegs nützliche 1W-Lib merkt es, wenn sich am Bus nichts rührt.
die funktion, heisst doch unsigned char init(void); da muss ich doch nen wert mitschicken, so wie bei lcd: lcd_init(16) z.B. Wo kann ich die ID nachschauen, oder ändern?
Bin mir aber auch ziemlich sicher, dass ich die init nicht bruche, habs trotzdem versucht, ohne wert, ohne klammern, hat nichts gebracht:(
Ha, ist das geil, versteh echt kein Wort, aber willst mir damit sagen, das alles richtig angschlossen ist, und der sensor nicht defekt ist?
> Bin mir aber auch ziemlich sicher, dass ich die init nicht bruche, habs > trotzdem versucht, ohne wert, ohne klammern, hat nichts gebracht:( Wenn du verzweifelt danach suchst, was für einen Wert ein Parameter vom Typ "void" wohl erwartet, und als Ausweg die Klammern ganz weglässt, dann möchte ich dringend empfehlen, erst einmal nähere Bekanntschaft mit der Sprache C zu schliessen.
Was hat das zu bedeuten, dass ich mit #include<18b20> und der entsprchend veränderten ausgabefunktion-> 18b20_temperature den Wert 27,5 bekomme?
Ja du meintest doch, dass da keine klammern hingehören, oder keine sind, ich bin davon ausgegangen, dass man das bei included files nachschauen kann. Wie gesagt Anfänger.
Ich wollte wissen, welche Klammer du meinst, weil mit die Frage komisch vorkam. Aber mit deiner Antwort kam raus dass du - erstens nicht weisst, dass (void) in diesem Kontext für Funktionen ohne Parameter steht, - zweitens eine Funktion ohne Klammern kein Aufruf sondern eine Adresse darstellt. Letzteres muss man als Anfänger noch nicht unbedingt wissen, aber ersteres deutet an, dass dies deine ersten Zeilen C waren, mehr oder weniger ohne Verständnis der Bedeutung abgetippt.
Nein, als ich meinte, dass in die klammern ein wert kommt, wusste ich nicht genau, wie die fkt in der included file genau ausieht, dachte nur direkt an das lcd_init bsp., da ich die init fkt schon gesehen hatte, und die klammern noch im kopf hatte, aber nicht mehr den inhalt. nachdem ich nachgeschaut hatte, und die fkt gepostet hatte, habe ich es versucht mit leeren klammer, so wie ich dachte, wie ich es von lcd_ready() kenne z.B. und so wie du meintest( was ja wohl ein missverständnis war) ohne klammern. in der tat, das 2. wusste ich nicht. bin auch wirklich anfänger, aber habe schon einige c-programme geschrieben, nur nicht viel mikrocontroller programmiert.
ich möchte ja noch mehr machen, habe bereits über das drehpoti und den ADW aktiviert und lese werte ein, die mittels interrupt (Timer) auf lcd ausgebe, aber zusätzlich will ich noch den angeschlossenen Tempsenor abrufen, und das klappt nit. ja den Text dazu hab ich einfach abgetippt, weil ich erstmal sehen wollte ob es klappt. Deshalb dieses kleine programm.
ich dachte der wird mit w1_port=0x18 und w1_bit=0x00 angesteuert?
> vor allem die ID von was? dem DS1820?
Ebendie. Der Inhalt der 9 Bytes an rom_code[0]. Nach dem 1w_search.
moment, kann ich mir doch übers terminal anzeigen lassen, oder, versuche es mal
An rom_code[0] steht 9 Bytes (chars). Die ersten davon sind die ID vom DS1820, das letzte davon ist was anderes. Soweit zitiere ich bloss das Manual vom CV. Und diese 9 Bytes solltest du mal ausgeben. Und zwar besser gleich in hex. Wenn du mit dieser Aufgabenstellung überfordert bist, dann habe ich wieder den Tip, erst einmal C zu lernen. Was auf dem PC einfacher ist als auf dem Controller.
printf("%-u",rom_code[0][0]); printf("%-u",rom_code[0][1]); printf("%-u",rom_code[0][2]); printf("%-u",rom_code[0][3]); printf("%-u",rom_code[0][4]); printf("%-u",rom_code[0][5]); printf("%-u",rom_code[0][6]); printf("%-u",rom_code[0][7]); printf("%-u",rom_code[0][8]); wenn ich das eingebe, kommt folgendes raus: 40552102250001091 wenndir das zu primitiv ist, dann trotzdem danke für die mühe, ich weiß nicht wie man HEX zahlen ausgibt, für das was ich vorhabe, brauche es ja auch nicht. sondern nur zum überprüfen der ID.
mit printf("0x%x\n",rom_code[0][0]); printf("0x%x\n",rom_code[0][1]); printf("0x%x\n",rom_code[0][2]); printf("0x%x\n",rom_code[0][3]); printf("0x%x\n",rom_code[0][4]); printf("0x%x\n",rom_code[0][5]); printf("0x%x\n",rom_code[0][6]); printf("0x%x\n",rom_code[0][7]); printf("0x%x\n",rom_code[0][8]); 9 0x28 0x37 0xd2 0xe1 0x00 0x00 0x00 0x6d 1 0x10
Ok, das heisst soweit scheint es zu stimmen. Für den Rest ist die Lib-Routine zuständig, gefüttert wird sie korrekt.
Hast du mal was von der Phantomspeisungsmodus gehört? muss ich evtl Taktfrequenz modifizieren, hab irgendwo gelsen, dass DS1820 mit 6 oder 12 MHz läuft
aber erstmal danke, dass du dich meiner nochmal angenommen hast, obwohl ich son noob bin.
> Hast du mal was von der Phantomspeisungsmodus gehört? Yep, das wirft die Frage auf, wie der DS genau angeschlossen ist, 3-polig oder 2-polig? Ohne separates VCC kann er alles ausser Temperatur messen, da geht ihm der Saft aus wenn die Software eine parasitäre Versorgung nicht berücksichtigt. > muss ich evtl Taktfrequenz modifizieren, hab irgendwo gelsen, dass > DS1820 mit 6 oder 12 MHz läuft Der DS18x20 hat keine extern irgendwie relevante Taktfrequenz. Wohl aber hat ein ein Timing, an dass sich der Controller halten muss. Wie das geht steht im Manual vom CVAVR. Wenn der Controller auf 16MHz läuft, die Lib aber der Ansicht ist er liefe auf 8MHz, dann ist alles offen.
ich habe kein avrwizard benutzt, wenn ich jetzt darauf gehe, steht da unter 1-wire none, brauche ich das, oder stellt sich das automatisch ein, durch #asm 1w_portb=0x18; ... ??
er liegt genau wie display und drehpoti auf VCC, ein anschluss ist auf GND, und ein anschluss ist auf pin 9 glötet, der wiederum führt dann zum PortB0. kann ich irgendwo sehen, mit welcher frequenz er arbeiten möchte?
Wirst wohl mal probieren müssen. Ich selber benutze den CVAVR nicht.
oder mit welcher freuqenz er denkt, dass der controller getaktet ist?
> kann ich irgendwo sehen, mit welcher frequenz er arbeiten möchte?
Das Handbuch schreibt auf S.157 (ca Mitte) wie man dem Projekt die
Taktfrequenz des Controllers beibringt. Daraus leitet die Lib
offensichtlich das 1-Wire Timing ab.
an dem wizard liegts nicht. auf seite 157 steht bei mir was anderes, haste auch die 211 seiten version?
aber die clock frequenz gebe ich ja unter settings ganz am anfang ein, dann wird die lib doch wissen, womit ich arbeite, es kann nur sein, dass der sensor mit der frequnz nicht arbeiten kann, sodass ich runtertakten muss, aber meintest ja, dass das nicht so ist. also bleibt dieser phantomspeisungsmodus..
Der Sensor hat keine Frequenz, kriegt keine Frequenz und braucht keine Frequenz. Das einzige was er braucht, ist ein korrekter Zeitablauf beim Zugriff. Die "Phantomspeisung" heisst offiziell parasitäre Stromversorgung und meint den Modus, indem der DS ohne VCC Pin betrieben wird. Da zieht er den Strom aus der Datenleitung und es gelten während der Messung besondere Reglen. Wenn der Sensor mit VCC betrieben wird, ist das nicht relevant.
ja gut, wenn ich bei codevision die frequenz einstelle, nimmt sch die lib ja sicher daher ide info. wenn die phantomspeisung nicht in frage kommt, fällt dir sonst noch was ein?
Wie schon gesagt: Nein. Rest => Leute die mit CV arbeiten.
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.