📄 sensor.s
字号:
#define __SFR_OFFSET 0
#define _VECTOR(N) __vector_ ## N // io.h does not define this for asm
#include <avr/io.h> // for CPU I/O register definitions and vectors
#include "App_IO.h" // for common defs
#define nop2 rjmp .+0 // jump to next instruction
.text
.global SIG_PIN_CHANGE1
.type SIG_PIN_CHANGE1, @function
.global SIG_PIN_CHANGE2
.type SIG_PIN_CHANGE2, @function
.global HallSensor // 外部函数声名
// Register assignments for usbCrc16 on gcc
// Calling conventions on gcc:
// First parameter passed in r24/r25, second in r22/23 and so on.
// Callee must preserve r1-r17, r28/r29
// Result is passed in r24/r25
# define argLen r22 // argument 2
# define argPtrL r24 // argument 1
# define argPtrH r25 // argument 1
# define resCrcL r24 // result
# define resCrcH r25 // result
# define ptrL XL
# define ptrH XH
# define ptr x
# define byte r18
# define bitCnt r19
# define polyL r20
# define polyH r21
# define scratch r23
SIG_PIN_CHANGE1:
SIG_PIN_CHANGE2:
push r24
in r24, SREG
push r24
push R25
push ptrL
push ptrH
cli
ldi r24, 0x02
out PCIFR, r24
call HallSensor
pop ptrH
pop ptrL
pop R25
pop r24
out SREG, r24
pop r24
reti
HallSensor:
// Hall = ((HALL_PIN & HALL_MASK)|(PINC & (1<<HALL3)))<<1;
in r25, PINC
in r24, HALL_PIN
sei
andi r24, HALL_MASK
andi r25, (1<<HALL3)
or r24, r25
lsl r24
// *p = &drvPatterns[i][Hall];
ldi ptrL, lo8(drvPatterns)
ldi ptrH, hi8(drvPatterns)
sbrc r14, BMDDR
adiw ptrL, 16
clr r25
add ptrL, r24
adc ptrH, r25
// MC_PORT = MASKBIT(MC_PORT,MC_MASK,*p++);
in r24, MC_PORT
andi r24, ~MC_MASK
ld r25, ptr+
or r24, r25
out MC_PORT, r24
// MC_DDR = MASKBIT(MC_DDR ,MC_MASK,*p++);
in r24, MC_DDR
andi r24, ~MC_MASK
ld r25, ptr
or r24, r25
out MC_DDR, r24
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -