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 :

[PicoBlaze ] Surveiller une pin


Sujet :

Autres architectures Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 375
    Par défaut [PicoBlaze ] Surveiller une pin
    Bonsoir à tous,

    Je tente en ce moment de debugger une carte que je programme. J'ai écrit le programme en assembleur.

    Le mainprog et les subroutines sont-ils dans le bonne ordre ?

    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
     
     
    CONSTANT    CST_AD_REG_STATE_LED,18 ; command reg_timer_status, finish counting?
     
    CONSTANT    CST_AD_REG_STATE_LED_1,10 ; command reg_led_r
    CONSTANT    CST_AD_REG_STATE_LED_2,10 ; command reg_led_r
     
    CONSTANT    CST_AD_REG_TIMER_VAL,15 ; command reg_timer_val to decount
     
    ;---------------------------------------------------------------------------------
    ;Special Register usage
    NAMEREG s0,ZEROS ;use
    NAMEREG s1,ONES ;use
    NAMEREG s2,STATE_LED_1 ;use
    NAMEREG s3,STATE_LED_2 ;use
    NAMEREG s4,TIMER_VAL ; use
    ;NAMEREG s5,ZEROS
    NAMEREG s6,REG_VAL_ENTRY
    ;ne pas utiliser s7 (boucles)
    ;ne pas utiliser s8 (interne)
    ;NAMEREG s9,ZEROS
    ;NAMEREG sA,ZEROS
    ;NAMEREG sB,ZEROS
    ;NAMEREG sC,ZEROS
    ;NAMEREG sD,ZEROS
    ;NAMEREG sE,ZEROS
    ; ne pas utiliser sF (macro)
     
    ;---------------------------------------------------------------------------------
    ;Initialisation
     
    LOAD ZEROS,00
    LOAD ONES,11
    LOAD STATE_LED_1,00 ; STATE OF LEDS
    LOAD STATE_LED_2,0F ; STATE OF LEDS
    LOAD TIMER_VAL,FF ;
     
    ;-------------------------------------MAINPROG------------------------------------
    ;---------------------------------------------------------------------------------
     
    mainprog:  ;CALL maj_timer_val
               CALL test_entry
               ;CALL stateleds ; state 1, see the difference
     
               ;CALL maj_timer_val
               CALL test_entry_2
               ;CALL stateleds_2 ; state 2, see the difference
     
    return mainprog
     
     
    ;------------------------------------SUBROUTINE-----------------------------------
    ;---------------------------------------------------------------------------------
     
    test_entry:  INPUT REG_VAL_ENTRY,CST_AD_REG_STATE_LED ;AD_REG_STATE_LED is PORT_ID
                                                          ;and select the INPUT_data and s0 receive the data
     
                 JUMP NZ, stateleds ;if entry value s0 is not NULL, jump in stateleds
                 return
     
    stateleds:   OUTPUT STATE_LED_1,CST_AD_REG_STATE_LED_1 ;OUTPUT PORT, PORT ID
                 return
     
    test_entry_2: INPUT REG_VAL_ENTRY,CST_AD_REG_STATE_LED ;AD_REG_STATE_LED is PORT_ID
                                                          ;and select the INPUT_data and s0 receive the data
     
                 JUMP NZ, stateleds_2 ;if entry value s0 is not NULL, jump in stateleds
                 return
     
    stateleds_2: OUTPUT STATE_LED_2,CST_AD_REG_STATE_LED_2 ;OUTPUT PORT, PORT ID
                 return
     
    maj_timer_val: OUTPUT TIMER_VAL,CST_AD_REG_TIMER_VAL ;OUTPUT PORT, PORT ID
                   return
    Merci par avance.

    Bonne soirée à tous

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 226
    Par défaut
    Citation Envoyé par joffrey575 Voir le message
    Le mainprog et les subroutines sont-ils dans le bonne ordre?
    C'est a toi de le savoir , impossible a dire sachant que on ne sait même pas quel résultat tu veux.
    Si le résultat est correct alors le code est bon

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 375
    Par défaut
    Je souhaite obtenir un changement d'état de 8 LEDS par le biais des fonctions test_entry et test_entry_2.

    J'ai une clock en entrée de mon design hardware sur FPGA qui déclenche un timer à chaque front montant.

    Ainsi, une fois que le timer a finie, il envoie un front montant significatif d'un changement d'état des LEDS.

  4. #4
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 226
    Par défaut
    Bah je pense que personne ici connaît l'architecture de ta machine , mais essayons d'y voir plus clair :

    Jamais fait de PicoBlaze de ma vie , mais je devine que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    LOAD ZEROS,00
    LOAD ONES,11
    LOAD STATE_LED_1,00 ; STATE OF LEDS
    LOAD STATE_LED_2,0F ; STATE OF LEDS
    LOAD TIMER_VAL,FF ;
    initialise les registres donc, alors c'est le plus déconcertant dans ton code (que j'ai pas compris au premier coup d'oeil) parce que en général on met des noms a des variables pas a des registres...


    La Memory Map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CONSTANT    CST_AD_REG_STATE_LED,18 ; command reg_timer_status, finish counting?
     
    CONSTANT    CST_AD_REG_STATE_LED_1,10 ; command reg_led_r
    CONSTANT    CST_AD_REG_STATE_LED_2,10 ; command reg_led_r
     
    CONSTANT    CST_AD_REG_TIMER_VAL,15 ; command reg_timer_val to decount
    Ok donc on sait que 15,18 c'est pour le timer et que le 10 c'est pour les LEDS avec 8 bits donc 8 LEDS, mais tu as mis reg_led_r pour moi le r signifie read donc c'est un rw non ?
    Ou alors quel est le registre d'écriture ? (et je peux vraiment pas le deviner).

    Autre question y'a t il une wram (ram de travaille) , parce que bon faire tout son programme avec que les registres c'est pas sérieux... (même dans les année 80 en avait un peu plus de RAM ).


    Pour ta question ben ça sera test_entry_2 qui écrira sur les LEDS mais seulement si s0 n'est pas NULL et S0 chez toi il est tjs égal a zéro
    Enfin d’après ton 'commentaire' parce que ça me semble du copier/coller les drapeaux dépende très rarement d'un registre particulier , le NZ c'est quand un drapeaux est dans un état particulière alors moi j'ai pas la doc sous les yeux de ton PicoBlaze alors soit tu laisse comme ça si tu sais ce que tu fais , soit tu rajoute une instruction de comparaison , ça sera plus explicite.

    Moi si tu me le demande pour tes LEDS allumé je dirai d’après ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    LOAD s0,FF
    OUTPUT s0,CST_AD_REG_STATE_LED_1
    Mais comme je l'ai dit sur tes commentaire tout laisse supposé que CST_AD_REG_STATE_LED_1 ne se lit que en lecture pas en écriture.

    J'ai une clock en entrée de mon design hardware sur FPGA qui déclenche un timer à chaque front montant.

    Ainsi, une fois que le timer a finie, il envoie un front montant significatif d'un changement d'état des LEDS.
    Alors :
    -quel registre I/O pour le front montant
    -Comment fonctionne ton TIMER ?
    Parce que le TIMER ça peut fonctionner très différent sur les différentes machines , pour ma part je suis tombé dessus que sur des processeurs sonore et en général en mettait la valeur en MiliSeconde , et puis en lisait le registre jusqu'a il était égal à 0, mais la doc expliquait très bien tout ça.
    Et dans ton cas ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 375
    Par défaut
    Ici, voici la doc du picoblaze.
    http://www.xilinx.com/support/docume...tion/ug129.pdf

    Page 102/122, tu as ce qu’il se passe pour l’instruction INPUT ! Un MUX permet de sélectionner l’entrée voulue puisque sur le picoblaze tu n’as qu’une seule entrée à 1 bit.

    Ok donc on sait que 15,18 c'est pour le timer et que le 10 c'est pour les LEDS avec 8 bits donc 8 LEDS, mais tu as mis reg_led_r pour moi le r signifie read donc c'est un rw non ?
    En fait ‘r’ c’est pour « red », les LEDS rouges. Il y a huit LEDS tricolore avec led_r, led_g et led_b (red, green, blue).

    Autre question y'a t il une wram (ram de travaille) , parce que bon faire tout son programme avec que les registres c'est pas sérieux... (même dans les année 80 en avait un peu plus de RAM.
    En fait, tu as le picoblaze d’une part et son micro-programme d’autre part. Le micro-programme je le programme en .psm qui sera compilé en code VHDL comme micro-programme. Le tout est mis sur FPGA.
    Je suppose que la RAM de travaille c’est le micro-programme ?


    En fait, OUTPUT s0,CST permet de sortir la valeur contenue dans s0 sur le bon registre de sortie en VHDL c’est un signal.

    INPUT s1,CST permet de sélectionner le bon signal à partir du MUX d’entrée et de mettre la valeur dans s1.

    C’est particulier mais regarde la page Page 102/122 de la doc tu comprendra.

    Alors :
    -quel registre I/O pour le front montant
    -Comment fonctionne ton TIMER ?
    Parce que le TIMER ça peut fonctionner très différent sur les différentes machines , pour ma part je suis tombé dessus que sur des processeurs sonore et en général en mettait la valeur en MiliSeconde , et puis en lisait le registre jusqu'a il était égal à 0, mais la doc expliquait très bien tout ça.
    Et dans ton cas ?
    Le front montant serait détecté par l’instruction INPUT qui surveille la bonne entrée grâce à la constante. Le fait d’acquérir les 8 bits du PORT surveillé agit sur le FLAG ZERO à priori d’après ce qu’on m’a dit.

    Le timer est codé en VHDL par moi-même donc on s’en occupe pas ici.

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 375
    Par défaut
    Pardons pour s0, c’est s6 en commentaire
    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
     
    CONSTANT    CST_AD_REG_STATE_LED,18 ; command reg_timer_status, finish counting?
     
    CONSTANT    CST_AD_REG_STATE_LED_1,10 ; command reg_led_r
    CONSTANT    CST_AD_REG_STATE_LED_2,10 ; command reg_led_r
     
    CONSTANT    CST_AD_REG_TIMER_VAL,15 ; command reg_timer_val to decount
     
    ;---------------------------------------------------------------------------------
    ;Special Register usage
    NAMEREG s0,ZEROS ;use
    NAMEREG s1,ONES ;use
    NAMEREG s2,STATE_LED_1 ;use
    NAMEREG s3,STATE_LED_2 ;use
    NAMEREG s4,TIMER_VAL ; use
    ;NAMEREG s5,ZEROS
    NAMEREG s6,REG_VAL_ENTRY
    ;ne pas utiliser s7 (boucles)
    ;ne pas utiliser s8 (interne)
    ;NAMEREG s9,ZEROS
    ;NAMEREG sA,ZEROS
    ;NAMEREG sB,ZEROS
    ;NAMEREG sC,ZEROS
    ;NAMEREG sD,ZEROS
    ;NAMEREG sE,ZEROS
    ; ne pas utiliser sF (macro)
     
    ;---------------------------------------------------------------------------------
    ;Initialisation
     
    LOAD ZEROS,00
    LOAD ONES,11
    LOAD STATE_LED_1,00 ; STATE OF LEDS
    LOAD STATE_LED_2,0F ; STATE OF LEDS
    LOAD TIMER_VAL,FF ;
     
    ;-------------------------------------MAINPROG------------------------------------
    ;---------------------------------------------------------------------------------
     
    mainprog:  ;CALL maj_timer_val
               CALL test_entry
               ;CALL stateleds ; state 1, see the difference
     
               ;CALL maj_timer_val
               CALL test_entry_2
               ;CALL stateleds_2 ; state 2, see the difference
     
    return mainprog
     
     
    ;------------------------------------SUBROUTINE-----------------------------------
    ;---------------------------------------------------------------------------------
     
    test_entry:  INPUT REG_VAL_ENTRY,CST_AD_REG_STATE_LED ;AD_REG_STATE_LED is PORT_ID
                                                          ;and select the INPUT_data and s0 receive the data
     
                 JUMP NZ, stateleds ;if entry value s6 is not NULL, jump in stateleds
                 return
     
    stateleds:   OUTPUT STATE_LED_1,CST_AD_REG_STATE_LED_1 ;OUTPUT PORT, PORT ID
                 return
     
    test_entry_2: INPUT REG_VAL_ENTRY,CST_AD_REG_STATE_LED ;AD_REG_STATE_LED is PORT_ID
                                                          ;and select the INPUT_data and s0 receive the data
     
                 JUMP NZ, stateleds_2 ;if entry value s6 is not NULL, jump in stateleds
                 return
     
    stateleds_2: OUTPUT STATE_LED_2,CST_AD_REG_STATE_LED_2 ;OUTPUT PORT, PORT ID
                 return
     
    maj_timer_val: OUTPUT TIMER_VAL,CST_AD_REG_TIMER_VAL ;OUTPUT PORT, PORT ID
                   return

    Pour moi, la séquence d’instruction est la suivante :
    1-Mainprog :

    2-Appel de la fonction « test_entry »
    3-Acquisition de la valeur présente à l’entrée avec INPUT, …
    4-Test si la donnée est NON NULL

    4-1-1-Si non nul c’est qu’on a eu une fin de TIMER (TIMER déclanché par CLK externe)
    4-1-2-Fonction « stateleds » Changement d’état des LEDS
    Ou
    4-2-1 Si nul -> alors on retourne au mainprog et on va lancer la fonction test_entry_2.

    Pour le 4-2-1, il vaut peut être mieux faire un return test_entry comme ça on reste dans la boucle tant qu’on a rien détecté. Ce n’est pas requit de faire une boucle infinie. !!

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

Discussions similaires

  1. [DOM] Surveiller une modification du DOM (lib prototype)
    Par Cladjidane dans le forum Bibliothèques & Frameworks
    Réponses: 9
    Dernier message: 04/02/2008, 14h58
  2. Surveiller une variable
    Par Electroniktor dans le forum C
    Réponses: 7
    Dernier message: 28/06/2007, 19h14
  3. Comment lire une pin sur le port série du pc
    Par KENPACHI dans le forum LabVIEW
    Réponses: 1
    Dernier message: 25/05/2007, 12h56
  4. Surveiller une TextBox d'une application
    Par spiral dans le forum MFC
    Réponses: 26
    Dernier message: 23/08/2005, 16h13

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