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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Aide sur le protocole 1 wire.
AOURIR
Membre
Membre
Messages : 1
Enregistré en : mai 2016

#1 Message par AOURIR » mar. 17 mai 2016 19:20

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
    ; 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.
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#2 Message par Guest » mer. 18 mai 2016 18:25

Bonjour

Quelques explications sont nécessaires . je ne comprends pas trop .tu travail, avec quel compilateur, sous quelle interface

A+

Aide sur le protocole 1 wire.
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » mer. 18 mai 2016 18:52

 ! Message de modération :
Bonjour AOURIR ,
Merci de bien vouloir relire les quelques règles concernant le forum que tu trouvera ici : Régles sur FantasPic.
Afin de faciliter le travail des bénévoles voulant t'aider, merci de poster le lien de ta DS en suivant ces instructions : Poster une Data-Sheet , sans oublier de bien vouloir mettre ton code entre les balises prévues à cet effet ( lien ici )

Merci à toi
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Aide sur le protocole 1 wire.
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#4 Message par Claudius » mer. 18 mai 2016 19:15

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

Aide sur le protocole 1 wire.
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » mer. 18 mai 2016 19:23

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 :twisted:
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Aide sur le protocole 1 wire.
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#6 Message par Guest » mer. 18 mai 2016 20:27

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


Dommage un fil en ASM :cry: 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 :wink: 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 51 invités