Forum: Mikrocontroller und Digitale Elektronik PIC16F872 ds18s20


von Hans G. (h-georg)


Angehängte Dateien:

Lesenswert?

Hey,
vielleicht kann mir einer von euch Helfen.
Mache grad erste Schritte mit dem PIC16F872 in Assambler(C ist ein 
schwarzes Buch für mich) und wollte jetzt den DS18S20 erstmal auslesen 
und im Hyperterminal ausgeben.
Geplant ist vorerst:
      Wenn ich am Hyperterminal "t" eingebe, soll der DS18S20 ausgelesen
      werden und dies dann im HT angezeigt werden!

Hab schon 2mal die .asm neugeschrieben, dann im i-net nach Hilfe 
gesucht.
Einig versuche abgekupfert nochwas bei gefügt und am ende alles so 
verbaut das ich alles nochmal neu gemacht hab. Nach jetzt schon 3 
Nächten..... bin ich jetzt schon kurz vor dem Aufgeben:( !!!!  Dachte 
die com.inc is falsch und hab mal schnell eingefügt das, wenn ich "q" 
eingebe mir "ok" ausgegeben wird und.... siehe da das geht! Aber bei dem 
"t" befehl für's auslesen und anzeigen der Temperatur geht nichts|-(
Die .asm Datei leg ich mal dabei vielleicht sieht einer von euch den 
Fehler den ich schon so oft übersehen habe.

Muss ich eigentlich diesen CRC berechnen und abgleichen?!
Hoffe das noch irgendeiner diesen 16f872 benuzt oder wird der so selten 
gebraucht das ich mich doch für den falschen entschieden hab??Kenn mich 
noch nicht so gut aus aber das wird wohl mit der Zeit kommen;)

von Severino R. (severino)


Lesenswert?

[asm]
HP:   call     empf    ;HT abfragen
      movfw  datum
      xorlw  'q'
      btfss    STATUS,Z    ;wenn "q" aus Hypert. schreib ok zur�ck
      goto    _1      ;sonst pr�fe auf t
      ...
      ...
_1:   call    empf    ; <--------- hier empfängst Du nochmals
                      ; statt das vorher empfangene Zeichen auf 't' zu
                      ; prüfen
      movfw  datum
      xorlw  't'
      btfss    STATUS,Z    ;wurde t im Hyperterminal gedr�ckt?
[/asm]

Dies ist mal ein erster Punkt. Vielleicht liegt's aber nicht nur daran.

Wo ist eigentlich das Label empf ?

> Muss ich eigentlich diesen CRC berechnen und abgleichen?!
Welchen CRC und was abgleichen?

> Hoffe das noch irgendeiner diesen 16f872 benuzt oder wird der so selten
> gebraucht das ich mich doch für den falschen entschieden hab??
Ist nicht gerade sehr verbreitet. Microchip empfiehlt für neue 
Anwendungen den PIC16F882. Leider hat keiner der beiden einen UART, was 
für die serielle Kommunikation mit dem PC ideal wäre.
Nächstes Mal würde ich einen PIC16F886 nehmen, oder wenn der für gewisse 
Distributoren noch immer zu neu ist (gibt's seit > 2Jahren), dann den 
PIC16F876A.

> Kenn mich noch nicht so gut aus aber das wird wohl mit der Zeit kommen.
Kommt schon noch, aber nicht von alleine.
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1469
http://www.sprut.de
http://www.fernando-heitor.de

von Hans G. (h-georg)


Lesenswert?

Hey danke für die schnelle Antwort und die Links. Zwei davon hab ich 
schon komplett durch gesucht aber den dritten werd ich mir auch noch 
rein ziehn

>  _1:   call    empf    ; <--------- hier empfängst Du nochmals
>                        ; statt das vorher empfangene Zeichen auf 't' zu
>                        ; prüfen

Hast recht müsste ja nur "datum" nochmal in "w" laden, da das w-register 
ja durch die xorlw 'q' verändert wird

Dachte nur CRC müsste ich auch berechnen und abgleichen (Datenblatt 
DS18S20 s.8) klammer mich gard an jede noch so kleine Idee

Ja die große Wahl hatte ich jetzt nicht gerade, da das so ne 
Übungsplatiene von der Schule ist, aber ich versuch was draus zu 
machen:-) da ich bis jetzt nur den kenne und noch einiges an Erfahrung 
sammeln muß ......

von H-georg (Gast)


Lesenswert?

hey hat denn keiner mehr ne idee??
komm irgendwie nicht weiter!
ist das jetzt im ansatz richitg oder hab ich das alles falsch verstanden 
und muss noch irgendwelche register setzten, lesen (sspie) oder.......
muss ich den pic in master mode setzten?? oder nur den portc,0 setzten 
nicht setzten dabei lesen und schreiben??
wäre für n paar tipps dankbar da mir jtzt fast jeder ansatz fehl:-(

von Severino R. (severino)


Lesenswert?

H-georg wrote:

> und muss noch irgendwelche register setzten, lesen (sspie) oder.......
> muss ich den pic in master mode setzten?? oder nur den portc,0 setzten
> nicht setzten dabei lesen und schreiben??

Warum versuchst Du es nicht und schaust, ob es dann geht?
Der Lerneffekt ist dabei sicher am grössten.

Oder schaust auf http://www.gidf.de nach, ob jemand schon mal einen 
ds18s20 mit einem PIC angesteuert hat.

von Chris (Gast)


Lesenswert?

Hallo, du verwendest wilde Nebeneffekte,
als Beispiel, habe danach nicht mehr weitergelesen.

>sende_byte:  movwf  iobyte  ;w-register speichern
>      movlw  .8
>      movwf  count  ;zaehler f�r die 8 bit
count ist in bank 0

>sende_loop:  dq_low
>      nop
>      nop
>      nop
>      rrf    iobyte,f    ;1bit in carry laden

>      bsf     STATUS,RP0
diese Zeile gehört raus, dann funktioniert es!!!

>      btfsc    STATUS,C
>      bsf    TRISC,0
>      bcf    STATUS,RP0
>      wait    .60
wait .70 sollte es eigentlich heissen.

>      dq_hi
>      nop
>      nop
>      decfsz  count,f
hier verwendest du die Variable in Bank1 !!!

>      goto    sende_loop
>      retlw  0

von H-georg (Gast)


Lesenswert?

@ Severino
danke aber bei google hab ich schon gesucht wie n wilden.... dachte hier 
bekomm ich so was wie "du musst das und das noch weglassen oder zeiten 
sind falsch und zu wenig..." n paar tips halt! erwarte ja keine fertige 
asm die ich mir auf n pic hau und gut is!

 @ Chris
danke dir chris! bin grad im Urlaub aber wenn ich zuhasue bin werd ich 
das mal direkt versuchen! dachte ich hab da n paar zeiten falsch bzw. 
muss keine reinnehmen da der pic eigentlich die zeiten vorgibt oder? 
Taktung!? muss ich auf die zeiten von dem ds18s20 achten 
read/write-time-slot?

noch ne frage kann der pic was mit dem befehl anfangen?

>wait:    macro  time      ;verzögerung in 5us schritten
>    movlw  (time/5)-1
>    movwf  tmp0

movlw (time/5)-1:
         rechnet der da echt??

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Also der µC rechnet da nichts. Der lädt nur eine Konstante nach w. Aber 
der Assembler versucht zur Laufzeit des Kompilers (also wenn er das 
Programm kompiliert) diesen Konstrukt aufzulösen. Und der rechnet dann 
eine Konstante aus, welche im Code gespeichert wird. Wäre time=10, dann 
würde der Kompiler (10/5)-1 =1 ausrechnen und den Befehl movlw 1 in den 
µC schreiben.

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.