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

📄 sensor.s

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