Forum: Mikrocontroller und Digitale Elektronik DS18S20 - STK200 mit 8515 Controller


von Peter K. (chrisstar)


Lesenswert?

Hallo, habe einen DS18S20 Sensor und möchte ihn mit dem Atmel STK 200 
mit einem 8515 Controller über die RS232 ausgeben.

Mein Problem ist, dass am Bildschirm immer 0 Devices detected ausgegeben 
wird. Was darauf zurückzuführen hat, dass kein DS1820 am Bus gefunden 
wurde.

Findet ihr vl einen Fehler im Code oder habe ich den DS1820 falsch 
angeschlossen?

V++... 5V
GND... Masse
DQ.... PortB/0
Zwischen V++ und DQ ist ein Widerstand 4,7k.

Getaktet ist der Controller mit 8MHz.


Bitte um dringenden Rat, weiß einfach nicht mehr weiter!

CODE:

Chip type : ATmega8515
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 128
*****************************************************/

#include <mega8515.h>
#include <delay.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=0
#endasm
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds1820.h>
#define MAX_DEVICES 8

unsigned char rom_code[MAX_DEVICES][9];

// Declare your global variables here

void main(void)
{

unsigned char i,j,devices;
int temp;
w1_init();
UCSRA=0x00; //baud rate...übertragung RS2/32
UCSRB=0x08;

UBRRL=0x33;




devices=w1_search(0xf0,rom_code);
printf("%-u DEVICE(S) DETECTED\n\r",devices);

// 1 Wire Bus initialization
w1_init();

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\xf8C\n\r",++i,j,temp/10,abs(temp%10));
}

};
}



mfg

von Gast (Gast)


Lesenswert?

Codesammlung
Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr 
sie hier posten. Fragen werden gelöscht!

von Karl H. (kbuchegg)


Lesenswert?

verschoben

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Der angegebene Sourcecode ist nicht ausreichend für ein vollständiges 
Programm.

Es fehlen mindestens die Definitionen der Funktionen w1_init(), 
w1_search() und  ds1820_temperature_10(). Das sind genau die Funktionen, 
die etwas mit dem 1Wire, d.h. dem Problem zu tun haben können.

von holger (Gast)


Lesenswert?

1
devices=w1_search(0xf0,rom_code);
2
printf("%-u DEVICE(S) DETECTED\n\r",devices);
3
4
// 1 Wire Bus initialization
5
w1_init();


Also wenn man das w1_init() VOR dem
w1_search() macht, könnte das helfen.

von holger (Gast)


Lesenswert?

>Also wenn man das w1_init() VOR dem
>w1_search() macht, könnte das helfen.

Vergiss es ;) Ganz oben stehts ja nochmal.

von Karl H. (kbuchegg)


Lesenswert?

Raus muss der 2-te Aufruf zwar, aber er hat natürlich nichts damit zu 
tun, dass die search Funktion nichts findet.


Das ist die Krux mit vorgefertigten Libraries: Super einfach in der 
Anwendung, aber wenns was hat, steht man da wie der Ochs vorm Tor.

(Kann man mit dem Debugger in die Funktionen hineinsteppen?)

Rein testweise würde ich mir trotzdem an deiner Stelle den WinAvr auf 
die Maschine holen, die PeDa Routinen aus der Codesammlung mal 
draufspielen. Wenn die auch nicht funktionieren, dann wirds wohl ein 
Hardwareproblem sein.

von Wayne M. (vibra)


Lesenswert?

The primary specification difference between the two parts is the 
temperature conversion time: DS1820 = 500ms (max) and DS18S20 = 750ms 
(max).
timing problem ?
Sind die Fuse Bit's richtig gesetzt - auf 8Mhz !
und und und ?

von Peter K. (Gast)


Lesenswert?

Es fehlen mindestens die Definitionen der Funktionen w1_init(),
w1_search() und  ds1820_temperature_10().

Die sind ja im Code angegeben Stefan!?

devices=w1_search(0xf0,rom_code);
.
.
.
temp=ds1820_temperature_10(&rom_code[i][0]);

von Peter K. (Gast)


Lesenswert?

Wayne du hast die Fuse Bits angesprochen. Kannst du mir vl helfen wie 
ich die richtig setze?

mfg

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Peter K. schrieb:

> Die sind ja im Code angegeben Stefan!?
>
> w1_init();
> devices=w1_search(0xf0,rom_code);
> ...

Der Aufruf der Funktionen ist angegeben, aber nicht, was die Funktionen 
machen (die Definition).

Man kann mit dem derzeitigen Code den Funktionen nicht "auf die Finger 
schauen". Z.B. nachsehen, was der Parameter 0xf0 beim w1_search() macht.

von Peter K. (Gast)


Angehängte Dateien:

Lesenswert?

Habe das im CoedVision gefunden, wo ich sie setzen kann, aber habe 
keinen Plan was ich hier zu tun habe, habe auch schon was gelesen, weiß 
aber nicht weiter...

von Peter K. (Gast)


Lesenswert?

Was muss ich dann machen Stefan, kannst mir hier ein wenig 
programmtechnisch helfen, was ich zutun habe, bzw was im Code fehlt

Danke für die Hilfe!

von Karl H. (kbuchegg)


Lesenswert?

Setz erst mal die Fusebits richtig.
Ansonsten lügst du deinen Compiler nur an, wenn du ihm sagst, dass dein 
µC mit 8Mhz läuft und der tut das gar nicht.

Datenblatt rausholen. Nachsehen wie die CKSEL Bits stehen müssen, damit 
ein "External Crystal" eingestellt ist.

Danach: Kontrollieren (zb. mit einer Warteschleife die eine LED blinken 
lässt), ob der µC auch wirklich mit 8Mhz läuft.

Dann: Nochmal den 1-Wire Code probieren.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:

> Danach: Kontrollieren (zb. mit einer Warteschleife die eine LED blinken
> lässt), ob der µC auch wirklich mit 8Mhz läuft.

Bzw. Nachsehen, ob das Terminalprogramm auf dem PC mit 9600 Baud 
arbeitet, wenn die Meldung "0 DEVICE(S) DETECTED" kommt.

UBRRL=0x33; // 51dez sollte lt. Datenblatt 9600 Baud bei 8 MHz sein

Wenn das Terminalprogramm bei 1200 Baud richtig arbeitet, sind keine 8 
MHz aktiv sondern nur 1 MHz.

von Peter K. (Gast)


Lesenswert?

Wie sehe ich am Terminal ob er mit 8MHz läuft. Sorry wenn ich so frage, 
aber das mit den Fuses und so ist mir gerade ganz neu.

Vielen Dank für die Hilfe!

von Wayne M. (vibra)


Lesenswert?

Wie programmierst du eigentlich den AVR auf dem STK200 , also welchen 
ISP Programmer benutzt du ?

von Peter K. (Gast)


Lesenswert?

Programmiert wird im CodeVision und verwenden tu ich den Atmel mega8515 
µController, oder willst du noch was anderes wissen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wenn der ATmega8515 über RS232 den Text "0 DEVICE(S) DETECTED" an den PC 
sendet, benutzt er eine Baudrate, die sich aus Taktrate und 
Baudrateneinstellung seiner UART ergibt.

Die Baudrateneinstellung kennst du bzw. die ist hier fix (UBRRL=0x33;). 
Die Baudrate kennst du auch. Das ist die Einstellung im Terminalprogramm 
auf dem PC. Damit kannst du auf die Taktrate schliessen!

Baudrate 9600 auf dem PC heisst die Taktrate auf dem ATmega8515 ist bei 
der Baudrateneinstellung oben 8 MHz.

Baudrate 1200 auf dem PC heisst die Taktrate auf dem ATmega8515 ist bei 
der Baudrateneinstellung oben 1 MHz.

Also ist deine Aufgabe: Im Terminalprogramm nachsehen, welche Baudrate 
eingestellt ist.

von Wayne M. (vibra)


Lesenswert?

http://www.engbedded.com/fusecalc/

Der ultimative online Fuse Calculator :-))

probier es halt damit wenn du zu faul bist das Datenblatt zu 
konsultieren,
und nein es gibt keine Datenblätter in Deutsch :P

von Wayne M. (vibra)


Lesenswert?

Peter K. schrieb:
> Programmiert wird im CodeVision und verwenden tu ich den Atmel mega8515
> µController, oder willst du noch was anderes wissen?

nicht was sondern womit war die Frage !
Also womit wird das compilierte Programm in den AVR -Controller 
übertragen
(im allgemeinen Programmiergerät genannt )
oder in neudeutsch
wie flasht du den MC ?

von Peter K. (Gast)


Angehängte Dateien:

Lesenswert?

Mit dem ISP Interface wird der Code übertragen, Der compiler compliert 
eine HEX die er dann rüber schickt.
Drücke hier nur Programm all und dann geht das automatische (siehe Bild)

mfg

von Peter K. (Gast)


Lesenswert?

Danke für den Link,

verwenden muss ich den Internen RC Osc.?

von Karl H. (kbuchegg)


Lesenswert?

Hast du einen Quarz physikalisch ein deinem µC?

Wenn ja, dann willst du einen "external Crystal" haben

http://www.mikrocontroller.net/articles/AVR_Fuses

Es schadet auch nicht, sich mal die Einführungsseite des Tutorials 
durchzulesen. Da beschäftigt sich so mancher Abschnitt mit der 
Taktversorgung eines µC

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment

von Peter K. (Gast)


Lesenswert?

Am STK200 gibt es einen Crystal mit 8MHz, habe ich im Datenblatt 
gesehen, aber keine erklärung wie ich sie setze, probier es mal mit 
deinem Link

von Wayne M. (vibra)


Lesenswert?

Wenn ich mich recht erinnere kann man das STK200 mit einem Quarz 
bestücken und dann gab es da noch eine Steckbrücke wo man Quarz oder 
Intern auswählen konnte.
Was du jetzt machst kommt darauf an was du machen möchtest.(  auweia  
)
also wenn du extern mit Quarz 8Mhz takten willst dann musst du das auch 
so einstellen.

von Peter K. (Gast)


Angehängte Dateien:

Lesenswert?

Das gibt er mir im Terminal aus... unten steht 9600 Baut, sollte also 
passen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ja, das sollte dann stimmen mit den 8 MHz.

Ich bin der 1wire.h und w1_init()... Geschichte nachgegangen. Das sind 
anscheinend Bibliotheken von CodevisionAVR (CodevisionAVR User Manual 
http://www.arctan.ca/files/CVAVRMAN2.pdf => Seite 163 und folgende).

Da ich nicht vor habe, von AVR-GCC zu CodevisionAVR zu wechseln, melde 
ich mich hier ab.

von Peter K. (Gast)


Lesenswert?

Ja wenn die 8MHz passen, wo könnte denn noch das Problem sein?

von Peter K. (Gast)


Lesenswert?

Jetzt erscheint im Terminal statt 0 Devices -> -999.9C

von Peter K. (Gast)


Lesenswert?

Wenn ich jetzt diesen teil verändere und einen anderen Wert einfüge, 
bekomm ich am Display verschiedenste Zeichen, weiß einer weiter?

/* quartz crystal frequency [Hz] */
#define xtal 3000000L

von Peter K. (Gast)


Angehängte Dateien:

Lesenswert?

Das ist nun mein neuer C-Code, Probleme bestehen beim Takten des #define 
xtal 3000000L

Weiß einer Rat, wie ich das schnellstens Löse?

von Wolfgang-G (Gast)


Lesenswert?

@ Peter K.

Jetzt kommst Du mit dem ganzen Krempel unter mindestens 3 verschiedenen 
Fragestellungen.
Mach erst mal die einfachen Hausaufgaben, die Dir unter "DS1820 defekt?" 
(Thema bereits am 30.4.09  begonnen) gestellt wurden    oder Du hast 
nichts verstanden - dann lass es ganz sein

von Peter K. (Gast)


Lesenswert?

Da hat sich ja schon meine Frage gelöst, der DS1820 funktioniert ja... 
Nur gibt er mir jetzt irgendwelche Werte/ Zeichen raus

von Karl H. (kbuchegg)


Lesenswert?

Jetzt kenn  ich mich überhaupt nicht mehr aus.
Du wechselst deine Taktfrequenzen schneller als andere ihre Unterwäsche.

Also: Dein 1-Wire Code findet jetzt ein Device? Oder wie?
Lass dir doch mal den gefundenen ROM-Code des Sensors ausgeben. Der muss 
mit einer charakteristischen Sequenz anfangen. Mal sehen, ob das 
gefundene Device nur eine Falschmeldung war oder nicht.

von Peter K. (Gast)


Angehängte Dateien:

Lesenswert?

Er findet nicht den Device sondern gibt irgendwelche Zeichen bei anderer 
Frequenz aus.

Siehe Anhang

Danke für die hilfe

von Peter K. (Gast)


Angehängte Dateien:

Lesenswert?

Bei 6000000 zeigt es mir das an.. usw...

von Peter K. (Gast)


Lesenswert?

Oder kann mir jemand einen fertigen DS1820 Code für den 8515 geben, dass 
ich mal ein Ergebnis sehen kann?

von Dauergast (Gast)


Lesenswert?

Im allgemeinen ist bei zunehmender Dunkelheit mit weniger Licht zu 
rechnen !

von Karl H. (kbuchegg)


Lesenswert?

Das hat doch keinen Sinn, da ständig den Compiler anzulügen!

Für XTAL kommt die Taktfrequenz deines Prozessors rein. Und nichts 
anderes.

von Peter K. (Gast)


Lesenswert?

Ich weiß langsam einfach nicht mehr weiter... Ein fertiges Programm 
könnte für das erste schon reichen, damit ich mal einen Überblick habe! 
Problem ist, dass ich keines für den CodeVision gefunden habe, das 
funktioniert,

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:
> Ich weiß langsam einfach nicht mehr weiter... Ein fertiges Programm
> könnte für das erste schon reichen, damit ich mal einen Überblick habe!

Ein fertiges Programm für CodeVision sieht auch nicht anders aus, als 
das was du hast.

Dein Problem ist erst mal die Hardware.
Solange dein XTAL Wert nicht mit der Realität übereinstimmt, brauchst du 
nicht länger weiter zu suchen, weil sinnlos.

Punkt 1 auf deiner Liste muss lauten:
Der XTAL Wert muss mit der tatsächlich vorhandenen Taktfrequenz 
übereinstimmen.
Dazu muss sichergestellt sein, dass der am µC angeschlossene Quarz auch 
tatsächlich in Funktion ist. Dazu wiederrum muss der µC per Fuses davon 
in Kentniss gesetzt werden, dass an seinen Pins ein Quarz angeschlossen 
ist.

Solange du diese Hürde nicht packst, ist es sinnlos überhaupt nur 
weiterzudiskutieren.

Over and out

von Peter K. (Gast)


Lesenswert?

Kannst du mir hier mit dem XTAL -> Realität weiter helfen, ich habe 
jetzt schon in diesen Tutorials gelesen und gelesen, nur ich komm 
einfach nicht weiter. Wieso funktioniert dieser DS1820 bei sovielen 
anderen auf anhieb und bei mir geht einfach nichts weiter...


mfg

von Peter K. (Gast)


Lesenswert?

The primary specification difference between the two parts is the
temperature conversion time: DS1820 = 500ms (max) and DS18S20 = 750ms
(max).

Ich verwende den DS18S20... wie stelle ich hier das Timing richtig ein? 
Bitte um konkrete Hilfe, wie ich das im CodeVision umsetze

von Peter K. (Gast)


Lesenswert?

Kann mir keiner mit meinem Problem helfen?

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.