📄 sensor.s.bak
字号:
#include "iarcompat.h"
#ifndef __IAR_SYSTEMS_ASM__ // configs for io.h
#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
#endif
#include "usbdrv.h" // for common defs
// register names
#define x1 r16
#define x2 r17
#define shift r18
#define cnt r19
#define x3 r20
#define x4 r21
#define bitcnt r22
#define phase x4
#define leap x4
// Some assembler dependent definitions and declarations:
#ifdef __IAR_SYSTEMS_ASM__
# define nop2 rjmp $+2 // jump to next instruction
# define XL r26
# define XH r27
# define YL r28
# define YH r29
# define ZL r30
# define ZH r31
# define lo8(x) LOW(x)
# define hi8(x) (((x)>>8) & 0xff) // not HIGH to allow XLINK to make a proper range check
extern usbRxBuf, usbDeviceAddr, usbNewDeviceAddr, usbInputBufOffset // 外部变量声名
public usbCrc16 // 外部函数声名
public usbCrc16Append
COMMON INTVEC
ORG USB_INTR_VECTOR
rjmp usbInterruptHandler
RSEG CODE
#else // __IAR_SYSTEMS_ASM__
# define nop2 rjmp .+0 // jump to next instruction
.text
.global USB_INTR_VECTOR
.type USB_INTR_VECTOR, @function
.global usbCrc16 // 外部函数声名
.global usbCrc16Append
#endif // __IAR_SYSTEMS_ASM__
;----------------------------------------------------------------------------
; 函数
;----------------------------------------------------------------------------
#ifdef __IAR_SYSTEMS_ASM__
// Register assignments for usbCrc16 on IAR cc
// Calling conventions on IAR:
// First parameter passed in r16/r17, second in r18/r19 and so on.
// Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer)
// Result is passed in r16/r17
// In case of the "tiny" memory model, pointers are only 8 bit with no
// padding. We therefore pass argument 1 as "16 bit unsigned".
RTMODEL "__rt_version", "3"
// The line above will generate an error if cc calling conventions change.
// The value "3" above is valid for IAR 4.10B/W32
# define argLen r18 // argument 2
# define argPtrL r16 // argument 1
# define argPtrH r17 // argument 1
# define resCrcL r16 // result
# define resCrcH r17 // result
# define ptrL ZL
# define ptrH ZH
# define ptr Z
# define byte r22
# define bitCnt r19
# define polyL r20
# define polyH r21
# define scratch r23
#else
// 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
#endif
; extern void HallSensorTask(void);
; data: r24/25
; len: r22
; temp variables:
; r18: data byte
; r19: bit counter
; r20/21: polynomial
; r23: scratch
; r24/25: crc-sum
; r26/27=X: ptr
HallSensorTask:
// Hall = ((HALL_PIN & HALL_MASK)|(PINC & (1<<HALL3)))<<1;
in r18, HALL_PIN
in r24, PINC
andi r18, HALL_MASK
andi r24, (1<<HALL3)
or r18, r24
lsl r18
// *p = &drvPatterns[1][Hall];
ldi ptrL, hi8(drvPatterns)
ldi ptrH, lo8(drvPatterns)
add ptrL, r18
adc ptrH, r1
// MC_PORT = MASKBIT(MC_PORT,MC_MASK,*p);
in r18, MC_PORT
andi r18, MC_MASK
ld r24, ptr+
or r18, r24
out MC_PORT, r18
// MC_DDR = MASKBIT(MC_DDR ,MC_MASK,*p);
in r18, MC_DDR
andi r18, MC_MASK
ld r24, ptr+
or r18, r24
out MC_DDR, r18
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -