Infineon XC888: Daten einlesen mit PORT

Gast #633863
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.
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
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
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.
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
Gast
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;
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
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.
Gast
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.
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)
Gast
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.
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.