📄 bjqd.lst
字号:
__start:
__text_start:
00AA E5CF LDI R28,0x5F
00AB E0D4 LDI R29,4
00AC BFCD OUT 0x3D,R28
00AD BFDE OUT 0x3E,R29
00AE 52C8 SUBI R28,0x28
00AF 40D0 SBCI R29,0
00B0 EA0A LDI R16,0xAA
00B1 8308 STD Y+0,R16
00B2 2400 CLR R0
00B3 E6E0 LDI R30,0x60
00B4 E0F0 LDI R31,0
00B5 E010 LDI R17,0
00B6 3FE6 CPI R30,0xF6
00B7 07F1 CPC R31,R17
00B8 F011 BEQ 0x00BB
00B9 9201 ST R0,Z+
00BA CFFB RJMP 0x00B6
00BB 8300 STD Z+0,R16
00BC E5E4 LDI R30,0x54
00BD E0F1 LDI R31,1
00BE E6A0 LDI R26,0x60
00BF E0B0 LDI R27,0
00C0 E011 LDI R17,1
00C1 35E4 CPI R30,0x54
00C2 07F1 CPC R31,R17
00C3 F021 BEQ 0x00C8
00C4 95C8 LPM
00C5 9631 ADIW R30,1
00C6 920D ST R0,X+
00C7 CFF9 RJMP 0x00C1
00C8 940E04AD CALL _main
_exit:
00CA CFFF RJMP _exit
_EEPROMReadWord:
eeprom_data --> Y+2
ptr --> R20
word --> R10
addr --> R22
00CB 940E0A27 CALL push_gset3
00CD 0159 MOVW R10,R18
00CE 01B8 MOVW R22,R16
00CF 9724 SBIW R28,4
FILE: C:\BJQD\eeprom_l.c
(0001) #include <eeprom.h>
(0002) #include "main.h"
(0003)
(0004) extern struct cal cal0;
(0005)
(0006) /*
(0007) eeprom操作模块
(0008) */
(0009)
(0010) /*
(0011) 从eeprom中读整型变量的值
(0012) */
(0013)
(0014) #include <eeprom.h>
(0015) /*
(0016) 从eeprom中读整型变量的值
(0017) */
(0018) void EEPROMReadWord(unsigned int addr,unsigned int *word)
(0019) {
(0020) unsigned char eeprom_data[2];
(0021) unsigned char *ptr = (unsigned char *)word;
00D0 01A5 MOVW R20,R10
(0022) EEPROMReadBytes(addr,eeprom_data,2);
00D1 E082 LDI R24,2
00D2 E090 LDI R25,0
00D3 8399 STD Y+1,R25
00D4 8388 STD Y+0,R24
00D5 019E MOVW R18,R28
00D6 5F2E SUBI R18,0xFE
00D7 4F3F SBCI R19,0xFF
00D8 018B MOVW R16,R22
00D9 940E0A89 CALL _EEPROMReadBytes
(0023) *ptr = eeprom_data[0];
00DB 802A LDD R2,Y+2
00DC 01FA MOVW R30,R20
00DD 8220 STD Z+0,R2
(0024) ptr++;
00DE 5F4F SUBI R20,0xFF
00DF 4F5F SBCI R21,0xFF
(0025) *ptr = eeprom_data[1];
00E0 802B LDD R2,Y+3
00E1 01FA MOVW R30,R20
00E2 8220 STD Z+0,R2
00E3 9624 ADIW R28,4
00E4 940E0A1A CALL pop_gset3
00E6 9508 RET
_EEPROMWriteWord:
eeprom_data --> Y+2
ptr --> R22
word --> R10
addr --> R20
00E7 940E0A27 CALL push_gset3
00E9 0159 MOVW R10,R18
00EA 01A8 MOVW R20,R16
00EB 9724 SBIW R28,4
(0026) }
(0027)
(0028) /*
(0029) 向eeprom中写整型变量的值
(0030) */
(0031) void EEPROMWriteWord(unsigned int addr,unsigned int *word)
(0032) {
(0033) unsigned char eeprom_data[2];
(0034) unsigned char *ptr = (unsigned char *)word;
00EC 01B5 MOVW R22,R10
(0035) eeprom_data[0] = *ptr;
00ED 01FB MOVW R30,R22
00EE 8020 LDD R2,Z+0
00EF 822A STD Y+2,R2
(0036) ptr++;
00F0 5F6F SUBI R22,0xFF
00F1 4F7F SBCI R23,0xFF
(0037) eeprom_data[1] = *ptr;
00F2 01FB MOVW R30,R22
00F3 8020 LDD R2,Z+0
00F4 822B STD Y+3,R2
(0038) EEPROMWriteBytes(addr,eeprom_data,2);
00F5 E082 LDI R24,2
00F6 E090 LDI R25,0
00F7 8399 STD Y+1,R25
00F8 8388 STD Y+0,R24
00F9 019E MOVW R18,R28
00FA 5F2E SUBI R18,0xFE
00FB 4F3F SBCI R19,0xFF
00FC 018A MOVW R16,R20
00FD 940E0AAD CALL _EEPROMWriteBytes
00FF 9624 ADIW R28,4
0100 940E0A1A CALL pop_gset3
0102 9508 RET
_time1_int:
j --> R16
i --> R18
0103 922A ST R2,-Y
0104 923A ST R3,-Y
0105 930A ST R16,-Y
0106 932A ST R18,-Y
0107 938A ST R24,-Y
0108 939A ST R25,-Y
0109 93EA ST R30,-Y
010A 93FA ST R31,-Y
010B B62F IN R2,0x3F
010C 922A ST R2,-Y
FILE: C:\BJQD\main.c
(0001) /*ICC-AVR application builder : 2004-3-11 12:02:11
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 主程序
(0005) ******************************************************************************/
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008) #include <eeprom.h>
(0009) #include <stdlib.h>
(0010) #include <math.h>
(0011) #include "main.h"
(0012) #include "eeprom_l.h"
(0013) #include "delay.h"
(0014) #include "comm.h"
(0015) #include "key.h"
(0016)
(0017) //eeprom 中的数据表
(0018) #pragma data:eeprom
(0019) /*
(0020) {0x0000(2),speed_romaddr(2),state_romaddr(1),pump_tab_romaddr(1),
(0021) state_other_romaddr(1)}
(0022) */
(0023) unsigned int space_eeprom=0000;
(0024) unsigned int speed_eeprom=100;
(0025) unsigned char state_eeprom=0;
(0026) unsigned char pump_tab_eeprom=1;
(0027) unsigned char state_other_eeprom=0;
(0028)
(0029) #pragma data:code
(0030) const unsigned char tabsin[]={
(0031) 0,6,13,19,25,31,37,44,50,56,62,68,74,80,86,92,
(0032) 98,103,109,115,120,126,131,136,142,147,152,157,162,167,171,176,
(0033) 180,185,189,193,197,201,205,208,212,215,219,222,225,228,231,233,
(0034) 236,238,240,242,244,246,247,249,250,251,252,253,254,254,255,255,
(0035) 255,255,255,254,254,253,252,251,250,249,247,246,244,242,240,238,
(0036) 236,233,231,228,225,222,219,215,212,208,205,201,197,193,189,185,
(0037) 180,176,171,167,162,157,152,147,142,136,131,126,120,115,109,103,
(0038) 98,92,86,80,74,68,62,56,50,44,37,31,25,19,13,6,
(0039) };
(0040) const unsigned char tabcos[]={
(0041) 255,255,255,254,254,253,252,251,250,249,247,246,244,242,240,238,
(0042) 236,233,231,228,225,222,219,215,212,208,205,201,197,193,189,185,
(0043) 180,176,171,167,162,157,152,147,142,136,131,126,120,115,109,103,
(0044) 98,92,86,80,74,68,62,56,50,44,37,31,25,19,13,6,
(0045) 0,6,13,19,25,31,37,44,50,56,62,68,74,80,86,92,
(0046) 98,103,109,115,120,126,131,136,142,147,152,157,162,167,171,176,
(0047) 180,185,189,193,197,201,205,208,212,215,219,222,225,228,231,233,
(0048) 236,238,240,242,244,246,247,249,250,251,252,253,254,254,255,255,
(0049) };
(0050)
(0051) #pragma data:data
(0052)
(0053) //全局变量
(0054) unsigned int speed; //16位速度寄存器
(0055) unsigned int out_ctr; //16位AD转换值寄存器
(0056) unsigned int pull_number; //闸门时间的脉冲数
(0057) unsigned int time_da; //16位D/A时间寄存器
(0058) unsigned int time_da0;
(0059) unsigned char key; //按键值
(0060) unsigned char da_counter; //8位计数器:纪录正在读取的细分表位置
(0061) unsigned char micros_nu; //8位寄存器:纪录细分数如4,8,16,32,64,128,256
(0062) unsigned char micros_nu0; //最终纪录细分数
(0063) unsigned char key_state; //1:禁止 0:允许
(0064) //key_state.0 run/stop
(0065) //key_state.1 cw/ccw
(0066) //key_state.2 max
(0067) //key_state.3 enter
(0068) //key_state.4
(0069) unsigned char key_counter; //键盘加减计数器
(0070) unsigned long disp_time_counter0;
(0071) unsigned long disp_time_counter1;
(0072) unsigned char add_dec_nu;
(0073) unsigned char ac_bd_state;
(0074) unsigned char state; //软件位状态寄存器
(0075) //state.0 正反转状态位 1正转 0反转
(0076) //state.1 全速标志 1全速 0正常
(0077) //state.2
(0078) //state.3 启停 1启 0停
(0079) //state.4
(0080) //state.5
(0081) //state.6
(0082) //state.7
(0083) unsigned char state_other;//软件位状态寄存器
(0084) //state.2 显示方式 1流量 0转速
(0085) //state.4 脚踏开关标志位 1脉冲 0电平
(0086) //state.5 外控方式 1关 0开
(0087) unsigned char state0; //软件位状态寄存器0
(0088) //state0.0 校正体积改变标志 1改变 0无改变
(0089) //state0.1 电机abcd相工作状态位 1为ab相 0为cd相
(0090) //state0.2 测试模式使能位 1使能 0禁止
(0091) //state0.3 在旋转编码开关控制函数里是否为第一次旋转 1第一次,0连续
(0092) //state0.4 定时分配标志 1分配 0停止
(0093) //state0.5 接收消息有效标志
(0094) //state0.6 显示 1转速 0流量
(0095) //state0.7 初始化启停 1启 0停
(0096) extern unsigned char state2;
(0097) //state2.0 disable_data 1:输入数据无效 0:有效;
(0098) //state2.1 remote 1:遥控输入有效 0:本地输入有效
(0099) //state2.2 1:外控关 0:外控开
(0100) //state2.3 1:键盘+10 0:键盘+1
(0101) //state2.4 1:允许输入数据 0:禁止输入数据
(0102) //state2.5 1:允许 0:停机
(0103) //state2.6 1:无外控模块 0:有外控模块
(0104) //state2.7 p99 1:P99指令使能 0:禁止
(0105) extern unsigned char state1;
(0106) //state1.7 1:电流 0:电压
(0107) unsigned char in_out_state;
(0108) unsigned char in_out_number;
(0109) unsigned char wrong;
(0110) /*
(0111) 0正常
(0112) 1数值下溢出
(0113) 2数值上溢出
(0114) 3
(0115) */
(0116) unsigned char counter;
(0117) unsigned int speed_pull;
(0118) extern unsigned char pump_tab;
(0119)
(0120) //定义中断向量
(0121) #pragma interrupt_handler time1_int:iv_TIMER1_COMPA
(0122) #pragma interrupt_handler time2_int:iv_TIMER2_COMP
(0123) #pragma interrupt_handler pull_int:iv_INT0
(0124)
(0125)
(0126) /******************************************************
(0127) D/A出细分波形中断函数(定时器1比较匹配中断)
(0128) ******************************************************/
(0129) void time1_int(void)
(0130) {
(0131) unsigned char i;
(0132) unsigned char j;
(0133) if (micros_nu==micros_nu0)
010D 90200075 LDS R2,micros_nu0
010F 90300076 LDS R3,micros_nu
0111 1432 CP R3,R2
0112 F449 BNE 0x011C
(0134) {time_da0=time_da;}
0113 9020007B LDS R2,time_da
0115 9030007C LDS R3,time_da+1
0117 9230007A STS time_da0+1,R3
0119 92200079 STS time_da0,R2
011B C010 RJMP 0x012C
(0135) else
(0136) {if (da_counter==128)
011C 91800077 LDS R24,da_counter
011E 3880 CPI R24,0x80
011F F461 BNE 0x012C
(0137) {
(0138) micros_nu0=micros_nu;
0120 90200076 LDS R2,micros_nu
0122 92200075 STS micros_nu0,R2
(0139) time_da0=time_da;
0124 9020007B LDS R2,time_da
0126 9030007C LDS R3,time_da+1
0128 9230007A STS time_da0+1,R3
012A 92200079 STS time_da0,R2
(0140) }
(0141) }
(0142) OCR1A=time_da0;
012C 90200079 LDS R2,time_da0
012E 9030007A LDS R3,time_da0+1
0130 BC3B OUT 0x2B,R3
0131 BC2A OUT 0x2A,R2
(0143) if (da_counter>=128)
0132 91800077 LDS R24,da_counter
0134 3880 CPI R24,0x80
0135 F018 BCS 0x0139
(0144) {da_counter=0;}
0136 2422 CLR R2
0137 92200077 STS da_counter,R2
(0145) i=tabsin[da_counter];
0139 E584 LDI R24,0x54
013A E090 LDI R25,0
013B 91E00077 LDS R30,da_counter
013D 27FF CLR R31
013E 0FE8 ADD R30,R24
013F 1FF9 ADC R31,R25
0140 9124 LPM R18,0(Z)
(0146) j=tabcos[da_counter];
0141 ED84 LDI R24,0xD4
0142 E090 LDI R25,0
0143 91E00077 LDS R30,da_counter
0145 27FF CLR R31
0146 0FE8 ADD R30,R24
0147 1FF9 ADC R31,R25
0148 9104 LPM R16,0(Z)
(0147) PORTD&=~(1<<DA_CS);
0149 9896 CBI 0x12,6
(0148) PORTD&=~(1<<DA_AB);
014A 9897 CBI 0x12,7
(0149) DATA_OUT=i; //送正弦值
014B BB28 OUT 0x18,R18
(0150) asm("nop");
014C 0000 NOP
(0151) PORTA&=~(1<<DA_WR);
014D 98D9 CBI 0x1B,1
(0152) PORTA|=(1<<DA_WR);
014E 9AD9 SBI 0x1B,1
(0153) PORTD|=(1<<DA_AB);
014F 9A97 SBI 0x12,7
(0154) DATA_OUT=j; //送正弦值
0150 BB08 OUT 0x18,R16
(0155) asm("nop");
0151 0000 NOP
(0156) PORTA&=~(1<<DA_WR);
0152 98D9 CBI 0x1B,1
(0157) PORTA|=(1<<DA_WR);
0153 9AD9 SBI 0x1B,1
(0158) PORTD|=(1<<DA_CS);
0154 9A96 SBI 0x12,6
(0159) if ((state|0b11111110)==0b11111110) //判断正反转
0155 91800068 LDS R24,state
0157 6F8E ORI R24,0xFE
0158 3F8E CPI R24,0xFE
0159 F531 BNE 0x0180
(0160) { //正转
(0161) if (ac_bd_state==0) //ac相处理
015A 90200069 LDS R2,ac_bd_state
015C 2022 TST R2
015D F489 BNE 0x016F
(0162) {
(0163) if (da_counter==0)
015E 90200077 LDS R2,da_counter
0160 2022 TST R2
0161 F431 BNE 0x0168
(0164) {
(0165) PORTC&=~(1<<DA_SIN);
0162 98AF CBI 0x15,7
(0166) PORTC&=~(1<<DA_COS);
0163 98AE CBI 0x15,6
(0167) ac_bd_state=1;
0164 E081 LDI R24,1
0165 93800069 STS ac_bd_state,R24
(0168) }
0167 C03D RJMP 0x01A5
(0169) else
(0170) {
(0171) if (da_counter==64)
0168 91800077 LDS R24,da_counter
016A 3480 CPI R24,0x40
016B F5C9 BNE 0x01A5
(0172) {
(0173) PORTC&=~(1<<DA_SIN);
016C 98AF CBI 0x15,7
(0174) PORTC|=(1<<DA_COS);
016D 9AAE SBI 0x15,6
(0175) }
(0176) }
(0177) }
016E C036 RJMP 0x01A5
(0178) else //bd相处理
(0179) {
(0180) if (da_counter==0)
016F 90200077 LDS R2,da_counter
0171 2022 TST R2
0172 F431 BNE 0x0179
(0181) {
(0182) PORTC|=(1<<DA_SIN);
0173 9AAF SBI 0x15,7
(0183) PORTC|=(1<<DA_COS);
0174 9AAE SBI 0x15,6
(0184) ac_bd_state=0;
0175 2422 CLR R2
0176 92200069 STS ac_bd_state,R2
(0185) }
0178 C02C RJMP 0x01A5
(0186) else
(0187) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -