Forum: Mikrocontroller und Digitale Elektronik Hilfe zu Temperatursensor DS1820


von Daniel A. (Gast)


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.

von Daniel A. (Gast)


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?

von Peter D. (peda)


Lesenswert?

Daniel A. wrote:

>
1
>   for(i=0;i<1000;i++) // wait
2
>

Was soll das werden, Hausnummern erraten ?


Im Datenblatt sind ganz bestimmte Zeiten gefordert und nicht 
irgendwelche "warte ein bissel".

Nimm nen Timer oder Delayfunktionen der Bibliothek.


Peter

von Daniel A. (Gast)


Lesenswert?

Es scheint so zu sein, dass es für diesen Mikrocontroller keine delay 
Funktionen gibt.

von Daniel A. (Gast)


Lesenswert?

Aber theoretisch könnte man dies trotzdem mit der for Schleife 
realisieren. Man müsste wahrscheinlich dazu ein Oszi nehmen.

von Philipp Karbach (Gast)


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

von Daniel A. (Gast)


Lesenswert?

Danke für das Beispiel.
Ich werds mal Versuchen. Aber ich brauche Verzögerungen die im 
Mikrosekundenbereich liegen.

von Philipp Karbach (Gast)


Lesenswert?

hmm war da nicht irgendwas mit 750ms beim ds1820?

von Daniel A. (Gast)


Lesenswert?

Ne ne, die Zeiten liegen so bei 600us.

von Daniel A. (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Timing der Initialisierung vom DS1820.

von tcfkat (Gast)


Lesenswert?

Abgesehen davon, beim ersten Code-Beispiel fehlt ein ; am Ende der 
for-Schleifen. P0_0 wird 0 und sofort wieder 1 gesetzt... ;)

von Daniel A. (Gast)


Lesenswert?

Ok das hab ich auch schon bemerkt.
Was meinst du damit:
>P0_0 wird 0 und sofort wieder 1 gesetzt... ;)

von Daniel A. (Gast)


Lesenswert?

Wie würdet ihr eine Verzögerung im Mikrosekundenbreich realisieren?

von tcfkat (Gast)


Lesenswert?

>Ok das hab ich auch schon bemerkt.
>Was meinst du damit:
>>P0_0 wird 0 und sofort wieder 1 gesetzt... ;)

Durch das fehlende Semikolon - hast Du ja jetzt behoben.

von Peter D. (peda)


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

von Daniel A. (Gast)


Lesenswert?

Muss das Timing exakt stimmen? Kann die Verzögerung statt 480us auch 1ms 
sein?

von Daniel A. (Gast)


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.

von Daniel A. (Gast)


Lesenswert?

Jetzt auf einmal sehe ich den Wert 0x01. Das versteh ich nicht!

von bascom-looser (Gast)


Lesenswert?


von Daniel A. (Gast)


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?

von Daniel A. (Gast)


Angehängte Dateien:

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

von Daniel A. (Gast)


Lesenswert?

Niemand da wo mir helfen könnte???

von Daniel A. (Gast)


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.

von Daniel A. (Gast)


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.

von Daniel A. (Gast)


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.

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.