📄 251.lst
字号:
(0135) void timer0_init(void)
(0136) {
(0137) TCCR0 = 0x00; //sto
_timer0_init:
013A 2422 CLR R2
013B BE23 OUT 0x33,R2
(0138) TCNT0 = 0x3D; //setup
013C E38D LDI R24,0x3D
013D BF82 OUT 0x32,R24
(0139) TCCR0 = 0x05; //start Timer
013E E085 LDI R24,5
013F BF83 OUT 0x33,R24
0140 9508 RET
(0140) }
(0141)
(0142)
(0143) //TIMER1 initialize - prescale:8
(0144) // WGM: 0) Normal, TOP=0xFFFF
(0145) // 1.0485s Overflow
(0146) // actual value: 0.100Sec (0.0%)
(0147) // For speed meter time counting
(0148) void timer1_init(void)
(0149) {
(0150) TCCR1B = 0x00; //stop
_timer1_init:
0141 2422 CLR R2
0142 BC2E OUT 0x2E,R2
(0151) TCNT1H = 0x00; //setup
0143 BC2D OUT 0x2D,R2
(0152) TCNT1L = 0x00;
0144 BC2C OUT 0x2C,R2
(0153) OCR1AH = 0xC3;
0145 EC83 LDI R24,0xC3
0146 BD8B OUT 0x2B,R24
(0154) OCR1AL = 0x50;
0147 E580 LDI R24,0x50
0148 BD8A OUT 0x2A,R24
(0155) OCR1BH = 0xC3;
0149 EC83 LDI R24,0xC3
014A BD89 OUT 0x29,R24
(0156) OCR1BL = 0x50;
014B E580 LDI R24,0x50
014C BD88 OUT 0x28,R24
(0157) ICR1H = 0xC3;
014D EC83 LDI R24,0xC3
014E BD87 OUT 0x27,R24
(0158) ICR1L = 0x50;
014F E580 LDI R24,0x50
0150 BD86 OUT 0x26,R24
(0159) TCCR1A = 0x00;
0151 BC2F OUT 0x2F,R2
(0160) TCCR1B = 0x03; //start Timer
0152 E083 LDI R24,3
0153 BD8E OUT 0x2E,R24
0154 9508 RET
(0161) }
(0162)
(0163)
(0164)
(0165) //TIMER2 initialize - prescale:32
(0166) // WGM: Normal
(0167) // desired value: 1KHz
(0168) // actual value: 1.000KHz (0.0%)
(0169) // for motor
(0170) void timer2_init(void)
(0171) {
(0172) TCCR2 = 0x00; //stop
_timer2_init:
0155 2422 CLR R2
0156 BC25 OUT 0x25,R2
(0173) ASSR = 0x00; //set async mode
0157 BC22 OUT 0x22,R2
(0174) TCNT2 = 0x83; //setup
0158 E883 LDI R24,0x83
0159 BD84 OUT 0x24,R24
(0175) OCR2 = 0x7D;
015A E78D LDI R24,0x7D
015B BD83 OUT 0x23,R24
(0176) TCCR2 = 0x03; //start
015C E083 LDI R24,3
015D BD85 OUT 0x25,R24
015E 9508 RET
(0177) }
(0178)
(0179) //Watchdog initialize
(0180) // prescale: 1024K
(0181) void watchdog_init(void)
(0182) {
(0183) WDR(); //this prevents a timout on enabling
_watchdog_init:
015F 95A8 WDR
(0184) WDTCR = 0x0E; //WATCHDOG ENABLED - dont forget to issue WDRs
0160 E08E LDI R24,0xE
0161 BD81 OUT 0x21,R24
0162 9508 RET
_timer2_ovf_isr:
0163 922A ST R2,-Y
0164 938A ST R24,-Y
0165 B62F IN R2,0x3F
0166 922A ST R2,-Y
(0185) }
(0186)
(0187) //==========================================================
(0188) //=======================ISR==============================
(0189) //==========================================================
(0190)
(0191) #pragma interrupt_handler timer2_ovf_isr:5
(0192) void timer2_ovf_isr(void)
(0193) {
(0194) TCNT2 = 0x83; //reload counter value
0167 E883 LDI R24,0x83
0168 BD84 OUT 0x24,R24
(0195) //unblock motor
(0196) MotorBlocked = 0;
0169 2422 CLR R2
016A 9220006B STS MotorBlocked,R2
(0197) WDR();
016C 95A8 WDR
016D 9029 LD R2,Y+
016E BE2F OUT 0x3F,R2
016F 9189 LD R24,Y+
0170 9029 LD R2,Y+
0171 9518 RETI
_timer1_ovf_isr:
0172 922A ST R2,-Y
0173 938A ST R24,-Y
0174 93EA ST R30,-Y
0175 B62F IN R2,0x3F
0176 922A ST R2,-Y
0177 D853 RCALL push_gset2
(0198) }
(0199)
(0200) #pragma interrupt_handler timer1_ovf_isr:9
(0201) void timer1_ovf_isr(void)
(0202) {
(0203) TimeInterval = 100000*5;
0178 E240 LDI R20,0x20
0179 EA51 LDI R21,0xA1
017A E067 LDI R22,7
017B E070 LDI R23,0
017C 93500073 STS TimeInterval+1,R21
017E 93400072 STS TimeInterval,R20
0180 93700075 STS TimeInterval+3,R23
0182 93600074 STS TimeInterval+2,R22
(0204) TimeIntervalRefreshed = 1;
0184 E081 LDI R24,1
0185 93800070 STS TimeIntervalRefreshed,R24
(0205) SpeedUltraLow = 1;
0187 93800071 STS SpeedUltraLow,R24
(0206) if(!MileageSaved)
0189 902000C1 LDS R2,MileageSaved
018B 2022 TST R2
018C F429 BNE 0x0192
(0207) {
(0208) MileageSaveBlocked = 0; //Start Mileage Saving
018D 2422 CLR R2
018E 9220006F STS MileageSaveBlocked,R2
(0209) MileageSaved = 1;
0190 938000C1 STS MileageSaved,R24
(0210) }
0192 D82A RCALL pop_gset2
0193 9029 LD R2,Y+
0194 BE2F OUT 0x3F,R2
0195 91E9 LD R30,Y+
0196 9189 LD R24,Y+
0197 9029 LD R2,Y+
0198 9518 RETI
_timer0_ovf_isr:
0199 922A ST R2,-Y
019A 923A ST R3,-Y
019B 938A ST R24,-Y
019C 939A ST R25,-Y
019D B62F IN R2,0x3F
019E 922A ST R2,-Y
(0211) }
(0212)
(0213) #pragma interrupt_handler timer0_ovf_isr:10
(0214) void timer0_ovf_isr(void)
(0215) {
(0216) //TIMER1 has overflowed
(0217) TCNT0 = 0x3D; //reload counter
019F E38D LDI R24,0x3D
01A0 BF82 OUT 0x32,R24
(0218)
(0219) Timer0Div++;
01A1 9180006E LDS R24,Timer0Div
01A3 5F8F SUBI R24,0xFF
01A4 9380006E STS Timer0Div,R24
(0220) if(Timer0Div>=2) //Divid by 2
01A6 3082 CPI R24,2
01A7 F0A8 BCS 0x01BD
(0221) {
(0222) Timer0Div = 0;
01A8 2422 CLR R2
01A9 9220006E STS Timer0Div,R2
(0223) //speed motor is not controled by timer0
(0224)
(0225) //N motor pulse count
(0226) NPulse = NPulseCnt;
01AB 9020007A LDS R2,NPulseCnt
01AD 9030007B LDS R3,NPulseCnt+1
01AF 9230007D STS NPulse+1,R3
01B1 9220007C STS NPulse,R2
(0227) NPulseCnt = 0;
01B3 2422 CLR R2
01B4 2433 CLR R3
01B5 9230007B STS NPulseCnt+1,R3
01B7 9220007A STS NPulseCnt,R2
(0228)
(0229) //Wake up calculating
(0230) CalculateBlocked = 0;
01B9 9220006C STS CalculateBlocked,R2
(0231) ParallelBlocked = 0;
01BB 9220006D STS ParallelBlocked,R2
(0232) }
01BD 9029 LD R2,Y+
01BE BE2F OUT 0x3F,R2
01BF 9199 LD R25,Y+
01C0 9189 LD R24,Y+
01C1 9039 LD R3,Y+
01C2 9029 LD R2,Y+
01C3 9518 RETI
(0233) }
(0234)
(0235) //SPI initialize
(0236) // clock rate: 250000hz
(0237) void spi_init(void)
(0238) {
(0239) SPCR = 0x51; //setup SPI
_spi_init:
01C4 E581 LDI R24,0x51
01C5 B98D OUT 0x0D,R24
(0240) SPSR = 0x00; //setup SPI
01C6 2422 CLR R2
01C7 B82E OUT 0x0E,R2
01C8 9508 RET
(0241) }
(0242)
(0243) //ADC initialize
(0244) // Conversion time: 104uS
(0245) void adc_setmux(uchar channel)
(0246) {
(0247) if(channel>5)
_adc_setmux:
channel --> R16
01C9 E085 LDI R24,5
01CA 1780 CP R24,R16
01CB F408 BCC 0x01CD
(0248) channel = 0;
01CC 2700 CLR R16
(0249) ADMUX &= BIT(7)|BIT(6)|BIT(5)|BIT(4);
01CD B187 IN R24,0x07
01CE 7F80 ANDI R24,0xF0
01CF B987 OUT 0x07,R24
(0250) ADMUX |= channel;
01D0 B027 IN R2,0x07
01D1 2A20 OR R2,R16
01D2 B827 OUT 0x07,R2
01D3 9508 RET
(0251) }
(0252)
(0253) void adc_init(void)
(0254) {
(0255) ADCSR = 0x00; //disable adc
_adc_init:
01D4 2422 CLR R2
01D5 B826 OUT 0x06,R2
(0256) ADMUX = 0x40; //select adc input 0, select AVCC=VREF
01D6 E480 LDI R24,0x40
01D7 B987 OUT 0x07,R24
(0257) ACSR = 0x80;
01D8 E880 LDI R24,0x80
01D9 B988 OUT 0x08,R24
(0258) ADCSR = 0xED; //ADEN=1,ADSC=1(start),ADFR=1(freerun),ADIE(interrupt enable)=1 32div
01DA EE8D LDI R24,0xED
01DB B986 OUT 0x06,R24
01DC 9508 RET
_adc_isr:
01DD D82B RCALL push_lset
(0259) }
(0260)
(0261) #pragma interrupt_handler adc_isr:15
(0262) void adc_isr(void)
(0263) {
(0264) //1. conversion complete, read value (int) using...
(0265) Voltage[ADCCurrentChannel]=ADCL; //Read 8 low bits first (important)
01DE 90200080 LDS R2,ADCCurrentChannel
01E0 E082 LDI R24,2
01E1 9D82 MUL R24,R2
01E2 01F0 MOVW R30,R0
01E3 E881 LDI R24,0x81
01E4 E090 LDI R25,0
01E5 0FE8 ADD R30,R24
01E6 1FF9 ADC R31,R25
01E7 B024 IN R2,0x04
01E8 2433 CLR R3
01E9 8231 STD Z+1,R3
01EA 8220 STD Z+0,R2
(0266) Voltage[ADCCurrentChannel]|=(int)ADCH << 8; //read 2 high bits and shift into top byte //
01EB 90200080 LDS R2,ADCCurrentChannel
01ED E082 LDI R24,2
01EE 9D82 MUL R24,R2
01EF 0110 MOVW R2,R0
01F0 E881 LDI R24,0x81
01F1 E090 LDI R25,0
01F2 0E28 ADD R2,R24
01F3 1E39 ADC R3,R25
01F4 B045 IN R4,0x05
01F5 2455 CLR R5
01F6 2C54 MOV R5,R4
01F7 2444 CLR R4
01F8 01F1 MOVW R30,R2
01F9 8060 LDD R6,Z+0
01FA 8071 LDD R7,Z+1
01FB 2864 OR R6,R4
01FC 2875 OR R7,R5
01FD 8271 STD Z+1,R7
01FE 8260 STD Z+0,R6
(0267) VoltageRefreshed[ADCCurrentChannel] = 1;
01FF E989 LDI R24,0x99
0200 E090 LDI R25,0
0201 91E00080 LDS R30,ADCCurrentChannel
0203 27FF CLR R31
0204 0FE8 ADD R30,R24
0205 1FF9 ADC R31,R25
0206 E081 LDI R24,1
0207 8380 STD Z+0,R24
(0268)
(0269) //2. NextChannel
(0270) ++ADCCurrentChannel;
0208 91800080 LDS R24,ADCCurrentChannel
020A 5F8F SUBI R24,0xFF
020B 93800080 STS ADCCurrentChannel,R24
(0271) if(ADCCurrentChannel>5)
020D E085 LDI R24,5
020E 90200080 LDS R2,ADCCurrentChannel
0210 1582 CP R24,R2
0211 F418 BCC 0x0215
(0272) ADCCurrentChannel = 0;
0212 2422 CLR R2
0213 92200080 STS ADCCurrentChannel,R2
(0273)
(0274) //3.Set MUX
(0275) adc_setmux(ADCCurrentChannel+1);
0215 91000080 LDS R16,ADCCurrentChannel
0217 5F0F SUBI R16,0xFF
0218 DFB0 RCALL _adc_setmux
(0276) //4.CLEAR INTERUPT FLAG ADIF
(0277) ADCSR |= BIT(ADIF);
0219 9A34 SBI 0x06,4
021A D805 RCALL pop_lset
021B 9518 RETI
_int0_isr:
021C 922A ST R2,-Y
021D 923A ST R3,-Y
021E 924A ST R4,-Y
021F 925A ST R5,-Y
0220 930A ST R16,-Y
0221 931A ST R17,-Y
0222 932A ST R18,-Y
0223 933A ST R19,-Y
0224 938A ST R24,-Y
0225 939A ST R25,-Y
0226 93AA ST R26,-Y
0227 93BA ST R27,-Y
0228 93EA ST R30,-Y
0229 B62F IN R2,0x3F
022A 922A ST R2,-Y
022B D79F RCALL push_gset2
(0278) }
(0279)
(0280) #pragma interrupt_handler int0_isr:2
(0281) void int0_isr(void)//speed
(0282) {
(0283) //external interupt on INT0
(0284) //1.Read Interval
(0285) CLI();
022C 94F8 BCLR 7
(0286) if(SpeedUltraLow)
022D 90200071 LDS R2,SpeedUltraLow
022F 2022 TST R2
0230 F021 BEQ 0x0235
(0287) SpeedUltraLow = 0;
0231 2422 CLR R2
0232 92200071 STS SpeedUltraLow,R2
0234 C012 RJMP 0x0247
(0288) else if (!(TIFR&BIT(TOV1)))
0235 B628 IN R2,0x38
0236 FC22 SBRC R2,2
0237 C00F RJMP 0x0247
(0289) {
(0290) TimeInterval = TCNT1;
0238 B42C IN R2,0x2C
0239 B43D IN R3,0x2D
023A 2444 CLR R4
023B 2455 CLR R5
023C 92300073 STS TimeInterval+1,R3
023E 92200072 STS TimeInterval,R2
0240 92500075 STS TimeInterval+3,R5
0242 92400074 STS TimeInterval+2,R4
(0291) TimeIntervalRefreshed = 1;
0244 E081 LDI R24,1
0245 93800070 STS TimeIntervalRefreshed,R24
(0292) }
(0293)
(0294) //Mileage Counting
(0295) MileagePulseCnt++;
0247 918000BF LDS R24,MileagePulseCnt
0249 919000C0 LDS R25,MileagePulseCnt+1
024B 9601 ADIW R24,1
024C 939000C0 STS MileagePulseCnt+1,R25
024E 938000BF STS MileagePulseCnt,R24
(0296) if (MileagePulseCnt>=998)
0250 3E86 CPI R24,0xE6
0251 E0E3 LDI R30,3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -