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

📄 uart_main.lis

📁 使用Atmel88芯片实现RS485通讯,Modbus通讯协议.在IVR_AVR环境中编译,文件完整.
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module uart_main.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\ICCTES~1\1128\uart_main.c
 0000                   .dbfunc e test _test fV
                        .even
 0000           _test::
 0000                   .dbline -1
 0000                   .dbline 13
 0000           ; // ICC-AVR application builder : 2007-11-28 8:53:26
 0000           ; // Target : M48
 0000           ; // Crystal: 8.0000Mhz
 0000           ; 
 0000           ; #include <iom48v.h>
 0000           ; #include <macros.h>
 0000           ; #include "main.h"
 0000           ; #include "modbus.h"
 0000           ; #include "timer2.h"   
 0000           ; #include "led.h"
 0000           ; 
 0000           ; void test(void)
 0000           ; {
 0000                   .dbline 15
 0000           ;     // LedShowLink = 5678;
 0000           ;       testVarAnalog = 0x0102;
 0000 82E0              ldi R24,258
 0002 91E0              ldi R25,1
 0004 90930100          sts _testVarAnalog+1,R25
 0008 80930000          sts _testVarAnalog,R24
 000C                   .dbline 16
 000C           ;     testVarPoint = 0x0304;
 000C 84E0              ldi R24,772
 000E 93E0              ldi R25,3
 0010 90930100          sts _testVarPoint+1,R25
 0014 80930000          sts _testVarPoint,R24
 0018                   .dbline 17
 0018           ;     testVarInputUp = 0x0506;
 0018 86E0              ldi R24,1286
 001A 95E0              ldi R25,5
 001C 90930100          sts _testVarInputUp+1,R25
 0020 80930000          sts _testVarInputUp,R24
 0024                   .dbline 18
 0024           ;     testVarInputDown = 0x0708;
 0024 88E0              ldi R24,1800
 0026 97E0              ldi R25,7
 0028 90930100          sts _testVarInputDown+1,R25
 002C 80930000          sts _testVarInputDown,R24
 0030                   .dbline -2
 0030           L5:
 0030                   .dbline 0 ; func end
 0030 0895              ret
 0032                   .dbend
 0032                   .dbfunc e delay _delay fV
 0032           ;            num -> R16,R17
                        .even
 0032           _delay::
 0032                   .dbline -1
 0032                   .dbline 22
 0032           ; }
 0032           ; 
 0032           ; void delay(uint num)
 0032           ; {
 0032           L7:
 0032                   .dbline 24
 0032           L8:
 0032                   .dbline 23
 0032           ;        while(num-->0)       
 0032 1801              movw R2,R16
 0034 0150              subi R16,1
 0036 1040              sbci R17,0
 0038 2220              tst R2
 003A D9F7              brne L7
 003C 3320              tst R3
 003E C9F7              brne L7
 0040           X0:
 0040                   .dbline -2
 0040           L6:
 0040                   .dbline 0 ; func end
 0040 0895              ret
 0042                   .dbsym r num 16 i
 0042                   .dbend
 0042                   .dbfunc e port_init _port_init fV
                        .even
 0042           _port_init::
 0042                   .dbline -1
 0042                   .dbline 28
 0042           ;             ;         
 0042           ; }
 0042           ; 
 0042           ; void port_init(void)
 0042           ; {
 0042                   .dbline 29
 0042           ;  PORTB = 0x00;
 0042 2224              clr R2
 0044 25B8              out 0x5,R2
 0046                   .dbline 30
 0046           ;  DDRB  = 0x00;
 0046 24B8              out 0x4,R2
 0048                   .dbline 31
 0048           ;  PORTC = 0x00; //m103 output only
 0048 28B8              out 0x8,R2
 004A                   .dbline 32
 004A           ;  DDRC  = 0x00;
 004A 27B8              out 0x7,R2
 004C                   .dbline 33
 004C           ;  PORTD = 0x00;
 004C 2BB8              out 0xb,R2
 004E                   .dbline 34
 004E           ;  DDRD  = 0x00;
 004E 2AB8              out 0xa,R2
 0050                   .dbline -2
 0050           L10:
 0050                   .dbline 0 ; func end
 0050 0895              ret
 0052                   .dbend
                        .area vector(rom, abs)
                        .org 18
 0012 29C0              rjmp _timer2_ovf_isr
                        .area text(rom, con, rel)
 0052                   .dbfile D:\ICCTES~1\1128\uart_main.c
 0052                   .dbfunc e timer2_ovf_isr _timer2_ovf_isr fV
                        .even
 0052           _timer2_ovf_isr::
 0052 8A93              st -y,R24
 0054 8FB7              in R24,0x3f
 0056 8A93              st -y,R24
 0058                   .dbline -1
 0058                   .dbline 39
 0058           ; }
 0058           ; 
 0058           ; #pragma interrupt_handler timer2_ovf_isr:10
 0058           ; void timer2_ovf_isr(void)
 0058           ; {
 0058                   .dbline 40
 0058           ;  TCNT2 = 0x83; //reload counter value
 0058 83E8              ldi R24,131
 005A 8093B200          sts 178,R24
 005E                   .dbline 42
 005E           ;       
 005E           ;  timeBase.bits.bt1ms = 1;
 005E 80910000          lds R24,_timeBase
 0062 8260              ori R24,2
 0064 80930000          sts _timeBase,R24
 0068                   .dbline -2
 0068           L11:
 0068 8991              ld R24,y+
 006A 8FBF              out 0x3f,R24
 006C 8991              ld R24,y+
 006E                   .dbline 0 ; func end
 006E 1895              reti
 0070                   .dbend
                        .area vector(rom, abs)
                        .org 36
 0024 38C0              rjmp _uart0_rx_isr
                        .area text(rom, con, rel)
 0070                   .dbfile D:\ICCTES~1\1128\uart_main.c
 0070                   .dbfunc e uart0_rx_isr _uart0_rx_isr fV
 0070           ;            tmp -> R16
                        .even
 0070           _uart0_rx_isr::
 0070 2A92              st -y,R2
 0072 0A93              st -y,R16
 0074 8A93              st -y,R24
 0076 9A93              st -y,R25
 0078 EA93              st -y,R30
 007A FA93              st -y,R31
 007C 2FB6              in R2,0x3f
 007E 2A92              st -y,R2
 0080                   .dbline -1
 0080                   .dbline 47
 0080           ; }
 0080           ; 
 0080           ; #pragma interrupt_handler uart0_rx_isr:19
 0080           ; void uart0_rx_isr(void)
 0080           ; {    
 0080                   .dbline 49
 0080           ;       uint8 tmp;
 0080           ;       receTimeOut = 10;    //通讯超时值
 0080 8AE0              ldi R24,10
 0082 80930000          sts _receTimeOut,R24
 0086                   .dbline 53
 0086           ;       //PORTC ^= 0x02;
 0086           ;       
 0086           ;       
 0086           ;       if(UCSR0A&BIT(FE0) != 0)  //帧错.                         //if(FERR==1) 
 0086 2090C000          lds R2,192
 008A 20FE              sbrs R2,0
 008C 12C0              rjmp L13
 008E                   .dbline 54
 008E           ;       {       
 008E                   .dbline 55
 008E           ;               UCSR0B &= ~BIT(RXEN0);  //CREN = 0;
 008E 8091C100          lds R24,193
 0092 8F7E              andi R24,239
 0094 8093C100          sts 193,R24
 0098                   .dbline 56
 0098           ;               UCSR0A &= ~BIT(FE0);    //FERR = 0;
 0098 8091C000          lds R24,192
 009C 8F7E              andi R24,239
 009E 8093C000          sts 192,R24
 00A2                   .dbline 57
 00A2           ;               UCSR0B |= BIT(RXEN0);   //CREN = 1; 
 00A2 8091C100          lds R24,193
 00A6 8061              ori R24,16
 00A8 8093C100          sts 193,R24
 00AC                   .dbline 58
 00AC           ;               tmp = UDR0;
 00AC 0091C600          lds R16,198
 00B0                   .dbline 60
 00B0           ;               //PORTC ^= 0x02;
 00B0           ;       }       
 00B0 34C0              rjmp L14
 00B2           L13:
 00B2                   .dbline 62
 00B2           ;       //else if(OERR==1)      
 00B2           ;       else if(UCSR0A&BIT(DOR0))  //溢出错.
 00B2 2090C000          lds R2,192
 00B6 23FE              sbrs R2,3
 00B8 12C0              rjmp L15
 00BA                   .dbline 63
 00BA           ;       { 
 00BA                   .dbline 64
 00BA           ;               UCSR0B &= ~BIT(RXEN0);  //CREN = 0; 
 00BA 8091C100          lds R24,193
 00BE 8F7E              andi R24,239
 00C0 8093C100          sts 193,R24
 00C4                   .dbline 65
 00C4           ;               UCSR0A &= ~BIT(DOR0);   //OERR = 0;
 00C4 8091C000          lds R24,192
 00C8 877F              andi R24,247
 00CA 8093C000          sts 192,R24
 00CE                   .dbline 66
 00CE           ;               UCSR0B |= BIT(RXEN0);   //CREN = 1; 
 00CE 8091C100          lds R24,193
 00D2 8061              ori R24,16
 00D4 8093C100          sts 193,R24
 00D8                   .dbline 67
 00D8           ;               tmp = UDR0;
 00D8 0091C600          lds R16,198
 00DC                   .dbline 69
 00DC           ;               //PORTC ^= 0x02;
 00DC           ;       }       
 00DC 1EC0              rjmp L16
 00DE           L15:
 00DE                   .dbline 71
 00DE           ;       else //奇偶校验的问题.
 00DE           ;       {       
 00DE                   .dbline 74
 00DE           ;               //      RX9DBuf = RX9D; 
 00DE           ;               // 读取接受寄存器中的数据.
 00DE           ;               receBuf[receCount] = UDR0;     // RCREG; 
 00DE 80E0              ldi R24,<_receBuf
 00E0 90E0              ldi R25,>_receBuf
 00E2 E0910000          lds R30,_receCount
 00E6 FF27              clr R31
 00E8 E80F              add R30,R24
 00EA F91F              adc R31,R25
 00EC 2090C600          lds R2,198
 00F0 2082              std z+0,R2
 00F2                   .dbline 77
 00F2           ;               // 奇校验判断.
 00F2           ;                       //if(RX9DBuf != ParityBit(&receBuf[receCount]))
 00F2           ;           if(UCSR0A&BIT(UPE0)!=0)  //奇校验硬件完成.
 00F2 2090C000          lds R2,192
 00F6 20FE              sbrs R2,0
 00F8 08C0              rjmp L17
 00FA                   .dbline 78
 00FA           ;               {
 00FA                   .dbline 80
 00FA           ;                       //PORTC ^= 0x02;                                         
 00FA           ;                       UCSR0A |= BIT(UPE0);                               
 00FA 8091C000          lds R24,192
 00FE 8460              ori R24,4
 0100 8093C000          sts 192,R24
 0104                   .dbline 81
 0104           ;                       checkoutError = 1; 
 0104 81E0              ldi R24,1
 0106 80930000          sts _checkoutError,R24
 010A                   .dbline 82
 010A           ;               }                       
 010A           L17:
 010A                   .dbline 83
 010A           ;               receCount++;                               // 接收地址偏移寄存器加1. 
 010A 80910000          lds R24,_receCount
 010E 8F5F              subi R24,255    ; addi 1
 0110 80930000          sts _receCount,R24
 0114                   .dbline 84
 0114           ;               receCount &= 0x0f;             // 最多接受16个字节. 
 0114 8F70              andi R24,15
 0116 80930000          sts _receCount,R24
 011A                   .dbline 86
 011A           ;       //      PORTC ^= 0x02;
 011A           ;       }   //
 011A           L16:
 011A           L14:
 011A                   .dbline -2
 011A           L12:
 011A 2990              ld R2,y+
 011C 2FBE              out 0x3f,R2
 011E F991              ld R31,y+
 0120 E991              ld R30,y+
 0122 9991              ld R25,y+
 0124 8991              ld R24,y+
 0126 0991              ld R16,y+
 0128 2990              ld R2,y+
 012A                   .dbline 0 ; func end
 012A 1895              reti
 012C                   .dbsym r tmp 16 c
 012C                   .dbend
                        .area vector(rom, abs)
                        .org 40
 0028 96C0              rjmp _uart0_udre_isr

⌨️ 快捷键说明

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