📄 control.s
字号:
.module Control.c
.area lit(rom, con, rel)
_FTC2::
.word 64
.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出,TC1控制)\Control.c
.dbsym e FTC2 _FTC2 kI
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出,TC1控制)\Control.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 15
; //ICC-AVR application builder : 2006-12-10 17:22:46
; // Target : M8
; // Crystal: 8.0000Mhz
; //ICC-AVR application builder : 2006-12-10 21:46:41
; // Target : M8
; // Crystal: 8.0000Mhz
;
; #include <iom8v.h>
; #include <macros.h>
; long Ddummy,Counter_MotorSpeedPulse,Counter_IRPulse,Settings_IRTopValue;
; char Settings_PrintQuality;
; const FTC2 =64;
;
; void port_init(void)
; {
.dbline 16
; PORTB = 0x00;
clr R2
out 0x18,R2
.dbline 17
; DDRB = 0xFF;
ldi R24,255
out 0x17,R24
.dbline 18
; PORTC = 0x7F; //m103 output only
ldi R24,127
out 0x15,R24
.dbline 19
; DDRC = 0x00;
out 0x14,R2
.dbline 20
; PORTD = 0xFF;
ldi R24,255
out 0x12,R24
.dbline 21
; DDRD = 0x00;
out 0x11,R2
.dbline -2
.dbline 22
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 29
;
; //TIMER1 initialisation - prescale:1
; // WGM: 4) CTC, TOP=OCRnA
; // desired value: 1KHz
; // actual value: 1.000KHz (0.0%)
; void timer1_init(void)
; {
.dbline 30
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 31
; TCNT1 = 0x00; //setup
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 32
; ICR1H = 0x1F;
ldi R24,31
out 0x27,R24
.dbline 33
; ICR1L = 0x3F;
ldi R24,63
out 0x26,R24
.dbline 34
; OCR1A = FTC2*Settings_PrintQuality; //每组Settings_PrintQuality个墨滴选一个充电
lds R18,_Settings_PrintQuality
clr R19
ldi R30,<_FTC2
ldi R31,>_FTC2
lpm R16,Z+
lpm R17,Z
rcall empy16s
out 0x2b,R17
out 0x2a,R16
.dbline 35
; OCR1B = FTC2/2; //充电脉宽是墨滴周期时间的一半,充电相位为0,充电好坏由断点调整
ldi R18,2
ldi R19,0
ldi R30,<_FTC2
ldi R31,>_FTC2
lpm R16,Z+
lpm R17,Z
rcall div16s
out 0x29,R17
out 0x28,R16
.dbline 36
; TCCR1A = 0x50;
ldi R24,80
out 0x2f,R24
.dbline 37
; TCCR1B = 0x09; //start Timer
ldi R24,9
out 0x2e,R24
.dbline -2
.dbline 38
; }
L2:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 12
rjmp _timer1_compa_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出,TC1控制)\Control.c
.dbfunc e timer1_compa_isr _timer1_compa_isr fV
.even
_timer1_compa_isr::
.dbline -1
.dbline 42
; //
; #pragma interrupt_handler timer1_compa_isr:7
; void timer1_compa_isr(void) //开始一个新的充电墨滴时PB1开始产生一个下降沿或上升沿
; { //compare occured TCNT1=OCR1A
.dbline -2
.dbline 46
; //if(PINB1==0){ //如果PB1是低电平,就开始一个新的DA转换
; // ;
; //}
; }
L3:
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 14
rjmp _timer1_compb_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出,TC1控制)\Control.c
.dbfunc e timer1_compb_isr _timer1_compb_isr fV
.even
_timer1_compb_isr::
.dbline -1
.dbline 50
;
; #pragma interrupt_handler timer1_compb_isr:8
; void timer1_compb_isr(void) //停止充电时刻,PB2开始产生上升沿或下降沿
; {
.dbline -2
.dbline 52
; //compare occured TCNT1=OCR1B
; }
L4:
.dbline 0 ; func end
reti
.dbend
.dbfunc e timer2_init _timer2_init fV
.even
_timer2_init::
.dbline -1
.dbline 60
; //
;
; //TIMER2 initialisation - prescale:1
; // WGM: Normal
; // desired value: 62.5KHz
; // actual value: 62.5KHz (0.0%)
; void timer2_init(void)
; {
.dbline 61
; TCCR2 = 0x00; //stop
clr R2
out 0x25,R2
.dbline 62
; ASSR = 0x00; //set async mode
out 0x22,R2
.dbline 63
; TCNT2 = 0x00; //setup
out 0x24,R2
.dbline 64
; OCR2 = FTC2; //0x40;振荡频率的分频值,8M-64,4M-32
ldi R30,<_FTC2
ldi R31,>_FTC2
lpm R0,Z+
lpm R1,Z
movw R30,R0
out 0x23,R30
.dbline 65
; TCCR2 = 0x19; //CTC 模式
ldi R24,25
out 0x25,R24
.dbline -2
.dbline 66
; }
L5:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 2
rjmp _int0_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出,TC1控制)\Control.c
.dbfunc e int0_isr _int0_isr fV
.even
_int0_isr::
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R24
st -y,R25
st -y,R26
st -y,R27
st -y,R30
in R2,0x3f
st -y,R2
rcall push_gset2
.dbline -1
.dbline 70
;
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void) //external interupt on INT0 记录电机速度
; {
.dbline 71
; Counter_MotorSpeedPulse++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_Counter_MotorSpeedPulse+2
lds R5,_Counter_MotorSpeedPulse+2+1
lds R2,_Counter_MotorSpeedPulse
lds R3,_Counter_MotorSpeedPulse+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _Counter_MotorSpeedPulse+1,R3
sts _Counter_MotorSpeedPulse,R2
sts _Counter_MotorSpeedPulse+2+1,R5
sts _Counter_MotorSpeedPulse+2,R4
.dbline 72
; if(Counter_MotorSpeedPulse>=1000){ //计算并显示电机速度
ldi R20,232
ldi R21,3
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlt L7
.dbline 72
.dbline 73
; Counter_MotorSpeedPulse =0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _Counter_MotorSpeedPulse+1,R21
sts _Counter_MotorSpeedPulse,R20
sts _Counter_MotorSpeedPulse+2+1,R23
sts _Counter_MotorSpeedPulse+2,R22
.dbline 74
; PORTB |=32; //PB5脚置高电平
sbi 0x18,5
.dbline 75
; }
L7:
.dbline 76
ldi R20,244
ldi R21,1
ldi R22,0
ldi R23,0
lds R4,_Counter_MotorSpeedPulse+2
lds R5,_Counter_MotorSpeedPulse+2+1
lds R2,_Counter_MotorSpeedPulse
lds R3,_Counter_MotorSpeedPulse+1
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L9
.dbline 76
in R24,0x18
andi R24,223
out 0x18,R24
L9:
.dbline -2
.dbline 77
; if(Counter_MotorSpeedPulse==500) PORTB &=223; //PB5脚置低电平
; }
L6:
rcall pop_gset2
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 4
rjmp _int1_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出,TC1控制)\Control.c
.dbfunc e int1_isr _int1_isr fV
.even
_int1_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R24
st -y,R30
in R0,0x3f
st -y,R0
rcall push_gset2
.dbline -1
.dbline 81
;
; #pragma interrupt_handler int1_isr:3
; void int1_isr(void) //external interupt on INT1 记录光电开关的触发脉冲
; {
.dbline 82
; Counter_IRPulse++;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
lds R4,_Counter_IRPulse+2
lds R5,_Counter_IRPulse+2+1
lds R2,_Counter_IRPulse
lds R3,_Counter_IRPulse+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _Counter_IRPulse+1,R3
sts _Counter_IRPulse,R2
sts _Counter_IRPulse+2+1,R5
sts _Counter_IRPulse+2,R4
.dbline 83
; if(Counter_IRPulse >= 1000){ //计算并触发打印按钮
ldi R20,232
ldi R21,3
ldi R22,0
ldi R23,0
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlt L12
.dbline 83
.dbline 84
; Counter_IRPulse=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _Counter_IRPulse+1,R21
sts _Counter_IRPulse,R20
sts _Counter_IRPulse+2+1,R23
sts _Counter_IRPulse+2,R22
.dbline 85
; PORTB |=64; //PB6脚置高电平
sbi 0x18,6
.dbline 86
; }
L12:
.dbline 87
ldi R20,244
ldi R21,1
ldi R22,0
ldi R23,0
lds R4,_Counter_IRPulse+2
lds R5,_Counter_IRPulse+2+1
lds R2,_Counter_IRPulse
lds R3,_Counter_IRPulse+1
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brne L14
.dbline 87
in R24,0x18
andi R24,191
out 0x18,R24
L14:
.dbline -2
.dbline 88
; if(Counter_IRPulse == 500) PORTB &=191; //PB6脚置低电平
; }
L11:
rcall pop_gset2
ld R0,y+
out 0x3f,R0
ld R30,y+
ld R24,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 92
;
; //call this routine to initialise all peripherals
; void init_devices(void)
; {
.dbline 94
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 95
; port_init();
rcall _port_init
.dbline 96
; timer2_init();
rcall _timer2_init
.dbline 97
; timer1_init();
rcall _timer1_init
.dbline 99
;
; MCUCR = 0x0F;
ldi R24,15
out 0x35,R24
.dbline 100
; GICR = 0xC0;
ldi R24,192
out 0x3b,R24
.dbline 101
; TIMSK = 0x18; //timer interrupt sources
ldi R24,24
out 0x39,R24
.dbline 102
; SEI(); //re-enable interrupts
sei
.dbline -2
.dbline 104
; //all peripherals are now initialised
; }
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 107
;
; void main()
; {
.dbline 108
; Settings_IRTopValue = 1000; //光电开关触发Settings_IRTopValue次后就开始打印一条信息
ldi R20,232
ldi R21,3
ldi R22,0
ldi R23,0
sts _Settings_IRTopValue+1,R21
sts _Settings_IRTopValue,R20
sts _Settings_IRTopValue+2+1,R23
sts _Settings_IRTopValue+2,R22
.dbline 109
; Settings_PrintQuality = 10; //10个墨滴选一个充电
ldi R24,10
sts _Settings_PrintQuality,R24
.dbline 110
; Counter_MotorSpeedPulse =0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _Counter_MotorSpeedPulse+1,R21
sts _Counter_MotorSpeedPulse,R20
sts _Counter_MotorSpeedPulse+2+1,R23
sts _Counter_MotorSpeedPulse+2,R22
.dbline 111
; Counter_IRPulse =0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
sts _Counter_IRPulse+1,R21
sts _Counter_IRPulse,R20
sts _Counter_IRPulse+2+1,R23
sts _Counter_IRPulse+2,R22
.dbline 113
;
; init_devices();
.dbline -2
.dbline 114
; }
L17:
.dbline 0 ; func end
rjmp _init_devices
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出,TC1控制)\Control.c
_Settings_PrintQuality::
.blkb 1
.dbsym e Settings_PrintQuality _Settings_PrintQuality c
_Settings_IRTopValue::
.blkb 4
.dbsym e Settings_IRTopValue _Settings_IRTopValue L
_Counter_IRPulse::
.blkb 4
.dbsym e Counter_IRPulse _Counter_IRPulse L
_Counter_MotorSpeedPulse::
.blkb 4
.dbsym e Counter_MotorSpeedPulse _Counter_MotorSpeedPulse L
_Ddummy::
.blkb 4
.dbsym e Ddummy _Ddummy L
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -