La macro suivante :
Code : Tout sélectionner
TMR0_IT macro
movwf TMR0_W_TEMP ; sauver registre W
; et les autres chez soi
swapf STATUS,w ; swap status dans w
banksel TMR0_DATAS
movwf TMR0_status_temp ; sauver status swappé
movf PCLATH, w
movwf TMR0_pclath_temp
bcf INTCON, T0IF
; fin des sauvegardes, déjà 13 cycles perdus
; cette IT est-elle pour ici ?
btfss INTCON, T0IE
return
btfss INTCON, T0IF
return
; oui
variable i = 0
while i < 8
; boucle i
btfsc TMR0_Flags, TMR0_IT_BCL1_DONE+i
goto TMR0_IT_2
; #DEFINE CMPT_TailleVar TMR0_TAILLE_COMPTEURS
; CMPT_ISNUL TMR0_Cmpt_Bcl1
; les deux instructions suivantes remplacent les 2 lignes
; précédentes pour être sûr du nombre de cycles
movf TMR0_Cmpt_Bcl1+2*i, w
iorwf TMR0_Cmpt_Bcl1+2*i+1, w
btfsc STATUS, Z
goto TMR0_IT_1
; pour équilibrer les deux situations en nombre de cycles perdus
goto $+1
nop
; 9 cycles perdus
clrf TMR0
#DEFINE CMPT_TailleVar TMR0_TAILLE_COMPTEURS
CMPT_DECUF TMR0_Cmpt_Bcl1+2*i
goto TMR0_IT_FIN
local TMR0_IT_1
TMR0_IT_1
bsf TMR0_Flags, TMR0_IT_BCL1_DONE+i
movf TMR0_Reste_Bcl1+2*i, w
; 9 cycles perdus
movwf TMR0
goto TMR0_IT_FIN
i set i+1
local TMR0_IT_2
TMR0_IT_2
endw
TMR0_IT_FIN
endm
me pose des problèmes d'assemblage que je ne comprends pas:
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F884 "test TMR0.asm" /l"test TMR0.lst" /e"test TMR0.err" /d__DEBUG=1
Error[116] ./TMR0.INC 561 : Address label duplicated or different in second pass (_3TMR0_IT_1)
Error[116] ./TMR0.INC 569 : Address label duplicated or different in second pass (_3TMR0_IT_2)
Error[116] ./TMR0.INC 561 : Address label duplicated or different in second pass (_3TMR0_IT_1)
Error[116] ./TMR0.INC 569 : Address label duplicated or different in second pass (_3TMR0_IT_2)
Error[116] ./TMR0.INC 561 : Address label duplicated or different in second pass (_3TMR0_IT_1)
Error[116] ./TMR0.INC 569 : Address label duplicated or different in second pass (_3TMR0_IT_2)
Error[116] ./TMR0.INC 561 : Address label duplicated or different in second pass (_3TMR0_IT_1)
Error[116] ./TMR0.INC 569 : Address label duplicated or different in second pass (_3TMR0_IT_2)
Error[116] ./TMR0.INC 561 : Address label duplicated or different in second pass (_3TMR0_IT_1)
Error[116] ./TMR0.INC 569 : Address label duplicated or different in second pass (_3TMR0_IT_2)
Error[116] ./TMR0.INC 561 : Address label duplicated or different in second pass (_3TMR0_IT_1)
Error[116] ./TMR0.INC 569 : Address label duplicated or different in second pass (_3TMR0_IT_2)
Error[116] ./TMR0.INC 561 : Address label duplicated or different in second pass (_3TMR0_IT_1)
Error[116] ./TMR0.INC 569 : Address label duplicated or different in second pass (_3TMR0_IT_2)
Skipping link step. Not all sources built successfully.
1 - pourquoi les étiquettes TMR0_IT_1 et TMR0_IT_2 sont-elles toujours préfixées de _3 alors qu'elles devraient l’être de _i, i = 1 à 8 ?ê
2 - pourquoi le local n'est-il pas pris en compte, ou mal.
J'ai déjà eu l'occasion d'utiliser cette directive sans problème. Notez que sa documentation ne parle pas de cet usage, pourtant indispensable.
Si quelqu'un a une idée, merci d'avance, sinon, je ferai péter, mais avec regrets, le while.