PIC: DS1620 uitlezen

Ik probeer de temperatuur te meten met de DS1620.
Helaas krijg ik dit nog niet voor elkaar.

Wie kan mij een zetje in de juiste richting geven ?
(De datasheet heb ik natuurlijk al gelezen)

Edit:
Zoals ik begrijp moet ik eerst een code naar de DS1620 sturen, welke code precies ?

[Bericht gewijzigd door MMSoft op zondag 4 februari 2007 18:41:03

Google vertelt me dat de DS1620 via 3-draads SPI moet aangestuurd worden, wat er allemaal exact verzonden moet worden en hoe hij daarop reageert, kan je nalezen in de datasheet.

Zoals ik het nu lees, vraag ik me af of je weet wat je doet. Gebruik je een µC, zo ja, hoe programmeer je em, met welke compiler, wat ken je van programmeren (heb je al eens een protocol geïmplementeerd),...

AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor

De DS1620 is op een PIC16F876A aangesloten.
Ik programmeer in ASM

code:



PIC          DS1620 
---          ------
RC4 ---<>--- Pen 1 (Data)
RC5 ---->--- Pen 2 (Clk)
RC6 ---->--- Pen 3 (RST)

Edit:
Als ik het goed begrijp moet er eerst een (configuratie) code naar de Sensor worden gestuurd, maar welke (er staan zoveel codes in de datasheet) ?

AAh = Read Temperatuur
EEh = Start Convert
En zo staat er een lijstje met codes in de datasheet.
Ik ben hier mee bezig geweest, maar krijg geen (werkend) begin.

[Bericht gewijzigd door MMSoft op zondag 4 februari 2007 21:10:52

Als je enkel de temperatuur wil uitlezen, moet je eerst 0xEE (start convert) versturen, en even later 0xAA (read temperature). Hierna zal de DS1620 op het ritme v/d klokpulsen bit-voor-bit de gemeten temperatuur doorgeven.

Oh, ja, bij het doorspelen van opdracht-code's naar de DS1620 maak je eerst RST hoog.

[Bericht gewijzigd door pros op zondag 4 februari 2007 21:03:40

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

De Temperatuur staat in 9 bits.

Moet ik 9 bits uitlezen, of 2 woorden (dus 16 bits) ?

Hoelang moet ik wachten tussen 0xEE (start convert) en 0xAA (read temperature) ?
Kan/moet ik afvragen of de conversie klaar is ?

Moet ik de opdrachten 'start convert' en 'read temperature' telkens geven als ik de temperatuur (die gewijzigd kan zijn) afvraag ?

Als ik naar m'n code kijk, zie ik dat er 16 bits worden uitgelezen. Dat is wel een valstrik, omdat de dummy-bits allemaal 0 zijn. Bij negatieve temperaturen krijg je dan bv. 00000001 11111111 (-1/2°C) waar je zelf 11111111 11111111 van moet maken om het in een signed int te plaatsen.
Verder duurt een temperatuurmeting gemiddeld 200mS en max. 500mS (heb je die datasheet wel helemaal gelezen?). Je kan de DS1620 ook opdragen continu de temperatuur te meten, dan kan je hem uitlezen als het je past (nadat je "read temperature" hebt opgegeven). Daarvoor moet je het configuration-register aanpassen (eerst 0x0C doorsturen, gevolgd door de 8 configuratie-bits). In single-shot mode moet je dit telkens laten voorafgaan door een "start convert" opdracht.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Bedankt, ik ga er morgenavond mee bezig...

Omdat ik totaal geen respons krijg van de DS1620, hier een stukje code:

code:



INIT            BCF        PORTC,6          ;Reset
                BSF        PORTC,5          ;Klok
                BSF        PORTC,4          ;Data



DS1620out       BCF        STATUS,RP0       ;Select Bank 0
                MOVWF      Tempw1           ;Save the char to send
                MOVLW      D'8'             ;Number of bits to send
                MOVWF      C2               ;	
                BCF        PORTC,4          ;Data

DSoutloop1      BCF        PORTC,5          ;Klok
                NOP                         ;
                BCF        PORTC,4          ;Data 
                BTFSC      Tempw1,0         ;Test the next bit to send
                BSF        PORTC,4          ;Data
                RRF        Tempw1,F         ;rotate the next bit in
                BSF        PORTC,5          ;Klok
                DECFSZ     C2,F             ;
                GOTO       DSoutloop1       ;		
                RETURN                      ;



DS1620in        BCF        STATUS,RP0       ;Select Bank 0
                MOVLW      D'8'             ;Number of bits to receive
                MOVWF      C2               ;	
                BSF        PORTC,4          ;Set Data for input.

DSinloop1       BCF        PORTC,5          ;Klok
                BCF        STATUS,C         ;Clear for rotate
                BTFSC      PORTC,4          ;Transfer DATA to the carry flag
                BSF        STATUS,C         ;Set carry if DATA is a 1
                RRF        Tempw1,F         ;rotate the next bit into the top of txout
                BSF        PORTC,5          ;Klok
                DECFSZ     C2,F             ;Output 8 bits
                GOTO       DSinloop1        ;		
                MOVF       Tempw1,W         ;Save the char received
                RETURN                      ;


PIC          DS1620 
---          ------
RC4 ---<>--- Pen 1 (Data)
RC5 ---->--- Pen 2 (Clk)
RC6 ---->--- Pen 3 (RST)

Klopt deze code ?
C4 als ingang ingesteld.
C5 en C6 als uitgang.

Moeten er pullup weerstanden gebruikt worden ?

Om met de laatste vraag te beginnen: er staan bij mij wel afsluitweerstanden op het DS1620-printje, maar da's omdat er 15m kabel te overbruggen valt. Pull-up weerstanden zijn niet echt nodig, denk ik.
Nu wat die code betreft: 't is allemaal een beetje potjeslatijn voor me, maar ik merk wel dat je aan het begin (INIT) de RST-lijn laag maakt (da's OK), maar dat je er verder niets mee doet. Het is wel degelijk de bedoeling dat je de RST-lijn hoog maakt, voor je met de CLK- en de DQ-lijnen gaat stoeien, en ze ten gepaste tijde terug laag maakt. Doe je dat niet, dan blijft het IC hardstikke doof voor al je verzoeken. Verder is het geen slecht idee om --zeker in de test-periode-- wat delay's in te bouwen. Het IC kan maar een klokfrequentie van 1.7MHz of zo aan.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Moet de RST-lijn telkens als er iets verstuurd (of ontvangen) is weer laag worden gemaakt,
Of pas aan het einde als de temperatuur data binnen ontvangen is ?

Als je het "read temperature" commando hebt verstuurt, moet de RST-lijn hoog blijven tot je alle bits hebt ingelezen. Eens je de RST-lijn laag maakt, beschouwt de DS1620 alle zaken als afgehandeld.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Ik heb er dit van gemaakt:

code:



Loop
      BSF        PORTC,6          ;Reset lijn hoog maken
                
      CALL       DELAY    

      MOVLW 0x0C
      CALL      DS1620out

      CALL       DELAY

      CALL      DS1620in
      MOVWF     Tempw1         

      CALL       DELAY
   
      CALL      DS1620in
      MOVWF     Tempw2          

      CALL       DELAY

      BCF        PORTC,6          ;Reset lijn laag maken

      
      'Temperatuur tonen'

      GOTO      Loop


Zowel de eerste bits (Tempw1) als de tweede bit reeks (Tempw2) blijven laag.

Ik doe dus nog iets verkeerd....

Met "delays inbouwen" bedoelde ik:

code:


RST hoog
delay
CLK laag
delay
Data-bit klaarzetten
delay
CLK hoog
delay
enz...
RST laag

Verder is er nog een misverstand over de "write config" opdracht (0x0C). Als je daarmee de DS1620 continu de temperatuur wil laten meten, hoef je dat maar 1 maal in te geven. Even m'n C-code vertalen:

code:


RST hoog
Verstuur 0x0C (write config)
Vestuur 0xFA (het config-byte)
RST laag
10mS wachten (config-byte moet naar eeprom)

Vanaf nu kan je op elk willekeurig tijdstip de temperatuur inlezen:

code:


Data-lijn = pic-uitgang
RST hoog
Verstuur 0xAA (read temperature)
Data-lijn = pic-ingang
Lees 16 bits
RST laag
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

De DS1620 zend nog steeds geen data terug.
Ik begin bijna te denken dat deze defect is :D

Dit is een overzicht van de code:

code:



Init:
C4 (Data) als uitgang instellen
Reset lijn Laag
Klok lijn Hoog
Data lijn Hoog
              
-------------------------------------------------

Eenmalig:
Reset lijn Hoog
Call Write 0x0C (config)      (Data is in het W register opgeslagen)
Call Write 0xFA (Config-byte) (Data is in het W register opgeslagen)
Reset lijn Laag
10ms wachten

-------------------------------------------------

Main:
Select Bank 1
C4 (Data) = Uitgang
Select Bank 0
Reset lijn hoog
DELAY
Call Write 0xAA (Data is in het W register opgeslagen)
Select Bank 1
C4 (Data) = Ingang
Select Bank 0
Call Read ;8 bits -> Data1 (Data is in het W register opgeslagen)
DELAY
Call Read ;8 bits -> Data2 (Data is in het W register opgeslagen)
Reset lijn Laag
DELAY
Data1 en Data2 weergeven
DELAY
GOTO Main

-------------------------------------------------

Write:
Select Bank 0
W-register -> Tempw1
C2 = 8 (aantal bits)

Write_Loop:

Klok-lijn Laag
Delay (7 NOP's)
DATA lijn = Tempw1,0
RRF Tempw1,F ;rotate the next bit in
Delay (7 NOP's)
Klok lijn Hoog
Delay (7 NOP's)
C2 - 1
C2 > 0 then Goto Write_Loop		

Reset lijn Laag
DELAY    
Reset lijn Hoog
RETURN 

-------------------------------------------------

Read:
Select Bank 0
C2 = 8

Read_Loop:

Klok lijn Laag
Delay (7 NOP's)
Carry flag Reset
IF C4 (Data) Then Set Carry
RRF Tempw1,F (Rotate met Carry flag)
Klok lijn Hoog
Delay (7 NOP's)
C2 - 1
C2 > 0 then Goto Read_Loop

Tempw1 -> W-register
RETURN

Wie ziet de fout ?

Als je de temperatuur wil uitlezen, begin je met de RST-lijn hoog te maken. Vervolgens stuur je 0xAA. Dan lees je 16 bit's uit. En pas dan mag je RST terug laag maken! Dus niet zo:

code:


Write:
Select Bank 0
W-register -> Tempw1
C2 = 8 (aantal bits)

Write_Loop:

Klok-lijn Laag
Delay (7 NOP's)
DATA lijn = Tempw1,0
RRF Tempw1,F ;rotate the next bit in
Delay (7 NOP's)
Klok lijn Hoog
Delay (7 NOP's)
C2 - 1
C2 > 0 then Goto Write_Loop		

Reset lijn Laag  <-!!!!
DELAY    
Reset lijn Hoog
RETURN 

Zodra je de RST-lijn laag maakt, beschouwt de DS1620 de zaak als afgedaan. Maak je de RST-lijn vervolgens weer hoog, dan gaat hij op een commando wachten, terwijl jij de temperatuur denkt uit te lezen...

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Dat zag ik in de datasheet staan, bij write data transfer op blz. 10.

Ik heb dit inmiddels verwijderd, maar helaas werkt het nog niet.

Edit:
Data1 = 136 Dec
Data2 = 1 Dec
Deze waardes krijg ik continu, ook als ik de sensor afkoel tot onder 0 graden Cel.

[Bericht gewijzigd door MMSoft op dinsdag 6 februari 2007 21:59:41

Je hebt blijkbaar een andere handleiding dan ik, want hier is dat protocol op pag. 7 terug te vinden. Hoe dan ook, zowel bij lezen als bij schrijven blijft de aanpak hetzelfde:

code:


RST hoog
protocol schrijven (0x0C, 0xAA of iets anders)
data lezen of schrijven (na 0x0C 0xFA schrijven, of na 0xAA 16 bits lezen)
RST laag

Desnoods knoop je LED'jes aan de signaallijnen (via een tor) en verleng je de delay's tot 1 sec, zodat je een visuele indicatie hebt.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Wat ik ook stuur, ik zie nog steeds geen respons (Data lijn veranderd niet van status).
Ik krijg steeds meer de indruk dat er geen leven zit in deze sensor !
Er is een kleine kans dat ik deze sensor de eerste keer verkeerd heb aangesloten.

Mocht iemand een goed werkend stukje code willen posten, dan kan ik weer een stukje uitsluiten.
(Liefst ASM voor een PIC uit de 16 serie, maar C of basic is ook geen probleem).

Als je de voedingsspanning omgewisseld hebt, of er 20V op gezet hebt, zal 'm wel stuk zijn. Maar verder zijn dat robuuste dingen, naar mijn bevinding. Wat komt er op z'n DQ-lijn tijdens het uitlezen?

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Hoezo, "niets"? Het spanningsniveau moet toch ergens tussen 0V en 5V liggen?

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Continu laag, dus niets 'geen data'

Koppel die lijn eens af van je µC, plaats een pull-up weerstand, en meet dan nog eens. Dan ben je er zeker van, dat de µC geen roet in het eten gooit.

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)

Ik ben nu weer zover dat ik data terug krijg.

Het zijn weer de waardes:
Data1 = 136 Dec
Data2 = 1 Dec

Welke temperatuur de sensor ook is, de waardes veranderen niet.....

Laatste poging: heeft iemand een stukje code, zodat ik daarmee nog kan testen ?

Je hebt toevallig geen avr in de schuif liggen? Of eentje die je kan lenen (en programmeren) bij een kennis?

Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)