📄 uart.lst
字号:
__start:
__text_start:
0036 EFCF LDI R28,0xFF
0037 E0D2 LDI R29,2
0038 BFCD OUT 0x3D,R28
0039 BFDE OUT 0x3E,R29
003A 51C0 SUBI R28,0x10
003B 40D0 SBCI R29,0
003C EA0A LDI R16,0xAA
003D 8308 STD Y+0,R16
003E 2400 CLR R0
003F E0E1 LDI R30,1
0040 E0F1 LDI R31,1
0041 E011 LDI R17,1
0042 35E6 CPI R30,0x56
0043 07F1 CPC R31,R17
0044 F011 BEQ 0x0047
0045 9201 ST R0,Z+
0046 CFFB RJMP 0x0042
0047 8300 STD Z+0,R16
0048 E6EA LDI R30,0x6A
0049 E0F0 LDI R31,0
004A E0A0 LDI R26,0
004B E0B1 LDI R27,1
004C E010 LDI R17,0
004D 36EB CPI R30,0x6B
004E 07F1 CPC R31,R17
004F F021 BEQ 0x0054
0050 95C8 LPM
0051 9631 ADIW R30,1
0052 920D ST R0,X+
0053 CFF9 RJMP 0x004D
0054 D0F5 RCALL _main
_exit:
0055 CFFF RJMP _exit
FILE: D:\ICCTES~1\1128\uart_main.c
(0001) // ICC-AVR application builder : 2007-11-28 8:53:26
(0002) // Target : M48
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom48v.h>
(0006) #include <macros.h>
(0007) #include "main.h"
(0008) #include "modbus.h"
(0009) #include "timer2.h"
(0010) #include "led.h"
(0011)
(0012) void test(void)
(0013) {
(0014) // LedShowLink = 5678;
(0015) testVarAnalog = 0x0102;
_test:
0056 E082 LDI R24,2
0057 E091 LDI R25,1
0058 9390010B STS testVarAnalog+1,R25
005A 9380010A STS testVarAnalog,R24
(0016) testVarPoint = 0x0304;
005C E084 LDI R24,4
005D E093 LDI R25,3
005E 93900109 STS testVarPoint+1,R25
0060 93800108 STS testVarPoint,R24
(0017) testVarInputUp = 0x0506;
0062 E086 LDI R24,6
0063 E095 LDI R25,5
0064 93900107 STS testVarInputUp+1,R25
0066 93800106 STS testVarInputUp,R24
(0018) testVarInputDown = 0x0708;
0068 E088 LDI R24,0x8
0069 E097 LDI R25,7
006A 93900105 STS testVarInputDown+1,R25
006C 93800104 STS testVarInputDown,R24
006E 9508 RET
(0019) }
(0020)
(0021) void delay(uint num)
(0022) {
(0023) while(num-->0)
_delay:
num --> R16
006F 0118 MOVW R2,R16
0070 5001 SUBI R16,1
0071 4010 SBCI R17,0
0072 2022 TST R2
0073 F7D9 BNE 0x006F
0074 2033 TST R3
0075 F7C9 BNE 0x006F
0076 9508 RET
(0024) ;
(0025) }
(0026)
(0027) void port_init(void)
(0028) {
(0029) PORTB = 0x00;
_port_init:
0077 2422 CLR R2
0078 B825 OUT 0x05,R2
(0030) DDRB = 0x00;
0079 B824 OUT 0x04,R2
(0031) PORTC = 0x00; //m103 output only
007A B828 OUT 0x08,R2
(0032) DDRC = 0x00;
007B B827 OUT 0x07,R2
(0033) PORTD = 0x00;
007C B82B OUT 0x0B,R2
(0034) DDRD = 0x00;
007D B82A OUT 0x0A,R2
007E 9508 RET
_timer2_ovf_isr:
007F 938A ST R24,-Y
0080 B78F IN R24,0x3F
0081 938A ST R24,-Y
(0035) }
(0036)
(0037) #pragma interrupt_handler timer2_ovf_isr:10
(0038) void timer2_ovf_isr(void)
(0039) {
(0040) TCNT2 = 0x83; //reload counter value
0082 E883 LDI R24,0x83
0083 938000B2 STS 0xB2,R24
(0041)
(0042) timeBase.bits.bt1ms = 1;
0085 91800138 LDS R24,timeBase
0087 6082 ORI R24,2
0088 93800138 STS timeBase,R24
008A 9189 LD R24,Y+
008B BF8F OUT 0x3F,R24
008C 9189 LD R24,Y+
008D 9518 RETI
_uart0_rx_isr:
tmp --> R16
008E 922A ST R2,-Y
008F 930A ST R16,-Y
0090 938A ST R24,-Y
0091 939A ST R25,-Y
0092 93EA ST R30,-Y
0093 93FA ST R31,-Y
0094 B62F IN R2,0x3F
0095 922A ST R2,-Y
(0043) }
(0044)
(0045) #pragma interrupt_handler uart0_rx_isr:19
(0046) void uart0_rx_isr(void)
(0047) {
(0048) uint8 tmp;
(0049) receTimeOut = 10; //通讯超时值
0096 E08A LDI R24,0xA
0097 9380012C STS receTimeOut,R24
(0050) //PORTC ^= 0x02;
(0051)
(0052)
(0053) if(UCSR0A&BIT(FE0) != 0) //帧错. //if(FERR==1)
0099 902000C0 LDS R2,0xC0
009B FE20 SBRS R2,0
009C C012 RJMP 0x00AF
(0054) {
(0055) UCSR0B &= ~BIT(RXEN0); //CREN = 0;
009D 918000C1 LDS R24,0xC1
009F 7E8F ANDI R24,0xEF
00A0 938000C1 STS 0xC1,R24
(0056) UCSR0A &= ~BIT(FE0); //FERR = 0;
00A2 918000C0 LDS R24,0xC0
00A4 7E8F ANDI R24,0xEF
00A5 938000C0 STS 0xC0,R24
(0057) UCSR0B |= BIT(RXEN0); //CREN = 1;
00A7 918000C1 LDS R24,0xC1
00A9 6180 ORI R24,0x10
00AA 938000C1 STS 0xC1,R24
(0058) tmp = UDR0;
00AC 910000C6 LDS R16,0xC6
(0059) //PORTC ^= 0x02;
(0060) }
00AE C034 RJMP 0x00E3
(0061) //else if(OERR==1)
(0062) else if(UCSR0A&BIT(DOR0)) //溢出错.
00AF 902000C0 LDS R2,0xC0
00B1 FE23 SBRS R2,3
00B2 C012 RJMP 0x00C5
(0063) {
(0064) UCSR0B &= ~BIT(RXEN0); //CREN = 0;
00B3 918000C1 LDS R24,0xC1
00B5 7E8F ANDI R24,0xEF
00B6 938000C1 STS 0xC1,R24
(0065) UCSR0A &= ~BIT(DOR0); //OERR = 0;
00B8 918000C0 LDS R24,0xC0
00BA 7F87 ANDI R24,0xF7
00BB 938000C0 STS 0xC0,R24
(0066) UCSR0B |= BIT(RXEN0); //CREN = 1;
00BD 918000C1 LDS R24,0xC1
00BF 6180 ORI R24,0x10
00C0 938000C1 STS 0xC1,R24
(0067) tmp = UDR0;
00C2 910000C6 LDS R16,0xC6
(0068) //PORTC ^= 0x02;
(0069) }
00C4 C01E RJMP 0x00E3
(0070) else //奇偶校验的问题.
(0071) {
(0072) // RX9DBuf = RX9D;
(0073) // 读取接受寄存器中的数据.
(0074) receBuf[receCount] = UDR0; // RCREG;
00C5 E08C LDI R24,0xC
00C6 E091 LDI R25,1
00C7 91E0012F LDS R30,receCount
00C9 27FF CLR R31
00CA 0FE8 ADD R30,R24
00CB 1FF9 ADC R31,R25
00CC 902000C6 LDS R2,0xC6
00CE 8220 STD Z+0,R2
(0075) // 奇校验判断.
(0076) //if(RX9DBuf != ParityBit(&receBuf[receCount]))
(0077) if(UCSR0A&BIT(UPE0)!=0) //奇校验硬件完成.
00CF 902000C0 LDS R2,0xC0
00D1 FE20 SBRS R2,0
00D2 C008 RJMP 0x00DB
(0078) {
(0079) //PORTC ^= 0x02;
(0080) UCSR0A |= BIT(UPE0);
00D3 918000C0 LDS R24,0xC0
00D5 6084 ORI R24,4
00D6 938000C0 STS 0xC0,R24
(0081) checkoutError = 1;
00D8 E081 LDI R24,1
00D9 9380012D STS checkoutError,R24
(0082) }
(0083) receCount++; // 接收地址偏移寄存器加1.
00DB 9180012F LDS R24,receCount
00DD 5F8F SUBI R24,0xFF
00DE 9380012F STS receCount,R24
(0084) receCount &= 0x0f; // 最多接受16个字节.
00E0 708F ANDI R24,0xF
00E1 9380012F STS receCount,R24
(0085) // PORTC ^= 0x02;
(0086) } //
00E3 9029 LD R2,Y+
00E4 BE2F OUT 0x3F,R2
00E5 91F9 LD R31,Y+
00E6 91E9 LD R30,Y+
00E7 9199 LD R25,Y+
00E8 9189 LD R24,Y+
00E9 9109 LD R16,Y+
00EA 9029 LD R2,Y+
00EB 9518 RETI
_uart0_udre_isr:
00EC 922A ST R2,-Y
00ED 923A ST R3,-Y
00EE 938A ST R24,-Y
00EF 939A ST R25,-Y
00F0 93EA ST R30,-Y
00F1 93FA ST R31,-Y
00F2 B62F IN R2,0x3F
00F3 922A ST R2,-Y
(0087) } //void uart0_rx_isr(void)
(0088)
(0089)
(0090) #pragma interrupt_handler uart0_udre_isr:21
(0091) void uart0_udre_isr(void)
(0092) {
(0093) //character transferred to shift register so UDR is now empty
(0094) // UDR0 = 0x01;
(0095) if(sendPosi<sendCount)
00F4 90200130 LDS R2,sendCount
00F6 90300131 LDS R3,sendPosi
00F8 1432 CP R3,R2
00F9 F480 BCC 0x010A
(0096) {
(0097) sendPosi++;
00FA 91800131 LDS R24,sendPosi
00FC 5F8F SUBI R24,0xFF
00FD 93800131 STS sendPosi,R24
(0098) // TX9D = ParityBit(sendBuf[sendPosi]);
(0099) UDR0 = sendBuf[sendPosi];
00FF E18C LDI R24,0x1C
0100 E091 LDI R25,1
0101 91E00131 LDS R30,sendPosi
0103 27FF CLR R31
0104 0FE8 ADD R30,R24
0105 1FF9 ADC R31,R25
0106 8020 LDD R2,Z+0
0107 922000C6 STS 0xC6,R2
(0100) }
0109 C015 RJMP 0x011F
(0101) else
(0102) {
(0103) // receEnable(); //485芯片
(0104) if(UCSR0A&BIT(TXC0) != 0) //if(TRMT)
010A 902000C0 LDS R2,0xC0
010C FE20 SBRS R2,0
010D C011 RJMP 0x011F
(0105) {
(0106) receCount = 0;
010E 2422 CLR R2
010F 9220012F STS receCount,R2
(0107) checkoutError = 0;
0111 9220012D STS checkoutError,R2
(0108) //--------------------------
(0109) //UCSR0B &= ~BIT(UDRIE0); //RXCIE0 清零. TXIE = 0;//在一组数据发送完成后关闭
(0110) UCSR0B &= ~BIT(TXCIE0);
0113 918000C1 LDS R24,0xC1
0115 7B8F ANDI R24,0xBF
0116 938000C1 STS 0xC1,R24
(0111) //TXEN = 0;
(0112) UCSR0B &= ~BIT(TXEN0);
0118 918000C1 LDS R24,0xC1
011A 7F87 ANDI R24,0xF7
011B 938000C1 STS 0xC1,R24
(0113) sendCount = 0;
011D 92200130 STS sendCount,R2
(0114) //--------------------------
(0115) // flag_bit = 0; //&&&&&&&&
(0116) }
(0117) }
011F 9029 LD R2,Y+
0120 BE2F OUT 0x3F,R2
0121 91F9 LD R31,Y+
0122 91E9 LD R30,Y+
0123 9199 LD R25,Y+
0124 9189 LD R24,Y+
0125 9039 LD R3,Y+
0126 9029 LD R2,Y+
0127 9518 RETI
(0118) }
(0119)
(0120) void test_pin(void)
(0121) {
(0122) DDRC |= 0x02;
_test_pin:
0128 9A39 SBI 0x07,1
(0123) PORTC |= 0x02;
0129 9A41 SBI 0x08,1
012A 9508 RET
(0124) }
(0125)
(0126) //call this routine to initialize all peripherals
(0127) void init_devices(void)
(0128) {
(0129) //stop errant interrupts until set up
(0130) CLI(); //disable all interrupts
_init_devices:
012B 94F8 BCLR 7
(0131) port_init();
012C DF4A RCALL _port_init
(0132) uart0_init();
012D D044 RCALL _uart0_init
(0133) timer2_init();
012E D203 RCALL _timer2_init
(0134) led_init();
012F D2BE RCALL _led_init
(0135)
(0136) test_pin();
0130 DFF7 RCALL _test_pin
(0137)
(0138) MCUCR = 0x00;
0131 2422 CLR R2
0132 BE25 OUT 0x35,R2
(0139) EICRA = 0x00; //extended ext ints
0133 92200069 STS 0x69,R2
(0140) EIMSK = 0x00;
0135 BA2D OUT 0x1D,R2
(0141)
(0142) TIMSK0 = 0x00; //timer 0 interrupt sources
0136 9220006E STS 0x6E,R2
(0143) TIMSK1 = 0x00; //timer 1 interrupt sources
0138 9220006F STS 0x6F,R2
(0144) TIMSK2 = 0x01; //timer 2 interrupt sources
013A E081 LDI R24,1
013B 93800070 STS 0x70,R24
(0145)
(0146) PCMSK0 = 0x00; //pin change mask 0
013D 9220006B STS 0x6B,R2
(0147) PCMSK1 = 0x00; //pin change mask 1
013F 9220006C STS 0x6C,R2
(0148) PCMSK2 = 0x00; //pin change mask 2
0141 9220006D STS 0x6D,R2
(0149) PCICR = 0x00; //pin change enable
0143 92200068 STS 0x68,R2
(0150) PRR = 0x84; //power controller
0145 E884 LDI R24,0x84
0146 93800064 STS 0x64,R24
(0151) SEI(); //re-enable interrupts
0148 9478 BSET 7
0149 9508 RET
(0152) //all peripherals are now initialized
(0153) }
(0154)
(0155) //
(0156) void main(void)
(0157) {
(0158) NOP();
_main:
014A 0000 NOP
(0159) init_devices();
014B DFDF RCALL _init_devices
(0160) NOP();
014C 0000 NOP
(0161) singleKeyTranmit();
014D D052 RCALL _singleKeyTranmit
(0162) delay(50000);
014E E500 LDI R16,0x50
014F EC13 LDI R17,0xC3
0150 DF1E RCALL _delay
(0163) singleKeyTranmit();
0151 D04E RCALL _singleKeyTranmit
(0164) test();
0152 DF03 RCALL _test
0153 C01C RJMP 0x0170
(0165)
(0166)
(0167) while(1)
(0168) {
(0169)
(0170) ReceiveFrameDisFun();
0154 D06C RCALL _ReceiveFrameDisFun
(0171)
(0172) //UDR0 = 0x01;
(0173) if(timeBase.bits.bt1ms)
0155 91800138 LDS R24,timeBase
0157 9586 LSR R24
0158 7081 ANDI R24,1
0159 F009 BEQ 0x015B
(0174) time_mission();
015A D1EA RCALL _time_mission
(0175) if(ledControl.bits.once128ms) // if(var_a == 1) //
015B 91800136 LDS R24,ledControl
015D 7081 ANDI R24,1
015E F031 BEQ 0x0165
(0176) {
(0177) //PORTC ^= 0x02;
(0178) ledControl.bits.once128ms=0; //var_a = 0; //
015F 91800136 LDS R24,ledControl
0161 7F8E ANDI R24,0xFE
0162 93800136 STS ledControl,R24
(0179) sub2();
0164 D307 RCALL _sub2
(0180) }
(0181) if(ledControl.bits.refurbish) //if(var_b == 1) //
0165 91800136 LDS R24,ledControl
0167 9586 LSR R24
0168 7081 ANDI R24,1
0169 F031 BEQ 0x0170
(0182) {
(0183) //PORTC ^= 0x02;
(0184) ledControl.bits.refurbish=0;//var_b = 0; //
016A 91800136 LDS R24,ledControl
016C 7F8D ANDI R24,0xFD
016D 93800136 STS ledControl,R24
(0185) subled();
016F D30E RCALL _subled
0170 CFE3 RJMP 0x0154
0171 9508 RET
FILE: D:\ICCTES~1\1128\modbus.c
(0001) //modbus.c
(0002) #include <iom48v.h>
(0003) #include <macros.h>
(0004) #include "main.h"
(0005) #include "modbus.h"
(0006) #include "timer2.h"
(0007) #include "led.h"
(0008)
(0009) #define LocalAddr 0x01
(0010) #define TRUE 1
(0011) #define FLASE 0
(0012) volatile uchar sendPosi,sendCount;
(0013) uchar receCount;
(0014) volatile uchar GetCntTemp;
(0015) uchar sendBuf[16];
(0016) uchar receBuf[16];
(0017) volatile uchar checkoutError; //校验结果
(0018) uchar receTimeOut; //接收超时
(0019)
(0020) uchar GetKeyValue;
(0021) uint crc_result;
(0022)
(0023) uint testVarAnalog;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -