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

📄 251.s

📁 卡车仪表的单片机程序
💻 S
📖 第 1 页 / 共 5 页
字号:
	.word 0,0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e MileageCurrent _MileageCurrent l
_MileagePulseCnt::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e MileagePulseCnt _MileagePulseCnt i
_MileageSaved::
	.blkb 1
	.area idata
	.byte 1
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e MileageSaved _MileageSaved c
_SpeedMotorCurrent::
	.blkb 2
	.area idata
	.word 2880
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e SpeedMotorCurrent _SpeedMotorCurrent I
_SpeedMotorSetting::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e SpeedMotorSetting _SpeedMotorSetting I
_NMotorCurrent::
	.blkb 2
	.area idata
	.word 2880
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e NMotorCurrent _NMotorCurrent I
_NMotorSetting::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e NMotorSetting _NMotorSetting I
_VoltageMotorSetting::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e VoltageMotorSetting _VoltageMotorSetting A[12:6]i
_VoltageMotorCurrent::
	.blkb 2
	.area idata
	.word 2880
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 2880
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 2880
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 2880
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 2880
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.word 2880
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e VoltageMotorCurrent _VoltageMotorCurrent A[12:6]i
_LCDContent::
	.blkb 2
	.area idata
	.byte 0,1
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.byte 2,3
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.byte 4,5
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.byte 6,8
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.byte 8,7
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 2
	.area idata
	.byte 8,9
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.blkb 1
	.area idata
	.byte 10
	.area data(ram, con, rel)
	.dbfile D:\prog251\251.c
	.dbsym e LCDContent _LCDContent A[13:13]c
	.area lit(rom, con, rel)
_SpeedAlarm::
	.word 1414
	.word 707
	.word 471
	.word 282
	.dbsym e SpeedAlarm _SpeedAlarm A[8:4]ki
_SpeedAlarmOut::
	.byte 2,3
	.byte 4,1
	.dbsym e SpeedAlarmOut _SpeedAlarmOut A[4:4]kc
	.area text(rom, con, rel)
	.dbfile D:\prog251\251.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 121
; NMotorCurrent = MaxAngle;
; NMotorSetting = 0;
; unint VoltageMotorSetting[6] = {0,0,0,0,0,0};
; unint VoltageMotorCurrent[6] = {MaxAngle,MaxAngle,MaxAngle,MaxAngle,MaxAngle,MaxAngle};
; 
; //Parallel Output
; unint ParallelOutputCmd;
; 
; //LCD
; uchar LCDContent[13] = {0,1,2,3,4,5,6,8,8,7,8,9,10};
; 
; //Alarm
; #define ThresholdOil	  166
; #define ThresholdTemp	  186
; #define ThresholdOilP	  145
; #define ThresholdAir	  339
; #define ThresholdVoltL	  300
; #define ThresholdVoltH	  450
; #define AlarmLedOil		  5
; #define AlarmLedTemp  	  7
; #define AlarmLedOilP  	  6
; #define AlarmLedAir1  	  8
; #define AlarmLedAir2  	  9
; #define AlarmLedVoltL  	  10
; #define AlarmLedVoltH  	  11
; const unint SpeedAlarm[4] = {
;  (Timer1UnitMaxSpeed*MaxSpeed/20),
;  (Timer1UnitMaxSpeed*MaxSpeed/40),
;  (Timer1UnitMaxSpeed*MaxSpeed/60),
;  (Timer1UnitMaxSpeed*MaxSpeed/100)};
; const uchar SpeedAlarmOut[4] = {
;  2,
;  3,
;  4,
;  1}; 
; 
; 
; void port_init(void)
; {
	.dbline 122
;  PORTB = 0x84;
	ldi R24,132
	out 0x18,R24
	.dbline 123
;  DDRB  = 0xef;
	ldi R24,239
	out 0x17,R24
	.dbline 124
;  PORTC = 0x00; //m103 output only
	clr R2
	out 0x15,R2
	.dbline 125
;  DDRC  = 0x40;
	ldi R24,64
	out 0x14,R24
	.dbline 126
;  PORTD = 0xA0;
	ldi R24,160
	out 0x12,R24
	.dbline 127
;  DDRD  = 0x23;
	ldi R24,35
	out 0x11,R24
	.dbline -2
L27:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer0_init _timer0_init fV
	.even
_timer0_init::
	.dbline -1
	.dbline 136
; }
; 
; //TIMER0 initialize - prescale:8
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value: 0.05Sec
; // actual value:  0.05Sec (0.0%)
; // Generate 0.1s event. For calculating & N meter counting 
; void timer0_init(void)
; {
	.dbline 137
;  TCCR0 = 0x00; //sto
	clr R2
	out 0x33,R2
	.dbline 138
;  TCNT0 = 0x3D; //setup
	ldi R24,61
	out 0x32,R24
	.dbline 139
;  TCCR0 = 0x05; //start Timer
	ldi R24,5
	out 0x33,R24
	.dbline -2
L28:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer1_init _timer1_init fV
	.even
_timer1_init::
	.dbline -1
	.dbline 149
; }
; 
; 
; //TIMER1 initialize - prescale:8
; // WGM: 0) Normal, TOP=0xFFFF
; // 1.0485s Overflow
; // actual value:  0.100Sec (0.0%)
; // For speed meter time counting
; void timer1_init(void)
; {
	.dbline 150
;  TCCR1B = 0x00; //stop
	clr R2
	out 0x2e,R2
	.dbline 151
;  TCNT1H = 0x00; //setup
	out 0x2d,R2
	.dbline 152
;  TCNT1L = 0x00;
	out 0x2c,R2
	.dbline 153
;  OCR1AH = 0xC3;
	ldi R24,195
	out 0x2b,R24
	.dbline 154
;  OCR1AL = 0x50;
	ldi R24,80
	out 0x2a,R24
	.dbline 155
;  OCR1BH = 0xC3;
	ldi R24,195
	out 0x29,R24
	.dbline 156
;  OCR1BL = 0x50;
	ldi R24,80
	out 0x28,R24
	.dbline 157
;  ICR1H  = 0xC3;
	ldi R24,195
	out 0x27,R24
	.dbline 158
;  ICR1L  = 0x50;
	ldi R24,80
	out 0x26,R24
	.dbline 159
;  TCCR1A = 0x00;
	out 0x2f,R2
	.dbline 160
;  TCCR1B = 0x03; //start Timer
	ldi R24,3
	out 0x2e,R24
	.dbline -2
L29:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer2_init _timer2_init fV
	.even
_timer2_init::
	.dbline -1
	.dbline 171
; }
; 
; 
; 
; //TIMER2 initialize - prescale:32
; // WGM: Normal
; // desired value: 1KHz
; // actual value:  1.000KHz (0.0%)
; // for motor
; void timer2_init(void)
; {
	.dbline 172
;  TCCR2 = 0x00; //stop
	clr R2
	out 0x25,R2
	.dbline 173
;  ASSR  = 0x00; //set async mode
	out 0x22,R2
	.dbline 174
;  TCNT2 = 0x83; //setup
	ldi R24,131
	out 0x24,R24
	.dbline 175
;  OCR2  = 0x7D;
	ldi R24,125
	out 0x23,R24
	.dbline 176
;  TCCR2 = 0x03; //start
	ldi R24,3
	out 0x25,R24
	.dbline -2
L30:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e watchdog_init _watchdog_init fV
	.even
_watchdog_init::
	.dbline -1
	.dbline 182
; }
; 
; //Watchdog initialize
; // prescale: 1024K
; void watchdog_init(void)
; {
	.dbline 183
;  WDR(); //this prevents a timout on enabling
	wdr
	.dbline 184
;  WDTCR = 0x0E; //WATCHDOG ENABLED - dont forget to issue WDRs
	ldi R24,14
	out 0x21,R24
	.dbline -2
L31:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 8
	rjmp _timer2_ovf_isr
	.area text(rom, con, rel)
	.dbfile D:\prog251\251.c
	.dbfunc e timer2_ovf_isr _timer2_ovf_isr fV
	.even
_timer2_ovf_isr::
	st -y,R2
	st -y,R24
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 193
; }
; 
; //==========================================================
; //=======================ISR==============================
; //==========================================================
; 
; #pragma interrupt_handler timer2_ovf_isr:5
; void timer2_ovf_isr(void)
; {
	.dbline 194
;  TCNT2 = 0x83; //reload counter value
	ldi R24,131
	out 0x24,R24
	.dbline 196
;  //unblock motor
;  MotorBlocked = 0;
	clr R2
	sts _MotorBlocked,R2
	.dbline 197
;  WDR();
	wdr
	.dbline -2
L32:
	ld R2,y+
	out 0x3f,R2
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.area vector(rom, abs)
	.org 16
	rjmp _timer1_ovf_isr
	.area text(rom, con, rel)
	.dbfile D:\prog251\251.c
	.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
	.even
_timer1_ovf_isr::
	st -y,R2
	st -y,R24
	st -y,R30
	in R2,0x3f
	st -y,R2
	rcall push_gset2
	.dbline -1
	.dbline 202
	.dbline 203
	ldi R20,32
	ldi R21,161
	ldi R22,7
	ldi R23,0
	sts _TimeInterval+1,R21
	sts _TimeInterval,R20
	sts _TimeInterval+2+1,R23
	sts _TimeInterval+2,R22
	.dbline 204
	ldi R24,1
	sts _TimeIntervalRefreshed,R24
	.dbline 205
	sts _SpeedUltraLow,R24
	.dbline 206
	lds R2,_MileageSaved
	tst R2
	brne L34
	.dbline 207
	.dbline 208
	clr R2
	sts _MileageSaveBlocked,R2
	.dbline 209
	sts _MileageSaved,R24
	.dbline 210
L34:
	.dbline -2
L33:
	rcall pop_gset2
	ld R2,y+
	out 0x3f,R2
	ld R30,y+
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.area vector(rom, abs)
	.org 18
	rjmp _timer0_ovf_isr
	.area text(rom, con, rel)
	.dbfile D:\prog251\251.c
	.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
	.even
_timer0_ovf_isr::
	st -y,R2
	st -y,R3
	st -y,R24
	st -y,R25
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 215
	.dbline 217
	ldi R24,61
	out 0x32,R24
	.dbline 219
	lds R24,_Timer0Div
	subi R24,255    ; addi 1
	sts _Timer0Div,R24
	.dbline 220
	cpi R24,2
	brlo L37
	.dbline 221
	.dbline 222
	clr R2
	sts _Timer0Div,R2
	.dbline 226
	lds R2,_NPulseCnt
	lds R3,_NPulseCnt+1
	sts _NPulse+1,R3
	sts _NPulse,R2
	.dbline 227
	clr R2
	clr R3
	sts _NPulseCnt+1,R3
	sts _NPulseCnt,R2
	.dbline 230
	sts _CalculateBlocked,R2
	.dbline 231
	sts _ParallelBlocked,R2
	.dbline 232
L37:
	.dbline -2
L36:
	ld R2,y+
	out 0x3f,R2
	ld R25,y+
	ld R24,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e spi_init _spi_init fV
	.even
_spi_init::
	.dbline -1
	.dbline 238
; }
; 
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void)
; {
;  TimeInterval = 100000*5;
;  TimeIntervalRefreshed = 1;
;  SpeedUltraLow = 1; 
;  if(!MileageSaved)
;  {
;    MileageSaveBlocked = 0; //Start Mileage Saving 
;    MileageSaved = 1;
;  }
; }
; 
; #pragma interrupt_handler timer0_ovf_isr:10
; void timer0_ovf_isr(void)
; {
;  //TIMER1 has overflowed
;  TCNT0 = 0x3D; //reload counter 
;  
;  Timer0Div++;
;  if(Timer0Div>=2)   //Divid by 2
;  {
;    Timer0Div = 0;
;    //speed motor is not controled by timer0
;  
;    //N motor pulse count
;    NPulse = NPulseCnt;
;    NPulseCnt = 0;
;    
;    //Wake up calculating
;    CalculateBlocked = 0;
;    ParallelBlocked = 0;
;  }
; }
; 
; //SPI initialize
; // clock rate: 250000hz
; void spi_init(void)
; {
	.dbline 239
;  SPCR = 0x51; //setup SPI
	ldi R24,81
	out 0xd,R24
	.dbline 240
;  SPSR = 0x00; //setup SPI
	clr R2
	out 0xe,R2
	.dbline -2
L39:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e adc_setmux _adc_setmux fV
;        channel -> R16
	.even
_adc_setmux::
	.dbline -1
	.dbline 246
; }
; 
; //ADC initialize
; // Conversion time: 104uS
; void adc_setmux(uchar channel)
; {
	.dbline 247
;    if(channel>5)
	ldi R24,5
	cp R24,R16
	brsh L41
	.dbline 248
;      channel = 0;
	clr R16
L41:
	.dbline 249
;    ADMUX &= BIT(7)|BIT(6)|BIT(5)|BIT(4);
	in R24,0x7
	andi R24,240
	out 0x7,R24
	.dbline 250
;    ADMUX |= channel;
	in R2,0x7
	or R2,R16
	out 0x7,R2
	.dbline -2
L40:
	.dbline 0 ; func end
	ret
	.dbsym r channel 16 c
	.dbend
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 254
; }
; 
; void adc_init(void)
; {
	.dbline 255
;  ADCSR = 0x00; //disable adc
	clr R2
	out 0x6,R2
	.dbline 256
;  ADMUX = 0x40; //select adc input 0, select AVCC=VREF 
	ldi R24,64
	out 0x7,R24
	.dbline 257
;  ACSR  = 0x80;
	ldi R24,128
	out 0x8,R24
	.dbline 258
;  ADCSR = 0xED; //ADEN=1,ADSC=1(start),ADFR=1(freerun),ADIE(interrupt enable)=1 32div
	ldi R24,237
	out 0x6,R24
	.dbline -2
L43:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 28
	rjmp _adc_isr
	.area text(rom, con, rel)
	.dbfile D:\prog251\251.c
	.dbfunc e adc_isr _adc_isr fV
	.even
_adc_isr::
	rcall push_lset
	.dbline -1
	.dbline 263
; }
; 
; #pragma interrupt_handler adc_isr:15
; void adc_isr(void)
; {
	.dbline 265
;  //1. conversion complete, read value (int) using...
;  Voltage[ADCCurrentChannel]=ADCL;            //Read 8 low bits first (important)
	lds R2,_ADCCurrentChannel
	ldi R24,2
	mul R24,R2
	movw R30,R0
	ldi R24,<_Voltage
	ldi R25,>_Voltage
	add R30,R24
	adc R31,R25
	in R2,0x4
	clr R3
	std z+1,R3
	std z+0,R2
	.dbline 266
;  Voltage[ADCCurrentChannel]|=(int)ADCH << 8; //read 2 high bits and shift into top byte //
	lds R2,_ADCCurrentChannel
	ldi R24,2
	mul R24,R2
	movw R2,R0
	ldi R24,<_Voltage
	ldi R25,>_Voltage
	add R2,R24
	adc R3,R25
	in R4,0x5
	clr R5
	mov R5,R4
	clr R4
	movw R30,R2
	ldd R6,z+0
	ldd R7,z+1
	or R6,R4
	or R7,R5
	std z+1,R7
	std z+0,R6
	.dbline 267
;  VoltageRefreshed[ADCCurrentChannel] = 1;
	ldi R24,<_VoltageRefreshed
	ldi R25,>_VoltageRefreshed
	lds R30,_ADCCurrentChannel
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,1
	std z+0,R24
	.dbline 270

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -