Stuck in programming a DATA LOGGER DS1922

Status
Not open for further replies.

didyi

Newbie level 4
Joined
Apr 30, 2016
Messages
6
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
64
Hi everyone
i'm on a project about the communcation 1 Wire
i have a DS1922 that i have to run.
i did a script for a " Search Rom " commande to identify the ID and display it on the LCD.
it worked fine.
now i'm doing a MATCH ROM with the ID that i found,
i'm just looking for a simple code to for example to mesure the temperature every 30 sec and display it on the LCD.
can anyone help me with that, i looked on the datasheet and i couldn't understand how to do that.
I'm using MPLAB IDE V 8.92 and PIC16F690
in the attatchement you'll find a picture of the ID and the script that i used to do that
the ID of the DS1922 : 414D843400000057
Code:
; définition des registres
#include p16f690.inc
#include Adressage.inc
   
 





 
   org 0x00

   call INIT
   call INITLCD
   clrf ADD_OCT1_DS1922
   clrf ADD_OCT2_DS1922
   clrf ADD_OCT3_DS1922
   clrf ADD_OCT4_DS1922
   clrf ADD_OCT5_DS1922
   clrf ADD_OCT6_DS1922
   clrf ADD_OCT7_DS1922
   clrf ADD_OCT8_DS1922
  



work
   goto Debut 

   
   
 
PIO
   call LCD_CLEAR
   movlw 0x00
   call LCD_Position
   movlw ADD_OCT1_DS1922
   movwf FSR
   call Cycle_Write
   call Wait_enter
   goto work 

INIT
  bcf STATUS,RP0
  bcf STATUS,RP1 ; Selection bank 
  clrf PORTA ; init PORTA
  clrf PORTB ; Init PORTB
  clrf PORTC ; Init PORTC
  clrf ANSEL ; PORTC digital IO
  clrf ANSELH ; PORTB digital IO
  
  bsf STATUS,RP0 ; Selection bank 1
  clrf ANSEL ; 
  bsf STATUS,RP1 ; Selection bank 2
  movlw 0x00 ;Parametrage PORTA
  movwf TRISA
  movlw 0x00 ; Parametrage PORTB 0x_0
  movwf TRISB
  movlw 0xF0 ; Parametrage PORTC 0xF_
  movwf TRISC
  bcf STATUS,RP0 ; Bank 0
  bcf STATUS,RP1 
  
  return
INITLCD 

  bsf STATUS,RP0 ; Selecion bank1
  movlw 0XF0 ;PORTC Output
  movwf TRISC
  bcf STATUS,RP0

  bcf PORTA,LCD_E ;//E=1
  bcf PORTB,LCD_RS ;// RS=0 
  movlw .30
  movwf CPT_Timer 
  call wait
        ; Attente min de 30 ms

  movlw 0X33 ; // $3 LCD (mode 8 bits)
  movwf PORTC 
  call LCD_TOP ;
  movlw .15
  movwf CPT_Timer ; // Attente 15 ms
  call wait
    

  movlw 0X33 ; // $3 LCD (mode 8 bits)
  movwf PORTC
  call LCD_TOP
  movlw .15
  movwf CPT_Timer ; // Attente 15 ms
  call wait
   ; // Attente 15 ms

  movlw 0X33 ;// $3 LCD (mode 8 bits)
  movwf PORTC
  call LCD_TOP
  movlw .15
  movwf CPT_Timer ; // Attente 15 ms
  call wait

  movlw 0X32 ; // $2 LCD ( mode 4 bits)
  movwf PORTC
  call LCD_TOP

  movlw 0X32 ;/ $2 LCD
  movwf PORTC
  call LCD_TOP

  movlw 0X38 ;// $8 LCD affichage 5*7
  movwf PORTC
  call LCD_TOP

  movlw 0X30 ; // $0 LCD
  movwf PORTC
  call LCD_TOP

  movlw 0X31 ; // $1 LCD
  movwf PORTC
  call LCD_TOP

  movlw 0X30 ;// $0 LCD 
  movwf PORTC
  call LCD_TOP

  movlw 0X0F ;// $F LCD
  movwf PORTC
  call LCD_TOP

  movlw 0X30 ;// $0 LCD
  movwf PORTC
  call LCD_TOP

  movlw 0X36 ;// $6 LCD déplacement vers la droite
  movwf PORTC
  call LCD_TOP
 
  bsf PORTB,LCD_RS

  bsf STATUS,RP0 ; // selection bank
  movlw 0XFF ; // PORTC INPUT
  bcf STATUS,RP0
  return

Cycle_Write
  movf INDF,0 ; INDF dans w
  call Conv_ASCII
  movf ASCII_1,0
  call LCD_Write ; appel de la fonction LCD_WRITE permettant d'écrire le caractère sur le LCD 
  movf ASCII_2,0
  call LCD_Write
  incf FSR, 1 ; incrémentation du pointeur FSR
  bcf STATUS,0 ; Reset Carry
  
  movf FSR,0 ; pointeur FSR<0x3F
  sublw 0x7F ; pointeur FSR<0x3F
  btfsc STATUS, 0 ; test de la carry
  goto Cycle_Write ; si FSR<0x3F 

  return

Conv_ASCII

  movwf ASCII_1
  movwf ASCII_2

  swapf ASCII_1,1

  movlw 0x0F
  andwf ASCII_1,1
  andwf ASCII_2,1

 
  bcf STATUS,0
  movf ASCII_1,0
  sublw 0x09
  btfss STATUS,0
  call conv_superieur_1
  call conv_inferieur_1

  bcf STATUS,0
  movf ASCII_2,0
  sublw 0x09
  btfss STATUS,0
  call conv_superieur_2
  call conv_inferieur_2

  return 

conv_inferieur_1 
  movlw 0x30
  addwf ASCII_1,1
  return
conv_superieur_1
  movlw 0x07
  addwf ASCII_1,1
  return
conv_inferieur_2
  movlw 0x30
  addwf ASCII_2,1
  return
conv_superieur_2
  movlw 0x07
  addwf ASCII_2,1
  return
; -----------------------------
; front E
; ---------------------------------

LCD_TOP 
  bsf PORTA,LCD_E ; E=1
  call attente2ms ; appel de la fonction permettant de créer une temporisation de 2ms
  bcf PORTA,LCD_E ; E=0
  return

attente2ms

  clrf CPT_Timer ; Reset du compteur CPT_TIMER
  movlw .199 
  movwf CPT_Timer ; CPT_TIMER=399*5µs+5µs soit 2ms
  nop
  nop
  nop
  nop
  nop
  call delay_LCD ; appel de la fonction permettant d'attendre 5µs
  return

delay_LCD
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  decfsz CPT_Timer,1
  goto delay_LCD
  return
; ---------------------------------------
; CLEAR LCD
; -------------------------------

LCD_CLEAR
  bcf PORTB,LCD_RS ; RS=0 mode commande
  movlw 0x00
  movwf PORTC ; PORTC=0x00
  call LCD_TOP ; Appel de la fonction permettant d'envoyer le front montant de E
  movlw 0x01 
  movwf PORTC ; PORTC=0x01
  call LCD_TOP ; Appel de la fonction permettant d'envoyer le front montant de E

  bsf PORTB,LCD_RS ; RS=1 mode Ecriture
  return 

; ------------------------------
; Envoie une lettre LCD
; ------------------------------

LCD_Write
  movwf vartemp1 ; vartemp1 w
  movwf vartemp2 ; vartemp2 w
 
  swapf vartemp1, f ; inversion des quartet
    
  movlw 0x0F ;MASQUE
  andwf vartemp1, f ;Applique le masque (valeur dans w) sur vartemp1 et stock dans vartemp1 0000 | B7 B6 B5 B4 
 
  movf vartemp1, w ;Charge dans w le contenu de vartemp1

  movwf PORTC ;Ecrit ce qui est dans w sur le port B
  
  call LCD_TOP ; Appel de la fonction permettant d'envoyer le front montant de E
 
  movlw 0x0F ;MASQUE
  andwf vartemp2, f ;Applique le masque (valeur dans w) sur vartemp2 et stock dans vartemp2 0000 | B3 B2 B1 B0
  movf vartemp2, w ;Charge dans w le contenu de vartemp1
  movwf PORTC ;Ecrit ce qui est dans w sur le port B 
 
  call LCD_TOP ; Appel de la fonction permettant d'envoyer le front montant de E 
 
  return
;------------------------------
;envoie une position LCD
;------------------------------
LCD_Position

  bcf PORTB,LCD_RS ;RS = 0,mode commande
 
  movwf vartemp1 ;Charge dans vartemp1 le contenu de w qui est une position au format 8 bits
  movwf vartemp2 ;Charge dans vartemp2 le contenu de w qui est une position au format 8 bits
 
  swapf vartemp1, f ;On inverse les quartets dans vartemp1 et on les replace dans vartemp1
         ;B7 B6 B5 B4 | B3 B2 B1 B0 deviens B3 B2 B1 B0 | B7 B6 B5 B4
  movlw 0x0F ;Charge le masque B'00001111' dans w
  andwf vartemp1, f ;Applique le masque (valeur dans w) sur vartemp1 et stock dans vartemp1 0000 | B7 B6 B5 B4
  movf vartemp1, w ;Charge dans w le contenu de vartemp1
  movwf PORTC 
 
  call LCD_TOP ; Appel de la fonction permettant d'envoyer le front montant de E 
 
  movlw 0X0F ;Charge le masque B'00001111' dans w
  andwf vartemp2, f ;Applique le masque (valeur dans w) sur vartemp2 et stock dans vartemp2 0000 | B3 B2 B1 B0
  movf vartemp2, w ;Charge dans w le contenu de vartemp1
  movwf PORTC 
 
  call LCD_TOP ; Appel de la fonction permettant d'envoyer le front montant de E 
 
  bsf PORTB,LCD_RS ;RS = 1, On passe en mode écriture
 
  return

; Fonction INC permettant de mettre la valeur dans le registre pointé puis d'incrémenter le pointeur 
INC 
  movwf INDF ; transfert la valeur de w dans le INDF, soit dans le registre pointé
  incf FSR,1 ; Incrémentation du pointeur
  return


; TEMPORISATION
wait
  movlw .100
  movwf CPT_milli
  call Micro_10
  decfsz CPT_Timer,1
  goto wait
  return 

; excécute CPT_milli*10µs
Micro_10
  nop
  nop
  nop
  nop
  nop
  nop
  nop
  decfsz CPT_milli,1
  goto Micro_10
  return

Wait_enter 
  bsf STATUS,RP0 ; Output
  movlw 0xF0; 
  movwf TRISC 
  bcf STATUS,RP0
  movlw 0x0B
  movwf PORTC
  
    

SCAN_COL_L1
  btfsc PORTC,Col1 ; Test de colonne 1
  goto SCAN_COL_L1 

Wait_enter_1 
  btfss PORTC,Col1
  goto Wait_enter_1 

  bcf PORTC,Lin1
  bsf STATUS,RP0 ; Output
  movlw 0xF0 
  movwf TRISC 
  bcf STATUS,RP0
  return 

; 1 WIRE

;------------------------------------------------------------------------------------------------------------------------
 
Debut
      
   call RA5_OUT
   call RESET_MASTER
   
   call RA5_IN
   call wait_0slave


   call RA5_OUT
   call SEARCH_ROM_ACTION 

   movlw 0x08
   movwf CPT_DEC
   
   movlw 0x41
   movwf ADD_OCT8_TEMP3 ; La gestion du conflit

Acquisition
 

  movlw ADD_OCT8_DS1922 ;Le premier registre est mit dans le FSR
  movwf FSR
  movlw 0


loop_1 
  call TEST
  decfsz CPT_DEC,1 ; La loop est executer 8 fois pour remplir l'octet de la premiere adresse
  goto loop_1
  decf FSR,1 ;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT2_DS1922 
  movlw 0x08
  movwf CPT_DEC

loop_2 call TEST
  decfsz CPT_DEC,1 ; La loop est executer 8 fois pour remplir l'octet de la premiere adresse
  goto loop_2
  decf FSR,1 ;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT3_DS1922 
  movlw 0x08
  movwf CPT_DEC

loop_3 
  call TEST
  decfsz CPT_DEC,1 ; La loop est executer 8 fois pour remplir l'octet de la premiere adresse
  goto loop_3
  decf FSR,1 ;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT4_DS1922 
  movlw 0x08
  movwf CPT_DEC

loop_4 call TEST
  decfsz CPT_DEC,1 ; La loop est executer 8 fois pour remplir l'octet de la premiere adresse
  goto loop_4
  decf FSR,1 ;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT5_DS1922 
  movlw 0x08
  movwf CPT_DEC

loop_5 call TEST
  decfsz CPT_DEC,1 ; La loop est executer 8 fois pour remplir l'octet de la premiere adresse
  goto loop_5
  decf FSR,1 ;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT6_DS1922 
  movlw 0x08
  movwf CPT_DEC

loop_6 call TEST
  decfsz CPT_DEC,1 ; La loop est executer 8 fois pour remplir l'octet de la premiere adresse
  goto loop_6
  decf FSR,1 ;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT7_DS1922 
  movlw 0x08
  movwf CPT_DEC

loop_7 call TEST
  decfsz CPT_DEC,1 ; La loop est executer 8 fois pour remplir l'octet de la premiere adresse
  goto loop_7
  decf FSR,1 ;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT8_DS1922 
  movlw 0x08
  movwf CPT_DEC

loop_8 call TEST
  decfsz CPT_DEC,1 ; La loop est executer 8 fois pour remplir l'octet de la premiere adresse
  goto loop_8
  movlw 0x08
  movwf CPT_DEC 
  goto PIO

TEST
 call RA5_OUT
 bcf PORTA,5
 call RA5_IN 

 btfsc PORTA,5 ; test si le bite recu est un 1
 bsf ADD_OCT8_TEMP3,7 ;Sur l'instruction au dessus on recoit un 0, donc on va tester si tous les bits barres sont a 1 si non, on gardera le contact avec les appareilles dont le bit est a 0
 btfss PORTA,5 ;test si le bit est a 0.
 bcf ADD_OCT8_TEMP3,7 ;Dans ce cas la valeur barre est egal a 1 et donc tout les bits sur la ligne sont egal a 0 on va les enregistrer
 movlw .12
 movwf tempo
 call delay_1
     
 call RA5_OUT
 bcf PORTA,5
 call RA5_IN

 btfsc PORTA,5
 bsf COMPLEMENT,7
 btfss PORTA,5
 bcf COMPLEMENT,7
 movlw .12
 movwf tempo
 call delay_1

 call RA5_OUT
 btfss ADD_OCT8_TEMP3,7 ; on va tester si le bit qui vient d'etre stocké dans la carry et decalé en 7 est un 0 ou un 1
 call C_0 ; on va comparer 0 a son bit commuté
 btfsc ADD_OCT8_TEMP3,7
 call C_1
 movlw .12
 movwf tempo
 call delay_1
   
 return
 

BIT_1

 bsf STATUS,C
 rrf INDF,1
 return

BIT_0

 bcf STATUS,C
 rrf INDF,1
 return

C_0
 btfsc COMPLEMENT,7
 call WRITE_0
 btfss COMPLEMENT,7
 call Conflit ;Le conflit est ICI
 return
C_1
 btfss COMPLEMENT,7
 call WRITE_1
 btfsc COMPLEMENT,7
 call Conflit ;Le Conflit est ici
 return



Conflit
 bcf STATUS,C
 rrf ADD_OCT8_TEMP3,1
 btfss STATUS,C
 call WRITE_0
 btfsc STATUS,C
 call WRITE_1 
 return

SEARCH_ROM_ACTION

 movlw 0x08
 movwf CPT_DEC
 movlw 0xF0 ; w=0xF0
 movwf SEARCH_ROM ; SEARCH_ROM=0xF0
 movlw SEARCH_ROM ; w= add SEARCH_ROM
 movwf FSR ; FSR=add SEARCH_ROM
 movlw 0
 call DEC_WRITE
 return
 
DEC_WRITE
 
 bcf STATUS,0 ; Clear Carry
 rrf INDF, 1 ; décalage à droite
 btfss STATUS,C ; Test de la carry
 call WRITE_0_D ; si =0
 btfsc STATUS,C
 call WRITE_1_D ; si =1
 decfsz CPT_DEC,1
 goto DEC_WRITE 
 return

WRITE_1
 bsf STATUS,C
 rrf INDF,1
 bcf PORTA,5 ; RA5=0
 nop ; a 0 pendant us
 nop 
 nop
 nop
 nop
 bsf PORTA,5 ; RA5=1
 movlw .15
 movwf tempo
 call delay_1
 return


WRITE_0
 bcf STATUS,C
 rrf INDF,1
 bcf PORTA,5 ; RA5=0
 movlw .13 
 movwf tempo; W*10µs
 call delay_1
 bsf PORTA,5
 movlw .1
 movwf tempo
 nop 
 call delay_1
 return

WRITE_1_D

 bcf PORTA,5 ; RA5=0
 nop ; a 0 pendant us
 nop 
 nop
 nop
 nop
 bsf PORTA,5 ; RA5=1
 movlw .15
 movwf tempo
 call delay_1
 return


WRITE_0_D

 bcf PORTA,5 ; RA5=0
 movlw .13 
 movwf tempo; W*10µs
 call delay_1
 bsf PORTA,5
 movlw .1
 movwf tempo
 nop 
 call delay_1
 return


delay_1

 nop
 nop
 decfsz tempo,1
 goto delay_1
 return


RA5_IN

 
 bsf STATUS,RP0 ;bank 1
 bcf STATUS,RP1
 bsf TRISA,5 ;input
 bcf STATUS,RP0
 return

RA5_OUT

 bsf STATUS,RP0 ;bank 1
 bcf STATUS,RP1
 bcf TRISA,5 ;output
 bcf STATUS,RP0
 bsf PORTA,5
 return

RESET_MASTER

 bcf PORTA,5 ;RA5=0
 movlw .60 ;600 usec
 movwf tempo
 call delay
 return

delay ; W*10
 nop
 nop
 nop
 nop
 nop
 nop
 nop
 decfsz tempo,1
 goto delay ; realisation de multi 60*10 donc 600usec
 return



wait_0slave
   btfsc PORTA,5 ; Test si l'entrée RA5 est à 1 donc l'esclave qui communique avec le maitre
   goto wait_0slave
wait_1slave 
   btfss PORTA,5
   goto wait_1slave
   movlw .60 ;600 usec
   movwf tempo
   call delay
   return 
 
 
 end 
Forward  Edit   #1

 
Last edited by a moderator:

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…