📄 m8m01.lst
字号:
__start:
__text_start:
001A E5CF LDI R28,0x5F
001B E0D4 LDI R29,4
001C BFCD OUT 0x3D,R28
001D BFDE OUT 0x3E,R29
001E 51C0 SUBI R28,0x10
001F 40D0 SBCI R29,0
0020 EA0A LDI R16,0xAA
0021 8308 STD Y+0,R16
0022 2400 CLR R0
0023 E6EE LDI R30,0x6E
0024 E0F0 LDI R31,0
0025 E010 LDI R17,0
0026 3AED CPI R30,0xAD
0027 07F1 CPC R31,R17
0028 F011 BEQ 0x002B
0029 9201 ST R0,Z+
002A CFFB RJMP 0x0026
002B 8300 STD Z+0,R16
002C E2E6 LDI R30,0x26
002D E0F0 LDI R31,0
002E E6A0 LDI R26,0x60
002F E0B0 LDI R27,0
0030 E010 LDI R17,0
0031 33E4 CPI R30,0x34
0032 07F1 CPC R31,R17
0033 F021 BEQ 0x0038
0034 95C8 LPM
0035 9631 ADIW R30,1
0036 920D ST R0,X+
0037 CFF9 RJMP 0x0031
0038 D11A RCALL _main
_exit:
0039 CFFF RJMP _exit
FILE: E:\m8com\M8MP01.c
(0001) //////////主机
(0002)
(0003) #include <iom8v.h>
(0004) #include <macros.h>
(0005) //ISARM pro
(0006) #define OUTLED1OFF PORTB|=0x01 //for
(0007) #define OUTLED1ON PORTB&=~0x01
(0008) #define OUTLED2OFF PORTB|=0x02 //For
(0009) #define OUTLED2ON PORTB&=~0x02
(0010) #define OUTLED2Pulse PORTB^=0x02
(0011)
(0012) #define OUTLED3OFF PORTB|=0x04 //For
(0013) #define OUTLED3ON PORTB&=~0x04
(0014) #define OUTLED3Pulse PORTB^=0x04
(0015) #define OUTLED4OFF PORTB|=0x08 //For
(0016) #define OUTLED4ON PORTB&=~0x08
(0017) #define OUTLED4Pulse PORTB^=0x08
(0018)
(0019) #define OUTDEON PORTD|=0x10
(0020) #define OUTDEOFF PORTD&=~0x10
(0021)
(0022) #define KB0 (PINC&0x01)
(0023) #define KB1 (PINC&0x02)
(0024)
(0025)
(0026) ///UART///
(0027) #define TXENABLE UCSRB&=~(1<<RXEN);UCSRB|=(1<<TXEN);
(0028) #define RXENABLE UCSRB&=~(1<<TXEN);UCSRB|=(1<<RXEN);
(0029) #define TXADDRESS UCSRB|=1;TXADFG=0;
(0030) #define TXDATA UCSRB&=~1;TXADFG=1;
(0031) //
(0032) #define TRFG0 0xFE
(0033) #define TRFG1 0xFD
(0034) #define TRFG2 0xF1
(0035) #define TRFG3 0xF0
(0036) //最大子板数
(0037) #define SlaveBMAX 15
(0038) //////////////////////////////
(0039) unsigned char TXADFG=0;
(0040)
(0041) unsigned char SlaveEN[17];
(0042) unsigned char SlaveCR=0; //子板编号计数器,当作物理地址
(0043) unsigned char TXINTMAX=1;//下行发送中断次数控制值
(0044) //unsigned char TXINTCR=0;//下行发送中断次数计数器
(0045) unsigned char TXINTFG=0;//下行发送中断次数完成标志
(0046) unsigned char RXINTMAX=16;//下行发送中断次数控制值
(0047) unsigned char RXINTCR=0;//下行发送中断次数计数器
(0048) unsigned char RXINTFG=0;//下行发送中断次数完成标志
(0049)
(0050) unsigned char TXBUF[16]; //发送缓冲区
(0051) unsigned char RXBUF[30]; //接收缓冲区
(0052) unsigned char TXbufP=0; //发送缓冲区下标
(0053) unsigned char RXbufP=0; //接收缓冲区下标
(0054) unsigned char RXbufPmax=11;//接收数据实际长度
(0055)
(0056) unsigned char RXERROR=0;
(0057) /////Soft Timer
(0058) unsigned char WaitCR0=0;
(0059) unsigned char WaitCR1=0;
(0060)
(0061) void SoftTimer(void)
(0062) {
(0063) WaitCR0++;
_SoftTimer:
003A 9180006B LDS R24,0x6B
003C 5F8F SUBI R24,0xFF
003D 9380006B STS 0x6B,R24
(0064) if(WaitCR0>254)
003F EF8E LDI R24,0xFE
0040 9020006B LDS R2,0x6B
0042 1582 CP R24,R2
0043 F440 BCC 0x004C
(0065) {
(0066) WaitCR0=0;
0044 2422 CLR R2
0045 9220006B STS 0x6B,R2
(0067) WaitCR1++;
0047 9180006C LDS R24,0x6C
0049 5F8F SUBI R24,0xFF
004A 9380006C STS 0x6C,R24
(0068) }//if(WaitCR0>0)
004C 9508 RET
(0069) }
(0070) void SoftTimerStart(void)
(0071) {
(0072) WaitCR0=0;
_SoftTimerStart:
004D 2422 CLR R2
004E 9220006B STS 0x6B,R2
(0073) WaitCR1=0;
0050 9220006C STS 0x6C,R2
0052 9508 RET
(0074) }
(0075)
(0076) void watchdog_init(void)
(0077) {
(0078) WDR();
_watchdog_init:
0053 95A8 WDR
(0079) WDTCR=0x0F ;
0054 E08F LDI R24,0xF
0055 BD81 OUT 0x21,R24
0056 9508 RET
(0080) }
(0081)
(0082) void Delay_1ms(void)
(0083) {
(0084) unsigned int i;
(0085)
(0086) for (i = 1; i<1140; i++)
_Delay_1ms:
i --> R16
0057 E001 LDI R16,1
0058 E010 LDI R17,0
0059 C002 RJMP 0x005C
005A 5F0F SUBI R16,0xFF
005B 4F1F SBCI R17,0xFF
005C 3704 CPI R16,0x74
005D E0E4 LDI R30,4
005E 071E CPC R17,R30
005F F3D0 BCS 0x005A
0060 9508 RET
_delayXms:
i --> R20
n --> R22
0061 D19C RCALL push_gset2
0062 01B8 MOVW R22,R16
(0087)
(0088) ;
(0089) }
(0090)
(0091) void delayXms(unsigned int n)
(0092) {
(0093) unsigned int i=0;
0063 2744 CLR R20
0064 2755 CLR R21
0065 C003 RJMP 0x0069
(0094) while(i<n)
(0095) {
(0096) Delay_1ms();
0066 DFF0 RCALL _Delay_1ms
(0097) i++;
0067 5F4F SUBI R20,0xFF
0068 4F5F SBCI R21,0xFF
0069 1746 CP R20,R22
006A 0757 CPC R21,R23
006B F3D0 BCS 0x0066
006C D178 RCALL pop_gset2
006D 9508 RET
(0098) }
(0099) }
(0100)
(0101)
(0102) void port_init(void)
(0103) {
(0104)
(0105)
(0106) PORTB=0xFF; //PB set to 1
_port_init:
006E EF8F LDI R24,0xFF
006F BB88 OUT 0x18,R24
(0107) DDRB=0xFF;
0070 BB87 OUT 0x17,R24
(0108)
(0109) PORTC=0xFF; //PC set to 1
0071 BB85 OUT 0x15,R24
(0110) DDRC=0x00; //
0072 2422 CLR R2
0073 BA24 OUT 0x14,R2
(0111)
(0112) PORTD=0xFF; //PD set to 1
0074 BB82 OUT 0x12,R24
(0113) DDRD=0x12; //PD0:RXD PD1:TXD PD2:DI0 PD3:DI1
0075 E182 LDI R24,0x12
0076 BB81 OUT 0x11,R24
(0114) //PD4:DI2 PD5:DI3
(0115) //OUTDEON;
(0116)
(0117) SFIOR&=~(1<<PUD); //OPEN UP LINK
0077 B780 IN R24,0x30
0078 7F8B ANDI R24,0xFB
0079 BF80 OUT 0x30,R24
(0118) //MCUCR|=(1<<ISC11); //Down edge int1
(0119) //GICR=(1<<INT1); //enable INT1
(0120)
(0121) delayXms(10); //delay 1s
007A E00A LDI R16,0xA
007B E010 LDI R17,0
007C DFE4 RCALL _delayXms
007D 9508 RET
(0122) }
(0123) //////////////////////////UART INIT
(0124) void uart_init(void)
(0125) {
(0126)
(0127) OUTDEOFF;
_uart_init:
007E 9894 CBI 0x12,4
(0128) UCSRB=0x00;
007F 2422 CLR R2
0080 B82A OUT 0x0A,R2
(0129) //UBRRL=0x25; //19.2kbps
(0130) UBRRL=0x1; //38.4kbps
0081 E081 LDI R24,1
0082 B989 OUT 0x09,R24
(0131) //TX EN ,9Bit ,Adress init
(0132) UCSRB=((1<<RXCIE)|(1<<TXCIE)|(1<<TXEN)|(1<<UCSZ2)|(1<<TXB8));
0083 EC8D LDI R24,0xCD
0084 B98A OUT 0x0A,R24
0085 9508 RET
(0133) //UCSRB=((1<<TXCIE)|(1<<TXCIE)|(1<<TXEN)|(1<<TXB8));
(0134) }//void uart_init(void)
(0135)
(0136) ///////////////Timer init
(0137) void timer_init(void)
(0138) {
(0139) ;
_timer_init:
0086 9508 RET
(0140) }
(0141)
(0142)
(0143) #pragma interrupt_handler timer1_ovf_isr:9
(0144) void timer1_ovf_isr(void)
(0145) {
(0146) ;
_timer1_ovf_isr:
0087 9518 RETI
_uart1_tx_isr:
0088 922A ST R2,-Y
0089 938A ST R24,-Y
008A 939A ST R25,-Y
008B 93EA ST R30,-Y
008C 93FA ST R31,-Y
008D B62F IN R2,0x3F
008E 922A ST R2,-Y
(0147)
(0148) }//void timer1_ovf_isr(void)
(0149)
(0150) //TR to SLAVE
(0151) #pragma interrupt_handler uart1_tx_isr:14
(0152) void uart1_tx_isr(void)
(0153) {
(0154)
(0155) TXbufP++;
008F 91800067 LDS R24,0x67
0091 5F8F SUBI R24,0xFF
0092 93800067 STS 0x67,R24
(0156) if(TXbufP<14)
0094 308E CPI R24,0xE
0095 F4A0 BCC 0x00AA
(0157) {
(0158)
(0159) if(TXbufP==2 )
0096 3082 CPI R24,2
0097 F441 BNE 0x00A0
(0160) {
(0161) OUTLED3Pulse;
0098 E084 LDI R24,4
0099 B228 IN R2,0x18
009A 2628 EOR R2,R24
009B BA28 OUT 0x18,R2
(0162) TXDATA;
009C 9850 CBI 0x0A,0
009D E081 LDI R24,1
009E 93800060 STS 0x60,R24
(0163)
(0164) }//if(TXbufP>1)
(0165) UDR=TXBUF[TXbufP];
00A0 E88C LDI R24,0x8C
00A1 E090 LDI R25,0
00A2 91E00067 LDS R30,0x67
00A4 27FF CLR R31
00A5 0FE8 ADD R30,R24
00A6 1FF9 ADC R31,R25
00A7 8020 LDD R2,Z+0
00A8 B82C OUT 0x0C,R2
(0166) }
00A9 C004 RJMP 0x00AE
(0167) else
(0168) {
(0169) OUTDEOFF;
00AA 9894 CBI 0x12,4
(0170) OUTLED1ON;
00AB 98C0 CBI 0x18,0
(0171) RXENABLE
00AC 9853 CBI 0x0A,3
00AD 9A54 SBI 0x0A,4
(0172) }//else
00AE 9029 LD R2,Y+
00AF BE2F OUT 0x3F,R2
00B0 91F9 LD R31,Y+
00B1 91E9 LD R30,Y+
00B2 9199 LD R25,Y+
00B3 9189 LD R24,Y+
00B4 9029 LD R2,Y+
00B5 9518 RETI
_uart1_rx_isr:
TmpD --> R16
00B6 922A ST R2,-Y
00B7 923A ST R3,-Y
00B8 930A ST R16,-Y
00B9 938A ST R24,-Y
00BA 939A ST R25,-Y
00BB 93EA ST R30,-Y
00BC 93FA ST R31,-Y
00BD B62F IN R2,0x3F
00BE 922A ST R2,-Y
(0173)
(0174)
(0175) }//void uart1_tx_isr(void)
(0176)
(0177) #pragma interrupt_handler uart1_rx_isr:12
(0178) void uart1_rx_isr(void)
(0179) {
(0180) unsigned char TmpD=0;
00BF 2700 CLR R16
(0181) TmpD=UDR;
00C0 B10C IN R16,0x0C
(0182) if(RXbufP<RXINTMAX)
00C1 90200064 LDS R2,0x64
00C3 90300068 LDS R3,0x68
00C5 1432 CP R3,R2
00C6 F420 BCC 0x00CB
(0183) {
(0184) RXbufP++;
00C7 2D83 MOV R24,R3
00C8 5F8F SUBI R24,0xFF
00C9 93800068 STS 0x68,R24
(0185) }
(0186) RXBUF[RXbufP]=UDR;
00CB E68E LDI R24,0x6E
00CC E090 LDI R25,0
00CD 91E00068 LDS R30,0x68
00CF 27FF CLR R31
00D0 0FE8 ADD R30,R24
00D1 1FF9 ADC R31,R25
00D2 B02C IN R2,0x0C
00D3 8220 STD Z+0,R2
(0187) OUTLED2Pulse;
00D4 E082 LDI R24,2
00D5 B228 IN R2,0x18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -