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.
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 |
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.
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.
Ich hab alles mögliche versucht, aber der DS1820 läuft auf dem XC888 überhaupt nicht. Bin irgenwie ratlos.
Funktionieren deine Ports ohne den DS? Vielleicht liegt's ja garnicht am XC.
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.
Also funktioniert dein Port richtig. Das Problem muss also an einer anderen Stelle liegen.
Ich kenn den DS... nicht, daher weiß ich nicht, was für Signale dieses Bauteil erwartet bzw. sendet. Sorry.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.