📄 initt.s
字号:
.module initt.c
.area text(rom, con, rel)
.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\initt.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 22
; //ICC-AVR application builder : 2005-4-25 9:42:27
; // Target : M8
; // Crystal: 8.00Mhz
; /*
; * Copyright (c) 2005, 广州力源电器公司开发部
; * All rights reserved.
; * 文件名称:init.c 负责初始化MCU各内部资源及外部端口
;
; * 当前版本: 1.0
; * 作者: 张洪强
; * 完成日期: 2005.7.25
; */
; #include <iom8v.h>
; #include <macros.h>
; //#include <interrupt.h>
; #include <signal.h>
; //#include <wdt.h>
; #include <eeprom.h>
; #include "init.h"
;
; void port_init(void)
; {
.dbline 23
; PORTB = 0x0F; //PB0-4接键盘,设为输入上拉
ldi R24,15
out 0x18,R24
.dbline 24
; DDRB = 0xF0; //PB4-7接控制输出,设为输出不上拉
ldi R24,240
out 0x17,R24
.dbline 25
; PORTC = 0x3C; //PC0,PC1接模拟信号进行AD转换,设为输入不上拉
ldi R24,60
out 0x15,R24
.dbline 26
; DDRC = 0x3C; //PC2,PC3,PC4,PC5接4位7段LED的位选端,设为输出上拉
out 0x14,R24
.dbline 27
; PORTD = 0xFF; //PORTD口接7段LED的段选端,全部设为输出上拉
ldi R24,255
out 0x12,R24
.dbline 28
; DDRD = 0xFF;
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 35
; }
;
; //TIMER0 initialize - prescale:1024
; // desired value: 50Hz
; // actual value: 50.080Hz (0.2%)
; void timer0_init(void)
; {
.dbline 36
; TCCR0 = 0x00; //stop
clr R2
out 0x33,R2
.dbline 37
; TCNT0 = 0xB2; //set count
ldi R24,178
out 0x32,R24
.dbline 38
; TCCR0 = 0x05; //start timer
ldi R24,5
out 0x33,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.area data(ram, con, rel)
.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\initt.c
L4:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\initt.c
L5:
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\initt.c
L6:
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\initt.c
L7:
.blkb 2
.area idata
.word 255
.area data(ram, con, rel)
.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\initt.c
.area text(rom, con, rel)
.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\initt.c
.dbfunc e SIGNAL _SIGNAL fI
.dbsym s min_value L7 i
.dbsym s max_value L6 i
.dbsym s total L5 i
.dbsym s i L4 c
; SIG_OVERFLOW0 -> R20,R21
.even
_SIGNAL::
rcall push_gset1
movw R20,R16
.dbline -1
.dbline 43
; }
;
; //#pragma interrupt_handler timer0_ovf_isr:10
; SIGNAL(SIG_OVERFLOW0)
; {
.dbline 46
; static unsigned char i = 0;
; static unsigned int total = 0,max_value = 0,min_value = 0xff;
; TCNT0 = 0xB2; //reload counter value
ldi R24,178
out 0x32,R24
.dbline 47
; if ( TIMER_EN )
lds R2,_TIMER_EN
tst R2
breq L8
.dbline 48
; {
.dbline 49
; TIMER_NUM++;
lds R24,_TIMER_NUM
lds R25,_TIMER_NUM+1
adiw R24,1
sts _TIMER_NUM+1,R25
sts _TIMER_NUM,R24
.dbline 50
; }
L8:
.dbline 51
; if ( adc_data_temp > max_value )
lds R2,L6
lds R3,L6+1
lds R4,_adc_data_temp
lds R5,_adc_data_temp+1
cp R2,R4
cpc R3,R5
brsh L10
.dbline 52
; {
.dbline 53
; max_value = adc_data_temp;
movw R2,R4
sts L6+1,R3
sts L6,R2
.dbline 54
; }
L10:
.dbline 55
; if ( adc_data_temp < min_value )
lds R2,L7
lds R3,L7+1
lds R4,_adc_data_temp
lds R5,_adc_data_temp+1
cp R4,R2
cpc R5,R3
brsh L12
.dbline 56
; {
.dbline 57
; min_value = adc_data_temp;
movw R2,R4
sts L7+1,R3
sts L7,R2
.dbline 58
; }
L12:
.dbline 59
; total += adc_data_temp;
lds R2,_adc_data_temp
lds R3,_adc_data_temp+1
lds R4,L5
lds R5,L5+1
add R4,R2
adc R5,R3
sts L5+1,R5
sts L5,R4
.dbline 60
; if ( i == 49 )
lds R24,L4
cpi R24,49
breq X0
rjmp L14
X0:
.dbline 61
; {
.dbline 62
; adc_data[0] =( total - min_value - max_value ) / 48.0;
lds R2,L7
lds R3,L7+1
sub R4,R2
sbc R5,R3
lds R2,L6
lds R3,L6+1
sub R4,R2
sbc R5,R3
ldi R16,<L16
ldi R17,>L16
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R4
lsr R17
ror R16
rcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall empy32fs
movw R16,R4
andi R16,1
andi R17,0
rcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall add32fs
ldi R16,<L17
ldi R17,>L17
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall div32f
sts _adc_data+1,R17
sts _adc_data,R16
sts _adc_data+2+1,R19
sts _adc_data+2,R18
.dbline 63
; adc_data_temp = 0;
clr R2
clr R3
sts _adc_data_temp+1,R3
sts _adc_data_temp,R2
.dbline 64
; max_value = 0;
sts L6+1,R3
sts L6,R2
.dbline 65
; min_value = 0xff;
ldi R24,255
ldi R25,0
sts L7+1,R25
sts L7,R24
.dbline 66
; total = 0;
sts L5+1,R3
sts L5,R2
.dbline 67
; }
rjmp L15
L14:
.dbline 68
; else if ( i == 99 )
lds R24,L4
cpi R24,99
breq X1
rjmp L18
X1:
.dbline 69
; {
.dbline 70
; adc_data[1] =( total - min_value - max_value ) / 48.0;
lds R2,L7
lds R3,L7+1
lds R4,L5
lds R5,L5+1
sub R4,R2
sbc R5,R3
lds R2,L6
lds R3,L6+1
sub R4,R2
sbc R5,R3
ldi R16,<L16
ldi R17,>L16
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R4
lsr R17
ror R16
rcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall empy32fs
movw R16,R4
andi R16,1
andi R17,0
rcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall add32fs
ldi R16,<L17
ldi R17,>L17
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall div32f
sts _adc_data+4+1,R17
sts _adc_data+4,R16
sts _adc_data+4+2+1,R19
sts _adc_data+4+2,R18
.dbline 71
; adc_data_temp = 0;
clr R2
clr R3
sts _adc_data_temp+1,R3
sts _adc_data_temp,R2
.dbline 72
; max_value = 0;
sts L6+1,R3
sts L6,R2
.dbline 73
; min_value = 0xff;
ldi R24,255
ldi R25,0
sts L7+1,R25
sts L7,R24
.dbline 74
; total = 0;
sts L5+1,R3
sts L5,R2
.dbline 75
; }
L18:
L15:
.dbline 76
; if ( i < 50 )
lds R24,L4
cpi R24,50
brsh L21
.dbline 77
; {
.dbline 78
; ADMUX &= ~( 1 << MUX0 );
cbi 0x7,0
.dbline 79
; }
rjmp L22
L21:
.dbline 81
; else
; {
.dbline 82
; ADMUX |= ( 1 << MUX0 );
sbi 0x7,0
.dbline 83
; }
L22:
.dbline 84
; i++;
lds R24,L4
subi R24,255 ; addi 1
sts L4,R24
.dbline 85
; i %= 100;
ldi R17,100
mov R16,R24
rcall mod8u
sts L4,R16
.dbline 86
; ADCSR |= ( 1<< ADSC ); //启动新的AD转换
sbi 0x6,6
.dbline -2
L3:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r SIG_OVERFLOW0 20 I
.dbend
.dbfunc e watchdog_init _watchdog_init fV
.even
_watchdog_init::
.dbline -1
.dbline 92
; }
;
; //Watchdog initialize
; // prescale: 512K
; void watchdog_init(void)
; {
.dbline 93
; wdt_reset(); //this prevents a timout on enabling
rcall _wdt_reset
.dbline -2
L23:
.dbline 0 ; func end
ret
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 100
; //wdt_enable(WDTO_1S); //WATCHDOG ENABLED - dont forget to issue WDRs,0.52S
; }
;
; //ADC initialize
; // Conversion time: 117uS
; void adc_init(void)
; {
.dbline 101
; ADCSR = 0x00; //disable adc
clr R2
out 0x6,R2
.dbline 102
; ADMUX = 0xC0; //select adc input 0,选择AVCC为参考电源
ldi R24,192
out 0x7,R24
.dbline 103
; ACSR = 0x80; //禁止模拟比较器
ldi R24,128
out 0x8,R24
.dbline 104
; ADCSR = 0xCE; //使能ADC,ADC转换开始,允许ADC中断,32分频
ldi R24,206
out 0x6,R24
.dbline -2
L24:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 109
; }
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; { //stop errant interrupts until set up
.dbline 110
; cli(); //disable all interrupts
rcall _cli
.dbline 111
; port_init();
rcall _port_init
.dbline 112
; watchdog_init();
rcall _watchdog_init
.dbline 113
; timer0_init();
rcall _timer0_init
.dbline 114
; adc_init();
rcall _adc_init
.dbline 115
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 116
; GICR = 0x00;
out 0x3b,R2
.dbline 117
; TIMSK = 0x01; //timer interrupt sources
ldi R24,1
out 0x39,R24
.dbline 118
; if ( UP_DOWN_POWER != 0x55aa )
lds R24,_UP_DOWN_POWER
cpi R24,170
breq L26
.dbline 119
; {
.dbline 126
; /*
; KEY_A_V_STATE = 0;
; KEY_AUTO_MAN_STATE = 0;
; KEY_CC_CV_STATE = 0;
; POWER_STATE = 0;
; */
; eeprom_busy_wait();
rcall _eeprom_busy_wait
.dbline 127
; KEY_A_V_STATE = eeprom_read_byte ( (char*)0x01 );
ldi R16,1
ldi R17,0
rcall _eeprom_read_byte
sts _KEY_A_V_STATE,R16
.dbline 128
; eeprom_busy_wait();
rcall _eeprom_busy_wait
.dbline 129
; KEY_AUTO_MAN_STATE = eeprom_read_byte ( (char*)0x03 );
ldi R16,3
ldi R17,0
rcall _eeprom_read_byte
sts _KEY_AUTO_MAN_STATE,R16
.dbline 130
; eeprom_busy_wait();
rcall _eeprom_busy_wait
.dbline 131
; KEY_CC_CV_STATE = eeprom_read_byte ( (char*)0x05 );
ldi R16,5
ldi R17,0
rcall _eeprom_read_byte
sts _KEY_CC_CV_STATE,R16
.dbline 132
; eeprom_busy_wait();
rcall _eeprom_busy_wait
.dbline 133
; POWER_STATE = eeprom_read_byte ( (char*)0x07 );
ldi R16,7
ldi R17,0
rcall _eeprom_read_byte
sts _POWER_STATE,R16
.dbline 134
; }
L26:
.dbline 136
;
; if ( POWER_STATE )
lds R2,_POWER_STATE
tst R2
breq L28
.dbline 137
; {
.dbline 138
; PORTB |= ( 1 << POWER ); //开启电源
sbi 0x18,4
.dbline 139
; }
rjmp L29
L28:
.dbline 141
; else
; {
.dbline 142
; PORTB &= ~( 1 << POWER ); //关闭电源
cbi 0x18,4
.dbline 143
; }
L29:
.dbline 144
; if ( KEY_A_V_STATE )
lds R2,_KEY_A_V_STATE
tst R2
breq L30
.dbline 145
; {
.dbline 146
; PORTB |= ( 1 << OUT_A ); //显示电流
sbi 0x18,7
.dbline 147
; }
rjmp L31
L30:
.dbline 149
; else
; {
.dbline 150
; PORTB &= ~( 1 << OUT_A ); //显示电压
cbi 0x18,7
.dbline 151
; }
L31:
.dbline 152
; if ( KEY_CC_CV_STATE )
lds R2,_KEY_CC_CV_STATE
tst R2
breq L32
.dbline 153
; {
.dbline 154
; PORTB |= ( 1 << OUT_CV ); //稳压
sbi 0x18,6
.dbline 155
; }
rjmp L33
L32:
.dbline 157
; else
; {
.dbline 158
; PORTB &= ~( 1 << OUT_CV ); //稳流
cbi 0x18,6
.dbline 159
; }
L33:
.dbline 160
; if ( KEY_AUTO_MAN_STATE )
lds R2,_KEY_AUTO_MAN_STATE
tst R2
breq L34
.dbline 161
; {
.dbline 162
; PORTB |= ( 1 << OUT_AUTO ); //自动
sbi 0x18,5
.dbline 163
; }
rjmp L35
L34:
.dbline 165
; else
; {
.dbline 166
; PORTB &= ~( 1 << OUT_AUTO ); //手动
cbi 0x18,5
.dbline 167
; }
L35:
.dbline 168
; UP_DOWN_POWER = 0x55aa;
ldi R24,21930
ldi R25,85
sts _UP_DOWN_POWER,R24
.dbline 169
; sei(); //re-enable interrupts
rcall _sei
.dbline -2
L25:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF\initt.c
_UP_DOWN_POWER::
.blkb 1
.dbfile F:\网络下载\AVR\完整应用\电流电压表\SOF/init.h
.dbsym e UP_DOWN_POWER _UP_DOWN_POWER c
_KEY_AUTO_MAN_STATE::
.blkb 1
.dbsym e KEY_AUTO_MAN_STATE _KEY_AUTO_MAN_STATE c
_KEY_CC_CV_STATE::
.blkb 1
.dbsym e KEY_CC_CV_STATE _KEY_CC_CV_STATE c
_POWER_STATE::
.blkb 1
.dbsym e POWER_STATE _POWER_STATE c
_KEY_A_V_STATE::
.blkb 1
.dbsym e KEY_A_V_STATE _KEY_A_V_STATE c
_KEY_INPUT::
.blkb 1
.dbsym e KEY_INPUT _KEY_INPUT c
_KEY_TEMP::
.blkb 1
.dbsym e KEY_TEMP _KEY_TEMP c
_SET_STATU::
.blkb 1
.dbsym e SET_STATU _SET_STATU c
_TIMER_EN::
.blkb 1
.dbsym e TIMER_EN _TIMER_EN c
_TIMER_NUM::
.blkb 2
.dbsym e TIMER_NUM _TIMER_NUM i
_adc_data_temp::
.blkb 2
.dbsym e adc_data_temp _adc_data_temp i
.area lit(rom, con, rel)
L17:
.word 0x0,0x4240
L16:
.word 0x0,0x4000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -