📄 main.lst
字号:
__text_start:
__start:
001A EFCF LDI R28,0xFF
001B E0D2 LDI R29,2
001C BFCD OUT 0x3D,R28
001D BFDE OUT 0x3E,R29
001E 51C0 SUBI R28,0x10
001F 40D0 SBCI R29,0
0020 EA0A LDI R16,0xAA
0021 8308 STD Y+0,R16
0022 2400 CLR R0
0023 E0E0 LDI R30,0
0024 E0F1 LDI R31,1
0025 E011 LDI R17,1
0026 31EB CPI R30,0x1B
0027 07F1 CPC R31,R17
0028 F011 BEQ 0x002B
0029 9201 ST R0,Z+
002A CFFB RJMP 0x0026
002B 8300 STD Z+0,R16
002C E3E4 LDI R30,0x34
002D E0F0 LDI R31,0
002E E0A0 LDI R26,0
002F E0B1 LDI R27,1
0030 E010 LDI R17,0
0031 33E4 CPI R30,0x34
0032 07F1 CPC R31,R17
0033 F021 BEQ 0x0038
0034 95C8 LPM
0035 9631 ADIW R30,1
0036 920D ST R0,X+
0037 CFF9 RJMP 0x0031
0038 D3E9 RCALL _main
_exit:
0039 CFFF RJMP _exit
FILE: E:\TWINTI~1\main.c
(0001) /********************************************************************************/
(0002) //
(0003) // builder : 2007-04-10
(0004) // Target : ATMEAG 48V
(0005) // Crystal : 内部 8.00 MHz
(0006) //
(0007) //
(0008)
(0009) /********************************************************************************/
(0010)
(0011) #include <iom48v.h>
(0012) #include <macros.h>
(0013)
(0014) #include "eeprom.h"
(0015) #include "time2.h"
(0016) #include "adc.h"
(0017)
(0018)
(0019) #define uchar unsigned char
(0020) #define uint unsigned int
(0021)
(0022) #define SET_LED PORTD |= (1<<PB4)
(0023) #define CLR_LED PORTD &= ~(1<<PB4)
(0024)
(0025) uchar e2rom[7];
(0026)
(0027) uint PE1,PE2;
(0028)
(0029) uchar mode;
(0030) uchar rxd_flag; // 油门接收OK标志
(0031)
(0032) uchar PWM;
(0033) uint Timer;
(0034) uint high,middle,low;
(0035) uchar REV;
(0036) uchar power;
(0037) uchar heat;
(0038) union
(0039) { uint temp;
(0040) uchar data[2];
(0041) }time;
(0042)
(0043)
(0044) /*---------------------------------------------------------------
(0045) 初始化
(0046) ----------------------------------------------------------------*/
(0047) void timer0_init(void)
(0048) {
(0049) TCCR0B = 0x00; //stop
_timer0_init:
003A 2422 CLR R2
003B BC25 OUT 0x25,R2
(0050) TCNT0 = 0x01; //set count
003C E081 LDI R24,1
003D BD86 OUT 0x26,R24
(0051) TCCR0A = 0x23;
003E E283 LDI R24,0x23
003F BD84 OUT 0x24,R24
(0052) OCR0B = 0xA5;
0040 EA85 LDI R24,0xA5
0041 BD88 OUT 0x28,R24
(0053) TCCR0B = 0x01; //start timer
0042 E081 LDI R24,1
0043 BD85 OUT 0x25,R24
0044 9508 RET
(0054) }
(0055)
(0056)
(0057)
(0058) void timer1_init(void) // 20MS 中断
(0059) {
(0060) TCCR1B = 0x00; // stop
_timer1_init:
0045 2422 CLR R2
0046 92200081 STS 0x81,R2
(0061) TCNT1H = 0xB1; // setup
0048 EB81 LDI R24,0xB1
0049 93800085 STS 0x85,R24
(0062) TCNT1L = 0xE0;
004B EE80 LDI R24,0xE0
004C 93800084 STS 0x84,R24
(0063) OCR1AH = 0x4E;
004E E48E LDI R24,0x4E
004F 93800089 STS 0x89,R24
(0064) OCR1AL = 0x20;
0051 E280 LDI R24,0x20
0052 93800088 STS 0x88,R24
(0065) OCR1BH = 0x4E;
0054 E48E LDI R24,0x4E
0055 9380008B STS 0x8B,R24
(0066) OCR1BL = 0x20;
0057 E280 LDI R24,0x20
0058 9380008A STS 0x8A,R24
(0067) ICR1H = 0x4E;
005A E48E LDI R24,0x4E
005B 93800087 STS 0x87,R24
(0068) ICR1L = 0x20;
005D E280 LDI R24,0x20
005E 93800086 STS 0x86,R24
(0069) TCCR1A = 0x00;
0060 92200080 STS 0x80,R2
0062 9508 RET
(0070) }
(0071)
(0072)
(0073) void init_devices(void)
(0074) {
(0075) CLI();
_init_devices:
0063 94F8 BCLR 7
(0076)
(0077) DDRB = 0x7F;
0064 E78F LDI R24,0x7F
0065 B984 OUT 0x04,R24
(0078) PORTB = 0xC0;
0066 EC80 LDI R24,0xC0
0067 B985 OUT 0x05,R24
(0079)
(0080) DDRC = 0x00;
0068 2422 CLR R2
0069 B827 OUT 0x07,R2
(0081) PORTC = 0x40; // m103 output only
006A E480 LDI R24,0x40
006B B988 OUT 0x08,R24
(0082)
(0083) DDRD = 0xFB;
006C EF8B LDI R24,0xFB
006D B98A OUT 0x0A,R24
(0084) PORTD = 0x40;
006E E480 LDI R24,0x40
006F B98B OUT 0x0B,R24
(0085)
(0086) MCUCR = 0x00;
0070 BE25 OUT 0x35,R2
(0087) EICRA = 0x03; // INT0 上升沿触发
0071 E083 LDI R24,3
0072 93800069 STS 0x69,R24
(0088) EIMSK = 0x01; // 使能 INT0 中断
0074 E081 LDI R24,1
0075 BB8D OUT 0x1D,R24
(0089)
(0090) timer0_init();
0076 DFC3 RCALL _timer0_init
(0091) timer1_init();
0077 DFCD RCALL _timer1_init
(0092) timer2_init();
0078 D43B RCALL _timer2_init
(0093) init_eeprom();
0079 D42A RCALL _init_eeprom
(0094) adc_int();
007A D3BF RCALL _adc_int
(0095)
(0096) SEI();
007B 9478 BSET 7
007C 9508 RET
_delay:
i --> R20
j --> R22
k --> R10
t --> R16
007D D4A2 RCALL push_gset3
(0097) }
(0098)
(0099) /*---------------------------------------------------------------
(0100) 延时
(0101) ----------------------------------------------------------------*/
(0102)
(0103) void delay(uint t)
(0104) {
(0105) uint i,j,k;
(0106)
(0107) for(i=0;i<t;i++)
007E 2744 CLR R20
007F 2755 CLR R21
0080 C016 RJMP 0x0097
(0108) {
(0109) for(j=0;j<200;j++)
0081 2766 CLR R22
0082 2777 CLR R23
0083 C00D RJMP 0x0091
(0110) {
(0111) for(k=0;k<50;k++);;
0084 24AA CLR R10
0085 24BB CLR R11
0086 C003 RJMP 0x008A
0087 01C5 MOVW R24,R10
0088 9601 ADIW R24,1
0089 015C MOVW R10,R24
008A 01C5 MOVW R24,R10
008B 3382 CPI R24,0x32
008C E0E0 LDI R30,0
008D 079E CPC R25,R30
008E F3C0 BCS 0x0087
008F 5F6F SUBI R22,0xFF
0090 4F7F SBCI R23,0xFF
0091 3C68 CPI R22,0xC8
0092 E0E0 LDI R30,0
0093 077E CPC R23,R30
0094 F378 BCS 0x0084
0095 5F4F SUBI R20,0xFF
0096 4F5F SBCI R21,0xFF
0097 1740 CP R20,R16
0098 0751 CPC R21,R17
0099 F338 BCS 0x0081
009A D47D RCALL pop_gset3
009B 9508 RET
(0112) }
(0113) }
(0114) }
(0115)
(0116)
(0117) void LED_set(void)
(0118) {
(0119) SET_LED ;
_LED_set:
009C 9A5C SBI 0x0B,4
(0120) delay(10);
009D E00A LDI R16,0xA
009E E010 LDI R17,0
009F DFDD RCALL _delay
(0121) CLR_LED ;
00A0 985C CBI 0x0B,4
(0122) delay(8);
00A1 E008 LDI R16,0x8
00A2 E010 LDI R17,0
00A3 DFD9 RCALL _delay
00A4 9508 RET
_egis:
temp --> R20
00A5 D47E RCALL push_gset1
(0123) }
(0124)
(0125) void egis(void)
(0126) {
(0127) uint temp;
(0128)
(0129) temp = adc_colect(1);
00A6 E001 LDI R16,1
00A7 D399 RCALL _adc_colect
00A8 01A8 MOVW R20,R16
(0130) if(temp<0x1D0 && power<200) power ++;
00A9 3D00 CPI R16,0xD0
00AA E0E1 LDI R30,1
00AB 071E CPC R17,R30
00AC F440 BCC 0x00B5
00AD 91800103 LDS R24,power
00AF 3C88 CPI R24,0xC8
00B0 F420 BCC 0x00B5
00B1 5F8F SUBI R24,0xFF
00B2 93800103 STS power,R24
00B4 C008 RJMP 0x00BD
(0131) else if(temp>0x1DF)power = 0;
00B5 ED8F LDI R24,0xDF
00B6 E091 LDI R25,1
00B7 1784 CP R24,R20
00B8 0795 CPC R25,R21
00B9 F418 BCC 0x00BD
00BA 2422 CLR R2
00BB 92200103 STS power,R2
(0132)
(0133) if(power>3 && PWM<50)
00BD E083 LDI R24,3
00BE 90200103 LDS R2,power
00C0 1582 CP R24,R2
00C1 F4E0 BCC 0x00DE
00C2 9180010D LDS R24,PWM
00C4 3382 CPI R24,0x32
00C5 F4C0 BCC 0x00DE
(0134) {
(0135) PWM = 0;
00C6 2422 CLR R2
00C7 9220010D STS PWM,R2
(0136) Pwm_set(0,0);
00C9 2722 CLR R18
00CA 2700 CLR R16
00CB D3F9 RCALL _Pwm_set
(0137) delay(5);
00CC E005 LDI R16,5
00CD E010 LDI R17,0
00CE DFAE RCALL _delay
(0138) temp = 0;
00CF 2744 CLR R20
00D0 2755 CLR R21
00D1 C008 RJMP 0x00DA
(0139) while(temp<0x1df)
(0140) {
(0141) temp = adc_colect(1);
00D2 E001 LDI R16,1
00D3 D36D RCALL _adc_colect
00D4 01A8 MOVW R20,R16
(0142) LED_set();
00D5 DFC6 RCALL _LED_set
(0143) Buz();
00D6 D13E RCALL _Buz
(0144) delay(20);
00D7 E104 LDI R16,0x14
00D8 E010 LDI R17,0
00D9 DFA3 RCALL _delay
00DA 3D4F CPI R20,0xDF
00DB E0E1 LDI R30,1
00DC 075E CPC R21,R30
00DD F3A0 BCS 0x00D2
(0145) }
(0146) }
(0147)
(0148)
(0149) temp = adc_colect(2);
00DE E002 LDI R16,2
00DF D361 RCALL _adc_colect
00E0 01A8 MOVW R20,R16
(0150) if(temp>0x3BF && heat<200) heat ++; // >110度
00E1 EB8F LDI R24,0xBF
00E2 E093 LDI R25,3
00E3 1780 CP R24,R16
00E4 0791 CPC R25,R17
00E5 F440 BCC 0x00EE
00E6 91800102 LDS R24,heat
00E8 3C88 CPI R24,0xC8
00E9 F420 BCC 0x00EE
00EA 5F8F SUBI R24,0xFF
00EB 93800102 STS heat,R24
00ED C007 RJMP 0x00F5
(0151) else if(temp<0x38E)heat = 0; // <80度
00EE 384E CPI R20,0x8E
00EF E0E3 LDI R30,3
00F0 075E CPC R21,R30
00F1 F418 BCC 0x00F5
00F2 2422 CLR R2
00F3 92200102 STS heat,R2
(0152)
(0153) if(heat>3 && PWM<50)
00F5 E083 LDI R24,3
00F6 90200102 LDS R2,heat
00F8 1582 CP R24,R2
00F9 F4F8 BCC 0x0119
00FA 9180010D LDS R24,PWM
00FC 3382 CPI R24,0x32
00FD F4D8 BCC 0x0119
(0154) {
(0155) PWM = 0;
00FE 2422 CLR R2
00FF 9220010D STS PWM,R2
(0156) Pwm_set(0,0);
0101 2722 CLR R18
0102 2700 CLR R16
0103 D3C1 RCALL _Pwm_set
(0157) delay(5);
0104 E005 LDI R16,5
0105 E010 LDI R17,0
0106 DF76 RCALL _delay
(0158) temp = 0xfff;
0107 EF4F LDI R20,0xFF
0108 E05F LDI R21,0xF
0109 C00A RJMP 0x0114
(0159) while(temp>0x38E)
(0160) {
(0161) temp = adc_colect(2);
010A E002 LDI R16,2
010B D335 RCALL _adc_colect
010C 01A8 MOVW R20,R16
(0162) LED_set();
010D DF8E RCALL _LED_set
(0163) LED_set();
010E DF8D RCALL _LED_set
(0164) Buz();
010F D105 RCALL _Buz
(0165) Buz();
0110 D104 RCALL _Buz
(0166) delay(20);
0111 E104 LDI R16,0x14
0112 E010 LDI R17,0
0113 DF69 RCALL _delay
0114 E88E LDI R24,0x8E
0115 E093 LDI R25,3
0116 1784 CP R24,R20
0117 0795 CPC R25,R21
0118 F388 BCS 0x010A
(0167) }
(0168) }
0119 D40D RCALL pop_gset1
011A 9508 RET
(0169) }
(0170)
(0171) /*---------------------------------------------------------------
(0172) 油门处理
(0173) ----------------------------------------------------------------*/
(0174)
(0175) void Gun_set(void)
(0176) {
(0177) if(rxd_flag) // 接收已完成
_Gun_set:
011B 9020010E LDS R2,rxd_flag
011D 2022 TST R2
011E F409 BNE 0x0120
011F C0BF RJMP 0x01DF
(0178) {
(0179) rxd_flag = 0;
0120 2422 CLR R2
0121 9220010E STS rxd_flag,R2
(0180)
(0181) if(Timer>high) Timer = high; // 确保接收到的数据在正常范围内
0123 90200109 LDS R2,high
0125 9030010A LDS R3,high+1
0127 9040010B LDS R4,Timer
0129 9050010C LDS R5,Timer+1
012B 1424 CP R2,R4
012C 0435 CPC R3,R5
012D F420 BCC 0x0132
012E 9230010C STS Timer+1,R3
0130 9220010B STS Timer,R2
(0182) if(Timer<low) Timer = low;
0132 90200105 LDS R2,low
0134 90300106 LDS R3,low+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -