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

📄 main.lis

📁 AVR单片机系统开发经典实例部分源程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module main.c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\AVR\AD\main.c
 0000                   .dbfunc e SIGNALA _SIGNALA fI
 0000           ;      temp_data -> R20,R21
 0000           ;              i -> R20,R21
 0000           ; SIG_UART0_RECV -> R16,R17
                        .even
 0000           _SIGNALA::
 0000 0E940000          xcall push_gset1
 0004                   .dbline -1
 0004                   .dbline 22
 0004           ; #include <iom128v.h>
 0004           ; #include <stdlib.h>
 0004           ; 
 0004           ; //全局变量////////////////////////////
 0004           ; 
 0004           ; unsigned int  global_flag_serie;//通信状态标志
 0004           ; unsigned int  global_ad_counter;//AD转换计数器
 0004           ; unsigned int  global_start_sample_flag;//采样开始标志
 0004           ; unsigned int  global_sample_mode_flag;//采样方式标志:手动或自动
 0004           ; unsigned int  global_operation_detected_flag;//检测到动作标志
 0004           ; unsigned int  global_detect_close[5];//用于检测合闸动作开始
 0004           ; unsigned int  global_detect_trip[5];//用于检测分闸动作开始
 0004           ; unsigned int  global_channel_flag;//通道标志
 0004           ; unsigned int  global_close_counter;//合闸线圈地址计数器
 0004           ; unsigned int  global_trip_counter;//分闸线圈地址计数器
 0004           ; unsigned int  global_motor_counter;//打压电机地址计数器
 0004           ; unsigned int  global_voltage_counter;//操作电压地址计数器
 0004           ; unsigned int  global_ad_finish_flag;//AD转换结束标志
 0004           ; 
 0004           ; //串口接收中断////////////////////////
 0004           ; SIGNALA(SIG_UART0_RECV)
 0004           ; {
 0004                   .dbline 31
 0004           ; //变量定义
 0004           ;       unsigned int temp_data;
 0004           ;       unsigned int i;
 0004           ; //关全局中断
 0004           ;  //   cli();
 0004           ; //等待接收到数据标志被置位
 0004           ;       //loop_until_bit_is_set(UCSR0A,RXC0);
 0004           ; //对接收到的字节进行判断
 0004           ;       temp_data=UDR0;//读取接收的字节
 0004 4CB1              in R20,0xc
 0006 5527              clr R21
 0008                   .dbline 32
 0008           ;       if(temp_data!=0)//如果接收到非零
 0008 4030              cpi R20,0
 000A 4507              cpc R20,R21
 000C 09F4              brne X3
 000E 4EC0              xjmp L2
 0010           X3:
 0010           X0:
 0010                   .dbline 33
 0010           ;       {
 0010                   .dbline 34
 0010           ;               if(global_flag_serie==0)//如果接收到的为第一字节
 0010 20902800          lds R2,_global_flag_serie
 0014 30902900          lds R3,_global_flag_serie+1
 0018 2220              tst R2
 001A 59F5              brne L4
 001C 3320              tst R3
 001E 49F5              brne L4
 0020           X1:
 0020                   .dbline 35
 0020           ;               {
 0020                   .dbline 36
 0020           ;                       switch (temp_data)
 0020 4031              cpi R20,16
 0022 E0E0              ldi R30,0
 0024 5E07              cpc R21,R30
 0026 B9F0              breq L9
 0028 80E1              ldi R24,16
 002A 90E0              ldi R25,0
 002C 8417              cp R24,R20
 002E 9507              cpc R25,R21
 0030 2CF0              brlt L12
 0032           L11:
 0032 4230              cpi R20,2
 0034 E0E0              ldi R30,0
 0036 5E07              cpc R21,R30
 0038 31F0              breq L8
 003A 38C0              xjmp L5
 003C           L12:
 003C 4232              cpi R20,34
 003E E0E0              ldi R30,0
 0040 5E07              cpc R21,R30
 0042 81F0              breq L10
 0044 33C0              xjmp L5
 0046           X2:
 0046                   .dbline 37
 0046           ;                       {
 0046           L8:
 0046                   .dbline 39
 0046           ;                               case 2://接到本机地址
 0046           ;                                       global_flag_serie=1;//准备接收第二字节数据
 0046 81E0              ldi R24,1
 0048 90E0              ldi R25,0
 004A 90932900          sts _global_flag_serie+1,R25
 004E 80932800          sts _global_flag_serie,R24
 0052                   .dbline 40
 0052           ;                                       UCSR0A&=~(1<<MPCM0);//清零MPCM0,允许继续接收数据包
 0052 5898              cbi 0xb,0
 0054                   .dbline 41
 0054           ;                                       break;
 0054 2BC0              xjmp L5
 0056           L9:
 0056                   .dbline 46
 0056           ;                       //      case 0://接到复位命令
 0056           ;                       //              global_start_sample_flag=0xff;//复位开始
 0056           ;                       //              break;
 0056           ;                               case 0x10://接到采集命令
 0056           ;                                       global_start_sample_flag=0;//开始采集数据
 0056 2224              clr R2
 0058 3324              clr R3
 005A 30922500          sts _global_start_sample_flag+1,R3
 005E 20922400          sts _global_start_sample_flag,R2
 0062                   .dbline 48
 0062           ;                               //      sbi(PORTG,3);//测试用///////////////
 0062           ;                                       break;
 0062 24C0              xjmp L5
 0064           L10:
 0064                   .dbline 53
 0064           ;                       //      case 17://接到采集结束命令
 0064           ;                               //      global_start_sample_flag=0xff;//结束采集数据
 0064           ;                       //              break;
 0064           ;                               case 0x22://接收到自动测试信号
 0064           ;                                       global_sample_mode_flag=0;
 0064 2224              clr R2
 0066 3324              clr R3
 0068 30922300          sts _global_sample_mode_flag+1,R3
 006C 20922200          sts _global_sample_mode_flag,R2
 0070                   .dbline 54
 0070           ;                                       break;
 0070                   .dbline 56
 0070           ;                               default:
 0070           ;                                       break;
 0070                   .dbline 58
 0070           ;                       }
 0070           ;               }
 0070 1DC0              xjmp L5
 0072           L4:
 0072                   .dbline 59
 0072           ;               else if((global_flag_serie==1)&&(temp_data<=32))//如果接收的是第二字节
 0072 80912800          lds R24,_global_flag_serie
 0076 90912900          lds R25,_global_flag_serie+1
 007A 8130              cpi R24,1
 007C E0E0              ldi R30,0
 007E 9E07              cpc R25,R30
 0080 A9F4              brne L13
 0082 80E2              ldi R24,32
 0084 90E0              ldi R25,0
 0086 8417              cp R24,R20
 0088 9507              cpc R25,R21
 008A 80F0              brlo L13
 008C                   .dbline 60
 008C           ;               {
 008C                   .dbline 61
 008C 4427              clr R20
 008E 5527              clr R21
 0090 02C0              xjmp L18
 0092           L15:
 0092                   .dbline 61
 0092                   .dbline 61
 0092                   .dbline 61
 0092           L16:
 0092                   .dbline 61
 0092 4F5F              subi R20,255  ; offset = 1
 0094 5F4F              sbci R21,255
 0096           L18:
 0096                   .dbline 61
 0096           ;                       for(i=0;i<0xfff;i++){;}//延时等待
 0096 4F3F              cpi R20,255
 0098 EFE0              ldi R30,15
 009A 5E07              cpc R21,R30
 009C D0F3              brlo L15
 009E                   .dbline 64
 009E           ;               //      SEND_ONE_PACKAGE(temp_data);//发送数据包,temp_data为包序号
 009E           ;               //      if(temp_data==17){sbi(PORTG,3);}//测试用////////////
 009E           ;                       global_flag_serie=0;
 009E 2224              clr R2
 00A0 3324              clr R3
 00A2 30922900          sts _global_flag_serie+1,R3
 00A6 20922800          sts _global_flag_serie,R2
 00AA                   .dbline 65
 00AA           ;                       UCSR0A|=(1<<MPCM0);//准备接收地址
 00AA 589A              sbi 0xb,0
 00AC                   .dbline 66
 00AC           ;               }
 00AC           L13:
 00AC           L5:
 00AC                   .dbline 67
 00AC           L2:
 00AC                   .dbline -2
 00AC           L1:
 00AC 0E940000          xcall pop_gset1
 00B0                   .dbline 0 ; func end
 00B0 0895              ret
 00B2                   .dbsym r temp_data 20 i
 00B2                   .dbsym r i 20 i
 00B2                   .dbsym r SIG_UART0_RECV 16 I
 00B2                   .dbend
 00B2                   .dbfunc e SIGNAL _SIGNAL fI
 00B2           ;              i -> <dead>
 00B2           ;          temp2 -> R22,R23
 00B2           ;          temp1 -> R22,R23
 00B2           ;    int16_temp1 -> R20,R21
 00B2           ; SIG_INTERRUPT7 -> R16,R17
                        .even
 00B2           _SIGNAL::
 00B2 0E940000          xcall push_gset2
 00B6                   .dbline -1
 00B6                   .dbline 74
 00B6           ;     }
 00B6           ;       //cbi(PORTE,2);//改为接收状态
 00B6           ;       //sei();
 00B6           ; }
 00B6           ; 
 00B6           ; //AD转换结束中断int7//////////////////
 00B6           ; SIGNAL(SIG_INTERRUPT7)
 00B6           ; {
 00B6                   .dbline 83
 00B6           ; //变量定义
 00B6           ;       unsigned int int16_temp1;
 00B6           ;       unsigned int temp1,temp2,i;
 00B6           ; //关中断
 00B6           ;       //cli();
 00B6           ; //读取ad转换结果
 00B6           ;       //int16_temp1=AD7891_READ();
 00B6           ; //如果是需要保存到RAM的采样
 00B6           ;       if(global_sample_mode_flag==0xFF)
 00B6 80912200          lds R24,_global_sample_mode_flag
 00BA 90912300          lds R25,_global_sample_mode_flag+1
 00BE 8F3F              cpi R24,255
 00C0 E0E0              ldi R30,0
 00C2 9E07              cpc R25,R30
 00C4 09F0              breq X6
 00C6 3CC0              xjmp L20
 00C8           X6:
 00C8                   .dbline 84
 00C8           ;       {
 00C8                   .dbline 88
 00C8           ;       //AD7891 deselect,否则数据总线与RAM冲突
 00C8           ;               //sbi(PORTD,5);
 00C8           ;       //AD转换结果存入RAM

⌨️ 快捷键说明

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