Свежие обсуждения
Микроконтроллеры

не подключается макрос к pic17c756a в MPASMе

Сколько не мучался, какие только директивы не подключал, все равно не замечает макрос, точнее замечает, но ничего не выполнив , идет далее.
После даже создал простенькую простенькую прогу, чтобы понять, но что-то не получается самому разобраться

листинг.
;********************************************************************

list P=17c756, x=ON
include <P17C756.inc>
EXPAND
;*********************************************************************

TEST EQU H'50'
VAL EQU H'51'

PROBA MACRO VAL1

CLRF VAL,f
ENDM

ORG 0000h
START:
BSF CPUSTA,GLINTD ; Запрет прерываний
CLRF BSR,F ; Обнуление регистра выбора банка
GOTO RESET

ORG 0030h

RESET:

MOVLW H'01'
MOVWF TEST

PROBA TEST

GOTO RESET

END

 

Попробуйте так:

PROBA MACRO VAL1
CLRF VAL1
ENDM

Этот макрос предписывает контроллеру очистить тот регистр, который будет указан программистом вместо VAL1 при вызове макроса.

 

Спасибо, огромное, все идет!

 

Ребят, еще один вопрос.
Почему:
IF !(VAL1<=0x01) INCF VAL3,f
IF (VAL3>8)
DECF VAL1,f
ELSE
DECF VAL3,F
ENDIF у меня работает наоборот, просто вообще слов нет ...

Листинг.
;********************************************************************

list P=17c756, x=ON
include <P17C756.inc>
EXPAND
;*********************************************************************

TEST EQU H'50'
VAL1 EQU H'51'
AAAAA EQU H'52'
VAL3 EQU H'53'

ORG 0000h
START:
BSF CPUSTA,GLINTD ; Запрет прерываний
CLRF BSR,F ; Обнуление регистра выбора банка
GOTO RESET

ORG 0030h

RESET:

CLRF VAL1,f
CLRF VAL3,f

IF !(VAL1<=0x01) INCF VAL3,f ; Почему-то он сюда попадает
IF (VAL3>8)
DECF VAL1,f ; Почему-то он сюда попадает
ELSE
DECF VAL3,F ; не попадает, хотя должен по идее ...
ENDIF

GOTO RESET

END

 

Еще в тему: если писать if, потом еще if, еще if , а потом else, то к какому ifу он будет относиться и хватит ли одного endifа?
Спасибо!!!

 

Макрос выполняется (разворачивается) во время компиляции. Он понятия не имеет, какое значение занесено в какой регистр

mirn: IF !(VAL1<=0x01) INCF VAL3,f ; Почему-то он сюда попадает

Потому что VAL1 EQU H'51'

 

, понял, спасибо!!! А можно как - нибудь "изменить", чтобы все-таки работало выражение?

 

Как сравнивать значения регистров?

например так:

IFLT	macro	f, k			;Перейти к метке k, если значение в регистре f меньше чем значение в аккумуляторе W
	subwf	f, W
	btfss	STATUS, C
	goto	k
	endm

IFGE	macro	f, k			;Перейти к метке k, если значение в регистре f больше либо равно W
	subwf	f, W
	btfsc	STATUS, C
	goto	k
	endm

Ну и погнали:

	movlw   #0
	IFGE	VAL1, skip	; идём на skip, если VAL1 > 0
	INCF	VAL3,F
skip:
	movlw   #8
	IFGE	VAL3, skip2	; идём на skip, если VAL3 > 8

И так далее...

 

Спасибо огромное!!!