[Programmation] Aide sur le protocole 1 wire.
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Aide sur le protocole 1 wire.



  1. #1
    didyi

    Aide sur le protocole 1 wire.


    ------

    Bonjour tout le monde
    je suis sur un projet, à base de pic16f690 j'ai une partie 1 wire, comme vous saviez il faut passer par certains commandes pour identifier un dispositif dans le cas d'une communication 1 wire.
    j'ai un code pour la commande " Search rom " il faut que je change des trucs pour que je puisse dialoguer avec le dispositif que je désire mettre en oeuvre mais ça fait maintenant 3 semaines que j'essaye sans y arriver.
    si vous pouvez m'aider ou me dire ce que je devrai faire exactement ça me sera de grande utilité et je vous serai reconnaissant.
    y a dedans des routine pour l'afficheur qu'ils ont pas utilisés.
    ce programme est pour identifier un switch branché sur la broce PortA,5 sur une maquette.
    merci
    Code:
    ; définition des registres
    #include	p16f690.inc
    #include	Adressage.inc
    			
    	
    
    
    
    
    
    	
    			org		0x00
    
    			call		INIT						; Init
    			call		INITLCD
    			clrf	ADD_OCT1_SW_IN					; Les adresses utilisées pour enregistrer les 8 octets d'adresse d'un composants
    			clrf	ADD_OCT2_SW_IN
    			clrf	ADD_OCT3_SW_IN
    			clrf	ADD_OCT4_SW_IN
    			clrf	ADD_OCT5_SW_IN
    			clrf	ADD_OCT6_SW_IN
    			clrf	ADD_OCT7_SW_IN
    			clrf	ADD_OCT8_SW_IN
    
    work
    			goto Debut	
    
    			
    			
    	
    PIO
    			call		LCD_CLEAR
    			movlw	0x00
    			call		LCD_Position
    			movlw	ADD_OCT1_SW_IN
    			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
    
    
    ;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					; Appele des fonctions Le port RA5 passe en sortie
    			call 	RESET_MASTER			; appele de Reset Master
    			
    			call 	RA5_IN					; RA5 en entrés
    			call	wait_0slave
    
    
    			call RA5_OUT					;RA5 en sortie
    			call SEARCH_ROM_ACTION 			; le sous programme qui enverra le code Search ROM F0h
    
    			movlw	0x08
    			movwf	CPT_DEC					; On met 08h dans le registre CPT_DEC, cela nous servira comme decompteur , cela nous permettra de realiser les 8 decomptage
    			
    			movlw	0x05
    			movwf	ADD_OCT8_TEMP3		; La gestion du conflit, son fonctionnement est assez simple a comprendre : Pour l'exemple 05h : Lors du premier conflit le maitre decidera de rester en communication avec de 1, le conflit suivant 0 suivant 1 le reste que des 0. Pour Faire simple A chaque conflit le 0 ou 1 envoié par le maitre  depend de votre chiffre choisi ici
    
    Acquisition
    	
    
    		movlw	ADD_OCT1_SW_IN						;Le premier registre est mit dans le FSR
    		movwf	FSR									;FSR est une adresse fictif qui va nous servire a faire suivre les 8 adresse, apres que l octet ADD_OCT1_SW_IN soit rempli, l'octet à l'adresse suivant prendra ca place
    		movlw	0
    
    ;Acquisition des 8 octets
    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						; effectue une boocle
    		incf 	FSR,1							;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT2_SW_IN	 
    		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
    		incf FSR,1							;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT3_SW_IN	 
    		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
    		incf FSR,1							;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT4_SW_IN	 
    		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
    		incf FSR,1							;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT5_SW_IN	 
    		movlw	0x08
    		movwf	CPT_DEC
    
    loop_5	call TEST
    		decfsz	CPT_DEC,1					; La loop est executer 8 fois pour remplir l'octet de ladresse
    		goto loop_5
    		incf FSR,1							;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT6_SW_IN	 
    		movlw	0x08
    		movwf	CPT_DEC
    
    loop_6	call TEST
    		decfsz	CPT_DEC,1					; La loop est executer 8 fois pour remplir l'octet de ladresse
    		goto loop_6
    		incf FSR,1							;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT7_SW_IN	 
    		movlw	0x08
    		movwf	CPT_DEC
    
    loop_7	call TEST
    		decfsz	CPT_DEC,1					; La loop est executer 8 fois pour remplir l'octet de l adresse
    		goto loop_7
    		incf FSR,1							;En incrementant FSR il va prendre le registre suivant au bout de 8 donc ADD_OCT8_SW_IN	 
    		movlw	0x08
    		movwf	CPT_DEC
    
    loop_8	call TEST
    		decfsz	CPT_DEC,1					; La loop est executer 8 fois pour remplir l'octet de l' adresse
    		goto loop_8
    		movlw	0x08
    		movwf	CPT_DEC	
    		goto PIO
    
    
    
    
    
    ;---------------------------------------------------------------------------------------Les sous programmes d'acquisition---------------------
    
    
    
    
    TEST
    	call RA5_OUT
    	bcf	PORTA,5
    	call RA5_IN	
    
    	btfsc PORTA,5					; test si le bite recu est un 1
    	bsf		ADD_OCT7_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_OCT7_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			; En repassant en sorties, metant le bit a 0 en remetant ensuite en entrée , on fait savoir à l'esclave qu 'il peut envoyer le complement
    	bcf	PORTA,5
    	call RA5_IN
    
    	btfsc 	PORTA,5 		;test du bite complement 
    	bsf	COMPLEMENT,7
    	btfss 	PORTA,5
    	bcf	COMPLEMENT,7
    	movlw	.12
    	movwf	tempo
    	call	delay_1
    
    	call 	RA5_OUT
    	btfss 	ADD_OCT7_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_OCT7_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									; Avec ce sous programme on realise un comparateur pour verifier si le bit complmement est bien realisé si non il y a un conflit sur la ligne et il que le maitre choisissent avec qui il souhaite de rester en communication
    	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			; Le conflit realise une rotation du chiffre qu'on a defini au dessus, dans l'exemple au dessus c'est un 05h, donc sur les  premiers conflit le maitre envoie 10100000
    	rrf			ADD_OCT8_TEMP3,1	; decalage a droite du bit ce qui permet de mettre le bit de pooids faible dans la carry
    	btfss		STATUS,C			; et par la suite effectué le test dessus
    	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   ;pour enregistrer la valeur Avec Write 1 on passe la valeur de la carry a 1 puis on la decale dans l'adresse qui lui sera assossiez
    	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 ;pour enregistrer la valeur Avec Write 0 on passe la valeur de la carry a 1 puis on la decale dans l'adresse qui lui sera assossiez 
    	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 5 us
    	nop     
    	nop
    	nop
    	nop
    	bsf			PORTA,5	; RA5=1
    	movlw		.15		; 70 us
    	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				;On fait passer RA5 en entrée
    
    	
    	bsf STATUS,RP0 				;bank 1
    	bcf STATUS,RP1
    	bsf	TRISA,5					;input
    	bcf STATUS,RP0
    	return
    
    RA5_OUT
    	bsf	PORTA,5
    	bsf STATUS,RP0 				;bank 1
    	bcf STATUS,RP1
    	bcf	TRISA,5					;output
    	bcf STATUS,RP0
    	
    	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						; Si on attend le pulse de presence de l'esclave
    			goto	wait_1slave
    			movlw		.60		;600 usec
    			movwf		tempo
    			call 		delay
    			return	
    	
    	
    	end

    -----

  2. #2
    gcortex

    Re : Aide sur le protocole 1 wire.


  3. #3
    didyi

    Re : Aide sur le protocole 1 wire.

    Merci pour fichier.
    je vois qu'il est en C moi je cherche en assembleur, celui là que j'ai marche parfaitement bien je cherche juste à modifier des petits trucs.
    celui que je veux communiquer avec à le ID : 000016ff608e

  4. #4
    gcortex

    Re : Aide sur le protocole 1 wire.

    tu as une procédure dans un document.
    Celle ci est très exigeante, donc normal
    que çà n'aime pas les modifications !

  5. A voir en vidéo sur Futura
  6. #5
    didyi

    Re : Aide sur le protocole 1 wire.

    Merci gcortex je vais encore essayer

  7. #6
    bobflux

    Re : Aide sur le protocole 1 wire.

    Citation Envoyé par didyi Voir le message
    je vois qu'il est en C moi je cherche en assembleur
    Et? Tu compiles la library en C et tu la link avec ton programme en asm...

Discussions similaires

  1. Le protocole 1-Wire et la commande Search ROM
    Par jonathan82 dans le forum Électronique
    Réponses: 24
    Dernier message: 27/09/2015, 08h02
  2. Aide One-wire
    Par droolz dans le forum Électronique
    Réponses: 12
    Dernier message: 10/04/2014, 18h47
  3. [Exercice] Aide pour un protocole.
    Par invite7d532bed dans le forum Biologie
    Réponses: 15
    Dernier message: 10/11/2012, 22h40
  4. Aide protocole
    Par invite409b5490 dans le forum Chimie
    Réponses: 1
    Dernier message: 12/05/2011, 23h21
  5. Protocole One wire
    Par Tupac Shakur dans le forum Électronique
    Réponses: 0
    Dernier message: 01/06/2010, 10h00
Découvrez nos comparatifs produits sur l'informatique et les technologies.