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.
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.
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.
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
...
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.
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?
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.
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:(
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.
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.
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.
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
> 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?
> 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.
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?