⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sensor.s.bak

📁 这是一个车用电机调速器的AVR单片机的整套C语言的源代码
💻 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 + -