📄 minid0712.s
字号:
.module minid0712.c
.area text(rom, con, rel)
.dbfile D:\bak\新建文件夹\minid0712.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 26
; /*****************************************************************
; * 文件名: main.c
; * 版本号:
; * 创作日期: 2005.7.12
; * 作者: fengzm
; * 功能说明: 主函数
; * 其它说明: 使用AVR单片机Atmega48, 晶振:8Mhz
;
; *****************************************************************/
;
;
; /*****************************************************************
;
; * 修改日期:
; * 修改人:
; * 修改原因:
;
;
; *******************************************************************/
;
;
; #include "minid.h"
;
;
; void port_init(void)
; {
.dbline 27
; PORTB = 0x00;
clr R2
out 0x5,R2
.dbline 28
; DDRB = 0x00; //0000 0000
out 0x4,R2
.dbline 29
; PORTC = 0x00;
out 0x8,R2
.dbline 30
; DDRC = 0x0C; //0000 1100
ldi R24,12
out 0x7,R24
.dbline 31
; PORTD = 0x00;
out 0xb,R2
.dbline 32
; DDRD = 0x61; //0110 0001
ldi R24,97
out 0xa,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e watchdog_init _watchdog_init fV
.even
_watchdog_init::
.dbline -1
.dbline 38
; }
;
; //Watchdog initialize
; //prescale: 2K,16ms
; void watchdog_init(void)
; {
.dbline 39
; WDR(); //this prevents a timout on enabling
wdr
.dbline 40
; WDTCSR = 0x08; //WATCHDOG ENABLED - dont forget to issue WDRs
ldi R24,8
sts 96,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 48
; }
;
; //TIMER0 initialize - prescale:1024
; // WGM: Normal
; // desired value: 10mSec
; // actual value: 9.984mSec (0.2%)
; void timer0_init(void)
; {
.dbline 49
; TCCR0B = 0x00; //stop
clr R2
out 0x25,R2
.dbline 50
; TCNT0 = 0xB2; //set count
ldi R24,178
out 0x26,R24
.dbline 51
; TCCR0A = 0x00;
out 0x24,R2
.dbline 52
; TCCR0B = 0x05; //start timer
ldi R24,5
out 0x25,R24
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 32
rjmp _timer0_ovf_isr
.area text(rom, con, rel)
.dbfile D:\bak\新建文件夹\minid0712.c
.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
.even
_timer0_ovf_isr::
rcall push_lset
rcall push_gset2
.dbline -1
.dbline 57
; }
;
; #pragma interrupt_handler timer0_ovf_isr:17
; void timer0_ovf_isr(void)
; {
.dbline 58
; TCNT0 = 0xB2; //TIMER0 has overflowed
ldi R24,178
out 0x26,R24
.dbline 62
;
; //****************当前转速值*****************
;
; g_Temp = g_DeltaEnc * 125;
lds R4,_g_DeltaEnc+2
lds R5,_g_DeltaEnc+2+1
lds R2,_g_DeltaEnc
lds R3,_g_DeltaEnc+1
ldi R20,125
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
rcall empy32u
sts _g_Temp+1,R17
sts _g_Temp,R16
sts _g_Temp+2+1,R19
sts _g_Temp+2,R18
.dbline 63
; g_Temp /=1000;
ldi R20,232
ldi R21,3
ldi R22,0
ldi R23,0
st -y,R23
st -y,R22
st -y,R21
st -y,R20
rcall div32u
sts _g_Temp+1,R17
sts _g_Temp,R16
sts _g_Temp+2+1,R19
sts _g_Temp+2,R18
.dbline 64
; g_Temp *= 72;
ldi R20,72
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R20
movw R18,R22
rcall empy32u
sts _g_Temp+1,R17
sts _g_Temp,R16
sts _g_Temp+2+1,R19
sts _g_Temp+2,R18
.dbline 65
; g_Temp = 60000000 / g_Temp;
ldi R20,0
ldi R21,135
ldi R22,147
ldi R23,3
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R20
movw R18,R22
rcall div32u
sts _g_Temp+1,R17
sts _g_Temp,R16
sts _g_Temp+2+1,R19
sts _g_Temp+2,R18
.dbline 68
; //****************当前转速值******************
;
; g_AdcNum = 7; //脚踏板通道
ldi R24,7
sts _g_AdcNum,R24
.dbline 69
; sPID.SetValue = AdcPedal(g_ValueAdc) & 0xfff; //PID输入预设值
lds R16,_g_ValueAdc
lds R17,_g_ValueAdc+1
rcall _AdcPedal
movw R24,R16
andi R25,15
sts _sPID+1,R25
sts _sPID,R24
.dbline 71
;
; g_IicData = PIDCalc(&sPID, g_Temp); //PID运算
lds R18,_g_Temp
lds R19,_g_Temp+1
ldi R16,<_sPID
ldi R17,>_sPID
rcall _PIDCalc
sts _g_IicData,R16
.dbline 72
; g_flag10ms = 0xff;
ldi R24,255
sts _g_flag10ms,R24
.dbline 75
;
; //**********************************
; timer1_ovf_isr_();
rcall _timer1_ovf_isr_
.dbline -2
L4:
rcall pop_gset2
rcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 85
; //***********************************
;
; }
;
;
;
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 87
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 88
; port_init();
rcall _port_init
.dbline 90
; //watchdog_init();
; timer0_init();
rcall _timer0_init
.dbline 91
; timer1_init();
rcall _timer1_init
.dbline 93
;
; twi_init();
rcall _twi_init
.dbline 94
; adc_init();
rcall _adc_init
.dbline 96
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 97
; EICRA = 0x00; //extended ext ints
sts 105,R2
.dbline 98
; EIMSK = 0x00;
out 0x1d,R2
.dbline 100
;
; TIMSK0 = 0x01; //timer 0 interrupt sources
ldi R24,1
sts 110,R24
.dbline 101
; TIMSK1 = 0x21; //timer 1 interrupt sources
ldi R24,33
sts 111,R24
.dbline 102
; TIMSK2 = 0x00; //timer 2 interrupt sources
sts 112,R2
.dbline 104
;
; PCMSK0 = 0x00; //pin change mask 0
sts 107,R2
.dbline 105
; PCMSK1 = 0x00; //pin change mask 1
sts 108,R2
.dbline 106
; PCMSK2 = 0x00; //pin change mask 2
sts 109,R2
.dbline 107
; PCICR = 0x00; //pin change enable
sts 104,R2
.dbline 108
; PRR = 0x00;
sts 100,R2
.dbline 110
;
; SEI(); //re-enable interrupts
sei
.dbline -2
L5:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 117
;
; }
;
;
;
; void main(void)
; {
.dbline 119
;
; init_devices();
rcall _init_devices
.dbline 121
;
; PIDInit (&sPID);
ldi R16,<_sPID
ldi R17,>_sPID
rcall _PIDInit
.dbline 122
; START_ADC();
ldi R24,235
sts 122,R24
.dbline 123
; SumDu = 0; //增量式PID清零
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _SumDu+1,R21
sts _SumDu,R20
sts _SumDu+2+1,R23
sts _SumDu+2,R22
rjmp L8
L7:
.dbline 126
.dbline 133
rcall _det_err
.dbline 134
clr R18
ldi R16,1
rcall _electromagne_ctrl
.dbline 135
L8:
.dbline 125
rjmp L7
X0:
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_ovf_isr_ _timer1_ovf_isr_ fV
.even
_timer1_ovf_isr_::
.dbline -1
.dbline 148
;
; while (1)
; {
; //if (g_flag10ms == 0xff)
; //{
; // g_flag10ms = 0;
;
; // STARTIIC(); //开始发送
; //}
; det_err();
; electromagne_ctrl(1,0);
; }//End while
;
;
; }
;
;
; // 10 ms 中断 一次
; // 需要提供低于220V 的信号g_singleLowVol
; // 电机停机信号g_MotorStop
; // 高于400V 的信号g_singleOverVol
; // 电机正在运行标志g_MotorRun
; // 电机速度小于10 RPM 标志g_LowSpeed
; void timer1_ovf_isr_(void)
; {
.dbline 149
; if (!g_MotorRun)
lds R2,_g_MotorRun
tst R2
breq X1
rjmp L11
X1:
.dbline 150
; {
.dbline 151
; if (g_singleLowVol)
lds R2,_g_singleLowVol
tst R2
breq L13
.dbline 152
; {
.dbline 153
; g_Lower220VCnt ++;
lds R24,_g_Lower220VCnt
lds R25,_g_Lower220VCnt+1
adiw R24,1
sts _g_Lower220VCnt+1,R25
sts _g_Lower220VCnt,R24
.dbline 154
; }
rjmp L14
L13:
.dbline 156
; else
; {
.dbline 157
; g_Over220VCnt ++;
lds R24,_g_Over220VCnt
lds R25,_g_Over220VCnt+1
adiw R24,1
sts _g_Over220VCnt+1,R25
sts _g_Over220VCnt,R24
.dbline 158
; }
L14:
.dbline 159
; if (g_Lower220VCnt + g_Over220VCnt > 300)
lds R2,_g_Over220VCnt
lds R3,_g_Over220VCnt+1
lds R4,_g_Lower220VCnt
lds R5,_g_Lower220VCnt+1
add R4,R2
adc R5,R3
ldi R24,300
ldi R25,1
cp R24,R4
cpc R25,R5
brsh L15
.dbline 160
; {
.dbline 161
; if (g_Lower220VCnt > g_Over220VCnt)
lds R4,_g_Lower220VCnt
lds R5,_g_Lower220VCnt+1
cp R2,R4
cpc R3,R5
brsh L17
.dbline 162
; {
.dbline 163
; g_LowVol = 1;
ldi R24,1
sts _g_LowVol,R24
.dbline 164
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -