didyi
Newbie level 4
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
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: