Forum: Mikrocontroller und Digitale Elektronik AT89C51ED2 (8051) mit DS18S20


von Wonk (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, wir kommen mit unserem Schulprojekt einfach nicht weiter. Wir 
möchten den Sensor DS18S20 von Dallas mit unserem µC AT89C51ED2 von 
Atmel, der mit 12MHz arbeitet, auslesen und auf LCD ausgeben.

Wir erhalten nach dem Reset den Presence Pulse vom Sensor, wissen jedoch 
nicht ob der Skip ROM Befehl überhaupt ankommt. Wir erhalten keine 
Bestätigung nach Convert T.

Das ganze versuchen wir in Assembler zu realisieren. Uns wird langsam 
die Zeit knapp. In einer Woche ist Abgabe und wir stehen total aufm 
Schlauch.

Hier mal den Code soweit, er ist leider nich optimiert, da es uns wegen 
Zeitmangel erstmal auf die Funktion ankommt. Es ist also ein rein 
linearer Ablauf...bitte nicht beschweren.:
1
  include C51ED2.inc  ;Registeradressen einbinden
2
 
3
 EXTERN CODE initLCD,loeschen,loeschzeile1,loeschzeile2,textzeile1,textzeile2,cursorpos
4
 EXTERN CODE textaus,zifferaus,hexaus,dezaus
5
 
6
      code at 0        
7
       CLR p3.0               ;
8
       CLR p3.1               ;
9
       CLR p3.2               ;
10
       CLR p3.3               ; Port 3 Auf 0 setzen
11
       CLR p3.4               ;
12
       CLR p3.5               ;
13
       CLR p3.6               ;
14
       SETB p1.0
15
       LCALL initLCD          ;LCD initialisieren
16
       LCALL loeschen         ;LCD löschen
17
             
18
;*********Sensor Initialisieren********************************************************       
19
    ;public start:
20
21
Start1:  CLR p1.0            ;Sensor resetten
22
      MOV R0, #0A0h        ;
23
Zeit1:  NOP                     ;Zeitschleife für 480µs
24
      DJNZ R0, Zeit1          ;
25
      
26
      SETB p1.0               ;p1.0 auf HIGH
27
28
      JB p1.0, $          ;Warten auf Presence Pulse
29
      JNB p1.0, $             ;
30
      
31
      MOV A, #04h          
32
       LCALL cursorpos
33
       MOV A, #03h 
34
       LCALL dezaus
35
      
36
;*********Scip ROM*********************************************************      
37
             
38
      CLR C              ;Carry-Flag löschen
39
      MOV R1, #08h            ;In Register R1 8Hex schreiben => 8Bit
40
      MOV A, #0CCh            ;In Akku CCHex schreiben => SkipROM
41
WTSlot:  CLR p1.0                ;p1.0 auf LOW
42
      NOP
43
      NOP
44
      
45
      RRC A              ;Akku mit Carry-Flag nach rechts rotieren
46
      MOV p1.0, C          ;Carry-Flag an p1.0 ausgeben  
47
                              
48
      MOV R0, #02h            ;
49
Pussy5:  NOP                     ;Zeitschleife für 7µs
50
      DJNZ R0, Pussy5         ;
51
      
52
      MOV R0, #0Ch            ;
53
Zeit5:  NOP                     ;Zeitschleife für 49µs
54
      NOP
55
      NOP                     ;
56
      DJNZ R0, Zeit5          ;
57
                              ;ergibt Zyklus von 60µs
58
      SETB p1.0               ;p1.0 auf HIGH
59
      DJNZ R1, WTSlot      ;R1 decrementieren und Sprung wenn R1 != 1
60
61
;*********Convert T*********************************************************
62
63
      CLR C                   ;Carry-Flag löschen
64
      MOV R1, #08h          ;In Register R1 8Hex schreiben => 8Bit
65
      MOV A, #44h             ;In Akku 44Hex schreiben => Convert T
66
Blubb:  CLR p1.0                ;p1.0 auf LOW
67
      NOP
68
      NOP
69
      
70
      RRC A              ;Akku mit Carry-Flag nach rechts rotieren
71
      MOV p1.0, C          ;Carry-Flag an p1.0 ausgeben
72
      
73
      MOV R0, #02h            ;
74
Pussy6:  NOP                     ;Zeitschleife für 7µs
75
      DJNZ R0, Pussy6         ;
76
      
77
      MOV R0, #0Ch            ;
78
Zeit6:  NOP                     ;Zeitschleife für 49µs 
79
      NOP
80
      NOP                     ;
81
      DJNZ R0, Zeit6        ;
82
                              ;ergibt Zyklus von 60µs      
83
      SETB p1.0               ;p1.0 auf HIGH
84
      DJNZ R1, Blubb        ;R1 decrementieren und Sprung wenn R1 != 1    
85
       
86
87
      JB p1.0, $          ;warten auf Bestätigung von Convert T
88
      JNB p1.0, $
89
      
90
      MOV A, #04h          
91
       LCALL cursorpos
92
       MOV A, #03h 
93
       LCALL dezaus

Ich häng mal noch den Code als Datei an.

von Wonk (Gast)


Lesenswert?

Ich wollt noch sagen, dass wir pro Bus nur einen Sensor betreiben 
(insgesamt 2).

Gruß Wonk

von Peter D. (peda)


Lesenswert?

Du liest P1.0 ein, schreibst aber auf P3.7, das kann nicht gehen.

1-Wire heißt nicht umsonst "ein draht", d.h. lesen mußt Du auch von 
P3.7.


Und wo hinein rennt das Programm am Ende ?

"SJMP $" muß ans Ende.


Das Convert-Bit hab ich nie gelesen, hab immer 1s gewartet. Bin mir aber 
ziemlich sicher, daß es so nicht geht.
Lies doch einfach mal den Device-Code aus.


Peter

von Wonk (Gast)


Lesenswert?

Hy,
also das mit dem P1.0 einlesen und p3.7 ausgeben war zu testzwecken.

Aber warum sollte das nicht gehn? Normalerweise ist es dem Sensor doch 
egal von welchem Port gelesen und geschrieben wird, oder?
Klär mich bitte auf, wenn ich falsch liege!

Das Abfragen ob die 1 von Convert T kommt, war ebenfalls nur zum 
Testzweck, ob dort überhaupt irgendwas gemacht wird! Im Normalfall 
warten wir dort auch einfach nur.

Zum Thema Leerlauf: der obige Code ist nur ein Ausschnitt. Im Anhang ist 
aber der komplette Code des Programms. Das Prog hat schon sein Ende usw.

Hoffe uns kann irgendwer weiterhelfen.

Gruß Wonk

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

moin moin,

in Anhang mal mein DS18S20 Treiber, schaut mal ob ihr davon was brauchen 
könnt.

Sorry, hab Streß auf Arbeit und nicht viel Zeit...

Mit Gruß Pieter

von Wonk (Gast)


Lesenswert?

Die sieht schonmal nicht schlecht aus, aber was ist das für ne macro.inc 
(kannst die vielleicht auch anhängen?) und was ist mit DS18S20_PORT 
gemeint.

Einmal wird das als Bit gehandhabt und das anderemal als Byte. Das 
schluckt mein µC nicht.

Dankeschön

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

moin moin,

so, nun noch mal den DS18S20.
Das Modul arbeitet mit maximal 8 Sensoren am DS18S20_PORT
Leider gibt es keinen indizierten Bitbefehle, daher der Umweg mit der 
Maske in B und den Port als Byt bearbeiten.

>Einmal wird das als Bit gehandhabt und das anderemal als Byte.
>Das schluckt mein µC nicht.

Der soll nicht schlucken, sondern das macht was im Prog steht!

Mit Gruß Pieter

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
Noch kein Account? Hier anmelden.