Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

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

LCD.jpg
 
Last edited by a moderator:

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top