Wer gerne If-Then-Else zur bedingten Kompilierung benutzen will, sich
gegenüber avrasm und dem avrstudio fast nicht umstellen möchte, der
sollte das oben erwähnte Avrterse mal ausprobieren. Es ist kostenlos und
man muss lediglich im Avrstudio angeben, die Datei statt mit avrasm mit
avrterse assemblieren zu lassen. Dann läufts nahezu wie gewohnt, nur mit
einem mächtigeren Assembler, der Macroverschachtelung, bedingte
Assemblierung etc. unterstützt.
Damit kann man dann auch das gewünschte Macro haben, das automatisch den
passenden Code für 0 - ca. 100 Zyklen Verzögerung generiert. Man braucht
nur unten stehendes Macro zu verwenden und lnop (basiert auf rjmp PC +
1) und delay_8Cycles (basisert auf einen rcall direkt zu einem nop + ret
=> 8 Zyklen) einbinden.
Lutz
;***********************************************************************
****
;* delay_XCycles
;***********************************************************************
****
;* Typ : Macro, Öffentlich
;* Kurzbeschreibung : Erzeugt nop, lnop, delay_8cycles - Kombinationen,
;* die mit möglichst wenig PrgMem X-Cycles verzögert
;* Eingabe : @0: Anzahl zu verzögernder Zyklen
;* Ausgabe : keine
;* Benutzte Register : 2 Byte Stacktiefe
;* Zyklen : @0
;* PrgMem-Verbrauch : Variabel, wird aber für X > 100 zu groß
;***********************************************************************
****
.macro delay_XCycles
; Verzögerungszyklenzahl in 8'er, 2'er und 1'er-Komponenten
; zerlegen
.set delay_XCInput = @0
.set Delay_XCFakt8 = ((delay_XCInput & $fffff8) / 8)
.set Delay_XCTempA = delay_XCInput - (Delay_XCFakt8 * 8)
.set Delay_XCFakt2 = ((delay_XCTempA & 0b1110) / 2)
.set Delay_XCFakt1 = delay_XCTempA - (Delay_XCFakt2 * 2)
.set Delay_XCTempA = (Delay_XCFakt8 * 8) + (Delay_XCFakt2 * 2) +
Delay_XCFakt1
.if (Delay_XCTempA != Delay_XCInput)
.echo "Trouble in Delay_XCycles!"
.endif
.set Delay_XCUsedWords = Delay_XCFakt8 + Delay_XCFakt2 +
Delay_XCFakt1
.if (Delay_XCUsedWords > 20)
.echo "Warnung: delay_XCycles verbrät mehr als 20 Words PrgMem!"
.echo "nämlich", Delay_XCUsedWords,"Words."
.endif
.count Delay_XCFakt8 ; 8'er NOP's
delay_8Cycles
.endcount
.count Delay_XCFakt2 ; 2'er NOP's
lnop
.endcount
.count Delay_XCFakt1 ; 1'er NOP's
nop
.endcount
.endmacro