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 :

[16F84A] Algorithme pour décoder 4 bits en 16 flags


Sujet :

Autres architectures Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [16F84A] Algorithme pour décoder 4 bits en 16 flags
    Bonjour

    Je vous explique mon probleme, j'ai un pic16f84a qui reçoit un code sur 4 bits (RB3,4,5 et 6) et je veux que, suivant ce code, il ait le flag correspondant qui soit mis à 1.
    Un exemple pour une meilleure compréhension :
    code reçu : b'0010' , flag2 mis a 1
    code reçu : b'0101' , flag5 mis a 1
    jusqu'au flag16

    Donc il me faudrait un algorithme qui me fasse ce boulot mais qui n'utilise pas la méthode du compteur programme car j'utilise des interuptions et ça fout le bordel.

    Deux exemples que j'ai laissé tomber :

    Un parce qu'il est trop long :
    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
    decodeur CLRF reserve_1 ; nettoyage des reserves de flag
    CLRF reserve_2
     
    MOVF sauv_4bits_PORTB,0 ; mise du code dans W
    SUBLW b'0000' ; soustraction du code avec 0000
    BTFSC STATUS,Z ; test du resultat
    RETURN ; si la soustraction donne 1 alors partir sinon code suivant
    MOVF sauv_4bits_PORTB,0
    SUBLW b'0001'
    BTFSC STATUS,Z
    GOTO decod_1
    MOVF sauv_4bits_PORTB,0
    SUBLW b'0010'
    BTFSC STATUS,Z
    GOTO decod_2
    MOVF sauv_4bits_PORTB,0
    SUBLW b'0011'
    BTFSC STATUS,Z
    GOTO decod_3
    MOVF sauv_4bits_PORTB,0
    SUBLW b'0100'
    BTFSC STATUS,Z
    GOTO decod_4
    MOVF sauv_4bits_PORTB,0
    SUBLW b'0101'
    BTFSC STATUS,Z
    GOTO decod_5
    MOVF sauv_4bits_PORTB,0
    SUBLW b'0110'
    BTFSC STATUS,Z
    GOTO decod_6
    MOVF sauv_4bits_PORTB,0
    SUBLW b'0111'
    BTFSC STATUS,Z
    GOTO decod_7
    MOVF sauv_4bits_PORTB,0
    SUBLW b'1000'
    BTFSC STATUS,Z
    GOTO decod_8
    MOVF sauv_4bits_PORTB,0
    SUBLW b'1001'
    BTFSC STATUS,Z
    GOTO decod_9
    MOVF sauv_4bits_PORTB,0
    SUBLW b'1010'
    BTFSC STATUS,Z
    GOTO decod_10
    MOVF sauv_4bits_PORTB,0
    SUBLW b'1011'
    BTFSC STATUS,Z
    GOTO decod_11
    MOVF sauv_4bits_PORTB,0
    SUBLW b'1100'
    BTFSC STATUS,Z
    GOTO decod_12
    MOVF sauv_4bits_PORTB,0
    SUBLW b'1101'
    BTFSC STATUS,Z
    GOTO decod_13
    MOVF sauv_4bits_PORTB,0
    SUBLW b'1110'
    BTFSC STATUS,Z
    GOTO decod_14
    MOVF sauv_4bits_PORTB,0
    SUBLW b'1111'
    BTFSC STATUS,Z
    GOTO decod_15
     
    RETURN
     
    decod_1 BSF reserve_1,flag_telec_avant ; si code=0001 alors mettre a 1 flag correspondant
    RETURN ; et partir
    decod_2 BSF reserve_1,flag_telec_arriere
    RETURN
    decod_3 BSF reserve_1,flag_telec_gauche
    RETURN
    decod_4 BSF reserve_1,flag_telec_droite
    RETURN
    decod_5 BSF reserve_1,flag_telec_stop
    RETURN
    decod_6 BSF reserve_1,flag_telec_7
    RETURN
    decod_7 BSF reserve_1,flag_telec_8
    RETURN
    decod_8 BSF reserve_1,flag_telec_9
    RETURN
    decod_9 BSF reserve_2,flag_telec_10
    RETURN
    decod_10 BSF reserve_2,flag_telec_11
    RETURN
    decod_11 BSF reserve_2,flag_telec_12
    RETURN
    decod_12 BSF reserve_2,flag_telec_13
    RETURN
    decod_13 BSF reserve_2,flag_telec_14
    RETURN
    decod_14 BSF reserve_2,flag_telec_15
    RETURN
    decod_15 BSF reserve_2,flag_telec_16
     
    RETURN
    L'autre parce qu'il me donne un comportement bizarre et qu'il n'est pas au point :

    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
    decodeur CLRF reserve_1 ; nettoyage des reserves de flag
    CLRF reserve_2
     
     
    MOVF sauv_4bits_PORTB,0 ; mise du code dans W, code de la forme '00011110'
    ADDWF PCL,1 ; adition de W avec le compteur de ligne de programme
    NOP ; si le code=0 (cad demande telec/auto) ne rien faire
    RETURN
    BSF reserve_1,flag_telec_avant ; si code=0001 alors mettre a 1 flag correspondant
    RETURN ; et partir
    BSF reserve_1,flag_telec_arriere
    RETURN
    BSF reserve_1,flag_telec_gauche
    RETURN
    BSF reserve_1,flag_telec_droite
    RETURN
    BSF reserve_1,flag_telec_stop
    RETURN
    BSF reserve_1,flag_telec_7
    RETURN
    BSF reserve_1,flag_telec_8
    RETURN
    BSF reserve_1,flag_telec_9
    RETURN
    BSF reserve_2,flag_telec_10
    RETURN
    BSF reserve_2,flag_telec_11
    RETURN
    BSF reserve_2,flag_telec_12
    RETURN
    BSF reserve_2,flag_telec_13
    RETURN
    BSF reserve_2,flag_telec_14
    RETURN
    BSF reserve_2,flag_telec_15
    RETURN
    BSF reserve_2,flag_telec_16
     
    RETURN

  2. #2
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    soyons bourrin(s)

    [Table_Flags:
    00_00000000_00000000
    00_00000000_00000001
    00_00000000_00000010
    00_00000000_00000100
    00_00000000_00001000
    00_00000000_00010000
    00_00000000_00100000
    00_00000000_01000000
    00_00000000_10000000
    00_00000001_00000000
    00_00000000_00000000
    00_00000010_00000000
    00_00000100_00000000
    00_00001000_00000000
    00_00010000_00000000
    00_00100000_00000000
    00_01000000_00000000
    00_10000000_00000000]

    mov eax D$CodeRecu

    mov ax W$Table_Flags+eax*4

    or W$Var ax

    à adapter à la machine cible bien-sûr

    ou je me trompe de raisonement ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    trop bourrin peut etre...

    pouvez vous m'expliquer le fonctionement d'un tel code?

    il ne s'agit la que d'un microcontroleur pic qui n'a qu'un jeu de 35 instructions alors je ne sais pas trop si j'arriverai a l'adapter

    Merci quand meme pour cette reponse en esperant avoir plus de details

    zoilo

  4. #4
    Inactif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 130
    Points : 160
    Points
    160
    Par défaut
    Désolé pour le retard...

    Le principe est ultra simple :

    Tu as des données organisées dans la RAM et initialisées sur les valeurs que tu désires utiliser.

    Adresse de base en RAM :
    1
    2
    4
    8
    16
    ...

    enfin tous les flags que tu désires mettre sur 1 dans ta variable finale selon code reçu.

    La structure d'organisation de ses datas est relativement simple et linéaire

    Donc, pour accéder à tes datas rangées en ordre croissante, un simple ajout d'offset est suffisant :

    Taille data * ID -> si taille data = DWord ID*4
    si taille data = Word ID*2

    pour récupérer le contenu de tes datas dans la ram :
    AddresseDeBase+ID(code reçu)*TailleData

    ensuite pour attribuer le flag sans détruire les autres :

    Or MaVariableFlags AdresseDeBase+Id(Code reçu)*TailleData

    Donc la question demeure : Me suis-je trompé dans le raisonement par rapport à ce que tu veux faire ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci mais finalement j'ai résolu le problème du deuxième code qui me faisait un truc bizarre.

    En additionnant une valeur au PCL, il passait au début de la page de 256 bits et non pas a la suivante car je ne modifiais pas le PCLATH. Du coup, j'ai mis mon décodeur au début pour être sûr qu'il ne soit pas en limite de page.

    Merci quand même bien que, pour ceux qui n'ont pas l'habitude des microcontrôleurs, je dois parler un peu barbare.

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

Discussions similaires

  1. algorithme pour calcul de probabilité
    Par filsdugrand dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 14/12/2005, 14h11
  2. Quel algorithme pour insertion d'objets "triés" da
    Par phplive dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2005, 09h27
  3. Algorithme pour trier trois nombres
    Par legosam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 17/01/2005, 21h47
  4. Quelle compilateur pour le 64 bits ?
    Par yarp dans le forum C++Builder
    Réponses: 12
    Dernier message: 10/09/2004, 18h42
  5. Algorithme pour chiffres significatifs en Assembleur
    Par lutin2003 dans le forum Assembleur
    Réponses: 5
    Dernier message: 09/09/2004, 10h47

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