Forum: Mikrocontroller und Digitale Elektronik Infineon XC888: Daten einlesen mit PORT


von Daniel A. (Gast)


Lesenswert?

Von Infineon habe ich mir ein Starterkid Board mit dem Mikrocontroller 
XC888 besorgt. Darauf habe ich einen Temperatursensor DS1820 angepracht.
Die Datenleitung vom DS1820 habe ich mit einem 4,7kOhm Widerstand auf 
Vcc (+5V) gelegt. Die anderen Leitungen sind an der Versorgungsspannung 
angeschlossen (+5V/GND). Laut Datenblatt habe ich alles richtig 
angeschlossen. Dies habe ich auch mehrmal überprüft.

Nur der Reset des DS1820 funktioniert überhaupt nicht.

Mit P4_0 kann ich den Ausgangspin vom Port 4 steuern.
Zuerst muss aber die Richtung festgelegt werden. P4_DIR = 0x01 bedeutet 
der Pin0 ist als Ausgang geschaltet.
Mit P4_DIR = 0x00 sind die Pins auf Eingang geschaltet.
Mit P4_0 kann ich dann die Information einlesen.

unsigned char w1_reset(void)
{
  unsigned char err;
  err = 0xFF;

  P4_DIR=1; // output
  P4_0=0;
  delay(80);
  P4_0=1;
  P4_DIR=0; // input
  delay(20);
  err = P4_0;
  delay(80);

  if( P4_0 == 0 )
     err = 1;

  return err;
}

Ich lese immer die 0x01 aus. Ich brauche dringend hilfe. Komme da nicht 
weiter.

von Daniel A. (Gast)


Angehängte Dateien:

Lesenswert?

Die Verkabelung des DS1820 habe ich genau gemacht.

von Peter D. (peda)


Lesenswert?

1-wire ist ein open-drain Bus, nen Pin auf 1 zu setzen ist also ganz 
schlecht.

Entweder Du benutzt den 8051-Modus, dann sind die Pins open drain und Du 
darfst auf 1 setzen, Richtungsumschaltung gibts ja nicht.

Oder als Push-Pull Ausgang setzt Du den Pin einmalig auf 0 und fäßt ihn 
nie wieder an.
Zwischen 0 oder 1 wird dann nur mit dem DIR-Bit umgeschaltet.


Vor allem bastele Dir aber erstmal Delayfunktionen, die auch stimmen.

Am besten geht das mit einem Timer, dann kann man die Zeit direkt aus 
der Quarzfrequenz berechnen lassen.

Ob die Delays stimmen, kannst Du mit nem Oszi oder mit dem Simulator 
(Zyklenzähler) überprüfen.

Das DAVE-Geraffel würde ich weglassen, verwirrt nur.


Peter

von Daniel A. (Gast)


Lesenswert?

P4_0=0;

unsigned char w1_reset(void)
{
  unsigned char err;
  err = 0xFF;

  P4_DIR=1; // output
  delay(480);
  P4_DIR=0; // input
  delay(66);
  err = P4_0;
  delay(480-66);

  if( P4_0 == 0 )
     err = 1;

  return err;
}

Mit dem Oszi habe ich die Verzögerungen gemessen. Diese müssten jetzt so 
stimmen. P4_0 = 1 habe ich entfernt. Geht immer noch nicht.

>>Entweder Du benutzt den 8051-Modus, dann sind die Pins open drain und Du
>>darfst auf 1 setzen, Richtungsumschaltung gibts ja nicht.

Was muss ich ändern, damit der 8051-Modus aktiv ist?

>>Oder als Push-Pull Ausgang setzt Du den Pin einmalig auf 0 und fäßt ihn
>>nie wieder an.
>>Zwischen 0 oder 1 wird dann nur mit dem DIR-Bit umgeschaltet.

Siehe Programmcode. Zu Angang setzte ich den Pin0 auf 0.

von Daniel A. (Gast)


Lesenswert?

Auf meinem AVR läuft der DS1820.
Hier der C-Code zu dem AVR.

unsigned char w1_reset(void)
{
  unsigned char err;
  err = 0xFF;
  PORTD.2=0;
  DDRD.2=1;
  delay_us(480);
  PORTD.2=0;
  DDRD.2=0;
  delay_us(66);
  err = PIND.2;
  delay_us(480-66);
  if( (PIND.2) == 0 )
    err = 1;
  return err;
}

Auf dem XC888 will es einfach nicht funktionieren.

von Carsten S. (carsten)


Lesenswert?

Welchen Compiler nutzt du?
Kannst du das ganze debuggen? Wenn ja, an welcher Stelle treten die 
Probleme auf? Stimmen die Register immer mit dem überein, was du 
erwartest?
Ich hatte bis jetzt noch nie Probleme mit den XC88x-Ports.

Carsten

von Daniel A. (Gast)


Lesenswert?

Hallo Carsten St.,

wie liesst du die Daten mit dem Port ein?
Kannst du mir einen Codeauschnitt zeigen? Auf dem AVR Mikrocontroller 
läuft der DS1820 ohne Probleme.

Diese Funktion verwende ich auf dem AVR Mikrocontroller:

unsigned char w1_reset(void)
{
  unsigned char err;
  err = 0xFF;
  PORTD.2=0;
  DDRD.2=1;
  delay_us(480);
  PORTD.2=0;
  DDRD.2=0;
  delay_us(66);
  err = PIND.2;
  delay_us(480-66);
  if( (PIND.2) == 0 )
    err = 1;
  return err;

von Daniel A. (Gast)


Lesenswert?

Hallo Carsten St.,

hast du einen DS1820 an einem XC888 angeschlossen und zum laufen 
gebracht?
Mich würde interessieren wie du die Ports vom XC888 ansteuerst.

von Carsten S. (carsten)


Lesenswert?

Nein, habe kein DS1820 dran, aber IO-Ports gehen.

Bei mir funktioniert folgender Code:
1
void main(void)
2
{
3
  // USER CODE BEGIN (MAIN_Main,2)
4
  ubyte ubTest;
5
  // USER CODE END
6
7
  MAIN_vInit();
8
9
  // USER CODE BEGIN (MAIN_Main,3)
10
11
  // USER CODE END
12
13
  while(1)
14
  {
15
16
  // USER CODE BEGIN (MAIN_Main,4)
17
  ubTest = (ubyte)P4_0;
18
  if(ubTest == 1)
19
    P3_DATA = 0xFF;
20
  else P3_DATA = 0x00;
21
  // USER CODE END
22
23
  }
24
25
} //  End of function main

von Daniel A. (Gast)


Lesenswert?

Mit Px_DIR kann man ja die Richtung festlegen.
Wenn ich einlesen möchte, dann muss ich Px_DIR = 1 setzen.
Mit Px_0 kann ich dann die Daten einlesen.

von Carsten S. (carsten)


Lesenswert?

Hab noch ganz vergessen,
P3 wird als Ausgang deklariert:
  P3_DIR        =  0xFF;         // load direction register

1 im DIR-Register heißt Ausgang, 0 heißt Eingang.
Der Reset-Wert is 0x00, sprich Eingang.

von Daniel A. (Gast)


Lesenswert?

Ich hab alles mögliche versucht, aber der DS1820 läuft auf dem XC888 
überhaupt nicht. Bin irgenwie ratlos.

von Carsten S. (carsten)


Lesenswert?

Funktionieren deine Ports ohne den DS? Vielleicht liegt's ja garnicht am 
XC.

von Daniel A. (Gast)


Lesenswert?

Also ohne DS1820 und ohne 4,7Kohm Widerstand verhält sich der Port 
folgendermaßen:


Wenn ich den Pin0 von Port4 mit P4_DIR = 0x00 auf Eingang stelle,
dann steht für kurze Zeit am Pin0 eine 1^also +5V. Nach drei vier 
Sekunden geht der Zustand dann auf Null zurück. Das verstehe ich nicht.

von Carsten S. (carsten)


Lesenswert?

Wenn du nichts angeschlossen hast, dann ist der PIN fast unbeschaltet 
(außer dem hochohmigen Eingangspin). Daher kann so ein Verhalten normal 
sein.
Lege über den 4,7k Ohm Widerstand mal 5V, mal 0V an und teste ob er die 
Zustände jeweils richtig einliest (5V->1,0V->0)

von Daniel A. (Gast)


Angehängte Dateien:

Lesenswert?

Wenn ich den Pin0 auslese, dann erhalte ich eine Eins.
Sobald ich den Pin0 mit Ground verbinde erscheint eine Null.
Wenn ich die Verbindung entferne, erscheint wieder eine Eins.

von Carsten S. (carsten)


Lesenswert?

Also funktioniert dein Port richtig. Das Problem muss also an einer 
anderen Stelle liegen.

von Daniel A. (Gast)


Lesenswert?

Was kann ich da noch machen? Was da nicht mehr weiter.

von Carsten S. (carsten)


Lesenswert?

Ich kenn den DS... nicht, daher weiß ich nicht, was für Signale dieses 
Bauteil erwartet bzw. sendet.
Sorry.

von Daniel A. (Gast)


Lesenswert?

Ich hab gestern ja meine delay Funktion getestet. Wahrscheinlich liegt 
es noch daran. Die Zeiten müssen ja schon korrekt eingehalten werden.

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.