Sida 1 av 1

Litet jobbigt problem...

Postat: 2 mars 2004, 20:10:17
av gvs
Är i slutfasen av mitt ibuttonprojekt och har ett återstående fel, hag jobbat mig runt det men det blir snyggare kod om jag löser även detta.

varför får jag följande kompileringsfel:
Error[116] E:\HEMSIDA\IBUTTON\IBUTTON.ASM 144 : Address label duplicated or different in second pass (JUMP)
Error[116] E:\HEMSIDA\IBUTTON\IBUTTON.ASM 150 : Address label duplicated or different in second pass (KORT)
Error[116] E:\HEMSIDA\IBUTTON\IBUTTON.ASM 155 : Address label duplicated or different in second pass (STOPP)

om jag anroper följade macro två eller flera gånger i samma kod, alltså skriver den på två ställen ett ställe som jag loopar kring funkar bra.


WAITSHORT MACRO
MOVLW H'FF'
MOVWF LOOP1
MOVWF LOOP2
JUMP
MOVLW H'FF'
MOVWF LOOP1
DECFSZ LOOP2,F
GOTO KORT
GOTO STOPP
KORT
WAIT .1000
DECFSZ LOOP1,F
GOTO JUMP
GOTO KORT
STOPP
ENDM

Postat: 2 mars 2004, 20:20:53
av matseng
Lägg till:

LOCAL JUMP, KORT, STOP

direkt efter "WAITSHORT MACRO"-raden så kanske det fungerar bättre.

Postat: 2 mars 2004, 20:43:43
av gvs
får det inte att funka fortfarande samma fel

har ändrat till följande:
WAITSHORT MACRO LOCAL JUMP, KORT, STOP

sen anropar jag det så här:

MOVLW H'0F'
MOVWF LOOP3
FELBLINK
BSF GPIO,LED
WAITSHORT LOCAL JUMP, KORT, STOP
BCF GPIO,LED
WAITSHORT LOCAL JUMP, KORT, STOP
DECFSZ LOOP3,F
GOTO FELBLINK

GOTO START

utan local joxet i anropet funkar det ännu sämre.

Postat: 2 mars 2004, 21:20:04
av matseng
Jag tänkte att LOCAL-joxet skulle stå på en egen rad.... Men jag uttryckte mig nog lite luddigt...

Postat: 2 mars 2004, 21:34:32
av gvs
tackar funkar nu, men varför? har aldrig hört om det tidigare

Postat: 2 mars 2004, 22:11:54
av matseng
Problemet med att använda macron som har en label i sig är att samma label kommer och hamna på flera ställen i koden. Detta eftersom ett macro inte är en subrutin utan snarare en mall eller en förkortning av en sekvens med kod.

Om du har kod som ser ut som:

Kod: Markera allt

Dum MACRO 
 MOVLW H'AA' 
 GOTO Foo  
Foo
 MOVLW H'55' 
ENDM 

 MOVLW H'11'
 Dum
 Dum
 Dum
 MOVLW H'22'
Så kommer assemblern att försöka assemblera följande kod när macroexpansionen har gjorts.

Kod: Markera allt

 MOVLW H'11'
 MOVLW H'AA' 
 GOTO Foo  
Foo
 MOVLW H'55' 
 MOVLW H'AA' 
 GOTO Foo  
Foo
 MOVLW H'55' 
 MOVLW H'AA' 
 GOTO Foo  
Foo
 MOVLW H'55' 
 MOVLW H'22'
Och då har man plöstligt tre lablar som heter "foo" i programmet, och det är inte bra.

Genom att med LOCAL-kommandot tala om att "foo" är en lokal label så ser assembler till att lägga på något på "foo" varje gång som macros anropas. Tillexempel lägga på en siffra i slutet på det. På så sätt blir det olika lablar och inga problem uppstår.

Kod: Markera allt

 MOVLW H'11'
 MOVLW H'AA' 
 GOTO Foo1  
Foo1
 MOVLW H'55' 
 MOVLW H'AA' 
 GOTO Foo2  
Foo2
 MOVLW H'55' 
 MOVLW H'AA' 
 GOTO Foo3 
Foo3
 MOVLW H'55' 
 MOVLW H'22'