Infineon XC888: Daten einlesen mit PORT

Gast #633863
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.
#633879
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
Gast #633908
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.
Gast #633920
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.
Gast #634157
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;
#634199
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
Gast #634272
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.

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