IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Jeux de lumiere avec un PIC16P84 en utilisant l'instruction retlw [PIC]


Sujet :

Embarqué

  1. #1
    Membre averti Avatar de luthor_06
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut Jeux de lumiere avec un PIC16P84 en utilisant l'instruction retlw
    Bonsoir a tous
    je suis debutant en programmation assembleur et je travaille sur les PIC16P84 sous proteus mais ca fais plusieurs jour et je suis bloque.
    En fait c'est ca mon code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    ;====================================================================
    ; Main.asm file generated by New Project wizard
    ;
    ; Created:   Sat Jul 15 2017
    ; Processor: PIC16F84A
    ; Compiler:  MPASM (Proteus)
    ;====================================================================
    
    ;====================================================================
    ; DEFINITIONS
    ;====================================================================
    
    #include p16f84a.inc                ; Include register definition file
    
    ;====================================================================
    ; VARIABLES
    ;====================================================================
       CBLOCK 0x0C
       d1 
       d2 
       d3 
       ENDC
    ;====================================================================
    ; RESET and INTERRUPT VECTORS
    ;====================================================================
    
          ; Reset Vector
    RST   code  0x0 
          goto  Start
    
    ;====================================================================
    ; CODE SEGMENT
    ;====================================================================
    
    PGM   code
    Start
          ; Write your code here
          bsf STATUS,5	; goo to page 1
          movlw 0x00	; W= '0000 0000'
          movwf PORTB	; Makes PORTB output (connected to LEDs)
          movlw 0xFF	; W= '1111 1111'
          movwf PORTA	; Makes PORTA input (connected to switches)
          bcf STATUS,5	; go back to page 0
          
    Reset clrf PORTB	; PORTB = '0000 0000' -> All LEDs off
    
    Loop  btfss PORTA,0	; Read RA0 (SW1), test RA0 value and skip if '1'
          goto Reset	; go back to Reset
          btfsc PORTA,1 	; Read RA1 (SW2), test RA1 value and skip if '0'
          movlw 0x03 	; W = 0x03
          movwf PCLATH 	; (PCLATH) = 0x03
          bsf PORTB
          call Pattern
          call Delay     
          goto  Loop
    
    Delay	movlw 7		
    	movwf d3
    	movlw 0xFF
    	movwf d2
    	movlw 0xE9
    	movwf d1
    	decfsz d1,f
    	goto $-1
    	decfsz d2,f
    	goto $-5
    	decfsz d3,f
    	goto $-9
    	return
    
    	ORG 0x0300
    	
    Pattern 
    	addwf PCL,F    ; Add W to PCL 
    	retlw 0x81
    	retlw 0x42	
    	retlw 0x24
    	retlw 0x18	
    	retlw 0x24	
    	retlw 0x42	
    	retlw 0x81
    	retlw 0x78	
    	retlw 0xC3
    	retlw 0xE7	
    	retlw 0xFF	
    	retlw 0xE7	
    	retlw 0xC3
    	retlw 0x81	
    	retlw 0x00	
    	retlw 0xFF	
    	retlw 0x00	
    	retlw 0xFF	
    	retlw 0x7E	
    	retlw 0x3C	
    	retlw 0x18
    	retlw 0x3C	
    	retlw 0x7E
    
    ;====================================================================
          END
    et mon schema,

    Nom : prteus.png
Affichages : 2648
Taille : 144,3 Ko

    Je voudrais faire en sorte qu'a l'execution les LEDs clignotent selon la routine Pattern mais j'y arrive
    il est question de parcourir le tableau (Pattern) et d'executer chaque ligne
    Tout se fait dans la routine Loop
    J'ai besoin d'aide Svp
    Merci

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 266
    Par défaut
    Salut,
    Dans la première partie de ton programme (Start) ceux sont les registres TRISA et TRISB qui servent à définir les broches en entrées ou sorties.
    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          ...
          movlw 0x00	; W= '0000 0000'
          movwf TRISB	; Makes PORTB output (connected to LEDs)
          ...

    Concernant le reste, mon cerveau est entrain de faire un noeud ! La dernière fois que j'ai fait de l'assembleur PIC c'était il y a 18 ans.
    Je suis désolé mais je n'ai pas vraiment envi de m'y remettre. Configure bien tes broches en entrées/sorties via les registres TRISA et B et voit d'abord si ça fonctionne avant qu'on regarde la suite

    A+.

  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Voici un site très avancé sur les pic et l'assembleur peut-etre que tu pourras y trouver ton bonheur.

    https://www.abcelectronique.com/bigo....php?par=8c8b7

  4. #4
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 219
    Par défaut
    Je n'ai jamais fait de PIC , ni d'embarqué avec mais je remarque un truc.
    Il n' y a pas de code d'initialisation de la pile (on tout cas je ne le vois pas) , je dis cela parce que j'ai toujours eu de sacré surprise en l'oubliant sur des machines réel( les émulateurs sont en général plus sympa doivent l'initialiser au bon endroit)
    Sachant que les interruptions et les appels de fonction l'utilise pour stocker l'adresse du retour :p

    Concernant le reste, mon cerveau est entrain de faire un noeud ! La dernière fois que j'ai fait de l'assembleur PIC c'était il y a 18 ans.
    T'en fait pas c'est normal
    Je trouve son code très arbitraire et avec beaucoup trop de nombre magic.

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 266
    Par défaut


    Citation Envoyé par Kannagi Voir le message
    Il n' y a pas de code d'initialisation de la pile (on tout cas je ne le vois pas)
    Excellente remarque ! Je me suis fait avoir aussi avant de me rappeler que ce petit micro avait une stack hardware

    Nom : Capture51.PNG
Affichages : 3171
Taille : 34,2 Ko

    Alors qu'en règle générale ARM, MSP430, ATMEGA on la pile dans la RAM.... comme tout le monde quoi .

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 294
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Concernant le reste, mon cerveau est entrain de faire un noeud ! La dernière fois que j'ai fait de l'assembleur PIC c'était il y a 18 ans.
    Citation Envoyé par Kannagi Voir le message
    T'en fait pas c'est normal
    Je trouve son code très arbitraire et avec beaucoup trop de nombre magic.
    Ah vous aussi , je n'ai guère plus de pratique, uniquement 2 rétro-ingénieries de programmes proposés dans des magazines, à titre d'hobby. Donc la suite n'est pas garantie sans erreur

    J'ai noté plusieurs erreurs d’algorithme. C'est une règle générale en programmation, mais encore plus en assembleur, il faut poser le programme sur la papier avant de se lancer.
    • Les lignes 50 et 51 ajoutent +0x300 au compteur de programme (qui est au alentour de 14, mais cela j'en suis pas sûr du tout!), on part dans la zone de mémoire du programme qui a les instructions retlw (la 13ème si j'ai bien compté), le micro devra sauter à la dernière adresse stockée dans la Stack, sauf que aucune adresse n'y a été stockée par un call -> le programme part dans les choux. Ces lignes sont inutiles, c'est le travail du Call et rien d'autre.
    • La ligne 52, c'est même pas dans la norme, je suis surpris que cela compile.
    • En arrivant dans Pattern, on ajoute W au compteur de programme pour sauter au bon retlw, sauf que W c'est le registre à tout faire qui n'est pas à sa valeur +1 à chaque boucle, le programme repart dans les choux. Il faut avoir une variable qui s'incrémente et qui permet à chaque appel d'aller à une instruction plus loin.
    • retlw retourne à l'instruction après le dernier call et stock la valeur en argument dans W, sauf que la ligne après call Pattern, n'affecte pas W au port B, donc le pattern n'est pas transmit aux LEDs.
    • Il n'y a pas de limite, et si le dernier pattern est afficher, à l'appel suivant le programme sautera à l'instruction qui suit la ligne 97 et partira dans les choux.
    • Et finalement les lignes 39 à 42: ce n'est pas PORTx qu'il faut utiliser mais TRISx, le 1er commentaire de Vincent
    • Et pour ce genre de programme on préférera le stockage d'un tableau de données dans la mémoire programme que l'on ira lire au moyen de l'adresse de début et d'un offset, au lieu d'un saut sur x instructions quasi similaire.


    Delias

  7. #7
    Membre averti Avatar de luthor_06
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Salut,
    Dans la première partie de ton programme (Start) ceux sont les registres TRISA et TRISB qui servent à définir les broches en entrées ou sorties.
    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          ...
          movlw 0x00	; W= '0000 0000'
          movwf TRISB	; Makes PORTB output (connected to LEDs)
          ...

    Concernant le reste, mon cerveau est entrain de faire un noeud ! La dernière fois que j'ai fait de l'assembleur PIC c'était il y a 18 ans.
    Je suis désolé mais je n'ai pas vraiment envi de m'y remettre. Configure bien tes broches en entrées/sorties via les registres TRISA et B et voit d'abord si ça fonctionne avant qu'on regarde la suite

    A+.
    Ca marche pas avec ces registres

  8. #8
    Membre averti Avatar de luthor_06
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Citation Envoyé par julien terrier Voir le message
    Voici un site très avancé sur les pic et l'assembleur peut-etre que tu pourras y trouver ton bonheur.

    https://www.abcelectronique.com/bigo....php?par=8c8b7
    Ok thank's je regarde ca

  9. #9
    Membre averti Avatar de luthor_06
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message



    Excellente remarque ! Je me suis fait avoir aussi avant de me rappeler que ce petit micro avait une stack hardware

    Nom : Capture51.PNG
Affichages : 3171
Taille : 34,2 Ko

    Alors qu'en règle générale ARM, MSP430, ATMEGA on la pile dans la RAM.... comme tout le monde quoi .
    Exact!

  10. #10
    Membre averti Avatar de luthor_06
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    En fait voici mon nouveau code et il fonctionne sauf le boutton branche sur RA1 et je voudrai faire en sorte que lorsqu'il est maintenu appuyer, il boucle de la ligne 17 a 22 du tableau mais j'y arrive pas. Une solution serai d'utiliser un deuxieme tableau mais ca seari pas tres tres super en terme de performance.

    Si quelq'un a une idee. Merci

  11. #11
    Membre averti Avatar de luthor_06
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    ;====================================================================
    ; Main.asm file generated by New Project wizard
    ;
    ; Created:   Sat Jul 15 2017
    ; Processor: PIC16F84A
    ; Compiler:  MPASM (Proteus)
    ;====================================================================
    
    ;====================================================================
    ; DEFINITIONS
    ;====================================================================
    
    #include p16f84a.inc                ; Include register definition file
    
    ;====================================================================
    ; VARIABLES
    ;====================================================================
       CBLOCK 0x0C
       d1 
       d2 
       d3 
       incr : 0	; increment variable
       ENDC
    ;====================================================================
    ; RESET and INTERRUPT VECTORS
    ;====================================================================
    
          ; Reset Vector
    RST   code  0x0 
          goto  Start
    
    ;====================================================================
    ; CODE SEGMENT
    ;====================================================================
    
    PGM   code
    Start
          ; Write your code here
          bsf STATUS,5	; go to page 1
          movlw 0x00	; W= '0000 0000'
          movwf PORTB	; Makes PORTB output (connected to LEDs)
          movlw 0xFF	; W= '1111 1111'
          movwf PORTA	; Makes PORTA input (connected to switches)
          bcf STATUS,5	; go back to page 0
          
    Reset clrf PORTB	; PORTB = '0000 0000' -> All LEDs off
          clrf incr		; incr = 0 
          
    Loop  	
          btfss PORTA,0	; Read RA0 (SW1), test RA0 value and skip if '1'
          goto Reset	; go back to Reset
          movlw 0x03	; W= 03	
          movwf PCLATH 	; PCLATH = 03 	
          btfsc PORTA,1	; Read RA1 (SW2), test RA1 value and skip if '0'
          movf incr, W	; incr = W
          call  Pattern     ; call Pattern
          movwf PORTB
          call Delay	; call Delay
          incf incr     	; increment incr, incr = incr + 1
          goto  Loop	; go back to Loop
          
    Delay	movlw 7		;36 38 36
    	movwf d3
    	movlw 0xFF
    	movwf d2
    	movlw 0xE9
    	movwf d1
    	decfsz d1,f
    	goto $-1
    	decfsz d2,f
    	goto $-5
    	decfsz d3,f
    	goto $-9
    	return
    
    	ORG 0x300
    	
    Pattern 
    	addwf PCL,F    ; Add W to PCL, PCL = PCL + W
    	retlw 0x81
    	retlw 0x42	
    	retlw 0x24
    	retlw 0x18	
    	retlw 0x24	
    	retlw 0x42	
    	retlw 0x81
    	retlw 0x78	
    	retlw 0xC3
    	retlw 0xE7	
    	retlw 0xFF	
    	retlw 0xE7	
    	retlw 0xC3
    	retlw 0x81	
    	retlw 0x00	
    	retlw 0xFF	
    	retlw 0x00	
    	retlw 0xFF	
    	retlw 0x7E	
    	retlw 0x3C	
    	retlw 0x18
    	retlw 0x3C	
    	retlw 0x7E
    
    ;====================================================================
          END

  12. #12
    Membre averti Avatar de luthor_06
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Citation Envoyé par Delias Voir le message
    Ah vous aussi , je n'ai guère plus de pratique, uniquement 2 rétro-ingénieries de programmes proposés dans des magazines, à titre d'hobby. Donc la suite n'est pas garantie sans erreur

    J'ai noté plusieurs erreurs d’algorithme. C'est une règle générale en programmation, mais encore plus en assembleur, il faut poser le programme sur la papier avant de se lancer.
    • Les lignes 50 et 51 ajoutent +0x300 au compteur de programme (qui est au alentour de 14, mais cela j'en suis pas sûr du tout!), on part dans la zone de mémoire du programme qui a les instructions retlw (la 13ème si j'ai bien compté), le micro devra sauter à la dernière adresse stockée dans la Stack, sauf que aucune adresse n'y a été stockée par un call -> le programme part dans les choux. Ces lignes sont inutiles, c'est le travail du Call et rien d'autre.
    • La ligne 52, c'est même pas dans la norme, je suis surpris que cela compile.
    • En arrivant dans Pattern, on ajoute W au compteur de programme pour sauter au bon retlw, sauf que W c'est le registre à tout faire qui n'est pas à sa valeur +1 à chaque boucle, le programme repart dans les choux. Il faut avoir une variable qui s'incrémente et qui permet à chaque appel d'aller à une instruction plus loin.
    • retlw retourne à l'instruction après le dernier call et stock la valeur en argument dans W, sauf que la ligne après call Pattern, n'affecte pas W au port B, donc le pattern n'est pas transmit aux LEDs.
    • Il n'y a pas de limite, et si le dernier pattern est afficher, à l'appel suivant le programme sautera à l'instruction qui suit la ligne 97 et partira dans les choux.
    • Et finalement les lignes 39 à 42: ce n'est pas PORTx qu'il faut utiliser mais TRISx, le 1er commentaire de Vincent
    • Et pour ce genre de programme on préférera le stockage d'un tableau de données dans la mémoire programme que l'on ira lire au moyen de l'adresse de début et d'un offset, au lieu d'un saut sur x instructions quasi similaire.


    Delias
    mince la t'as decortique mon code trop bien!!
    En fait j'ai essaye de corrige et j'ai obtenu le nouveau code plus haut. mais je suis de nouveau bloque
    Pour les registres TRISx aussi j'ai reverifie ca marche. Thank's Vincent

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 294
    Par défaut
    Bonsoir

    De 1 j'ai enfin compris à quoi servent les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          movlw 0x03	; W= 03
          movwf PCLATH 	; PCLATH = 03
    Cela est nécessaire pour que la ligne suivante fonctionne, saloperie de double buffer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	addwf PCL,F    ; Add W to PCL, PCL = PCL + W
    L'indiquer dans les commentaires serait pas mal, mettre ces deux lignes au début de la fonction serait mieux, sauf que cela n'est pas si simple que cela car W serait alors écrasé. Ou si la réactualisation de PCLATH n'est pas nécessaire (càd n'est pas reseté lors de l'écriture de PCL) ces deux lignes peuvent très bien être dans la partie initialisation. Et dernièrement il serait bien de remplacer le 03 par High(Pattern) si cette commande est connue du précompilateur.

    En l'état quand le bouton SW2 est pressé, les lignes 52 et 53 font que W n'est pas mis a jour et Pattern est appelé avec la valeur précédente de W (qui est 3), et le comptage continue.
    Tiens au passage le commentaire de la ligne 53 est faux, c'est l'inverse.

    Citation Envoyé par luthor_06 Voir le message
    En fait voici mon nouveau code et il fonctionne sauf le boutton branche sur RA1 et je voudrai faire en sorte que lorsqu'il est maintenu appuyer, il boucle de la ligne 17 a 22 du tableau mais j'y arrive pas. Une solution serai d'utiliser un deuxieme tableau mais ca seari pas tres tres super en terme de performance.

    Si quelq'un a une idee. Merci
    Cela reste parfaitement possible, il faut construire une structure if plus compliquée que le simple saut d'une instruction et agir sur le compteur, voir mieux gérer deux compteurs et appeler la fonction avec l'un des deux compteurs ou même avoir deux appels de fonctions différent (un dans chaque partie du if). Tout cela est expliqué dans tous les cours d'introduction, tellement c'est la base.

    Et il manque toujours l'anti débordement du compteur, avec le risque de planter le programme si Pattern est appelé avec une valeur dans W trop grande.

    Delias

  14. #14
    Membre averti Avatar de luthor_06
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Bonjour a tous,
    Volila J'ai pu gere avec une deuxieme loop et des tests et ca marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    ;====================================================================
    ; Main.asm file generated by New Project wizard
    ;
    ; Created:   Sat Jul 15 2017
    ; Processor: PIC16F84A
    ; Compiler:  MPASM (Proteus)
    ;====================================================================
    
    ;====================================================================
    ; DEFINITIONS
    ;====================================================================
    
    #include p16f84a.inc                ; Include register definition file
    
    ;====================================================================
    ; VARIABLES
    ;====================================================================
       CBLOCK 0x0C
       d1 
       d2 
       d3 
       incr : 0	; increment variable
       ENDC
    ;====================================================================
    ; RESET and INTERRUPT VECTORS
    ;====================================================================
    
          ; Reset Vector
    RST   code  0x0 
          goto  Start
    
    ;====================================================================
    ; CODE SEGMENT
    ;====================================================================
    
    PGM   code
    Start
          ; Write your code here
          bsf STATUS,5	; go to page 1
          movlw 0x00	; W= '0000 0000'
          movwf TRISB	; Makes PORTB output (connected to LEDs)
          movlw 0xFF	; W= '1111 1111'
          movwf TRISA	; Makes PORTA input (connected to switches)
          bcf STATUS,5	; go back to page 0
          
    Reset clrf PORTB	; PORTB = '0000 0000' -> All LEDs off
          clrf incr		; incr = 0 
          
    Loop  btfss PORTA,0	; Read RA0 (SW1), test RA0 value and skip if '1'
          goto Reset	; go back to Reset
          movlw 0x03	; W= 03	
          movwf PCLATH 	; PCLATH = 03 	
          movf incr, W	; incr = W
          call  Pattern     ; call Pattern
          movwf PORTB	; makes PORTB
          btfsc PORTA,1	; Read RA1 (SW2), test RA1 value and skip if '0'
          call Delay	; call Delay
          incf incr, f    	; increment incr, incr = incr + 1
          goto  TestSW2	; go to TestSW2
    
    TestSW2 btfsc PORTA,1	; Read RA1 (SW2), test RA1 value and skip if '0'
    	goto Loop	;if yes, go back to Loop
    
    LoopSW2 clrf PORTB	; PORTB = '0000 0000' -> All LEDs off
    	movlw 0x10	; W= '0001 0000'
    	addwf incr, W	; incr = W
    	call  Pattern   ; call Pattern
    	movwf PORTB	; makes PORTB
    	call Delay	; call Delay
            incf incr, f    ; increment incr, incr = incr + 1
            goto  TestSW2	; go back to TestSW2
          
    Delay	movlw 0x37	
    	movwf d3
    	movlw 0x36
    	movwf d2
    	movlw 0x37
    	movwf d1
    	decfsz d1,f
    	goto $-1
    	decfsz d2,f
    	goto $-5
    	decfsz d3,f
    	goto $-9
    	return
    
    	ORG 0x300
    	
    Pattern 
    	addwf PCL,F    ; Add W to PCL, PCL = PCL + W
    	retlw 0x81
    	retlw 0x42	
    	retlw 0x24
    	retlw 0x18	
    	retlw 0x24	
    	retlw 0x42	
    	retlw 0x81
    	retlw 0x78	
    	retlw 0xC3
    	retlw 0xE7	
    	retlw 0xFF	
    	retlw 0xE7	
    	retlw 0xC3
    	retlw 0x81	
    	retlw 0x00	
    	retlw 0xFF	
    	retlw 0x00	
    	retlw 0xFF	
    	retlw 0x7E	
    	retlw 0x3C	
    	retlw 0x18
    	retlw 0x3C	
    	retlw 0x7E
    
    ;====================================================================
          END

  15. #15
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 266
    Par défaut
    Salut,
    Si tu estimes avoir trouvé la solution alors tu peux cliquer sur le bouton "Résolu" en bas de la fenêtre, à côté de "Répondre".

    C'est important pour les autres personnes qui rencontreraient un problème similaire. Ils sauront qu'une solution a été trouvé.

  16. #16
    Membre averti Avatar de luthor_06
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Ok et merci a tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/06/2007, 21h11
  2. comment communiquer avec un PABX en utilisant TAPI
    Par keletigui dans le forum C++
    Réponses: 1
    Dernier message: 30/03/2007, 12h12
  3. Trouble avec Excel avec un programme qui utilise un Hook.
    Par hot_metal dans le forum Windows
    Réponses: 5
    Dernier message: 14/01/2006, 13h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo