📄 modbusm16.lst
字号:
__text_start:
__start:
016F E5CF LDI R28,0x5F
0170 E0D4 LDI R29,4
0171 BFCD OUT P3D,R28
0172 BFDE OUT P3E,R29
0173 58C0 SUBI R28,0x80
0174 40D0 SBCI R29,0
0175 EA0A LDI R16,0xAA
0176 8308 STD R16,0+Y
0177 2400 CLR R0
0178 E6E1 LDI R30,0x61
0179 E0F0 LDI R31,0
017A E010 LDI R17,0
017B 3BE6 CPI R30,0xB6
017C 07F1 CPC R31,R17
017D F011 BEQ 0x0180
017E 9201 ST R0,Z+
017F CFFB RJMP 0x017B
0180 8300 STD R16,0+Z
0181 EDEC LDI R30,0xDC
0182 E0F2 LDI R31,2
0183 E6A0 LDI R26,0x60
0184 E0B0 LDI R27,0
0185 E012 LDI R17,2
0186 3DED CPI R30,0xDD
0187 07F1 CPC R31,R17
0188 F021 BEQ 0x018D
0189 95C8 LPM
018A 9631 ADIW R30,1
018B 920D ST R0,X+
018C CFF9 RJMP 0x0186
018D 940E02B8 CALL _main
_exit:
018F CFFF RJMP _exit
FILE: E:\我的网页\mcuc\download\M16-23板程序模板\新建文件夹\init.c
(0001) //ICC-AVR application builder : 2004-10-27 10:06:29
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include "main.h"
(0006)
(0007) //初始化变量
(0008) void varInit(void)
(0009) {
(0010)
(0011) }//void valInit(void)
_varInit:
0190 9508 RET
(0012)
(0013) void port_init(void)
(0014) {
(0015) //
(0016) PORTA = 0xF0; //
_port_init:
0191 EF80 LDI R24,0xF0
0192 BB8B OUT P1B,R24
(0017) DDRA = 0x00; //
0193 2422 CLR R2
0194 BA2A OUT P1A,R2
(0018) PORTB = 0xFF; //
0195 EF8F LDI R24,0xFF
0196 BB88 OUT P18,R24
(0019) DDRB = 0xFD; //
0197 EF8D LDI R24,0xFD
0198 BB87 OUT P17,R24
(0020) PORTC = 0xFF; //
0199 EF8F LDI R24,0xFF
019A BB85 OUT P15,R24
(0021) DDRC = 0x00; //
019B BA24 OUT P14,R2
(0022) PORTD = 0xFF; //
019C BB82 OUT P12,R24
(0023) DDRD = 0xFA; //
019D EF8A LDI R24,0xFA
019E BB81 OUT P11,R24
(0024) }//void port_init(void)
019F 9508 RET
(0025)
(0026)
(0027) //Watchdog initialisation
(0028) // prescale: 2048K cycles
(0029) void watchdog_init(void)
(0030) {
(0031) WDR(); //this prevents a timout on enabling
_watchdog_init:
01A0 95A8 WDR
(0032) WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
01A1 E08F LDI R24,0xF
01A2 BD81 OUT P21,R24
(0033) }//void watchdog_init(void)
01A3 9508 RET
(0034)
(0035) void timer0_init(void)
(0036) {
(0037) //初始化1ms 定时中断
(0038) TCCR0 = 0x00;
_timer0_init:
01A4 2422 CLR R2
01A5 BE23 OUT P33,R2
(0039) TIFR = 0x00;
01A6 BE28 OUT P38,R2
(0040) TCNT0 = 0x83;
01A7 E883 LDI R24,0x83
01A8 BF82 OUT P32,R24
(0041) TCCR0 = 0x03;
01A9 E083 LDI R24,3
01AA BF83 OUT P33,R24
(0042) }//void timer0_init(void)
01AB 9508 RET
(0043)
(0044) //ADC initialisation
(0045) // Conversion time: 52uS
(0046) void adc_init(void)
(0047) {
(0048) uint8 adcMux = 0;
_adc_init:
adcMux --> R16
01AC 2700 CLR R16
(0049)
(0050) ADCSR = 0x00; //disable adc
01AD 2422 CLR R2
01AE B826 OUT P06,R2
(0051) ADMUX = 0xc0 |(adcMux&0x0f); //select adc input 0 2.56V参考源
01AF 2F80 MOV R24,R16
01B0 708F ANDI R24,0xF
01B1 6C80 ORI R24,0xC0
01B2 B987 OUT P07,R24
(0052) ACSR = 0x80;
01B3 E880 LDI R24,0x80
01B4 B988 OUT P08,R24
(0053) ADCSR = 0x85; //使能ADC 32分频
01B5 E885 LDI R24,0x85
01B6 B986 OUT P06,R24
(0054) }//void adc_init(void)
01B7 9508 RET
(0055)
(0056) //UART0 initialisation
(0057) // desired baud rate: 9600
(0058) // actual: baud rate:9615 (0.2%)
(0059) // char size: 8 bit
(0060) // parity: Even
(0061) void uart0_init(void)
(0062) {
(0063) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
01B8 2422 CLR R2
01B9 B82A OUT P0A,R2
(0064) UCSRA = 0x00;
01BA B82B OUT P0B,R2
(0065) UCSRC = 0xA6;
01BB EA86 LDI R24,0xA6
01BC BD80 OUT P20,R24
(0066) UBRRL = 51; //set baud rate lo
01BD E383 LDI R24,0x33
01BE B989 OUT P09,R24
(0067) UBRRH = 0x00; //set baud rate hi
01BF BC20 OUT P20,R2
(0068) UCSRB = 0xD8;
01C0 ED88 LDI R24,0xD8
01C1 B98A OUT P0A,R24
(0069)
(0070) receEnable();
01C2 98C7 CBI P18,7
(0071) }
01C3 9508 RET
_uart0_rx_isr:
status --> R16
01C4 922A ST R2,-Y
01C5 930A ST R16,-Y
01C6 938A ST R24,-Y
01C7 939A ST R25,-Y
01C8 93EA ST R30,-Y
01C9 93FA ST R31,-Y
01CA B62F IN R2,P3F
01CB 922A ST R2,-Y
(0072)
(0073) #pragma interrupt_handler uart0_rx_isr:12
(0074) void uart0_rx_isr(void)
(0075) {
(0076) uint8 status;
(0077)
(0078) //uart has received a character in UDR
(0079) status = UCSRA;
01CC B10B IN R16,P0B
(0080) receBuf[receCount] = UDR;
01CD E781 LDI R24,0x71
01CE E090 LDI R25,0
01CF 91E000B2 LDS R30,_receCount
01D1 27FF CLR R31
01D2 0FE8 ADD R30,R24
01D3 1FF9 ADC R31,R25
01D4 B02C IN R2,P0C
01D5 8220 STD R2,0+Z
(0081)
(0082) if(status & 0x1c) //通信出错
01D6 2F80 MOV R24,R16
01D7 718C ANDI R24,0x1C
01D8 F019 BEQ 0x01DC
(0083) checkoutError = 2; //偶校验出错
01D9 E082 LDI R24,2
01DA 93800070 STS _checkoutError,R24
(0084)
(0085) //testRegister = status;
(0086) receCount++; //接收地址偏移寄存器加1
01DC 918000B2 LDS R24,_receCount
01DE 5F8F SUBI R24,0xFF
01DF 938000B2 STS _receCount,R24
(0087) receCount &= 0x1f; //最多一次只能接收32个字节
01E1 718F ANDI R24,0x1F
01E2 938000B2 STS _receCount,R24
(0088) receTimeOut = 10; //通讯超时值
01E4 E08A LDI R24,0xA
01E5 9380006F STS _receTimeOut,R24
(0089) }
01E7 9029 LD R2,Y+
01E8 BE2F OUT P3F,R2
01E9 91F9 LD R31,Y+
01EA 91E9 LD R30,Y+
01EB 9199 LD R25,Y+
01EC 9189 LD R24,Y+
01ED 9109 LD R16,Y+
01EE 9029 LD R2,Y+
01EF 9518 RETI
_uart0_tx_isr:
01F0 922A ST R2,-Y
01F1 923A ST R3,-Y
01F2 938A ST R24,-Y
01F3 939A ST R25,-Y
01F4 93EA ST R30,-Y
01F5 93FA ST R31,-Y
01F6 B62F IN R2,P3F
01F7 922A ST R2,-Y
(0090)
(0091) #pragma interrupt_handler uart0_tx_isr:14
(0092) void uart0_tx_isr(void)
(0093) {
(0094) //character has been transmitted
(0095) if(sendPosi < sendCount)
01F8 902000B3 LDS R2,_sendCount
01FA 903000B1 LDS R3,_sendPosi
01FC 1432 CP R3,R2
01FD F470 BCC 0x020C
(0096) {
(0097) sendPosi++;
01FE 2D83 MOV R24,R3
01FF 5F8F SUBI R24,0xFF
0200 938000B1 STS _sendPosi,R24
(0098) UDR = sendBuf[sendPosi];
0202 E981 LDI R24,0x91
0203 E090 LDI R25,0
0204 91E000B1 LDS R30,_sendPosi
0206 27FF CLR R31
0207 0FE8 ADD R30,R24
0208 1FF9 ADC R31,R25
0209 8020 LDD R2,0+Z
020A B82C OUT P0C,R2
(0099) }
020B C006 RJMP 0x0212
(0100) else
(0101) {
(0102) receEnable(); //发送完后将485置于接收状态
020C 98C7 CBI P18,7
(0103) receCount = 0; //清接收地址偏移寄存器
020D 2422 CLR R2
020E 922000B2 STS _receCount,R2
(0104) checkoutError = 0;
0210 92200070 STS _checkoutError,R2
(0105) }
(0106) }
0212 9029 LD R2,Y+
0213 BE2F OUT P3F,R2
0214 91F9 LD R31,Y+
0215 91E9 LD R30,Y+
0216 9199 LD R25,Y+
0217 9189 LD R24,Y+
0218 9039 LD R3,Y+
0219 9029 LD R2,Y+
021A 9518 RETI
(0107)
(0108) //call this routine to initialise all peripherals
(0109) void init_devices(void)
(0110) {
(0111) //stop errant interrupts until set up
(0112) CLI(); //disable all interrupts
_init_devices:
021B 94F8 BCLR 7
(0113) port_init();
021C DF74 RCALL _port_init
(0114) watchdog_init();
021D DF82 RCALL _watchdog_init
(0115) timer0_init();
021E DF85 RCALL _timer0_init
(0116) adc_init();
021F DF8C RCALL _adc_init
(0117) uart0_init();
0220 DF97 RCALL _uart0_init
(0118)
(0119) MCUCR = 0x00;
0221 2422 CLR R2
0222 BE25 OUT P35,R2
(0120) GICR = 0x00;
0223 BE2B OUT P3B,R2
(0121) TIMSK = 0x01; //timer interrupt sources
0224 E081 LDI R24,1
0225 BF89 OUT P39,R24
(0122) SEI(); //re-enable interrupts
0226 9478 BSET 7
(0123) //all peripherals are now initialised
(0124) }//void init_devices(void)
0227 9508 RET
_timer0_ovf_isr:
0228 922A ST R2,-Y
0229 923A ST R3,-Y
022A 924A ST R4,-Y
022B 925A ST R5,-Y
022C 938A ST R24,-Y
022D 939A ST R25,-Y
022E 93AA ST R26,-Y
022F 93BA ST R27,-Y
0230 93EA ST R30,-Y
0231 B62F IN R2,P3F
0232 922A ST R2,-Y
0233 940E064A CALL push_gset2
FILE: E:\我的网页\mcuc\download\M16-23板程序模板\新建文件夹\main.c
(0001) //ICC-AVR application builder : 2004-10-27 10:06:29
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) /*****************************************************
(0006) 微控电子 www.mcuc.cn
(0007) modbus RTU 的mega16程序,使用ICCAVR编译
(0008) 单片机mega16
(0009) 通信波特率 9600 8位数据 1位停止位 偶校验 485通位接口
(0010) 单片机控制板地址 localAddr(变量)
(0011) 通信可设置数据的地址:
(0012) 字地址 0 - 255 (只取16位的低8位)
(0013) 位地址 0 - 255 (只取16位的低8位)
(0014) ******************************************************/
(0015)
(0016)
(0017) #include "main.h"
(0018)
(0019) uint32 tickCount,intTickCount;
(0020) uint8 flag1ms,c200ms;
(0021)
(0022) #pragma interrupt_handler timer0_ovf_isr:10
(0023) //定时器0 1ms定时中断
(0024) void timer0_ovf_isr(void)
(0025) {
(0026) TCNT0 = 0x83;
0235 E883 LDI R24,0x83
0236 BF82 OUT P32,R24
(0027) intTickCount++;
0237 E041 LDI R20,1
0238 E050 LDI R21,0
0239 E060 LDI R22,0
023A E070 LDI R23,0
023B 90400068 LDS R4,_intTickCount+2
023D 90500069 LDS R5,_intTickCount+3
023F 90200066 LDS R2,_intTickCount
0241 90300067 LDS R3,_intTickCount+1
0243 0E24 ADD R2,R20
0244 1E35 ADC R3,R21
0245 1E46 ADC R4,R22
0246 1E57 ADC R5,R23
0247 92300067 STS _intTickCount+1,R3
0249 92200066 STS _intTickCount,R2
024B 92500069 STS _intTickCount+3,R5
024D 92400068 STS _intTickCount+2,R4
(0028) flag1ms = 1; //1ms 时间到
024F E081 LDI R24,1
0250 93800065 STS _flag1ms,R24
(0029)
(0030) /*
(0031) if(adcCount<=SAMPLECOUNT-1 && adcCount>=0)
(0032) adcData[adcCount] = ADC & 0x3ff; //读取AD数据
(0033) if(adcCount >= 0)
(0034) {
(0035) ADMUX = 0xc0 |(adcMux&0x0f);
(0036) ADCSR |= 1 << ADSC; //启动ADC
(0037) adcCount--;
(0038) }
(0039) */
(0040) }//void timer0_ovf_isr(void)
0252 940E0627 CALL pop_gset2
0254 9029 LD R2,Y+
0255 BE2F OUT P3F,R2
0256 91E9 LD R30,Y+
0257 91B9 LD R27,Y+
0258 91A9 LD R26,Y+
0259 9199 LD R25,Y+
025A 9189 LD R24,Y+
025B 9059 LD R5,Y+
025C 9049 LD R4,Y+
025D 9039 LD R3,Y+
025E 9029 LD R2,Y+
025F 9518 RETI
(0041)
(0042) void timeProc(void)
(0043) {
(0044) static uint16 second;
(0045) static uint8 i;
(0046)
(0047) if(flag1ms == 1)
_timeProc:
0260 91800065 LDS R24,_flag1ms
0262 3081 CPI R24,1
0263 F009 BEQ 0x0265
0264 C052 RJMP 0x02B7
(0048) {
(0049) flag1ms = 0;
0265 2422 CLR R2
0266 92200065 STS _flag1ms,R2
(0050) CLI();
0268 94F8 BCLR 7
(0051) tickCount = intTickCount;
0269 90400068 LDS R4,_intTickCount+2
026B 90500069 LDS R5,_intTickCount+3
026D 90200066 LDS R2,_intTickCount
026F 90300067 LDS R3,_intTickCount+1
0271 9230006B STS _tickCount+1,R3
0273 9220006A STS _tickCount,R2
0275 9250006D STS _tickCount+3,R5
0277 9240006C STS _tickCount+2,R4
(0052) SEI();
0279 9478 BSET 7
(0053)
(0054) if(receTimeOut>0)
027A 2422 CLR R2
027B 9030006F LDS R3,_receTimeOut
027D 1423 CP R2,R3
027E F478 BCC 0x028E
(0055) {
(0056) receTimeOut--;
027F 2D83 MOV R24,R3
0280 5081 SUBI R24,1
0281 9380006F STS _receTimeOut,R24
(0057) if(receTimeOut==0 && receCount>0) //判断通讯接收是否超时
0283 2388 TST R24
0284 F449 BNE 0x028E
0285 903000B2 LDS R3,_receCount
0287 1423 CP R2,R3
0288 F428 BCC 0x028E
(0058) {
(0059) receEnable(); //将485置为接收状态
0289 98C7 CBI P18,7
(0060) receCount = 0; //将接收地址偏移寄存器清零
028A 922000B2 STS _receCount,R2
(0061) checkoutError = 0;
028C 92200070 STS _checkoutError,R2
(0062) }
(0063) }
(0064)
(0065) c200ms++;
028E 91800064 LDS R24,_c200ms
0290 5F8F SUBI R24,0xFF
0291 93800064 STS _c200ms,R24
(0066) if(c200ms > 100)
0293 E684 LDI R24,0x64
0294 90200064 LDS R2,_c200ms
0296 1582 CP R24,R2
0297 F438 BCC 0x029F
(0067) {
(0068) c200ms = 0;
0298 2422 CLR R2
0299 92200064 STS _c200ms,R2
(0069) blinkLed(); //运行指示灯闪烁
029B E480 LDI R24,0x40
029C B228 IN R2,P18
029D 2628 EOR R2,R24
029E BA28 OUT P18,R2
(0070) }
(0071)
(0072) second++;
029F 91800061 LDS R24,0x61
02A1 91900062 LDS R25,0x62
02A3 9601 ADIW R24,1
02A4 93900062 STS 0x62,R25
02A6 93800061 STS 0x61,R24
(0073) if(second > 10000)
02A8 E180 LDI R24,0x10
02A9 E297 LDI R25,0x27
02AA 90200061 LDS R2,0x61
02AC 90300062 LDS R3,0x62
02AE 1582 CP R24,R2
02AF 0593 CPC R25,R3
02B0 F430 BCC 0x02B7
(0074) {
(0075) second = 0;
02B1 2422 CLR R2
02B2 2433 CLR R3
02B3 92300062 STS 0x62,R3
02B5 92200061 STS 0x61,R2
(0076) }
(0077) }
(0078) }//void timeProc(void)
02B7 9508 RET
(0079)
(0080) void main(void)
(0081) {
(0082) int16 i;
(0083)
(0084) varInit();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -