www.mikrocontroller.net

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


Autor: Daniel A. (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Die Verkabelung des DS1820 habe ich genau gemacht.

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Carsten St. (carsten)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Carsten St. (carsten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, habe kein DS1820 dran, aber IO-Ports gehen.

Bei mir funktioniert folgender Code:
void main(void)
{
  // USER CODE BEGIN (MAIN_Main,2)
  ubyte ubTest;
  // USER CODE END

  MAIN_vInit();

  // USER CODE BEGIN (MAIN_Main,3)

  // USER CODE END

  while(1)
  {

  // USER CODE BEGIN (MAIN_Main,4)
  ubTest = (ubyte)P4_0;
  if(ubTest == 1)
    P3_DATA = 0xFF;
  else P3_DATA = 0x00;
  // USER CODE END

  }

} //  End of function main

Autor: Daniel A. (Gast)
Datum:

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

Autor: Carsten St. (carsten)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Carsten St. (carsten)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

Autor: Carsten St. (carsten)
Datum:

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

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

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

Autor: Carsten St. (carsten)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also funktioniert dein Port richtig. Das Problem muss also an einer 
anderen Stelle liegen.

Autor: Daniel A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was kann ich da noch machen? Was da nicht mehr weiter.

Autor: Carsten St. (carsten)
Datum:

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

Autor: Daniel A. (Gast)
Datum:

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

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.