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 :

[STR912 ARM9] Quelle est l'erreur dans mon prog. ASM ?


Sujet :

Autres architectures Assembleur

  1. #1
    Candidat au Club
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [STR912 ARM9] Quelle est l'erreur dans mon prog. ASM ?
    Bonjour,

    Je programme pour le moment un str912, je dois faire l'acquisition de 12 bits provenant d'un ADC chaque fois qu'une interruption apparait.

    Je dois ensuite incrémenter des canaux 16 bits selon la valeur(12bits) que j'ai obtenu (4096 canaux vu que j'ai un adc 12 bits).

    J'arrive à incrémenter les canaux correctement sauf quelques uns qui s'incrémente de 2 (parfois).

    Habituellement ceux qui finisse par l'adresse 0x_ _ _ 0 mais ce n'est vrai que dans le cas ou l'adc (délivre des valeurs qui se suives (voir l'exemple en dessous)).

    Si vous pouviez me dire quel est mon erreur ca me serait d'un grand secours (ca fait quelques temps que je cherche).

    Voici la partie du programme:
    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
    LDR R7, =0x04002BB0 /*;Adresse pour traitement octet 1*/
    LDR R11, =0x5800C3FC /*;Adresse des 4bits de poids fort Port4*/
    LDRB R11, [R11] /* R11 = contenu de l'adresse 0x5800C3FC*/
    STRB R11, [R7] /*;Place les 4bits de poids fort à l'adresse de traitement*/
     
    LDR R7, =0x04002BB1 /*;Adresse de traitement octet 2 */
    LDR R11, =0x5800A3FC /*;Adresse des 8bits de poids faibles P6*/
    LDRB R11, [R11] /* R11 = Contenu de 0x5800A3FC */ 
    STRB R11, [R7] /*;Place les 8bits de poids faibles à l'adresse de traitement*/ 
    LDR R7, =0x04002BB0 /* R7 = 0x04002bb0 */
    LDR R7, [R7] /* Places la valeur des 12 bits reçus dans le registres R7 (adresse 0x04002BB0*/
     
    ADD R10,R7,R7 /* R10 = 2 * valeur 12 bits réceptionnée */
    LDR R8, =0x04002BC0 /* Charge adresse du début de tableau contenant les 4096 canaux */
    ADD R10,R8,R10 /* R10 = Valeur 12 bit(16 bits)*2 + Adresse début tableau => ad. canal */
     
    LDRH R11, [R10] /* On pointe R11 sur l'adresse du canal*/
     
    ADD R11, R11,#1 /* R11 = R11+1 ;La valeur du canal est incrémenté */
    STRH R11, [R10] /* On place R11 dans le canal correspondant*/





    Voici ce que j'obtient en mémoire :l' adc émettant une fois les nombres de 1 à 53:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    0x0400BC0 0000 	0001 	0001 	0001 	0001 	0001 	0001 	0001 [Canaux 0 à 7]
    0x0400BD0 0002 	0001 	0001 	0001 	0001 	0001 	0001 	0001 [Canaux 8 à 15]
    0x0400BE0 0002 	0001 	0001 	0001 	0001 	0001 	0001 	0001 [Canaux 16 à 23]
    0x0400BF0 0001 	0001 	0001 	0001 	0001 	0001 	0001 	0001 [Canaux 24 à 31]
    0x0400C00 0002 	0001 	0001 	0001 	0001 	0001 	0001 	0001 [Canaux 32 à 39]
    0x0400C10 0001 	0001 	0001 	0001 	0001 	0001 	0001 	0001  [Canaux 40 à 47]
    0x0400C20 0002 	0001 	0001 	0001 	0001 	0001 	0001 	0001  [Canaux 48 à 53]

    Merci bcp pour votre aide...

  2. #2
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Salut

    Je connais pas du tout ce µC, mais je me pose une question à propos de ton code...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LDRB R11, [R11] /* R11 = contenu de l'adresse 0x5800C3FC*/
    Quelle est la taille du registre R11 (32bits) ? Est-il lu et écrit de manière atomique ?

    Sinon, c'est pas tout simplement ton DAC qui ne donne pas les valeur que tu attends (plusieurs mesures successives arrondies à la même valeur) ?

  3. #3
    Candidat au Club
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui R11 est bien un registre 32 bits.

    LDRB R11, [R11] /* R11 = contenu de l'adresse 0x5800C3FC*/
    On charge un octet contenu à l'adresse 0x5800C3FC dans R11

    Que veux tu dire par lu et écrit de manière atomique?

    Sinon pour le dysfonctionnement de l'ADC, je commence vraiment à y penser (ça me rassure peut-être). Le problème est que lorsque je fait par exemple une mesure avec 53 valeurs envoyé par l'adc une seule fois (en tout cas je le pense) , les canaux correspondant son bien tous incrémenté (1 fois pour la plupart et 2 fois pour certain).

    Merci pour ta réponse. A plus.

  4. #4
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Citation Envoyé par maczdecarpate
    Que veux tu dire par lu et écrit de manière atomique?
    Ben imaginons une machine inconnue qui fonctionne en 8 bits mais peut manipuler des données sur 16 bits. Tu veux lire les 16 bits à l'adresse 0x1234 dans ce même registre (reg).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov 0x1234, reg
    mov reg, [reg]
    Selon comment le µC et le compilateur fonctionne, il se peut que ceci ne soit pas valable. Si en interne le circuit ne fais que des opérations sur 8 bits, et que le registre 16 bits est simplement la concaténation de deux registres 8 bits (r1 et r2), le code "devient" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov 0x1234, reg
    mov r1, [reg]
    mov r2, [reg+1]
    Si à l'adresse 0x1234 on a 0x9876, lorsqu'on met 0x98 dans r1, reg devient 0x9834, et on ne met donc pas la bonne valeur dans r2...

    Cet exemple est super-tiré par les cheveux, mais on est souvent confronté à ces problèmes avec les compteurs: le compteur vaut 0x0994 mais le temps de le lire, sa valeur à changé et on lit par exemple 0x0901

    Dans le doute, il est peut être intéressant d'utiliser deux registres: un qui pointe vers les bonnes valeur et un pour les calculs ?


    Citation Envoyé par maczdecarpate
    Sinon pour le dysfonctionnement de l'ADC, je commence vraiment à y penser (ça me rassure peut-être). Le problème est que lorsque je fait par exemple une mesure avec 53 valeurs envoyé par l'adc une seule fois (en tout cas je le pense) , les canaux correspondant son bien tous incrémenté (1 fois pour la plupart et 2 fois pour certain).
    Tu as essayé en simulant le convertisseur ? Est-ce que ton sous-programme d'interruption à bien le temps de se terminer lorsque la mesure suivante apparait (j'y pense que maintenant, mais c'est dans l'ordre des trucs qui sont les plus courants) ?

    Bon courage

Discussions similaires

  1. Je ne trouve pas ou est l'erreur dans mon programme
    Par stich51 dans le forum Général Python
    Réponses: 3
    Dernier message: 02/05/2014, 16h36
  2. Où est l'erreur dans mon code ?
    Par fitarika dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 31/12/2009, 03h09
  3. [DOM] quel est l'erreur dans mon code
    Par une_tite_question dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 10/08/2008, 11h20
  4. [XHTML] Où est l'erreur dans mon submit ?
    Par unreal2me dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/03/2007, 16h47
  5. Réponses: 5
    Dernier message: 14/05/2006, 22h41

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