mnetasm.s

来自「一个完整的用AVR写的电话交换机程序 希望对从事安防的开发者有用」· S 代码 · 共 58 行

S
58
字号
#include <avr/io.h>
//#include <avr/signal.h>

#define cBit0RxUp	500		// n /8 us = 40us (30k)

	.section .text
	.global  SIG_INPUT_CAPTURE1		;外部函数声明

SIG_INPUT_CAPTURE1:		/// 54 Circle
       	push	r24
       	in		r24, _SFR_IO_ADDR(SREG)	; 63
       	push	r24
       	eor		r24, r24
;	TCNT1=0;
  		sts		TCNT1H, r24
  		sts		TCNT1L, r24

       	push	r25

;		if (bit_is_set(TIFR1,OCF1B))
       	sbis	_SFR_IO_ADDR(TIFR1), OCF1B	; 22
       	rjmp	lbCp0001     	; 0x1b0

;	unsigned int CaptureTime=ICR1 ;
  		lds		r24, ICR1L
  		lds		r25, ICR1H

;				if (CaptureTime>cBit0RxUp)  MNetRxFlag = _BV(MRxFErr)|_BV(MRxBitF);
       	subi	r24, lo8(cBit0RxUp) //0x41	; 65
       	sbci	r25, hi8(cBit0RxUp)// 0x01	; 1
       	brcc	lbCp0002   	; 0x1b8
;				else		MNetRxFlag = _BV(MRxBitF);	// Receiver "0"
       	ldi		r24, 0x04	; 4
       	rjmp	lbCp0003     	; 0x1ba

lbCp0001:
;			if (bit_is_set(TIFR1,OCF1A))	MNetRxFlag = _BV(MRxBitV)|_BV(MRxBitF);	// Receiver "1"
        sbis	_SFR_IO_ADDR(TIFR1), OCF1A	; 22
       	rjmp	lbCp0002      	; 0x1b8

       	ldi		r24, 0x05	; 5
       	rjmp	lbCp0003     	; 0x1ba
;				else	MNetRxFlag = _BV(MRxFErr)|_BV(MRxBitF);		// Plus to short
 lbCp0002:
       	ldi	r24, 0x06	; 6
 lbCp0003:		// MNetRxFlag = r24
  		sts		MNetRxFlag, r24

//	TIFR1 = 0b100111; // 清除该标志 ICF1 – – OCF1B OCF1A TOV1 
       	ldi		r24, _BV(ICF1)|_BV(OCF1B)|_BV(OCF1A)|_BV(TOV1)	; 39
       	out		_SFR_IO_ADDR(TIFR1), r24	; 22

       	pop	r25
       	pop	r24
       	out	 _SFR_IO_ADDR(SREG), r24	; 63       	
       	pop	r24
       	reti

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?