www.pudn.com > xunjijiqiren.rar > Motor.s
.module Motor.c .area data(ram, con, rel) _Ek:: .blkb 2 .area idata .word 0 .area data(ram, con, rel) .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c .dbsym e Ek _Ek I _Ek_1:: .blkb 2 .area idata .word 0 .area data(ram, con, rel) .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c .dbsym e Ek_1 _Ek_1 I _Ek_2:: .blkb 2 .area idata .word 0 .area data(ram, con, rel) .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c .dbsym e Ek_2 _Ek_2 I _flage:: .blkb 1 .area idata .byte 0 .area data(ram, con, rel) .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c .dbsym e flage _flage c .area text(rom, con, rel) .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c .dbfunc e Putdata _Putdata fV ; i -> R20,R21 ; data -> R16,R17 .even _Putdata:: rcall push_gset1 .dbline -1 .dbline 30 ; //***************************FileName:Motor.C************************ ; //***************************ICCAVR6.30编译************************** ; #include; #include ; #include ; ; //***************************全局变量定义**************************// ; #define U1 5 ; char Data[10]; //接收数据数组 ; int adress; //数据地址 ; int a; //采样时间次数 ; float t; //采样时间.s ; int itime; //给定采样时间的次数 ; int Ek=0; //本次偏差 ; int Ek_1=0; //上次偏差 ; int Ek_2=0; //上上次偏差 ; char flage=0; //监控标志 ; union chang1 //float数据与char数据转换 ; {char c[4]; ; float x; ; }floatxin; ; union chang2 //int数据与char数据转换 ; {char c[2]; ; int x; ; }intxin; ; ; //**************************串口数据发送函数***********************// ; //说明:串口数据发送采用查询方式,每一帧发送10个字节 ; void Putdata(char data[10]) ; {int i; .dbline 31 ; for(i=0;i<=9;i++) clr R20 clr R21 .dbline 32 L6: .dbline 32 L7: .dbline 32 sbis 0xb,5 rjmp L6 .dbline 33 mov R30,R20 mov R31,R21 add R30,R16 adc R31,R17 ldd R2,z+0 out 0xc,R2 .dbline 33 L3: .dbline 31 subi R20,255 ; offset = 1 sbci R21,255 .dbline 31 ldi R24,9 ldi R25,0 cp R24,R20 cpc R25,R21 brge L7 .dbline -2 .dbline 34 ; {while(!(USR&(1< R16,R17 .even _GetOutputADC:: .dbline -1 .dbline 38 ; ; //**************************读AD转换结果***************************// ; int GetOutputADC() ; {int temp; .dbline 39 ; temp=ADCH; in R16,0x5 clr R17 .dbline 40 ; temp=temp<<8; mov R17,R16 clr R16 .dbline 41 ; return(temp+ADCL); in R2,0x4 clr R3 add R16,R2 adc R17,R3 .dbline -2 L9: .dbline 0 ; func end ret .dbsym r temp 16 I .dbend .dbfunc e Upspeed _Upspeed fV .even _Upspeed:: sbiw R28,2 .dbline -1 .dbline 46 ; } ; ; //***************************电机加速函数**************************// ; void Upspeed() ; {EEPROMReadBytes(0x0010,intxin.c,2); .dbline 46 ldi R24,2 ldi R25,0 std y+1,R25 std y+0,R24 ldi R18,<_intxin ldi R19,>_intxin ldi R16,16 ldi R17,0 rcall _EEPROMReadBytes .dbline 47 ; intxin.c[0]+=Data[6]; lds R2,_Data+6 lds R3,_intxin add R3,R2 sts _intxin,R3 .dbline 48 ; intxin.c[1]+=Data[7]; lds R2,_Data+7 lds R3,_intxin+1 add R3,R2 sts _intxin+1,R3 .dbline 49 ; EEPROMWriteBytes(0x0010,intxin.c,2); ldi R24,2 ldi R25,0 std y+1,R25 std y+0,R24 ldi R18,<_intxin ldi R19,>_intxin ldi R16,16 ldi R17,0 rcall _EEPROMWriteBytes .dbline -2 .dbline 50 ; } L10: adiw R28,2 .dbline 0 ; func end ret .dbend .dbfunc e Downspeed _Downspeed fV .even _Downspeed:: sbiw R28,2 .dbline -1 .dbline 54 ; ; //***************************电机减速函数**************************// ; void Downspeed() ; { .dbline 55 ; EEPROMReadBytes(0x0010,intxin.c,2); ldi R24,2 ldi R25,0 std y+1,R25 std y+0,R24 ldi R18,<_intxin ldi R19,>_intxin ldi R16,16 ldi R17,0 rcall _EEPROMReadBytes .dbline 56 ; intxin.c[0]-=Data[6]; lds R2,_Data+6 lds R3,_intxin sub R3,R2 sts _intxin,R3 .dbline 57 ; intxin.c[1]-=Data[7]; lds R2,_Data+7 lds R3,_intxin+1 sub R3,R2 sts _intxin+1,R3 .dbline 58 ; EEPROMWriteBytes(0x0010,intxin.c,2); ldi R24,2 ldi R25,0 std y+1,R25 std y+0,R24 ldi R18,<_intxin ldi R19,>_intxin ldi R16,16 ldi R17,0 rcall _EEPROMWriteBytes .dbline -2 .dbline 59 ; } L14: adiw R28,2 .dbline 0 ; func end ret .dbend .dbfunc e PIDB _PIDB fV ; speed -> R14,R15 ; z -> y+20 ; u -> y+14 ; t -> R10,R11 ; y -> R12,R13 ; temp1 -> R20 ; k -> y+2 ; i -> y+18 .even _PIDB:: rcall push_gset5 sbiw R28,22 .dbline -1 .dbline 63 ; ; //***************************PID调节函数***************************// ; void PIDB() ; {int y; //本次速度值 .dbline 71 ; float u; //电压差值 ; int z; //输出增量 ; int t; //采样时间 ; char temp1; //暂存 ; int i; ; int speed; //速度设定 ; float k[3]; //PID参数记录 ; for (i=0;i<=2;i++) clr R0 clr R1 std y+19,R1 std y+18,R0 L19: .dbline 72 .dbline 72 ldi R24,4 ldi R25,0 std y+1,R25 std y+0,R24 ldi R18,<_floatxin ldi R19,>_floatxin ldd R16,y+18 ldd R17,y+19 lsl R16 rol R17 lsl R16 rol R17 rcall _EEPROMReadBytes .dbline 73 mov R24,R28 mov R25,R29 adiw R24,2 ldd R30,y+18 ldd R31,y+19 lsl R30 rol R31 lsl R30 rol R31 add R30,R24 adc R31,R25 lds R4,_floatxin+2 lds R5,_floatxin+2+1 lds R2,_floatxin lds R3,_floatxin+1 std z+0,R2 std z+1,R3 std z+2,R4 std z+3,R5 .dbline 73 L20: .dbline 71 ldd R24,y+18 ldd R25,y+19 adiw R24,1 std y+19,R25 std y+18,R24 .dbline 71 ldi R24,2 ldi R25,0 ldd R0,y+18 ldd R1,y+19 cp R24,R0 cpc R25,R1 brge L19 .dbline 74 ; {EEPROMReadBytes(i*4,floatxin.c,4); ; k[i]=floatxin.x;} ; EEPROMReadBytes(0x0010,intxin.c,1); //读EEPROM ldi R24,1 std y+1,R25 std y+0,R24 ldi R18,<_intxin ldi R19,>_intxin ldi R16,16 ldi R17,0 rcall _EEPROMReadBytes .dbline 75 ; speed=intxin.x; lds R14,_intxin lds R15,_intxin+1 .dbline 76 ; t=itime*0.0001275; ldi R16, L23 rcall lpm32 st -y,R19 st -y,R18 st -y,R17 st -y,R16 lds R16,_itime lds R17,_itime+1 rcall int2fp st -y,R19 st -y,R18 st -y,R17 st -y,R16 rcall mpy32f rcall fp2int mov R10,R16 mov R11,R17 .dbline 77 ; y = TCNT1; in R12,0x2c in R13,0x2d .dbline 78 ; Ek=y-speed; mov R2,R12 mov R3,R13 sub R2,R14 sbc R3,R15 sts _Ek+1,R3 sts _Ek,R2 .dbline 79 ; u=k[0]*((Ek-Ek_1)+(t/k[1])*Ek+(k[2]/t)*(Ek-2*Ek_1+Ek_2)); mov R30,R28 mov R31,R29 ldd R2,z+2 ldd R3,z+3 ldd R4,z+4 ldd R5,z+5 st -y,R5 st -y,R4 st -y,R3 st -y,R2 lds R2,_Ek_1 lds R3,_Ek_1+1 lds R16,_Ek lds R17,_Ek+1 sub R16,R2 sbc R17,R3 rcall int2fp st -y,R19 st -y,R18 st -y,R17 st -y,R16 mov R16,R10 mov R17,R11 rcall int2fp st -y,R19 st -y,R18 st -y,R17 st -y,R16 mov R30,R28 mov R31,R29 ; stack offset 12 ldd R2,z+18 ldd R3,z+19 ldd R4,z+20 ldd R5,z+21 st -y,R5 st -y,R4 st -y,R3 st -y,R2 rcall div32fs lds R16,_Ek lds R17,_Ek+1 rcall int2fp st -y,R19 st -y,R18 st -y,R17 st -y,R16 rcall mpy32fs rcall add32fs mov R30,R28 mov R31,R29 ; stack offset 8 ldd R2,z+18 ldd R3,z+19 ldd R4,z+20 ldd R5,z+21 st -y,R5 st -y,R4 st -y,R3 st -y,R2 mov R16,R10 mov R17,R11 rcall int2fp st -y,R19 st -y,R18 st -y,R17 st -y,R16 rcall div32fs lds R2,_Ek_1 lds R3,_Ek_1+1 lsl R2 rol R3 lds R16,_Ek lds R17,_Ek+1 sub R16,R2 sbc R17,R3 lds R2,_Ek_2 lds R3,_Ek_2+1 add R16,R2 adc R17,R3 rcall int2fp st -y,R19 st -y,R18 st -y,R17 st -y,R16 rcall mpy32fs rcall add32fs rcall mpy32f mov R30,R28 mov R31,R29 std z+14,R16 std z+15,R17 std z+16,R18 std z+17,R19 .dbline 80 ; z=u/U1*0xFF; ldi R16, L26 rcall lpm32 st -y,R19 st -y,R18 st -y,R17 st -y,R16 mov R30,R28 mov R31,R29 ; stack offset 4 ldd R2,z+18 ldd R3,z+19 ldd R4,z+20 ldd R5,z+21 st -y,R5 st -y,R4 st -y,R3 st -y,R2 ldi R16, L27 rcall lpm32 st -y,R19 st -y,R18 st -y,R17 st -y,R16 rcall div32fs rcall mpy32f rcall fp2int std y+21,R17 std y+20,R16 .dbline 81 ; temp1=OCR2; in R20,0x23 .dbline 82 ; if(flage==1) //监控状态 lds R24,_flage cpi R24,1 brne L28 .dbline 83 ; {Data[4]=0xD0; .dbline 83 ldi R24,208 sts _Data+4,R24 .dbline 84 ; Data[5]=temp1; sts _Data+5,R20 .dbline 85 ; Data[6]=y>>8; mov R2,R12 mov R3,R13 mov R2,R3 clr R3 sbrc R2,7 com R3 sts _Data+6,R2 .dbline 86 ; Data[7]=y; sts _Data+7,R12 .dbline 87 ; Putdata(Data);} ldi R16,<_Data ldi R17,>_Data rcall _Putdata .dbline 87 L28: .dbline 88 ; temp1=temp1+z; mov R2,R20 clr R3 ldd R0,y+20 ldd R1,y+21 add R2,R0 adc R3,R1 mov R20,R2 .dbline 89 ; if(temp1<=0) //结果小于0时输出0 clr R2 cp R2,R20 brlo L34 .dbline 90 ; temp1 = 0x00; clr R20 L34: .dbline 91 ; if(temp1>=0xF0) //结果大于0xF0时输出0xF0 cpi R20,240 brlo L36 .dbline 92 ; temp1 = 0xF0; ldi R20,240 L36: .dbline 93 ; OCR2=temp1; out 0x23,R20 .dbline 94 ; Ek_2 = Ek_1; lds R2,_Ek_1 lds R3,_Ek_1+1 sts _Ek_2+1,R3 sts _Ek_2,R2 .dbline 95 ; Ek_1 = Ek; lds R2,_Ek lds R3,_Ek+1 sts _Ek_1+1,R3 sts _Ek_1,R2 .dbline 96 ; TCNT1 = 0x0000; //计数器清零 clr R2 clr R3 out 0x2d,R3 out 0x2c,R2 .dbline -2 .dbline 97 ; } L18: adiw R28,22 rcall pop_gset5 .dbline 0 ; func end ret .dbsym r speed 14 I .dbsym l z 20 I .dbsym l u 14 D .dbsym r t 10 I .dbsym r y 12 I .dbsym r temp1 20 c .dbsym l k 2 A[12:3]D .dbsym l i 18 I .dbend .dbfunc e USARTInit _USARTInit fV ; baudrate -> R16,R17 .even _USARTInit:: .dbline -1 .dbline 101 ; ; //***************************串口初始化函数************************// ; void USARTInit(int baudrate) ; {UCR = (1< _Data+4 lds R16,_adress lds R17,_adress+1 rcall _EEPROMReadBytes rjmp L41 L40: .dbline 110 ; else ; EEPROMReadBytes(adress,&Data[6],2); ldi R24,2 ldi R25,0 std y+1,R25 std y+0,R24 ldi R18,<_Data+6 ldi R19,>_Data+6 lds R16,_adress lds R17,_adress+1 rcall _EEPROMReadBytes L41: .dbline 111 ; switch(adress) lds R24,_adress lds R25,_adress+1 cpi R24,4 ldi R30,0 cpc R25,R30 breq L50 ldi R24,4 ldi R25,0 lds R2,_adress lds R3,_adress+1 cp R24,R2 cpc R25,R3 brlt L61 L60: lds R2,_adress lds R3,_adress+1 tst R2 brne X1 tst R3 breq L48 X1: rjmp L47 L61: lds R24,_adress lds R25,_adress+1 cpi R24,8 ldi R30,0 cpc R25,R30 breq L52 cpi R24,8 ldi R30,0 cpc R25,R30 brlt L47 L62: lds R24,_adress lds R25,_adress+1 cpi R24,12 ldi R30,0 cpc R25,R30 breq L54 cpi R24,14 ldi R30,0 cpc R25,R30 breq L56 cpi R24,16 ldi R30,0 cpc R25,R30 breq L58 rjmp L47 X2: .dbline 112 L48: .dbline 112 ; {case 0x0000:Data[3]=0xE4;break; ldi R24,228 sts _Data+3,R24 .dbline 112 rjmp L47 L50: .dbline 113 ; case 0x0004:Data[3]=0xE5;break; ldi R24,229 sts _Data+3,R24 .dbline 113 rjmp L47 L52: .dbline 114 ; case 0x0008:Data[3]=0xE6;break; ldi R24,230 sts _Data+3,R24 .dbline 114 rjmp L47 L54: .dbline 115 ; case 0x000C:Data[3]=0xE7;break; ldi R24,231 sts _Data+3,R24 .dbline 115 rjmp L47 L56: .dbline 116 ; case 0x000E:Data[3]=0xE8;break; ldi R24,232 sts _Data+3,R24 .dbline 116 rjmp L47 L58: .dbline 117 ldi R24,233 sts _Data+3,R24 .dbline 117 .dbline 118 L47: .dbline -2 .dbline 119 ; case 0x0010:Data[3]=0xE9;break; ; default :break;} ; } L39: adiw R28,2 .dbline 0 ; func end ret .dbend .dbfunc e readdata _readdata fV ; tempdata -> R22 ; trandata -> R20,R21 ; data -> R20 .even _readdata:: rcall push_gset2 mov R20,R16 .dbline -1 .dbline 123 ; ; //***************************读数据函数****************************// ; void readdata(char data) ; {int trandata; .dbline 125 ; char tempdata; ; if(data==0xE) cpi R20,14 brne L64 .dbline 126 ; Eepromdata(); rcall _Eepromdata rjmp L65 L64: .dbline 128 ; else ; {switch(data) .dbline 128 clr R21 cpi R20,1 ldi R30,0 cpc R21,R30 breq L69 cpi R20,2 ldi R30,0 cpc R21,R30 breq L70 cpi R20,3 ldi R30,0 cpc R21,R30 breq L71 rjmp L67 X3: .dbline 129 L69: .dbline 129 ; {case 1:trandata=TCNT1;break; //读TCNT1 in R20,0x2c in R21,0x2d .dbline 129 rjmp L67 L70: .dbline 130 ; case 2:trandata=(int)(tempdata=TCNT0);break;//读TCNT0 in R2,0x32 mov R22,R2 mov R20,R2 clr R21 .dbline 130 rjmp L67 L71: .dbline 131 ; case 3:trandata=GetOutputADC();break;//读A/D转换结果 rcall _GetOutputADC mov R20,R16 mov R21,R17 .dbline 131 .dbline 132 ; default :break;} L67: .dbline 133 ; Data[6]=(char)trandata;//数据低八位 sts _Data+6,R20 .dbline 134 ; Data[7]=(char)(trandata>>8);//数据高八位 mov R2,R20 mov R3,R21 mov R2,R3 clr R3 sbrc R2,7 com R3 sts _Data+7,R2 .dbline 135 ; } L65: .dbline 136 ; Putdata(Data); ldi R16,<_Data ldi R17,>_Data rcall _Putdata .dbline -2 .dbline 137 ; } L63: rcall pop_gset2 .dbline 0 ; func end ret .dbsym r tempdata 22 c .dbsym r trandata 20 I .dbsym r data 20 c .dbend .dbfunc e order _order fV .even _order:: rcall push_gset1 .dbline -1 .dbline 141 ; ; //***************************命令函数******************************// ; void order(void) ; {switch (Data[4]) .dbline 141 lds R20,_Data+4 clr R21 cpi R20,192 ldi R30,0 cpc R21,R30 breq L79 cpi R20,193 ldi R30,0 cpc R21,R30 breq L80 cpi R20,194 ldi R30,0 cpc R21,R30 breq L81 cpi R20,195 ldi R30,0 cpc R21,R30 breq L82 cpi R20,196 ldi R30,0 cpc R21,R30 breq L83 cpi R20,197 ldi R30,0 cpc R21,R30 breq L84 cpi R20,198 ldi R30,0 cpc R21,R30 breq L85 cpi R20,200 ldi R30,0 cpc R21,R30 breq L86 cpi R20,201 ldi R30,0 cpc R21,R30 breq L87 rjmp L76 X4: .dbline 142 L79: .dbline 142 ; {case 0xC0:PORTB=PORTB|0x04;break; //停止 sbi 0x18,2 .dbline 142 rjmp L76 L80: .dbline 143 ; case 0xC1:PORTB=PORTB&0xFB;break; //启动 in R24,0x18 andi R24,251 out 0x18,R24 .dbline 143 rjmp L76 L81: .dbline 145 ; case 0xC2: //正转 ; {PORTB=PORTB&0xFC|0x02; .dbline 145 in R24,0x18 andi R24,252 ori R24,2 out 0x18,R24 .dbline 146 ; PORTD=PORTD&0x3F|0x40; in R24,0x12 andi R24,63 ori R24,64 out 0x12,R24 .dbline 147 ; break;} rjmp L76 L82: .dbline 149 ; case 0xC3: //反转 ; {PORTB=PORTB&0xFC|0x01; .dbline 149 in R24,0x18 andi R24,252 ori R24,1 out 0x18,R24 .dbline 150 ; PORTD=PORTD&0x3F|0x80; in R24,0x12 andi R24,63 ori R24,128 out 0x12,R24 .dbline 151 ; break;} rjmp L76 L83: .dbline 152 ; case 0xC4:Upspeed();break; //加速 rcall _Upspeed .dbline 152 rjmp L76 L84: .dbline 153 ; case 0xC5:Downspeed();break; //减速 rcall _Downspeed .dbline 153 rjmp L76 L85: .dbline 155 ; case 0xC6: //制动 ; {PORTB=PORTB|0x03; .dbline 155 in R24,0x18 ori R24,3 out 0x18,R24 .dbline 156 ; PORTD=PORTD&0x3F; in R24,0x12 andi R24,63 out 0x12,R24 .dbline 157 ; break;} rjmp L76 L86: .dbline 158 ; case 0xC8:flage=1;break; //监控 ldi R24,1 sts _flage,R24 .dbline 158 rjmp L76 L87: .dbline 159 clr R2 sts _flage,R2 .dbline 159 .dbline 160 L76: .dbline -2 .dbline 162 ; case 0xC9:flage=0;break; //退出监控 ; default :break; ; } ; } L74: rcall pop_gset1 .dbline 0 ; func end ret .dbend .dbfunc e Datadisposal _Datadisposal fV ; operation -> R20 ; temp -> R22,R23 .even _Datadisposal:: rcall push_gset2 sbiw R28,2 .dbline -1 .dbline 167 ; ; ; //***************************数据处理函数**************************// ; void Datadisposal(void) ; {char operation; .dbline 169 ; int temp; ; operation=Data[3]; lds R20,_Data+3 .dbline 170 ; temp=Data[4]; lds R22,_Data+4 clr R23 .dbline 171 ; temp=temp<<8; mov R23,R22 clr R22 .dbline 172 ; adress=temp+Data[5]; lds R2,_Data+5 clr R3 mov R4,R22 mov R5,R23 add R4,R2 adc R5,R3 sts _adress+1,R5 sts _adress,R4 .dbline 173 ; switch(operation&0x0F) mov R22,R20 clr R23 andi R22,15 andi R23,0 cpi R22,0 cpc R22,R23 breq L95 X5: cpi R22,1 ldi R30,0 cpc R23,R30 breq L96 cpi R22,2 ldi R30,0 cpc R23,R30 breq L98 rjmp L93 X6: .dbline 174 L95: .dbline 174 ; {case 0:readdata(operation>>4);break; mov R16,R20 swap R16 andi R16,#0x0F rcall _readdata .dbline 174 rjmp L93 L96: .dbline 175 ; case 1:EEPROMWriteBytes(adress,&Data[6],2);break; ldi R24,2 ldi R25,0 std y+1,R25 std y+0,R24 ldi R18,<_Data+6 ldi R19,>_Data+6 lds R16,_adress lds R17,_adress+1 rcall _EEPROMWriteBytes .dbline 175 rjmp L93 L98: .dbline 176 rcall _order .dbline 176 .dbline 177 L93: .dbline -2 .dbline 179 ; case 2:order();break; ; default :break; ; } ; } L88: adiw R28,2 rcall pop_gset2 .dbline 0 ; func end ret .dbsym r operation 20 c .dbsym r temp 22 I .dbend .dbfunc e main _main fV .even _main:: .dbline -1 .dbline 183 ; ; //***************************主函数********************************// ; void main() ; {USARTInit(25); //初始化串口 .dbline 183 ldi R16,25 ldi R17,0 rcall _USARTInit .dbline 184 ; TCNT1=00; //定时器1初始化 clr R2 clr R3 out 0x2d,R3 out 0x2c,R2 .dbline 185 ; TCCR1B=0x06; ldi R24,6 out 0x2e,R24 .dbline 186 ; DDRB=0x0F; //I/O口初始化 ldi R24,15 out 0x17,R24 .dbline 187 ; DDRD=0xC0; ldi R24,192 out 0x11,R24 .dbline 188 ; TIMSK=0x40; //中断初始化 ldi R24,64 out 0x39,R24 .dbline 189 ; OCR2 = 0x0F; //PWM初始化 ldi R24,15 out 0x23,R24 .dbline 190 ; TCCR2=0x72; ldi R24,114 out 0x25,R24 .dbline 191 ; PORTB=PORTB&0xFC|0x01; in R24,0x18 andi R24,252 ori R24,1 out 0x18,R24 .dbline 192 ; PORTD=PORTD&0x3F|0x80; in R24,0x12 andi R24,63 ori R24,128 out 0x12,R24 .dbline 193 ; SEI(); sei L100: .dbline 194 .dbline 194 L101: .dbline 194 rjmp L100 X7: .dbline -2 .dbline 195 ; do{} while(1); //等待中断 ; } L99: .dbline 0 ; func end ret .dbend .area vector(rom, abs) .org 22 rjmp _UART_RXC .area text(rom, con, rel) .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c .dbfunc e UART_RXC _UART_RXC fV ; i -> R20 .even _UART_RXC:: rcall push_lset rcall push_gset1 .dbline -1 .dbline 200 ; ; //***************************串行接收中断服务程序******************// ; #pragma interrupt_handler UART_RXC:12 ; void UART_RXC(void) ; {char i=0; .dbline 200 clr R20 .dbline 201 ; CLI(); cli .dbline 202 ; Data[0]=UDR; in R2,0xc sts _Data,R2 .dbline 203 ; if(Data[0]==0x55) //起始位检测 mov R24,R2 cpi R24,85 brne L104 .dbline 204 ; {do .dbline 205 L109: .dbline 205 L110: .dbline 205 ; {while(!(USR&(1< _Data mov R30,R20 clr R31 add R30,R24 adc R31,R25 in R2,0xc std z+0,R2 .dbline 208 ; if(i==9) cpi R20,9 brne L112 .dbline 209 rjmp L108 L112: .dbline 209 L107: .dbline 209 ; break;} while(1); rjmp L110 L108: .dbline 210 ; if((Data[8]==0xFE)&&(Data[9]==0xFF)) //检测结束位 lds R24,_Data+8 cpi R24,254 brne L114 lds R24,_Data+9 cpi R24,255 brne L114 .dbline 211 rcall _Datadisposal L114: .dbline 211 ; Datadisposal();} L104: .dbline 212 ; SEI(); sei .dbline -2 .dbline 213 ; } L103: rcall pop_gset1 rcall pop_lset .dbline 0 ; func end reti .dbsym r i 20 c .dbend .area vector(rom, abs) .org 8 rjmp _TIM2_OVF .area text(rom, con, rel) .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c .dbfunc e TIM2_OVF _TIM2_OVF fV .even _TIM2_OVF:: rcall push_lset sbiw R28,2 .dbline -1 .dbline 218 ; ; //***************************定时器2中断服务程序*******************// ; #pragma interrupt_handler TIM2_OVF:5 ; void TIM2_OVF(void) ; {CLI(); .dbline 218 cli .dbline 219 ; EEPROMReadBytes(0x000C,&itime,2);//读采样次数 ldi R24,2 ldi R25,0 std y+1,R25 std y+0,R24 ldi R18,<_itime ldi R19,>_itime ldi R16,12 ldi R17,0 rcall _EEPROMReadBytes .dbline 220 ; a++; lds R24,_a lds R25,_a+1 adiw R24,1 sts _a+1,R25 sts _a,R24 .dbline 221 ; if(a==itime) //时间窗口判断, lds R2,_itime lds R3,_itime+1 cp R24,R2 cpc R25,R3 brne L119 .dbline 222 ; {a = 0; .dbline 222 clr R2 clr R3 sts _a+1,R3 sts _a,R2 .dbline 223 ; PIDB();} rcall _PIDB .dbline 223 L119: .dbline 224 ; SEI(); sei .dbline -2 .dbline 225 ; } L118: adiw R28,2 rcall pop_lset .dbline 0 ; func end reti .dbend .area bss(ram, con, rel) .dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c _intxin:: .blkb 2 .dbsym e intxin _intxin X _floatxin:: .blkb 4 .dbsym e floatxin _floatxin X _itime:: .blkb 2 .dbsym e itime _itime I _t:: .blkb 4 .dbsym e t _t D _a:: .blkb 2 .dbsym e a _a I _adress:: .blkb 2 .dbsym e adress _adress I _Data:: .blkb 10 .dbsym e Data _Data A[10:10]c .area lit(rom, con, rel) L27: .word 0x0,0x40a0 L26: .word 0x0,0x437f L23: .word 0xb185,0x3905