DS1820 defekt?

#1247009
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
Angehängte Dateien:
Gast #1251377
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
#1251435
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.
Gast #1251457
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
#1251468
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)
#1251490
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 :-)
Gast #1251513
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!
#1251517
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.
#1251522
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren