📄 timer_send.lst
字号:
__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 + -