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

📄 spiasm.s

📁 一个完整的用AVR写的电话交换机程序 希望对从事安防的开发者有用
💻 S
字号:
#include <avr/io.h>
//#include <avr/signal.h>
//#include "Atmel_88_8.h"


// Use R4 <- SREG, R5 <-R30, R6<-R31 , R7<-R24 , R8<-R25 Register


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


.macro	mcSIG_PoP
        	out	_SFR_IO_ADDR(SREG), r4	; 63
        	mov	R25,R8		;pop	r25
        	mov	R24,R7		;	pop	r24
.endm


// Interrupt Routine Slave Mode (interrupt controlled)
SIG_SPI:// ;------------------------------------------------------------
       	mov		R7,R24		;push	r24
       	mov		R8,R25		;push	r25			// mData
       	in		r4, _SFR_IO_ADDR(SREG)
		
//  PB5-SCk PB4-MISO PB3-MOSI PB2-SS
//unsigned char mData;

		//if ( bit_is_set(TIMSK1,ICIE1))  sei();
		lds		r25, TIMSK1
		sbrs	r25, ICIE1
		rjmp	intSPI_CheckTaskStart
		sei

intSPI_CheckTaskStart: ;----------------
//	mData= SPDR;
		in	r25,_SFR_IO_ADDR(SPDR);

//	if (mSPITask==0) 	// Read Command			
		lds		r24, mSPITask
       	and		r24, r24
       	breq	intSPI_T0
       	sbrc	r24, 0	
		rjmp	intSPI_T1  // (mSPITask==1)Transmit Data
		sbrc	r24,1
		rjmp	intSPI_T2 // mSPITask==2  RxData

intSPI_TNothing:
//				{ SPDR =0xf0; }
        ldi		r24, 0xff	; 255
        out		_SFR_IO_ADDR(SPDR), r24	; 46

 intSPI_End:
 		mcSIG_PoP
		reti


intSPI_T0: ;----------------------------------
       	sbrc	r25, 7
       	rjmp	intSPI_T0ReqSendData  // if bit_is_set(mData,7) 		// if Main Req Read Data
       	sbrc	r25, 6		// if  bit_is_set(mData,6)  // if Main Req Send Data
       	rjmp	intSPI_T0ReqReadData

intSPI_T0CmReset: ;---------------------
//		mData &= 0b111111;
        	andi	r25, 0x3F	; 63
//		if (mData == 1 ) { while(1);}		// Reset					
        	cpi		r25, 0x01	; 1
        	brne	intSPI_End     	; 0x7fe
intSPI_T0CmResetHalt:
        	rjmp	intSPI_T0CmResetHalt      	; 0x79e


intSPI_T0ReqSendData: ;---------------------------------
//				{ SPDR = mSPIOut[0];  				  
 		lds		r24, mSPIOut
       	out		_SFR_IO_ADDR(SPDR), r24	; ************************** SPI Out
//				  if (mSPIOut[0]==0) { mSPITask=0xf0; return }
       	and		r24, r24
       	brne	intSPI_SetSPITx      	; 0x764
       	ldi		r24, 0xf0	; 255
 		sts		mSPITask, r24

 		mcSIG_PoP
		reti

intSPI_SetSPITx:
//				  else { mSPITask=1; mSPINxOut=mSPIOut[1];mSPICount=2;}
        ldi	r25, 0x01	; 1
  		sts	mSPITask, r25
        ldi	r25, 0x02	;
 		sts	mSPICount, r25

  		lds	r24, mSPIOut+1
  		sts	mSPINxOut, r24
 		mcSIG_PoP
		reti

intSPI_T0ReqReadData: ;---------------------------
// 	mData &= 0b111111;
        	andi	r25, 0x3F	; 63
//	if (( mData > 40 )||( mData ==0 ))  { mSPITask=0xf0; return;}  // Len too long
        	mov		r24, r25
        	subi	r24, 0x01	; 1
        	cpi		r24, 0x28	; 40
        	brcc	intSPI_SetTaskNothing    	; 0x7ea

//	mSPIIn.Tx[0]= mData;mSPICount=1;mSPITask =2;
  			sts		mSPIIn, r25
        	ldi		r24, 0x01	; 1
  			sts		mSPICount, r24
        	ldi		r24, 0x02	; 2
 			sts		mSPITask, r24
 		mcSIG_PoP
		reti

intSPI_T1: ;----------------------------------------------
//			SPDR = mSPINxOut;
  		lds	r24, mSPINxOut
       	out	_SFR_IO_ADDR(SPDR), r24	; ************************** SPI Out
//			if ( mSPIOut[0] >= mSPICount)  
  		lds	r25, mSPICount
  		lds	r24, mSPIOut
       	cp	r24, r25
       	brcs intSPI_SetBuzzyTx

//			mSPINxOut= mSPIOut[mSPICount];
			mov		r5,r30		//push 	r30
			mov		r6,r31		//push 	r31
        	mov		r30, r25
        	eor		r31, r31
        	subi	r30, lo8(-(mSPIOut))
        	sbci	r31, hi8(-(mSPIOut))
        	ld		r24, Z
  			sts		mSPINxOut, r24
			mov		r31,r6		;pop		r31
			mov		r30,r5		;pop 	r30

//			mSPICount++;
        	subi	r25, 0xFF	; 255
  			sts		mSPICount, r25
        	
 		mcSIG_PoP
		reti

intSPI_SetBuzzyTx:
//		mSPIBusy=0x3; mSPIOut[0]=0;
       	ldi		r24, 0x3	; Set Bussy
		sts		mSPIBusy,r24
		eor		r24,r24
       	ldi		r24, 0	; Set Bussy
		sts		mSPIOut,r24
intSPI_SetTaskNothing:
//					 mSPITask=0xf0;  return;
       	ldi		r24, 0xf0	; 255
 		sts		mSPITask, r24
		
 		mcSIG_PoP
		reti
 
 intSPI_T2: ;------------------------------------
//				mSPIIn.Tx[mSPICount]= mData;
			mov		r5,r30		//push 	r30
			mov		r6,r31		//push 	r31

 	 	lds		r24, mSPICount
       	mov		r30, r24
       	eor		r31, r31
       	subi	r30, lo8(-(mSPIIn))	; 183
       	sbci	r31, hi8(-(mSPIIn))	; 253
       	st		Z, r25

			mov		r31,r6		;pop		r31
			mov		r30,r5		;pop 	r30

//				if (mSPICount>= mSPIIn[0])
  		lds		r25, mSPIIn
       	cp		r24, r25
       	brcc	intSPI_SetBuzzyRx
	 //fnSetRxBuff
 intSPI_T2AddCount:
//				mSPICount++; return;
       	subi	r24, 0xFF	; 255
  		sts		mSPICount, r24
			
 		mcSIG_PoP
		reti

intSPI_SetBuzzyRx:
	;	mSPIBusy=5	;mSPITask=0xf0
       	ldi		r24, 0x5	; Set Bussy
		sts		mSPIBusy,r24
       	ldi		r24, 0xf0	; 255
 		sts		mSPITask, r24
		
 		mcSIG_PoP
		reti

////////////////////////////////////////////////////////////////////////////////////////////
// Interrupt 1

	.section .text
	.global  	SIG_INTERRUPT1		;外部函数声明
SIG_INTERRUPT1: // M-Net Data Input Interrupt, Use to Cal the Wave Len with Timer 2
       	mov		R8,R25		;push	r25			// mData
       	in		r4, _SFR_IO_ADDR(SREG)
//if ( bit_is_set(TIMSK1,ICIE1))  sei();
		lds	r25, TIMSK1
		sbrs	r25, ICIE1
		rjmp	Int1_Start
		sei

Int1_Start:
// 	if (bit_is_clear(PIND,3) ) SetBit(DDRB,4) else ClrBit(DDRB,4);
		cbi		_SFR_IO_ADDR(DDRB),4
		sbis    _SFR_IO_ADDR(PIND),3 
		sbi		_SFR_IO_ADDR(DDRB),4

//	if (mSPIBusy) 
	 	lds		r25, mSPIBusy
       	and		r25, r25
       	breq	Int1_Normal
//	{ SPDR=0x80; mSPITask=0xf0; }
Int1_Bussy:
       	ldi		r25, 0x80	; 128
       	out		_SFR_IO_ADDR(SPDR), r25	; 46
       	ldi		r25, 0xF0	; 240
  		sts		mSPITask, r25

       	out		_SFR_IO_ADDR(SREG), r4	; 63
       	mov		R25,R8		;pop	r25
		reti

Int1_Normal:
//		else { SPDR = MNetStatus; mSPITask=0; }
  		lds		r25, MNetStatus
       	out		_SFR_IO_ADDR(SPDR), r25	; 46
       	ldi		r25, 0	; 128
  		sts		mSPITask, r25
 
       	out		_SFR_IO_ADDR(SREG), r4	; 63
       	mov		R25,R8		;pop	r25
		reti

⌨️ 快捷键说明

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