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
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.
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
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;
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.
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.
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)
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.