Le littéral xorwf n’affecte pas le drapeau z même lorsque la valeur littérale est identique à la valeur en w

Danois ALI

Le littéral xorwf n’affecte pas le drapeau z même lorsque la valeur littérale est identique à la valeur en w


Selon la description du jeu d’instructions, « xorwf myLiteral » doit xor le contenu de « w » avec « myLiteral » et si les deux sont identiques, le drapeau Z dans STATUS doit être défini (pas intéressé où cette instruction enregistre le résultat mais le drapeau Z doit être affecté si les deux les valeurs étaient les mêmes)

Mais dans mon code, cela ne se produit pas

movf PORTC
xorwf red_on    ;w holds 01000100 and red_on is also 01000100 Z must be one
btfsc STATUS, Z ;but here it's not one
goto Turn_Yellow_On

Le code complet suit:

    ; PIC16F72 Configuration Bit Settings

; Assembly source line config statements

#include "p16f72.inc"

; CONFIG
; __config 0xFFF7
 __CONFIG _FOSC_RC & _WDTE_ON & _PWRTE_ON & _CP_OFF & _BOREN_ON

STATUS equ 0x03
TRISC equ 0x87
PORTC equ 0x07
INTCON equ 0x0b

RP0 equ 5
RP1 equ 6
Z equ 2

GIE equ 7
INTE equ 4
INTF equ 1

all_off equ 0x00
red_on equ 0x44
yellow_on equ 0x22
green_on equ 0x11 

bank0 macro
    bcf STATUS, RP0
    bcf STATUS, RP1
    endm

bank1 macro
    bsf STATUS, RP0
    bcf STATUS, RP1
    endm

extrn_int_enable macro
    bsf INTCON, GIE
    bsf INTCON, INTE
    endm

PORTC_as_out macro
    bank1
    movlw 0x00
    movwf TRISC
    endm

PORTC_out macro outByte
    bank0
    movlw outByte
    movwf PORTC
    endm

test_and_switch macro testWith, jumpTo
    movf PORTC
    xorwf testWith
    btfsc STATUS, Z
    goto jumpTo
    endm

    org 0x00
Reset_Vector:
    goto Main

    org 0x04
Interrupt_Vector:
    goto Switch_Next

    org 0x05
Main:
    PORTC_as_out
    extrn_int_enable

Loop:
    clrwdt
    goto Loop

    org 0x200
Switch_Next:
    bcf INTCON, INTF

    ;test_and_switch all_off, Turn_Red_On
    movf PORTC      ;I recognized the mistake I should use d = 0 but data
    ;will still be copied in w when program goes to "Turn_Red_On" routine for 
    ;the first time
    xorwf all_off
    btfsc STATUS, Z
    goto Turn_Red_On

    ;test_and_switch red_on, Turn_Yellow_On
    movf PORTC
    xorwf red_on    ;w holds 01000100 and red_on is also 01000100 Z must be one
    btfsc STATUS, Z ;but here it's not one
    goto Turn_Yellow_On

    ;test_and_switch yellow_on, Turn_Green_On
    movf PORTC
    xorwf yellow_on
    btfsc STATUS, Z
    goto Turn_Green_On

    goto Turn_All_Off

Turn_Red_On:
    PORTC_out red_on
    goto Return_From_Int

Turn_Yellow_On:
    PORTC_out yellow_on
    goto Return_From_Int

Turn_Green_On:
    PORTC_out green_on
    goto Return_From_Int

Turn_All_Off:
    PORTC_out all_off
    goto Return_From_Int

Return_From_Int:
    retfie

    end

Réponses


 Spehro Pefhany

Votre instruction movf PORTC n’a pas de destination.

La valeur par défaut est f, PORTC dans ce cas, donc vous ne mettez pas le numéro dans le registre w.

Remplacez-le par movf PORTC, w

Et vous devez toujours le déclarer explicitement pour éviter les problèmes. L’exécution d’une simulation aurait probablement intercepté cela, et cela vaut la peine d’apprendre à le faire.

Edit: De plus, vous utilisez xorwf (ex-ou le registre w avec un registre de fichiers), alors que vous devriez utiliser xorlw (ex-ou un littéral avec le registre w).

xorwf prend l’opérande comme une adresse et xor le registre w avec le contenu du registre à cet emplacement (0x44, dans les 96 octets des registres à usage général), ce qui n’est pas ce que vous voulez.

Danois ALI

la destination du résultat n’est pas un point d’intérêt atm. Le résultat indésirable est lorsque w contient 0x44 et que xorwf 0x44 ne définit pas le drapeau Z (c’est étonnant pour moi). Si vous copiez et simulez ce code dans MPLAB X et utilisez un stimulus pour interrompre la broche INT, vous remarquerez la 2e interruption après avoir entré le libellé Switch_Next sur environ la 7e ligne de code, vous remarquerez que la valeur de w serait 0x44 et « xorwf red_on » (red_on equ 0x44) ne mettra toujours pas Z dans STATUS lors de son exécution, ce qui est étrange

Spehro Pefhany

Voir ajout de modification ci-dessus.

Danois ALI

Merci, c’était mon erreur, je n’ai pas reconnu que xorwf prenait le littéral comme adresse et non comme valeur constante maintenant je l’ai remplacé par xorlw et mon code fonctionne. Reconnaissant!

 

#à, #en, #la, #pas, drapeau, est, identique, Le, littéral, littérale, lorsque, même, n’affecte, valeur, w, xorwf, z

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *