JojoJoppe
Wees altijd vrolijk!
Hoi,
Ik probeer nu in asm een macro te maken waarmee ik standaard een delay kan invoeren van een meervoud van 10.
LIST p=16F628a
#include "P16F628A.INC"
__config _INTRC_OSC_NOCLKOUT & _LVP_OFF & _PWRTE_ON & _MCLRE_ON & _WDTE_OFF
; CONSTANT's
#define LED PORTB,4
; MACRO's
DELAYMS MACRO ms
local dly1,dly2
variable dl,tr1,tr2,tr3
pagesel $
MOVWF dl
movlw ms/.10
MOVWF tr3
dly2 MOVLW .13
MOVWF tr2
CLRF tr1
dly1 DECFSZ tr1, f
GOTO dly1
DECFSZ tr2, f
GOTO dly1
DECFSZ tr3, f
GOTO dly2
MOVFW dl ; Laden huidige W
ENDM
; VARIABLES
UDATA
dl101 res 1
dl102 res 1
dl103 res 1
; INIT
org 0x000
clrf PORTB
banksel TRISB
clrf TRISB
banksel PORTB
; MAIN
main bsf LED
DELAYMS .200
bcf LED
DELAYMS .200
GOTO main
ENDAlleen wanneer ik dit run, gaat de led aan maar niet meer uit. (terwijl wanneer ik de delaylussen in een subroutine zet en die dan roep vanaf de macro doet hij het wel.) Weet iemand wat ik fout doe?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ik roep de code altijd aan in een subroutine vanuit een macro...
Dat is efficienter, omdat er veel minder code wordt gegenereerd, zeker als je de delay vaak gebruikt.
Fuzzbass
Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Ik zie het nut van een macro met 1 over te dragen variabele ook niet echt. Je zou helemaal geen macro moeten gebruiken hier.
Waarom het niet werkt is volgens mij omdat je dl, tr1, tr2 en tr3 niet als RAM-lokaties gedefinieerd hebt, maar als assembler variabelen.