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
-----