samedi 17 janvier 2015

questions quiz

Voici un petit programme à tester dans le simulateur de MPLABX en mode pas à pas. Mais avant essayez de deviner le contenu de STATUS après chaque opération suivie du commentaire STATUS=?. Si vous répondez correctement à chaque étape votre compréhension du fonctionnement interne du CPU est excellente.


    include p10f200.inc
    __config _WDTE_OFF
    radix dec
    org 0
main_loop
    bsf STATUS,0   ; set C bit
    bsf STATUS,1   ; set DC bit
    bsf STATUS,2   ; set Z bit
    clrf STATUS    ; Q1, STATUS=?
    bsf STATUS,7   ; Q2, STATUS=?
    movfw STATUS   ; Q3, STATUS=? W=?
    movlw 0x78
    addwf STATUS,F ; Q4, STATUS=?
    movfw STATUS   ; Q5, STATUS=? W=?
    xorwf STATUS,F ; Q6, STATUS=?
    goto main_loop
    end
Pour vous aidez dans votre réflexion voici une représentation du registre STATUS des PIC10F20X.

Réponses et explications

  1. STATUS=0x1F. Pensiez-vous que le contenu de STATUS serais mis à zéro? Erreur car certains bits sont en lecture seule : ~TO et ~PD. De plus Z est mis à 1 car l'instruction CLRF affecte ce bit en le mettant à 1. L'ajustement des bits Z,DC et C se fait à la fin de l'opération et l'opération CLRF ne change pas l'état des indicateurs DC et C. Ces deux là était à 1 donc ils le reste. Donc si vous voulez mettre à zéro les 3 indicateurs ne faites pas un CLRF STATUS mais plutôt:
    
      BCF STATUS,Z
      BCF STATUS,DC
      BCF STATUS,C
    
  2. STATUS=0x9F. Ce bit est R/W donc il es mis à 1 tel que prévu par l'opération. Les autres bits ne sont pas affectés.
  3. STATUS=0x9B et W=0x9F. C'est normal puisque l'instruction MOVFW affecte la valeur de l'indicateur Z. Celui-ci a été mis à zéro puisque la valeur transféré dans W n'était pas nulle.
  4. STATUS=0x1B. L'addition a bien donnée le résultat escomptée sauf que les indicateurs Z, DC et C ont été ajusté en conséquence de l'addition. Comme toujours les bit en lecture seule de STATUS n'ont pas été modifiés par le résultat et les 3 indicateurs ont écrasés les bit 0-2 du résultat. Si vous voulez vérifier que l'addition donne le résultat escompté remplacé addwf STATUS, F par addwf STATUS, W et vérifier le résultat dans W.
  5. STATUS=0x1B et W=0x1B. Cette fois-ci STATUS n'a pas été modifié par l'opération MOVFW puisque Z était déjà à zéro.
  6. STATUS=0x1F. l'opération XORWF n'affecte que le bit Z. Ici on a fait une opération xor de la valeur de STATUS avec elle-même. Le résultat d'une telle opération est zéro. Donc le bit Z a été mis à 1. les bits DC et C ne sont pas altérés. Encore une fois les 3 indicateurs écrase les bits 0-2 du résultat. Le bit 4 (~PD) était à 1 et le reste puisqu'il est en lecture seule.