⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 251.lst

📁 卡车仪表的单片机程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -