Forum: Mikrocontroller und Digitale Elektronik DS1820 defekt?


von Peter K. (chrisstar)


Angehängte Dateien:

Lesenswert?

Hallo, habe ein Programm auf den µC geschrieben, Am Display erscheint
dass 0 DS1820 erkannt wurden.

Am Oszi kann ich zwischen Datenleitung und Masse die 5V ablesen. Sonst
tut sich nichts. Keine Änderung des Signals.

Ist der DS1820 möglicherweise defekt? Widerstand ist zw. D und V++ und
wird mit 5V versorgt.

mfg

von Hans (Gast)


Lesenswert?

Hast du den DS1820 einmal falsch angeschlossen?

von Robert W. (rweber)


Lesenswert?

Hi,

siehst Du gar nichts am Bus? Die Reset sequence wird vom Controller 
erzeugt, nicht vom DS18B20.

PS: Schau mal ins Datenblatt, da ist schoen beschrieben, wie der reset + 
precence pulse (der kommt von DS18B20) aussehen muss.

Gruss,
rweber

von Peter K. (Gast)


Lesenswert?

zwischen der Datenleitung und Masse erkenne ich nichts, außer die 5V. 
Zwischen wo muss ich am µC messen, damit ich die precence puls erhalte?

von Karl H. (kbuchegg)


Lesenswert?

Peter K. wrote:
> zwischen der Datenleitung und Masse erkenne ich nichts, außer die 5V.
> Zwischen wo muss ich am µC messen, damit ich die precence puls erhalte?

Der 1-Wire Bus heist deshalb 1-Wire, weil sich alles auf nur einer 
Leitung abspielt. Also müsstest du wohl auf dieser einen Leitung die 
Pulse sehen.

von Peter K. (Gast)


Lesenswert?

Ja schon klar, aber das Oszi hat mal 2 Anschlüsse, zwischen wo sollte 
ich denn sonst messen, damit ich etwas sehe?

von Wolfgang-G (Gast)


Lesenswert?

zeig doch mal Dein Programmschnipsel, mit dem Du den DS1820 ansteuerst

von Peter K. (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist das Programm im Anhang

Am Display steht 0 DS1820 Aktiv

von Wolfgang-G (Gast)


Lesenswert?

Entschuldigung, ich nehme alles zurück, es steht ja im 1. Beitrag

von Peter K. (Gast)


Lesenswert?

Kein Problem, seht ihr vl im Code einen Fehler?

von Peter K. (Gast)


Lesenswert?

Hat keiner eine Antwort für mich?

von Peter K. (Gast)


Lesenswert?

Stimmt dieser Codeteil?:

#define MAX_DEVICES 8

/* DS1820 ROM CODE */
unsigned char rom_codes[MAX_DEVICES][9];

/* Wird überprüft wieviele DS1820 Sensoren entdeckt wurden    */
devices=w1_search(0xf0,rom_codes);
sprintf(lcd_buffer,"%u DS18S20\nAnzahl aktiv",devices);

von User (Gast)


Lesenswert?

Vielleicht am falschen Pin angeschloßen???

von Peter K. (Gast)


Lesenswert?

Glaub ich nicht, da ich auf PortA Bit6 drauf bin und der müsste stimmen

von Peter K. (Gast)


Lesenswert?

Habe ich den DS1820 wie folgt richtig angeschlossen?

V++... 5V
Masse
und zwischen Datenleitung und V++ ist der Widerstand 4,7k
Datenleitung geht auf PORTA/6

von Peter K. (Gast)


Lesenswert?

Ist die Beschaltung richtig?

von Wolfgang-G (Gast)


Lesenswert?

>Am Oszi kann ich zwischen Datenleitung und Masse die 5V ablesen. Sonst
>tut sich nichts. Keine Änderung des Signals.

zeigt Dein Oszi zwischenzeitlich etwas auf der datenleitung an?

von Peter K. (Gast)


Lesenswert?

Nein immer nur die 5V

von Peter K. (Gast)


Lesenswert?

Habe jetzt den Code geschrieben:

#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;
        w1_init();

while (1)
      {
             //       for(i=0;i<2;)
             //   {
                        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));
              //  }

      };
}


Bekomme nun am Display den Wert: -999.9 sonst nichts. Kann mir jemand 
bitte helfen?

mfg

von Peter K. (Gast)


Lesenswert?

Bitte um dringenden Rat:

Clock wurde auf 8 MHz eingestellt! Weiß keiner was hier los ist?

von Karl H. (kbuchegg)


Lesenswert?

Kannst du den Compiler wechseln?
In der Codesammlung gibt es DS1820 Routinen vom Peter Dannegger für den 
gcc. Hab den Code neulich mal gebraucht. Hat auf Anhieb funktioniert.

Dass dein Oszi völlig ruhig ist macht mich stutzig, da ja eigentlich der 
AVR die Kommunikation initiiert und dabei den Pin auf 0 runterzieht.

Das hier
1
// 1 Wire Bus functions
2
#asm
3
   .equ __w1_port=0x18 ;PORTB
4
   .equ __w1_bit=0
5
#endasm
6
#include <1wire.h>

gefällt mir überhaupt nicht.
Hast du 3-mal kontrolliert ob PORTB wirklich auf der Adresse 0x18 liegt?
PS: Weiter oben war es noch PORTA auf 0x18. Also irgendwas stimmt da 
nicht.

von Peter K. (Gast)


Lesenswert?

Also das mit dem Port müsste stimmen, da CodeVision den Port selbst 
zuweist wenn man PortB klickt.

Bei PortA würde stehen:
#asm
   .equ __w1_port=0x1B ;PORTA
   .equ __w1_bit=0
#endasm

-------------------------------------------------------

Angeschlossen ist ja der DS1820 wohl richtig oder?

V++... 5V
GND... Masse
DQ.... auf PortB - Bit0

Zwischen V++ und DQ ist ein Widerstadn 4,7k

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:

> Angeschlossen ist ja der DS1820 wohl richtig oder?
>
> V++... 5V
> GND... Masse
> DQ.... auf PortB - Bit0
>
> Zwischen V++ und DQ ist ein Widerstadn 4,7k

Ja. Ausser das du den falschen realen Pin an die falsche Leitung 
anschliesst, kann da nicht viel schief gehen.

Klemm mal den DS ab und sieh mit dem Oszi nach, ob sich am Pin was tut. 
Der Prozessor muss den Pin nach Masse ziehen um dem DS mitzuteilen: 
Jetzt gehts los.
Wenn du das nicht siehst, bist du eventuell am falschen Prozessorpin 
(solls auch schon gegeben haben, dass man sich mit den Pins verzählt)

von Karl H. (kbuchegg)


Lesenswert?

In deinem letzten Programm fehlt mir der w1_search Aufruf.

von Peter K. (Gast)


Lesenswert?

Braucht man den unbedingt?

Habe ihn weggelassen und dann wird mir -999.9C angezeigt, was 
anscheinend auf einen Hardwarefehler rückschließen lässt!?

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:
> Braucht man den unbedingt?

Was denkst du wohl, wozu man in
1
               temp=ds1820_temperature_10(&rom_code[i][0]);

den rom_code angibt. Und was ist eigentlich dieser rom_code?
(Hinweis: wie denkst du werden mehrere DS1820 an ein und derselben 
Leitung unterschieden?)

Und wenn man diesen rom_code schon benötigt, damit auch der richtige DS 
angesprochen wird, wo wird man den dann her kriegen?

Und jetzt schaust du dir mal an, was w1_search macht :-)

von Karl H. (kbuchegg)


Lesenswert?

In diesem Sinne fehlt mir dann in deinem zuallererst geposteten Programm 
ganz oben der Aufruf von w1_init()

von Peter K. (Gast)


Lesenswert?

Ich verwende ja nur einen DS1820.

Habe nun den Code:

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

wieder eingefügt. Nun wird mir 0 Devices detected angezeigt!

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:
> Ich verwende ja nur einen DS1820.

Das ist aber deiner Library egal.
Die ist darauf ausgelegt maximal MAX_DEVICES Stück an einer Leitung zu 
verwalten.
Und nein: DU musst nach den Regeln der Library spielen und nicht 
umgekehrt.

von Peter K. (Gast)


Lesenswert?

Ja habe es nun so gemacht. wenn ich w1_init() einfüge bekomme ich gar 
nichts mehr am bildschirm angezeigt.

von Peter K. (Gast)


Lesenswert?

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;

        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));
                }

      };
}


Das ist nun der Code mit dem was noch gefehlt hat!

von Peter K. (Gast)


Lesenswert?

Ausgabe ist wiederrum 0 Devices detected...

von Karl H. (kbuchegg)


Lesenswert?

Noch mal:

Wenn du nur minimalen Code hast

int main()
{
  w1_init();
  while( 1 )
    w1_search(0xf0,rom_code);
}

dann muss der Pin, den du auserkoren hast, regelmässig auf 0 gezogen 
werden. Wenn dem nicht so ist, dann
* bist du am falschen Pin
* oder hast irgendein anderes Hardware Problem
* oder die Lib hat nicht verstanden an welchem Pin sie die 1-Wire 
Kommunikation aufbauen soll

Das sind deine Ansatzpunkte. Und solange du am Oszi nicht siehst, wie 
der von dir angegebene Pin auf 0 gezogen wird, hat es keinen Sinn sich 
über was anderes auch nur Gedanken zu machen. (*)

Und zum testen würd ich den DS1820 mal abhängen, den 4k7 Widerstand aber 
am Portpin belassen.

(*) Es könnte im Minimalprogramm auch noch ein anderer Aufruf fehlen, 
ich kenn weder den Compiler noch die dort verwendeten w1 Funktionen. 
Allerdings erscheint mir eine Sequenz
    zuerst das 1-Wire Modul initialisieren
    dann nach vorhandenen Geräten suchen
als ziemlich logische Vorgehensweise. Ob das so stimmt, steht sicher 
auch in der Doku deines Compilers.

von Peter K. (Gast)


Lesenswert?

* bist du am falschen Pin
* oder hast irgendein anderes Hardware Problem
* oder die Lib hat nicht verstanden an welchem Pin sie die 1-Wire

Punkt 1 und 3 sind ja denk ich die gleichen und bin mir 100% sicher dass 
es der richtige Pin ist!

Die Hardware kann ich leider nicht ausschließen...

von Karl H. (kbuchegg)


Lesenswert?

Peter K. schrieb:

> Die Hardware kann ich leider nicht ausschließen...

Dann schreib dir ein Testprogramm, welches am Port B, Pin 0 einfach mal 
den Pin toggelt. Die 3 Minuten wirst du ja wohl haben

int main()
{
  DDRB = 0xFF;

  while( 1 ) {
    PORTB = 0x00;
    PORTB = 0x01;
  }
}

lass es laufen und schon siehst du auf deinem Oszi, ob an diesem Pin 
Pulse rauskommen oder nicht. Wenn nicht -> Hardware defekt oder Oszi am 
falschen Pin angeklemmt oder überhaupt Oszi falsch angeklemmt.

von Peter K. (Gast)


Lesenswert?

Das habe ich gerade geschrieben. Messen tu ich zwischen GND und 
PORTB/0... Messe die 5V konst.

von Peter K. (Gast)


Lesenswert?

Wenn ich einen anderen Port verwende / Bit dann schwingt es am Oszi nur 
auf diesem Bit bleibt es auf 5V konst

von Karl H. (kbuchegg)


Lesenswert?

Was hast du für eine Aussenbeschaltung momentan an diesem Pin?

von Peter K. (Gast)


Lesenswert?

Den DQ vom DS1820 habe ich weggeklemmt, somit hängt nichts mehr drann.

von Wolfgang-G (Gast)


Lesenswert?

>Wenn ich einen anderen Port verwende / Bit dann schwingt es am Oszi nur
>auf diesem Bit bleibt es auf 5V konst

--> Ferndiagnose:  Fehler gefunden

dann häng doch den DS1820 zunächst an einen funktionstüchtigen PIN und 
prüfe mit dem Oszi was geschieht

von Peter K, (Gast)


Lesenswert?

Habe auch schon einen anderen Pin verwendet, passiert aber überall das 
gleiche.

von Peter K. (chrisstar)


Lesenswert?

Verwendet wird der Mega8515, könnte etwas mit dem takten nicht stimmen, 
habe im CodeVision die 8MHz eingestellt?

von Wolfgang-G (Gast)


Lesenswert?

>Wenn ich einen anderen Port verwende / Bit dann schwingt es am Oszi nur
>auf diesem Bit bleibt es auf 5V konst

>Habe auch schon einen anderen Pin verwendet, passiert aber überall das
>gleiche.

was denn nun, reagiert ein Ausgang oder nicht?

von Peter K. (Gast)


Lesenswert?

Wenn ich igendeinen Port im CodeVision definiere und dort nun messe, 
werden mir immer die 5V konst. angezeigt. Die anderen schwingen herum.

von Netzwanze (Gast)


Lesenswert?

Auch wenn Du ein einfaches Toggle-Programm laufen läßt?

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.