[an error occurred while processing this directive] [an error occurred while processing this directive]
Черт, все табуляции скушались и получилась каша. Ну да ладно, кому действительно надо, разберется. А вот и сами макросы, с помощью которых это делалось (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Boris Barbaris 24 октября 2001 г. 15:18
В ответ на: Если используешь ИАРовсий ассемблер (он, кстати, официально бесплатный), можно использовать макросы (+) отправлено Boris Barbaris 24 октября 2001 г. 15:09

; ------------------------------------------------
; Джентельменский набор макросов для IAR-asm AVR
; (c) Boris F. Frolkin, 1999
; ------------------------------------------------
;#pragma language=extended

RADIX 0ah
COL 132
#define tmp r16 ; рабочий регистр для обработки данных
#define work r17 ; рабочий регистр для передачи параметров

tag_reg = 11h ; r0..r15
tag_reg16 = 12h ; r16..r31
tag_port = 14h ; port 0..1Fh
tag_port32 = 18h ; port 20h..3Fh

#define BitTag
#define BitPort byte3
#define BitMask byte2
#define BitPos low
OffsetTag = 1000000h
OffsetPort = 10000h
OffsetMask = 100h
OffsetPos = 1h
BitMaskOnly = 0ffh * OffsetPos

; ------------------------------------------------

ClearAllRegisters macro ; обнуление всех регистров r0..r31
local label
clr ZH
ldi ZL,30
label: st -Z,ZH
tst ZL
brne label
endm
; ------------------------------------------------

nop2 macro ; NOP длительностью 2 такта
local label
rjmp label
label:
endm
; ------------------------------------------------

stop macro ; отладочная остановка
local label
label: wdr
rjmp label
endm
; ------------------------------------------------

addi macro register,const8
subi register,low(-const8)
endm
; ------------------------------------------------

adci macro register,const8
sbci register,low(-const8)
endm
; ------------------------------------------------

addi16 macro hregister,lregister,const16
subi lregister,low(-const16)
sbci hregister,high(-const16)
endm
; ------------------------------------------------

subi16 macro hregister,lregister,const16
subi lregister,low(const16)
sbci hregister,high(const16)
endm
; ------------------------------------------------

waitZero macro register
local label
label: tst register
brne label
endm
; ------------------------------------------------

load macro port,const
ldi tmp,const
out port,tmp
endm
; ------------------------------------------------

loadr macro registr,const
if const=0
clr registr
else
ldi tmp,const
mov registr,tmp
endif
endm
; ------------------------------------------------

Delay macro Takts
if Takts=0
; ничего
elseif Takts=1
nop
elseif Takts=2
nop2
elseif Takts=3
nop
nop2
elseif Takts=4
nop2
nop2
elseif Takts=5
nop
nop2
nop2
elseif Takts=6
nop2
nop2
nop2
elseif Takts=7
rcall __Delay7
elseif Takts=8
nop
rcall __Delay7
elseif (Takts mod 3)=0
ldi tmp,((Takts-6)/3)
rcall __Delay0
elseif (Takts mod 3)=1
ldi tmp,((Takts-6)/3)
rcall __Delay1
elseif (Takts mod 3)=2
ldi tmp,((Takts-6)/3)
rcall __Delay2
endif
endm
; ------------------------------------------------

DelaySubroutine macro
; Задержка на фиксированное количество тактов
; tmp*3+6 (с CALL и RET)
__Delay2: nop
__Delay1: nop
__Delay0:
dec tmp
brne __Delay0
__Delay7: ret
endm
; ------------------------------------------------

defreg macro regname,regnumber
if regnumber>31
#error "regnumber <> 0..31"
elseif regnumber>15
regname = ((tag_reg16*100h+regnumber)*100h+0)*100h+0
else
regname = ((tag_reg*100h+regnumber)*100h+0)*100h+0
endif
endm
; ------------------------------------------------

defport macro portname,portnumber
if portnumber>63
#error "portnumber > 3Fh"
elseif portnumber>31
portname = ((tag_port32*100h+portnumber)*100h+0)*100h+0
else
portname = ((tag_port*100h+portnumber)*100h+0)*100h+0
endif
endm
; ------------------------------------------------

defbit macro bitname,portreg,bitvalue
if bitvalue>7
#error "bitvalue <> 0..7"
endif
if (high(hwrd(portreg))=0)
#error "port/register not defined"
endif
bitname = (portreg | ((1< endm
; ------------------------------------------------

skip0 macro bitname
if (high(hwrd(bitname))=tag_port)
sbic byte3(bitname),low(bitname)
elseif (high(hwrd(bitname))=tag_reg16)
___count var 16
repti ___reg,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31
if (byte3(bitname)=___count)
sbrc ___reg,low(bitname)
endif
___count var ___count+1
endr
elseif (high(hwrd(bitname))=tag_reg)
___count var 0
repti ___reg,r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15
if (byte3(bitname)=___count)
sbrc ___reg,low(bitname)
endif
___count var ___count+1
endr
else
#error "invalid tag / port 20h..3Fh"
endif
endm
; ------------------------------------------------

skip1 macro bitname
if (high(hwrd(bitname))=tag_port)
sbis byte3(bitname),low(bitname)
elseif (high(hwrd(bitname))=tag_reg16)
___count var 16
repti ___reg,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31
if (byte3(bitname)=___count)
sbrs ___reg,low(bitname)
endif
___count var ___count+1
endr
elseif (high(hwrd(bitname))=tag_reg)
___count var 0
repti ___reg,r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15
if (byte3(bitname)=___count)
sbrs ___reg,low(bitname)
endif
___count var ___count+1
endr
else
#error "invalid tag / port 20h..3Fh"
endif
endm
; ------------------------------------------------

wait0 macro bitname
local label
label: skip0 bitname
rjmp label
endm
; ------------------------------------------------

wait1 macro bitname
local label
label: skip1 bitname
rjmp label
endm
; ------------------------------------------------

set0 macro bitname
if (high(hwrd(bitname))=tag_port)
cbi byte3(bitname),low(bitname)
elseif (high(hwrd(bitname))=tag_reg16)
___count var 16
repti ___reg,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31
if (byte3(bitname)=___count)
cbr ___reg,byte2(bitname)
endif
___count var ___count+1
endr
elseif (high(hwrd(bitname))=tag_reg)
___count var 0
repti ___reg,r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15
if (byte3(bitname)=___count)
ldi tmp,~(byte2(bitname))
and ___reg,tmp
endif
___count var ___count+1
endr
else
#error "invalid tag / port 20h..3Fh"
endif
endm
; ------------------------------------------------

set1 macro bitname
if (high(hwrd(bitname))=tag_port)
sbi byte3(bitname),low(bitname)
elseif (high(hwrd(bitname))=tag_reg16)
___count var 16
repti ___reg,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30,r31
if (byte3(bitname)=___count)
sbr ___reg,byte2(bitname)
endif
___count var ___count+1
endr
elseif (high(hwrd(bitname))=tag_reg)
___count var 0
repti ___reg,r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15
if (byte3(bitname)=___count)
ldi tmp,byte2(bitname)
or ___reg,tmp
endif
___count var ___count+1
endr
else
#error "invalid tag / port 20h..3Fh"
endif
endm
; ------------------------------------------------
; Конец набора макросов для IAR-asm AVR
; ------------------------------------------------

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru