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

📄 timer_send.lst

📁 AVR控制的SAB82525——HDLC通信 循环队列处理 完全是自己写的
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0096 EFCF      LDI	R28,0xFF
    0097 E1D0      LDI	R29,0x10
    0098 BFCD      OUT	0x3D,R28
    0099 BFDE      OUT	0x3E,R29
    009A 51C0      SUBI	R28,0x10
    009B 40D0      SBCI	R29,0
    009C EA0A      LDI	R16,0xAA
    009D 8308      STD	Y+0,R16
    009E 2400      CLR	R0
    009F EAE0      LDI	R30,0xA0
    00A0 E0F1      LDI	R31,1
    00A1 E014      LDI	R17,4
    00A2 35E9      CPI	R30,0x59
    00A3 07F1      CPC	R31,R17
    00A4 F011      BEQ	0x00A7
    00A5 9201      ST	R0,Z+
    00A6 CFFB      RJMP	0x00A2
    00A7 8300      STD	Z+0,R16
    00A8 E8EC      LDI	R30,0x8C
    00A9 E0F0      LDI	R31,0
    00AA E0A0      LDI	R26,0
    00AB E0B1      LDI	R27,1
    00AC E011      LDI	R17,1
    00AD 32EC      CPI	R30,0x2C
    00AE 07F1      CPC	R31,R17
    00AF F021      BEQ	0x00B4
    00B0 95C8      LPM
    00B1 9631      ADIW	R30,1
    00B2 920D      ST	R0,X+
    00B3 CFF9      RJMP	0x00AD
    00B4 940E0264  CALL	_main
_exit:
    00B6 CFFF      RJMP	_exit
FILE: E:\Projects\AVR\Timer_Send\queue_2D.c
(0001) extern unsigned char pre_txd[33];
(0002) unsigned char Buffer_Send[20][33];
(0003) unsigned char front,rear;
(0004) extern unsigned char count;
(0005) void InitQueue()
(0006) 	{
(0007) 		front=0;
_InitQueue:
    00B7 2422      CLR	R2
    00B8 922001A1  STS	_front,R2
(0008) 		rear=0;
    00BA 922001A0  STS	_rear,R2
(0009) 		count=0;
    00BC 92200436  STS	_count,R2
(0010) 	}
    00BE 9508      RET
(0011) unsigned char QueueEmpty()
(0012) 	{
(0013) 		if(count!=0)
_QueueEmpty:
    00BF 90200436  LDS	R2,_count
    00C1 2022      TST	R2
    00C2 F011      BEQ	0x00C5
(0014) 			return 0;
    00C3 2700      CLR	R16
    00C4 C001      RJMP	0x00C6
(0015) 		else 
(0016) 			return 1;
    00C5 E001      LDI	R16,1
    00C6 9508      RET
(0017) 	}
(0018) 
(0019) unsigned char QueueFull()
(0020) 	{
(0021) 		if(count==20)
_QueueFull:
    00C7 91800436  LDS	R24,_count
    00C9 3184      CPI	R24,0x14
    00CA F411      BNE	0x00CD
(0022) 			return 1;
    00CB E001      LDI	R16,1
    00CC C001      RJMP	0x00CE
(0023) 		else
(0024) 			return 0;
    00CD 2700      CLR	R16
    00CE 9508      RET
_EnQueue:
  i_enQ                --> R20
  num_enQ              --> R18
  txd_data             --> R16
    00CF 940E0273  CALL	push_gset1
(0025) 	}
(0026) 
(0027) void EnQueue(unsigned char txd_data[32],unsigned char num_enQ)    //////入队
(0028) 	{
(0029) 		unsigned char i_enQ=0;
    00D1 2744      CLR	R20
(0030) 		
(0031) 		for(i_enQ=0;i_enQ<num_enQ;i_enQ++)
    00D2 C014      RJMP	0x00E7
(0032) 		{
(0033) 			Buffer_Send[rear][i_enQ]=txd_data[i_enQ];
    00D3 902001A0  LDS	R2,_rear
    00D5 E281      LDI	R24,0x21
    00D6 9D82      MUL	R24,R2
    00D7 0110      MOVW	R2,R0
    00D8 EA82      LDI	R24,0xA2
    00D9 E091      LDI	R25,1
    00DA 0E28      ADD	R2,R24
    00DB 1E39      ADC	R3,R25
    00DC 2FE4      MOV	R30,R20
    00DD 27FF      CLR	R31
    00DE 0DE2      ADD	R30,R2
    00DF 1DF3      ADC	R31,R3
    00E0 2FA4      MOV	R26,R20
    00E1 27BB      CLR	R27
    00E2 0FA0      ADD	R26,R16
    00E3 1FB1      ADC	R27,R17
    00E4 902C      LD	R2,0(X)
    00E5 8220      STD	Z+0,R2
    00E6 9543      INC	R20
    00E7 1742      CP	R20,R18
    00E8 F350      BCS	0x00D3
(0034) 		}
(0035) 		
(0036) 		Buffer_Send[rear][32]=num_enQ;
    00E9 902001A0  LDS	R2,_rear
    00EB E281      LDI	R24,0x21
    00EC 9D82      MUL	R24,R2
    00ED 01F0      MOVW	R30,R0
    00EE EC82      LDI	R24,0xC2
    00EF E091      LDI	R25,1
    00F0 0FE8      ADD	R30,R24
    00F1 1FF9      ADC	R31,R25
    00F2 8320      STD	Z+0,R18
(0037) 			
(0038) 		//count++;
(0039) 		if(rear>=19)
    00F3 2D82      MOV	R24,R2
    00F4 3183      CPI	R24,0x13
    00F5 F060      BCS	0x0102
(0040) 			{
(0041) 				rear=0;
    00F6 2422      CLR	R2
    00F7 922001A0  STS	_rear,R2
(0042) 				count=20+rear-front;
    00F9 902001A1  LDS	R2,_front
    00FB 918001A0  LDS	R24,_rear
    00FD 5E8C      SUBI	R24,0xEC
    00FE 1982      SUB	R24,R2
    00FF 93800436  STS	_count,R24
(0043) 			}
    0101 C00B      RJMP	0x010D
(0044) 		else
(0045) 			{
(0046) 				rear++;
    0102 918001A0  LDS	R24,_rear
    0104 5F8F      SUBI	R24,0xFF
    0105 938001A0  STS	_rear,R24
(0047) 				count=rear-front;
    0107 902001A1  LDS	R2,_front
    0109 2E38      MOV	R3,R24
    010A 1832      SUB	R3,R2
    010B 92300436  STS	_count,R3
(0048) 			}
(0049) 	}
    010D 940E0276  CALL	pop_gset1
    010F 9508      RET
(0050) 	  
(0051) void DeQueue()        ///////出队
(0052) 	{
(0053) 		unsigned char i_deQ=0;
_DeQueue:
  num_deQ              --> R16
  i_deQ                --> R18
    0110 2722      CLR	R18
(0054) 		unsigned char num_deQ=0;
    0111 2700      CLR	R16
(0055) 		
(0056) 		num_deQ=Buffer_Send[front][32];
    0112 902001A1  LDS	R2,_front
    0114 E281      LDI	R24,0x21
    0115 9D82      MUL	R24,R2
    0116 01F0      MOVW	R30,R0
    0117 EC82      LDI	R24,0xC2
    0118 E091      LDI	R25,1
    0119 0FE8      ADD	R30,R24
    011A 1FF9      ADC	R31,R25
    011B 8100      LDD	R16,Z+0
(0057) 		
(0058) 		for(i_deQ=0;i_deQ<num_deQ;i_deQ++)
    011C C016      RJMP	0x0133
(0059) 		{
(0060) 			pre_txd[i_deQ]=Buffer_Send[front][i_deQ];
    011D 902001A1  LDS	R2,_front
    011F E281      LDI	R24,0x21
    0120 9D82      MUL	R24,R2
    0121 0110      MOVW	R2,R0
    0122 EA82      LDI	R24,0xA2
    0123 E091      LDI	R25,1
    0124 0E28      ADD	R2,R24
    0125 1E39      ADC	R3,R25
    0126 2FE2      MOV	R30,R18
    0127 27FF      CLR	R31
    0128 0DE2      ADD	R30,R2
    0129 1DF3      ADC	R31,R3
    012A 8020      LDD	R2,Z+0
    012B E387      LDI	R24,0x37
    012C E094      LDI	R25,4
    012D 2FE2      MOV	R30,R18
    012E 27FF      CLR	R31
    012F 0FE8      ADD	R30,R24
    0130 1FF9      ADC	R31,R25
    0131 8220      STD	Z+0,R2
    0132 9523      INC	R18
    0133 1720      CP	R18,R16
    0134 F340      BCS	0x011D
(0061) 		}
(0062) 		
(0063) 		pre_txd[32]=Buffer_Send[front][32];
    0135 902001A1  LDS	R2,_front
    0137 E281      LDI	R24,0x21
    0138 9D82      MUL	R24,R2
    0139 01F0      MOVW	R30,R0
    013A EC82      LDI	R24,0xC2
    013B E091      LDI	R25,1
    013C 0FE8      ADD	R30,R24
    013D 1FF9      ADC	R31,R25
    013E 8020      LDD	R2,Z+0
    013F 92200457  STS	0x457,R2
(0064) 		//Plus------------------------------------------------
(0065) 		/*for(i_deQ=0;i_deQ<33;i_deQ++)
(0066) 		{
(0067) 			Buffer_Send[front][i_deQ]=0;
(0068) 		}*/
(0069) 		//----------------------------------------------------
(0070)               
(0071) 		//count--;
(0072) 		if(front>=19)
    0141 918001A1  LDS	R24,_front
    0143 3183      CPI	R24,0x13
    0144 F048      BCS	0x014E
(0073) 			{
(0074) 				front=0;
    0145 2422      CLR	R2
    0146 922001A1  STS	_front,R2
(0075) 				count=rear-front;
    0148 903001A0  LDS	R3,_rear
    014A 1832      SUB	R3,R2
    014B 92300436  STS	_count,R3
(0076) 			}
    014D C00A      RJMP	0x0158
(0077) 		else
(0078) 			{
(0079) 				front++;
    014E 918001A1  LDS	R24,_front
    0150 5F8F      SUBI	R24,0xFF
    0151 938001A1  STS	_front,R24
(0080) 				count=rear-front;
    0153 903001A0  LDS	R3,_rear
    0155 1A38      SUB	R3,R24
    0156 92300436  STS	_count,R3
(0081) 			}
(0082) 	}
    0158 9508      RET
_timer0_txd_srv:
  num_tmr              --> R20
    0159 940E028E  CALL	push_lset
    015B 940E0273  CALL	push_gset1
FILE: E:\Projects\AVR\Timer_Send\Timer0.c
(0001) #include "iom128v.h"
(0002) #include "macros.h"
(0003) //------------------------------------------------------------------
(0004) extern unsigned char count;
(0005) extern unsigned char data_array01[32];
(0006) extern unsigned char data_array02[32];
(0007) extern unsigned char data_array03[32];
(0008) extern unsigned char data_array04[32];
(0009) extern unsigned char data_array05[32];
(0010) //------------------------------------------------------------------
(0011) #pragma interrupt_handler timer0_txd_srv:17
(0012) void timer0_txd_srv(void)
(0013) {
(0014) 	unsigned char num_tmr=0;
    015D 2744      CLR	R20
(0015) 	TCNT0=0xb5;	//计数值重装
    015E EB85      LDI	R24,0xB5
    015F BF82      OUT	0x32,R24
(0016) 	
(0017) 	transmit();
    0160 940E021F  CALL	_transmit
(0018) 	
(0019) 	if(count<(20-5))
    0162 91800436  LDS	R24,_count
    0164 308F      CPI	R24,0xF
    0165 F4F0      BCC	0x0184
(0020) 		{
(0021) 			EnQueue(data_array01,2);
    0166 E022      LDI	R18,2
    0167 E030      LDI	R19,0
    0168 E000      LDI	R16,0
    0169 E011      LDI	R17,1
    016A 940E00CF  CALL	_EnQueue
(0022) 			EnQueue(data_array02,4);
    016C E024      LDI	R18,4
    016D E030      LDI	R19,0
    016E E200      LDI	R16,0x20
    016F E011      LDI	R17,1
    0170 940E00CF  CALL	_EnQueue
(0023) 			EnQueue(data_array03,3);
    0172 E023      LDI	R18,3
    0173 E030      LDI	R19,0
    0174 E400      LDI	R16,0x40
    0175 E011      LDI	R17,1
    0176 940E00CF  CALL	_EnQueue
(0024) 			EnQueue(data_array04,3);
    0178 E023      LDI	R18,3
    0179 E030      LDI	R19,0
    017A E600      LDI	R16,0x60
    017B E011      LDI	R17,1
    017C 940E00CF  CALL	_EnQueue
(0025) 			EnQueue(data_array05,15);
    017E E02F      LDI	R18,0xF
    017F E030      LDI	R19,0
    0180 E800      LDI	R16,0x80
    0181 E011      LDI	R17,1
    0182 940E00CF  CALL	_EnQueue
(0026) 		}
(0027) 				
(0028) 			
(0029) }
    0184 940E0276  CALL	pop_gset1
    0186 940E02A5  CALL	pop_lset
    0188 9518      RETI
(0030) //------------------------------------------------------------------
(0031) void timer0_init(void)
(0032) {
(0033) 	TIMSK=0x01;
_timer0_init:
    0189 E081      LDI	R24,1
    018A BF87      OUT	0x37,R24
(0034) 	TCCR0=0x00;
    018B 2422      CLR	R2
    018C BE23      OUT	0x33,R2
(0035) 	TCNT0=0xb5;	//20ms的计数值
    018D EB85      LDI	R24,0xB5
    018E BF82      OUT	0x32,R24
(0036) 	
(0037) 	TCCR0=0x07;
    018F E087      LDI	R24,7
    0190 BF83      OUT	0x33,R24
(0038) }
    0191 9508      RET
FILE: E:\Projects\AVR\Timer_Send\Timer_Send.c
(0001) //主机发I桢m-m,从机用透明模式
(0002) 
(0003) //------------------------------------------------------------------
(0004) 
(0005) 
(0006) #include "iom128v.h"
(0007) #include "macros.h"
(0008) 
(0009) //------------------------------------------------------------------
(0010) 
(0011) #define XFIFO ((volatile unsigned char *)0)
(0012) #define XBYTE ((volatile unsigned char *)0) 
(0013) #define MASK (*(volatile unsigned char *)0x2020)
(0014) #define MASB (*(volatile unsigned char *)0x2060)
(0015) #define ISTA (*(volatile unsigned char *)0x2020)
(0016) #define ISTB (*(volatile unsigned char *)0x2060)
(0017) #define CMDR (*(volatile unsigned char *)0x2021)
(0018) #define STAR (*(volatile unsigned char *)0x2021)
(0019) #define MODE (*(volatile unsigned char *)0x2022)
(0020) #define TIMR (*(volatile unsigned char *)0x2023)
(0021) #define XAD1 (*(volatile unsigned char *)0x2023)
(0022) #define EXIR (*(volatile unsigned char *)0x2024)
(0023) #define XAD2 (*(volatile unsigned char *)0x2025)
(0024) #define RBCL (*(volatile unsigned char *)0x2025)
(0025) #define RAH1 (*(volatile unsigned char *)0x2026)
(0026) #define RAH2 (*(volatile unsigned char *)0x2027)
(0027) #define RSTA (*(volatile unsigned char *)0x2027)
(0028) #define RAL1 (*(volatile unsigned char *)0x2028)
(0029) #define RAL2 (*(volatile unsigned char *)0x2029)
(0030) #define RHCR (*(volatile unsigned char *)0x2029)
(0031) #define XBCL (*(volatile unsigned char *)0x202a)
(0032) #define BGR  (*(volatile unsigned char *)0x202b)
(0033) #define CCR2 (*(volatile unsigned char *)0x202c)
(0034) #define XBCH (*(volatile unsigned char *)0x202d)
(0035) #define RBCH (*(volatile unsigned char *)0x202d)
(0036) #define RLCR (*(volatile unsigned char *)0x202e)
(0037) #define VSTR (*(volatile unsigned char *)0x202e)
(0038) #define CCR1 (*(volatile unsigned char *)0x202f)
(0039) #define XFW  (STAR&0x40)>>6                     //发送FIFO可写
(0040) #define CEC  (STAR&0x04)>>2                     //CEC=1,CMDR不可写;CEC=0,CMDR可写
(0041) #define RME  (ISTA&0x80)>>7                     //信息接收结束
(0042) #define RPF  (ISTA&0x40)>>6                     //32Bytes接受池满
(0043) #define RSC  (ISTA&0x20)>>5                     //自动模式下对方的状态
(0044) #define XPR  (ISTA&0x10)>>4                     //发送池正空
(0045) #define TIN  (ISTA&0x08)>>3                     //定时器中断
(0046) #define XMR  (EXIR&0x80)>>7                     //发送需要重复
(0047) #define XDU  (EXIR&0x40)>>6                     //发送中途中止
(0048) #define PCE  (EXIR&0x20)>>5                     //协议错误
(0049) #define RFO  (EXIR&0x10)>>4                     //接收数据无法存入RFIFO造成溢出
(0050) #define CSC  (EXIR&0x08)>>3                     //CTS状态改变
(0051) #define RFS  (EXIR&0x04)>>2                     //接收到帧头
(0052) //---------------------------------------------------------------------
(0053) unsigned char flag_txd;
(0054) unsigned char pre_txd[33];
(0055) unsigned char count;
(0056) extern unsigned char front,rear;
(0057) //-----------------------------------------------------------------------------
(0058) 
(0059) //Queue_2D Declaration Start===================================================
(0060) void InitQueue();
(0061) unsigned char QueueEmpty();
(0062) unsigned char QueueFull();
(0063) void EnQueue(unsigned char txd_data[32],unsigned char num_enQ);    //入队
(0064) void DeQueue();        //出队
(0065) //Queue_2D Declaration End=====================================================
(0066) 
(0067) //DATA Array for Test Start====================================================
(0068) unsigned char data_array01[32]={0x02,0x93};
(0069) unsigned char data_array02[32]={0x02,0x00,0xff,0xee};
(0070) unsigned char data_array03[32]={0x03,0x00,0x66};
(0071) unsigned char data_array04[32]={0x04,0x00,0xff};
(0072) unsigned char data_array05[32]={0x05,0x00,0xff,0xff,0xee,0xff,0xee,0xff,0xee,0xff,0xee,0xff,0xee,0xff,0xee};
(0073) //DATA Array for Test End======================================================
(0074) 
(0075) //-----------------------------------------------------------------------------
(0076) void chipinit(void)
(0077) { 
(0078) 	 DDRB|=0xcf;		//1100_1111
_chipinit:
    0192 B387      IN	R24,0x17
    0193 6C8F      ORI	R24,0xCF
    0194 BB87      OUT	0x17,R24
(0079) 	 PORTB|=0xcf;		//同上
    0195 B388      IN	R24,0x18
    0196 6C8F      ORI	R24,0xCF
    0197 BB88      OUT	0x18,R24
(0080) 	 
(0081) 	 DDRD=0xfc;			//1111_1100		**
    0198 EF8C      LDI	R24,0xFC
    0199 BB81      OUT	0x11,R24

⌨️ 快捷键说明

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