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.
- Claudius
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
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 c'est illisible avec des commentaires du C, manque portion de programme notamment sur le LCD, bon j'ai déjà un peu décortique la bête un bon cadrage notamment sur les tempos pour ce type de communication , est nécessaire.
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 38 invités