?? motor_main.s
字號:
.module motor_main.c
.area code(ram, con, rel)
.area lit(rom, con, rel)
_table::
.byte 189,132
.byte 217,205
.byte 228,'m
.byte 125,133
.byte 253,237
.dbfile C:\icc\speedloop\motor_main.c
.dbsym e table _table A[10:10]kc
.area data(ram, con, rel)
.dbfile C:\icc\speedloop\motor_main.c
_ledbuff::
.blkb 2
.area idata
.byte 189,189
.area data(ram, con, rel)
.dbfile C:\icc\speedloop\motor_main.c
.blkb 2
.area idata
.byte 189,189
.area data(ram, con, rel)
.dbfile C:\icc\speedloop\motor_main.c
.dbsym e ledbuff _ledbuff A[4:4]c
.area text(rom, con, rel)
.dbfile C:\icc\speedloop\motor_main.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 19
; //ICC-AVR application builder : 2005-8-3
; // Target : M16
; // Crystal: 4.0000Mhz
; //closed speed loop controlling
;
; #include <iom16v.h>
; #include <macros.h>
;
; #pragma data:code
; const unsigned char table[]={0xbd,0x84,0xd9,0xcd,0xe4,0x6d,0x7d,0x85,0xfd,0xed};//7segment
; #pragma data:data
; unsigned char ledbuff[]={0xbd,0xbd,0xbd,0xbd};
;
; unsigned char adc_res8,count;
; unsigned char ad_mux;
; unsigned int adc_res16,count16;
;
; void port_init(void)
; {
.dbline 20
; PORTA = 0x00;
clr R2
out 0x1b,R2
.dbline 21
; DDRA = 0xF0;//HIGH 4BIT AS OUTPUT
ldi R24,240
out 0x1a,R24
.dbline 22
; PORTB = 0x00;
out 0x18,R2
.dbline 23
; DDRB = 0xfd;//t1 input other output
ldi R24,253
out 0x17,R24
.dbline 24
; PORTC = 0x00; //m103 output only
out 0x15,R2
.dbline 25
; DDRC = 0x00;
out 0x14,R2
.dbline 26
; PORTD = 0x00;
out 0x12,R2
.dbline 27
; DDRD = 0xFF;//port d as a output
ldi R24,255
out 0x11,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 36
; }
;
;
; //TIMER0 initialize - prescale:64
; // WGM: Normal
; // desired value: 2mSec
; // actual value: 2.000mSec (0.0%)
; void timer0_init(void)
; {
.dbline 37
; TCCR0 = 0x00; //stop
clr R2
out 0x33,R2
.dbline 38
; TCNT0 = 0x16; //set count
ldi R24,22
out 0x32,R24
.dbline 39
; OCR0 = 0x57; //set compare
ldi R24,87
out 0x3c,R24
.dbline 40
; TCCR0 = 0x05; //start timer
ldi R24,5
out 0x33,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 36
jmp _timer0_ovf_isr
.area text(rom, con, rel)
.dbfile C:\icc\speedloop\motor_main.c
.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
; temp -> R16
.even
_timer0_ovf_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R24
st -y,R25
in R2,0x3f
st -y,R2
.dbline -1
.dbline 45
; }
;
; #pragma interrupt_handler timer0_ovf_isr:10
; void timer0_ovf_isr(void)
; {
.dbline 47
; unsigned char temp;
; temp=SREG;
in R16,0x3f
.dbline 49
; //unsigned int temp16;
; TCCR1B=0X00;//STOP T1
clr R2
out 0x2e,R2
.dbline 50
; TCCR0=0X00;//STOP T0
out 0x33,R2
.dbline 51
; count++;
lds R24,_count
subi R24,255 ; addi 1
sts _count,R24
.dbline 52
; count16=TCNT1;
in R2,0x2c
in R3,0x2d
sts _count16+1,R3
sts _count16,R2
.dbline 53
; TCNT1H = 0x00 /*INVALID SETTING*/; //setup
clr R2
out 0x2d,R2
.dbline 54
; TCNT1L = 0x00 /*INVALID SETTING*/;
out 0x2c,R2
.dbline 56
;
; TCNT0 = 0x16; //reload counter value
ldi R24,22
out 0x32,R24
.dbline 57
; OCR0=0X57;
ldi R24,87
out 0x3c,R24
.dbline 58
; TCCR0=0X05;//START TIMER0
ldi R24,5
out 0x33,R24
.dbline 59
; TCCR1B=0X07;//START T1
ldi R24,7
out 0x2e,R24
.dbline 60
; if (count16==0)
lds R2,_count16
lds R3,_count16+1
tst R2
brne L4
tst R3
brne L4
X0:
.dbline 61
; {
.dbline 62
; TCCR0=0X00;
clr R2
out 0x33,R2
.dbline 63
; }
L4:
.dbline 64
; SREG=temp;
out 0x3f,R16
.dbline -2
L3:
ld R2,y+
out 0x3f,R2
ld R25,y+
ld R24,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbsym r temp 16 c
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 71
; }
; //TIMER1 initialize - prescale:Rising edge
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value: 1Hz
; // actual value: Out of range
; void timer1_init(void)
; {
.dbline 72
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 73
; TCNT1H = 0x00 /*INVALID SETTING*/; //setup
out 0x2d,R2
.dbline 74
; TCNT1L = 0x00 /*INVALID SETTING*/;
out 0x2c,R2
.dbline 75
; OCR1AH = 0x00 /*INVALID SETTING*/;
out 0x2b,R2
.dbline 76
; OCR1AL = 0x00 /*INVALID SETTING*/;
out 0x2a,R2
.dbline 77
; OCR1BH = 0x00 /*INVALID SETTING*/;
out 0x29,R2
.dbline 78
; OCR1BL = 0x00 /*INVALID SETTING*/;
out 0x28,R2
.dbline 81
; //OCR1CH = $OCR1CH$;
; //OCR1CL = $OCR1CL$;
; ICR1H = 0x00 /*INVALID SETTING*/;
out 0x27,R2
.dbline 82
; ICR1L = 0x00 /*INVALID SETTING*/;
out 0x26,R2
.dbline 83
; TCCR1A = 0x00;
out 0x2f,R2
.dbline 84
; TCCR1B = 0x07; //start Timer
ldi R24,7
out 0x2e,R24
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer2_init _timer2_init fV
.even
_timer2_init::
.dbline -1
.dbline 91
; }
;
; //TIMER2 initialize - prescale:1
; // WGM: PWM Phase correct
; // actual value: 15.686KHz (93.6%)
; void timer2_init(void)
; {
.dbline 92
; TCCR2 = 0x00; //stop
clr R2
out 0x25,R2
.dbline 93
; ASSR = 0x00; //set async mode
out 0x22,R2
.dbline 94
; TCNT2 = 0x01; //setup
ldi R24,1
out 0x24,R24
.dbline 95
; OCR2 = 0xFF;
ldi R24,255
out 0x23,R24
.dbline 96
; TCCR2 = 0x61; //start
ldi R24,97
out 0x25,R24
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 111
; }
;
; //#pragma interrupt_handler timer2_ovf_isr:5
; //void timer2_ovf_isr(void)
; //{
; // unsigned char temp;
; // temp=SREG;
; // OCR2=adc_res8;
; // SREG=temp;
; //}
;
; //ADC initialize
; // Conversion time: 3uS
; void adc_init(void)
; {ad_mux=0x01;
.dbline 111
ldi R24,1
sts _ad_mux,R24
.dbline 112
; ADCSR = 0x00; //disable adc
clr R2
out 0x6,R2
.dbline 113
; ADMUX = (1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(ad_mux&0x0f); //select adc input 0
andi R24,15
ori R24,224
out 0x7,R24
.dbline 114
; ACSR = 0x80;
ldi R24,128
out 0x8,R24
.dbline 115
; ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
ldi R24,206
out 0x6,R24
.dbline -2
L8:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 133
; }
;
; //#pragma interrupt_handler adc_isr:15
; //void adc_isr(void)
; //{
; // unsigned char temp;
; // temp=SREG;
; // adc_res8=ADCH;
; //hex2bcd(adc_res8);
; //ad_mux=0x01;
; //ADMUX=(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(ad_mux&0x0f);
; // ADCSRA|=(1<<ADSC);//start adc again
; // SREG=temp;
; //}
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 135
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 136
; port_init();
xcall _port_init
.dbline 137
; timer0_init();
xcall _timer0_init
.dbline 138
; timer1_init();
xcall _timer1_init
.dbline 139
; timer2_init();
xcall _timer2_init
.dbline 142
; //adc_init();
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 143
; GICR = 0x00;
out 0x3b,R2
.dbline 144
; TIMSK = 0x41; //enable timer0 timer2 interrupt sources
ldi R24,65
out 0x39,R24
.dbline 145
; SEI(); //re-enable interrupts
sei
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 149
; //all peripherals are now initialized
; }
; void delay_1ms(void)
; {
.dbline 151
; unsigned int i;
; for (i=0;i<542;i++)
clr R16
clr R17
xjmp L14
L11:
.dbline 152
L12:
.dbline 151
subi R16,255 ; offset = 1
sbci R17,255
L14:
.dbline 151
cpi R16,30
ldi R30,2
cpc R17,R30
brlo L11
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e hex2bcd _hex2bcd fV
; temp -> R20
; i -> R22
; cnt -> R10,R11
.even
_hex2bcd::
xcall push_gset3
movw R10,R16
.dbline -1
.dbline 155
; ;
; }
; void hex2bcd(unsigned int cnt)
; {
.dbline 157
; unsigned char i,temp;
; for (i=0;i<4;i++)
clr R22
xjmp L19
L16:
.dbline 158
.dbline 159
ldi R18,10
ldi R19,0
movw R16,R10
xcall mod16u
mov R20,R16
.dbline 160
ldi R24,<_table
ldi R25,>_table
mov R30,R20
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
ldi R24,<_ledbuff
ldi R25,>_ledbuff
mov R26,R22
clr R27
add R26,R24
adc R27,R25
st x,R30
.dbline 161
ldi R18,10
ldi R19,0
movw R16,R10
xcall div16u
movw R10,R16
.dbline 162
L17:
.dbline 157
inc R22
L19:
.dbline 157
cpi R22,4
brlo L16
.dbline -2
L15:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r i 22 c
.dbsym r cnt 10 i
.dbend
.dbfunc e display _display fV
; i -> R20
.even
_display::
xcall push_gset1
.dbline -1
.dbline 166
; {
; temp=cnt%10;
; ledbuff[i]=table[temp];
; cnt=cnt/10;
; }
; }
;
; void display(void)
; {
.dbline 168
; unsigned char i;
; for (i=0;i<4;i++)
clr R20
xjmp L24
L21:
.dbline 169
.dbline 170
ldi R24,<_ledbuff
ldi R25,>_ledbuff
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x18,R2
.dbline 171
mov R17,R20
subi R17,252 ; addi 4
ldi R16,1
xcall lsl8
mov R2,R16
com R2
out 0x1b,R2
.dbline 172
xcall _delay_1ms
.dbline 173
mov R17,R20
subi R17,252 ; addi 4
ldi R16,1
xcall lsl8
in R2,0x1b
or R2,R16
out 0x1b,R2
.dbline 174
L22:
.dbline 168
inc R20
L24:
.dbline 168
cpi R20,4
brlo L21
.dbline -2
L20:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e main _main fI
.even
_main::
.dbline -1
.dbline 179
; {
; PORTB=ledbuff[i];
; PORTA=~(1<<(4+i));
; delay_1ms();
; PORTA|=(1<<(4+i));
; }
; }
;
;
; main()
; {
.dbline 180
; init_devices();
xcall _init_devices
.dbline 181
; count=0;
clr R2
sts _count,R2
xjmp L27
L26:
.dbline 183
.dbline 185
lds R16,_count16
lds R17,_count16+1
xcall _hex2bcd
.dbline 186
xcall _display
.dbline 187
L27:
.dbline 182
xjmp L26
X1:
.dbline -2
L25:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\icc\speedloop\motor_main.c
_count16::
.blkb 2
.dbsym e count16 _count16 i
_adc_res16::
.blkb 2
.dbsym e adc_res16 _adc_res16 i
_ad_mux::
.blkb 1
.dbsym e ad_mux _ad_mux c
_count::
.blkb 1
.dbsym e count _count c
_adc_res8::
.blkb 1
.dbsym e adc_res8 _adc_res8 c
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -