Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
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
je cherche juste à modifier des petits trucs.
le dispositif avec qui je voudrai communiquer à le ID : 000016ff608e
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
- ; 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
je cherche juste à modifier des petits trucs.
le dispositif avec qui je voudrai communiquer à le ID : 000016ff608e
Aide sur le protocole 1 wire.
Aide sur le protocole 1 wire.
Aide sur le protocole 1 wire.
Bonsoir,
En plus des ~500 lignes de code assembleur, je/nous serai/serions intéressé/intéressés par le code du fichier inclus: Adressage.inc, ce qui me/nous permettrait de produire un assemblage sans erreur voire simuler le programme généré...
Quant au fichier p16f690.inc, je/nous pense/pensons pouvoir me/nous débrouiller tout seul ;-)
En plus des ~500 lignes de code assembleur, je/nous serai/serions intéressé/intéressés par le code du fichier inclus: Adressage.inc, ce qui me/nous permettrait de produire un assemblage sans erreur voire simuler le programme généré...
Quant au fichier p16f690.inc, je/nous pense/pensons pouvoir me/nous débrouiller tout seul ;-)
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
Aide sur le protocole 1 wire.
Aide sur le protocole 1 wire.
Jérémy a écrit :Yop,
Afin de trop rechercher, je vous propose d'attendre une réponse de l'auteur , voir si le fil est suivi ! cela évitera de travailler pour rien
Dommage un fil en ASM
Mais si nous lit, je veux bien, l'aider à poursuivre la chose, avec LUI.Mais, déjà qui réponde à ma question sur type de compli et interface
A+
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités




