www.mikrocontroller.net

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


Autor: Wonk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.:
  include C51ED2.inc  ;Registeradressen einbinden
 
 EXTERN CODE initLCD,loeschen,loeschzeile1,loeschzeile2,textzeile1,textzeile2,cursorpos
 EXTERN CODE textaus,zifferaus,hexaus,dezaus
 
      code at 0        
       CLR p3.0               ;
       CLR p3.1               ;
       CLR p3.2               ;
       CLR p3.3               ; Port 3 Auf 0 setzen
       CLR p3.4               ;
       CLR p3.5               ;
       CLR p3.6               ;
       SETB p1.0
       LCALL initLCD          ;LCD initialisieren
       LCALL loeschen         ;LCD löschen
             
;*********Sensor Initialisieren********************************************************       
    ;public start:

Start1:  CLR p1.0            ;Sensor resetten
      MOV R0, #0A0h        ;
Zeit1:  NOP                     ;Zeitschleife für 480µs
      DJNZ R0, Zeit1          ;
      
      SETB p1.0               ;p1.0 auf HIGH

      JB p1.0, $          ;Warten auf Presence Pulse
      JNB p1.0, $             ;
      
      MOV A, #04h          
       LCALL cursorpos
       MOV A, #03h 
       LCALL dezaus
      
;*********Scip ROM*********************************************************      
             
      CLR C              ;Carry-Flag löschen
      MOV R1, #08h            ;In Register R1 8Hex schreiben => 8Bit
      MOV A, #0CCh            ;In Akku CCHex schreiben => SkipROM
WTSlot:  CLR p1.0                ;p1.0 auf LOW
      NOP
      NOP
      
      RRC A              ;Akku mit Carry-Flag nach rechts rotieren
      MOV p1.0, C          ;Carry-Flag an p1.0 ausgeben  
                              
      MOV R0, #02h            ;
Pussy5:  NOP                     ;Zeitschleife für 7µs
      DJNZ R0, Pussy5         ;
      
      MOV R0, #0Ch            ;
Zeit5:  NOP                     ;Zeitschleife für 49µs
      NOP
      NOP                     ;
      DJNZ R0, Zeit5          ;
                              ;ergibt Zyklus von 60µs
      SETB p1.0               ;p1.0 auf HIGH
      DJNZ R1, WTSlot      ;R1 decrementieren und Sprung wenn R1 != 1

;*********Convert T*********************************************************

      CLR C                   ;Carry-Flag löschen
      MOV R1, #08h          ;In Register R1 8Hex schreiben => 8Bit
      MOV A, #44h             ;In Akku 44Hex schreiben => Convert T
Blubb:  CLR p1.0                ;p1.0 auf LOW
      NOP
      NOP
      
      RRC A              ;Akku mit Carry-Flag nach rechts rotieren
      MOV p1.0, C          ;Carry-Flag an p1.0 ausgeben
      
      MOV R0, #02h            ;
Pussy6:  NOP                     ;Zeitschleife für 7µs
      DJNZ R0, Pussy6         ;
      
      MOV R0, #0Ch            ;
Zeit6:  NOP                     ;Zeitschleife für 49µs 
      NOP
      NOP                     ;
      DJNZ R0, Zeit6        ;
                              ;ergibt Zyklus von 60µs      
      SETB p1.0               ;p1.0 auf HIGH
      DJNZ R1, Blubb        ;R1 decrementieren und Sprung wenn R1 != 1    
       

      JB p1.0, $          ;warten auf Bestätigung von Convert T
      JNB p1.0, $
      
      MOV A, #04h          
       LCALL cursorpos
       MOV A, #03h 
       LCALL dezaus

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

Autor: Wonk (Gast)
Datum:

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

Gruß Wonk

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Wonk (Gast)
Datum:

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

Autor: Pieter (Gast)
Datum:
Angehängte Dateien:

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

Autor: Wonk (Gast)
Datum:

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

Autor: Pieter (Gast)
Datum:
Angehängte Dateien:

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

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.