www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe zu Temperatursensor DS1820


Autor: Daniel A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
//----------------------------------------
// Reset DS1820
//----------------------------------------
char ResetDS1820(void)
{
  char a;
  P0_DIR=0xFF;     
  P0_0=0;     
  for(i=0;i<1000;i++) // wait
  P0_0=1;     
  P0_DIR=0xFE
  for(i=0;i<1000;i++) // wait  
  presence = P0_0;      // get presence signal
  for(i=0;i<1000;i++) // wait
  a=presence; 
  P0_DIR=0xFF; 
  return a;           // presence signal returned
}   // 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.

Autor: Daniel A. (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel A. wrote:

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

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Philipp Karbach (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm war da nicht irgendwas mit 750ms beim ds1820?

Autor: Daniel A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne ne, die Zeiten liegen so bei 600us.

Autor: Daniel A. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier das Timing der Initialisierung vom DS1820.

Autor: tcfkat (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie würdet ihr eine Verzögerung im Mikrosekundenbreich realisieren?

Autor: tcfkat (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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


Achtung !

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


Peter

Autor: Daniel A. (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

  P0_0=0;
  P0_DIR=0xBF;     
    
     
  delay_us(480);
   
  P0_0=0;   
  P0_DIR=0xBE;
  

  delay_us(66);

  presence = P0_0;      // get presence signal

  delay_ms(480-66);

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

Wahrscheinlich sollte ich mal mit dem Oszi das Signal messen. Leider 
habe ich zur Zeit keines.

Autor: Daniel A. (Gast)
Datum:

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

Autor: bascom-looser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Daniel A. (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:
Angehängte Dateien:

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

unsigned char w1_reset(void)
{
  char a,presence;

  P0_0=0;
  P0_DIR=0x01;     
    
     
  delay_us(480);
   
  P0_0=0;   
  P0_DIR=0x00;
  

  delay_us(66);

  presence = P0_0;      // get presence signal

  delay_ms(480-66);

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

Autor: Daniel A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand da wo mir helfen könnte???

Autor: Daniel A. (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

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.