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

Autres architectures Assembleur Discussion :

[68HCS12] Mettre à 1 le bit n°i d'un registre


Sujet :

Autres architectures Assembleur

  1. #1
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut [68HCS12] Mettre à 1 le bit n°i d'un registre
    Bonjour,

    Je dois décoder une touche détectée sur le port H ; j'ai donc pensé à l'algorithme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Pour B de 0 à 3
    <div style="margin-left:40px">PIFH <- 0
    PIFH[B] <- 1
    DELAY_1MS
    Pour A de 0 à 3
    <div style="margin-left:40px">Si PIFH[7 - B] = 1
    <div style="margin-left:40px">A <- A + 12 - 4*B</div></div></div>Fin
    Où A est l'offset d'une chaîne ASCII "*0#D789C456B123A".

    Mon problème se situe au niveau de l'instruction PIFH[B]<- 1. Je dois mettre à 1 le bit dont le numéro est le contenu d'un registre, et je ne vois absolument pas comment faire... Pourriez-vous m'aider ?

    Merci d'avance.

    P.S: Naturellement, si je fais fausse route ou si des optimisations sont possibles, n'hésitez pas à me le dire (je serais bien au contraire ravi de le savoir), j'ai conçu l'algorithme sans conviction.
    Vive l'embarqué.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par kidpaddle2 Voir le message
    Mon problème se situe au niveau de l'instruction PIFH[B]<- 1. Je dois mettre à 1 le bit dont le numéro est le contenu d'un registre, et je ne vois absolument pas comment faire... Pourriez-vous m'aider ?
    Hello,

    Je ne connais pas le jeu du 68HCS12 en particulier mais pour faire varier en général un bit isolé dans un registre, on passe par une opération logique. En l'occurence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LDAA PTH
    ORAA #40
    STAA PTH
    ... charge le contenu du port H dans A, force le bit 6 de A à un, et restocke la valeur mise à jour dans le port H. À noter que PTH est une « equate » qui correspond à une adresse particulière, que je ne connais pas.

    Pour forcer le bit n d'un registre à un, il faut donc faire un OU logique avec 2^n. Pour trouver 2^n, soit tu procèdes par décalages en mettant un registre à 1 et en décalant son contenu vers la gauche tant que n est non-nul, soit tu te fais une petite table qui contient 80h,40h,20h,10h,08h,04h,02h,01h et tu te sers de n comme index pour aller chercher directement la bonne valeur. Cette dernière méthode est de loin la plus efficace tant que l'on reste sur huit bits.

  3. #3
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Merci de ta réponse, je n'avais pas pensé à cette alternative (honte à moi de ne pas avoir mes réflexes de programmation C en assembleur).

    Je pense que ça devrait donner quelque chose comme ça :
    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
    MASKS		DC.B		#$01, #$02, #$04, #$08, #$10, #$20, #$40, #$80
     
    FINDKEY:	LDX		#0
    TCOL:		CMPX		#3
    		BHI		ECOL
     
    		MOVB		PIFH, X, MASKS
    		DELAY_1MS
     
    		LDY		#0
    TLIN:		CMPY		#3
    		BHI		ELIN
     
    		; si PIFH[7 - X] = 1
    		; A <- Y + 12 - 4 * X
     
    		INY
    		BRA		TLIN
     
    ELIN:		INX
    		BRA		TCOL
     
    ECOL:		RTS
    Peux-tu déjà confirmer le "MOVB PIFH, X, MASKS" pour l'utilisation que je veux en faire ? Ensuite, je ne sais pas quoi mettre au niveau des commentaires... Le problème, c'est que je ne peux pas comparer PIFH directement avec un masque, puisque le test ne porte que sur un seul bit (je précise qu'un autre bit est à 1, et je ne peux pas a priori déterminer lequel)... Donc un AND ne marchera pas. D'autant plus que l'opération 7 - X ne doit pas modifier X, alors que dois-je faire ?

    Merci.
    Vive l'embarqué.

  4. #4
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    En fait, il me faudrait uniquement un moyen de mettre à 1 un bit sans affecter les autres...
    Vive l'embarqué.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Je ne suis pas un expert du 68HCS12, mais tu ne peux pas faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LDAA PIFH
    ORAA X,MASK
    STAA PIFH
    ?

  6. #6
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Oups, euh oui je me suis trompé, je voulais dire "récupérer la valeur d'un et un seul bit"... En gros, faire un if() sur un bit.

    Désolé ^^
    Vive l'embarqué.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Dans ce cas, tu fais un AND sur ton registre avec la table qu'on a définie ci-dessus, ce qui aura pour effet de préserver un seul bit, et tu vérifies si, à l'issue, ton registre est nul ou pas.

  8. #8
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Très juste ! Merci pour l'aide

    Je reviens une fois le programme terminé...
    Vive l'embarqué.

  9. #9
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Voici le code commenté...

    Qu'en pensez-vous ?

    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
    ; ==== FINDKEY routine : returns in A accumulator ASCII code of pressed hex key 
    STRING:  FCC  "*0#D789C456B123A"
    MASKS:   DCB  %00000001, %00000010, %00000100, ; ...
    CLIN:    DC.B 3 ; Lines counter (index)
    CCOL:    DC.B 3 ; Columns counter (index)
     
     
    FINDKEY: ; for(; CLIN != 0 ; --CLIN) {
             ; PIFH[CLIN] = 1
             LDX  MASKS
             LDAB CLIN
             ABX
             MOVB X, PIFH
             DELAY_1MS
     
    TCOL:    ; for(; CCOL != 0 ; --CCOL) {
             ; if(PIFH[CCOL] = 1) { /* ... */ } else goto ENCOL
             LDX  4,  MASKS
             LDAB CCOL
             ABX
             LDAA PIFH
             ANDA X
             CMPA #0
             BNE  ENDCOL
     
             ; A = CCOL + 12 - 4 * CLIN
             LDAB #4
             LDAA CLIN
             MUL
             NEG  B
             LDAA CCOL
             ADDA #12
             ABA
     
    ENCOL:   ; } //for_columns
             DEC  CLIN
             BNE  FINDKEY
     
             ; } //for_lines
             DEC  CCOL
             BNE  TCOL
     
             RTS
    Merci d'avance.
    Vive l'embarqué.

Discussions similaires

  1. Mettre Projet 16 bits en 32 bits
    Par futneguet dans le forum C++
    Réponses: 4
    Dernier message: 02/09/2010, 14h35
  2. Bits dans byte pour mettre a jour label
    Par untipy dans le forum C#
    Réponses: 3
    Dernier message: 04/07/2010, 11h29
  3. Mettre les bits impairs à 1
    Par Master C dans le forum Assembleur
    Réponses: 6
    Dernier message: 30/05/2008, 11h22
  4. Réponses: 4
    Dernier message: 29/03/2007, 19h39
  5. [bit]Mettre un mot de 16 bits (string) en short
    Par -=Spoon=- dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 27/03/2004, 21h07

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