www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DS1820 defekt?


Autor: Peter K. (chrisstar)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du den DS1820 einmal falsch angeschlossen?

Autor: Robert Weber (rweber)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter K. (Gast)
Datum:

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

Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zeig doch mal Dein Programmschnipsel, mit dem Du den DS1820 ansteuerst

Autor: Peter K. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist das Programm im Anhang

Am Display steht 0 DS1820 Aktiv

Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung, ich nehme alles zurück, es steht ja im 1. Beitrag

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Problem, seht ihr vl im Code einen Fehler?

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner eine Antwort für mich?

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht am falschen Pin angeschloßen???

Autor: Peter K. (Gast)
Datum:

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

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist die Beschaltung richtig?

Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein immer nur die 5V

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte um dringenden Rat:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 Wire Bus functions
#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=0
#endasm
#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.

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In deinem letzten Programm fehlt mir der w1_search Aufruf.

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter K. schrieb:
> Braucht man den unbedingt?

Was denkst du wohl, wozu man in
               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 :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter K. (Gast)
Datum:

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

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ausgabe ist wiederrum 0 Devices detected...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter K. (Gast)
Datum:

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

Autor: Peter K. (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hast du für eine Aussenbeschaltung momentan an diesem Pin?

Autor: Peter K. (Gast)
Datum:

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

Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter K, (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe auch schon einen anderen Pin verwendet, passiert aber überall das 
gleiche.

Autor: Peter K. (chrisstar)
Datum:

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

Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter K. (Gast)
Datum:

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

Autor: Netzwanze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn Du ein einfaches Toggle-Programm laufen läßt?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.