?? 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 <io8535v.h>
; #include <macros.h>
; #include <eeprom.h>
;
; //***************************全局變量定義**************************//
; #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<<UDRE)));
; UDR=data[i];}
; }
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbsym r data 16 pc
.dbend
.dbfunc e GetOutputADC _GetOutputADC fI
; temp -> 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
ldi R17,>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
ldi R17,>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
ldi R17,>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<<TXEN)|(1<<RXCIE)|(1<<RXEN); //設置收發使能,接受中斷允許
.dbline 101
ldi R24,152
out 0xa,R24
.dbline 102
; UBRR = baudrate; //設置波特率寄存器
out 0x9,R16
.dbline -2
.dbline 103
; }
L38:
.dbline 0 ; func end
ret
.dbsym r baudrate 16 I
.dbend
.dbfunc e Eepromdata _Eepromdata fV
.even
_Eepromdata::
sbiw R28,2
.dbline -1
.dbline 107
;
; //***************************讀EEPROM函數**************************//
; void Eepromdata(void)
; {if((adress==0x0000)||(adress==0x0004)||(adress==0x0008)) //地址判斷
.dbline 107
lds R2,_adress
lds R3,_adress+1
tst R2
brne X0
tst R3
breq L43
X0:
lds R24,_adress
lds R25,_adress+1
cpi R24,4
ldi R30,0
cpc R25,R30
breq L43
cpi R24,8
ldi R30,0
cpc R25,R30
brne L40
L43:
.dbline 108
; EEPROMReadBytes(adress,&Data[4],4);
ldi R24,4
ldi R25,0
std y+1,R25
std y+0,R24
ldi R18,<_Data+4
ldi R19,>_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:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -