Hilfe zu Temperatursensor DS1820

Gast #632124
Lesenswert?

Guten Morgen,

ich hab mir ein XC888 Starterkid Board von Infineon zugelegt.
An diesem Board habe ich an Port0 (Pin0) einen Temperatursensor vom Typ 
DS1820 angeschlossen. Die Datenleitung habe ich mit einem 4,7KOhm 
Widerstand an Vcc(+5V) angeschlossen.
1
//----------------------------------------
2
// Reset DS1820
3
//----------------------------------------
4
char ResetDS1820(void)
5
{
6
  char a;
7
  P0_DIR=0xFF;     
8
  P0_0=0;     
9
  for(i=0;i<1000;i++) // wait
10
  P0_0=1;     
11
  P0_DIR=0xFE
12
  for(i=0;i<1000;i++) // wait  
13
  presence = P0_0;      // get presence signal
14
  for(i=0;i<1000;i++) // wait
15
  a=presence; 
16
  P0_DIR=0xFF; 
17
  return a;           // presence signal returned
18
}   // 0=presence, 1 = no part

Wenn ich die Funktion im Hauptprogramm ausführe erhalte ich immer als 
Rückgabewert die 1.
Vielleicht hab ich noch was bei der Einstellung des Port0 was falsch 
gemacht. Den Port0 habe ich in den Zustand Tristate gesetzt.
Hat jemand noch einen Vorschlag.
Gast #632137
Lesenswert?

(Der XC888 ist ein 8-Bit Mikrocontroller)

P0_DIR=0xFF : der ganze Port0 wird auf Ausgang geschaltet

P0_DIR=0xFE : nur vom Port0 wird Pin0 auf Eingang geschaltet.

Vielleicht sind meine delays nicht korrekt. Wie üwrdet ihr die delays 
realisieren?
Gast #632160
Lesenswert?

#define FOSC 8000000UL

void delay_ms(unsigned int ms)
{
  unsigned int zaehler;
  while (ms)
  {
    zaehler =  FOSC / 5000;
    while (zaehler)
    {
      asm volatile ("nop");
      zaehler--;
    }
    ms--;
  }
}

versuchs doch mal mit sowas ;)
#632438
Lesenswert?

Daniel A. wrote:
> Wie würdet ihr eine Verzögerung im Mikrosekundenbreich realisieren?

Entweder mit nem Timer:

Beitrag "DS1820, DS18B20 in C"


Oder ne Delayschleife programmieren, das Assemblerlisting ansehen und 
die Zyklenzahl ausrechnen:

http://home.tiscali.de/peterd/appl/soft/c51/thclock/index.htm


Achtung !

Das obere Beispiel ist für AVR (anderer Timeraufbau), das untere für die 
langsamen 8051 (XTAL / 12).


Peter
Gast #632764
Lesenswert?

Also ich kann machen was ich will, die Funktion gibt als Rückgabewert 
immer eine 0 zurück.
1
unsigned char w1_reset(void)
2
{
3
  char a,presence;
4

5
  P0_0=0;
6
  P0_DIR=0xBF;     
7
    
8
     
9
  delay_us(480);
10
   
11
  P0_0=0;   
12
  P0_DIR=0xBE;
13
  
14

15
  delay_us(66);
16

17
  presence = P0_0;      // get presence signal
18

19
  delay_ms(480-66);
20

21
  a=presence; 
22
  return a;           // presence signal returned
23
}   // 0=presence, 1 = no part

Wahrscheinlich sollte ich mal mit dem Oszi das Signal messen. Leider 
habe ich zur Zeit keines.
Gast #632789
Lesenswert?

Das bringt mir allerdings sehr sehr wenig.
Ich habe doch kein AVR, sondern einen 8-Bit Mikrocontroller von Infineon 
(TYP:XC888). Ausserdem programmiere ich mit Keil und nicht mit 
CodeVision AVR.

Kann mir jemand sagen ob dieser C-Code korrekt so ist?
Gast #632805
Lesenswert?

Wenn diese Funktion genau so verwende und ausführe, dann erscheint als 
Rückgabewert zuerst eine 0 und dann nach 1 Sekunde eine 1.
Mit dem AVR funktioniert der DS1820 prima. In AVR gibt es für das 
EInlesen und rausschreiben zwei Systemfunktionsregister. Der XC888 hat 
soweit ich weis dies nicht. Mit P0_0 kann ich einlesen als auch was 
rausschreiben.
In den Konfigurationstool DAVE kann ich den Port einstellen:
SIEHE BILD IM ANHANG

1
unsigned char w1_reset(void)
2
{
3
  char a,presence;
4

5
  P0_0=0;
6
  P0_DIR=0x01;     
7
    
8
     
9
  delay_us(480);
10
   
11
  P0_0=0;   
12
  P0_DIR=0x00;
13
  
14

15
  delay_us(66);
16

17
  presence = P0_0;      // get presence signal
18

19
  delay_ms(480-66);
20

21
  a=presence; 
22
  return a;           // presence signal returned
23
}   // 0=presence, 1 = no part
Angehängte Dateien:
Gast #633663
Lesenswert?

Jetzt hab ich mal mit dem Multimetzer den Spannung am Port4 Pin0 
gemessen.

1.)

P4_DIR = 0x00; // Port4 steht auf INPUT
x = P4_0;

Sobald das Programm startet, steht der Zustand des Pin0 vom Port4 auf 
HIGH (+5V). Nach ungefähr drei vier Sekunden geht der Zustand auf LOW 
zurück.
Das finde ich echt komisch. Ich dafür keine Erklärung.

Wenn ich +5V auf den Pin0 gebe, dann messe ich auch +5V und die Variable 
x beinhaltet auch den Wert 0x01. Auch da geht dann der Zustand nach 
einigen Sekunden auf LOW zurück.


2.)

P4_DIR = 0x01; // Port0 steht auf OUTPUT
x = P4_0;

Hier verhält sich der Pin so wie er soll. Da funktioniert alles.
Gast #633835
Lesenswert?

Jetzt hab ich mal mit dem Multimeter die Spannung am Port4 Pin0
gemessen.

1.)

P4_DIR = 0x00; // Port4 steht auf INPUT
x = P4_0;

Sobald das Programm startet, steht der Zustand des Pin0 vom Port4 auf
HIGH (+5V). Nach ungefähr drei vier Sekunden geht der Zustand auf LOW
zurück.
Das finde ich echt komisch. Ich hab dafür keine Erklärung.

Wenn ich +5V auf den Pin0 gebe, dann messe ich auch +5V und die Variable
x beinhaltet auch den Wert 0x01. Auch da geht dann der Zustand nach
einigen Sekunden auf LOW zurück.


2.)

P4_DIR = 0x01; // Port0 steht auf OUTPUT
x = P4_0;

Hier verhält sich der Pin so wie er soll. Da funktioniert alles.
Gast #650708
Lesenswert?

Da der DS1820 auf dem XC888 noch als nicht läuft, wende ich mich 
nochmals diesem Thread.
Der Mikrocontroller XC888 läuft bei mir mit einem internen Takt von 
24Mhz.
Register CMCON steht bei mir auf 0x00. Das Osziloscope hab ich an einen 
Port Pin angeschlossen. in der while(1) Schleife vom Hauptprogramm wird 
der Port Pin permanent von +5V auf 0V gesetzt. Mit dem Oszilloscope kann 
ich keine Frequenz von 24Mhz messen. Bin die ganze Zeit am überlegen 
woren es liegen könnte. Ich komme da nicht drauf.

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