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

📄 countermeter.lst

📁 一个用AVR做出的一个频率计
💻 LST
📖 第 1 页 / 共 3 页
字号:
 350 018a F894      		cli
 351 018c DEBF      		out __SP_H__,r29
 352 018e 0FBE      		out __SREG__,__tmp_reg__
 353 0190 CDBF      		out __SP_L__,r28
 354 0192 DF91      		pop r29
 355 0194 CF91      		pop r28
 356 0196 0895      		ret
 357               	/* epilogue end (size=9) */
 358               	/* function delay size 57 (38) */
 364               	.Lscope1:
 366               	.global	read_counters
 368               	read_counters:
 121:countermeter.c **** } 
 122:countermeter.c **** 
 123:countermeter.c **** 
 124:countermeter.c **** 
 125:countermeter.c **** //读16位计数值
 126:countermeter.c **** unsigned int read_counters(void)
 127:countermeter.c **** {
 370               	.LM17:
 371               	/* prologue: frame size=2 */
 372 0198 CF93      		push r28
 373 019a DF93      		push r29
 374 019c CDB7      		in r28,__SP_L__
 375 019e DEB7      		in r29,__SP_H__
 376 01a0 2297      		sbiw r28,2
 377 01a2 0FB6      		in __tmp_reg__,__SREG__
 378 01a4 F894      		cli
 379 01a6 DEBF      		out __SP_H__,r29
 380 01a8 0FBE      		out __SREG__,__tmp_reg__
 381 01aa CDBF      		out __SP_L__,r28
 382               	/* prologue end (size=10) */
 128:countermeter.c **** 	unsigned int counter_value;
 129:countermeter.c **** 
 130:countermeter.c **** 	// 读数据时关闭中断
 131:countermeter.c **** 	cli();
 384               	.LM18:
 385               	/* #APP */
 386 01ac F894      		cli
 132:countermeter.c **** 	//关闭数码管显示	
 133:countermeter.c ****     PORTA |= 0X07;	
 388               	.LM19:
 389               	/* #NOAPP */
 390 01ae 8091 3B00 		lds r24,59
 391 01b2 8760      		ori r24,lo8(7)
 392 01b4 8093 3B00 		sts 59,r24
 134:countermeter.c **** 	//设置PORTB位输入	
 135:countermeter.c ****     DDRB = 0X00;
 394               	.LM20:
 395 01b8 1092 3700 		sts 55,__zero_reg__
 136:countermeter.c **** 	//置OE_H为低读取高8位	
 137:countermeter.c ****     PORTA &= ~(1<<OE_H);
 397               	.LM21:
 398 01bc 8091 3B00 		lds r24,59
 399 01c0 8F7D      		andi r24,lo8(-33)
 400 01c2 8093 3B00 		sts 59,r24
 138:countermeter.c **** 	asm volatile("nop");
 402               	.LM22:
 403               	/* #APP */
 404 01c6 0000      		nop
 139:countermeter.c **** 	//1个脉冲锁存计数值
 140:countermeter.c ****     PORTA |= (1<<OE_H);
 406               	.LM23:
 407               	/* #NOAPP */
 408 01c8 8091 3B00 		lds r24,59
 409 01cc 8062      		ori r24,lo8(32)
 410 01ce 8093 3B00 		sts 59,r24
 141:countermeter.c **** 	asm volatile("nop");	
 412               	.LM24:
 413               	/* #APP */
 414 01d2 0000      		nop
 142:countermeter.c ****     PORTA &= ~(1<<OE_H);
 416               	.LM25:
 417               	/* #NOAPP */
 418 01d4 8091 3B00 		lds r24,59
 419 01d8 8F7D      		andi r24,lo8(-33)
 420 01da 8093 3B00 		sts 59,r24
 143:countermeter.c **** 	asm volatile("nop");	
 422               	.LM26:
 423               	/* #APP */
 424 01de 0000      		nop
 144:countermeter.c **** 	//读高8位数据    
 145:countermeter.c ****     counter_value = PINB;
 426               	.LM27:
 427               	/* #NOAPP */
 428 01e0 8091 3600 		lds r24,54
 429 01e4 9927      		clr r25
 430 01e6 8983      		std Y+1,r24
 431 01e8 9A83      		std Y+2,r25
 146:countermeter.c ****     //置OE_H为高    		
 147:countermeter.c ****     PORTA |= (1<<OE_H);
 433               	.LM28:
 434 01ea 8091 3B00 		lds r24,59
 435 01ee 8062      		ori r24,lo8(32)
 436 01f0 8093 3B00 		sts 59,r24
 148:countermeter.c **** 	counter_value <<= 8;	
 438               	.LM29:
 439 01f4 8981      		ldd r24,Y+1
 440 01f6 9A81      		ldd r25,Y+2
 441 01f8 982F      		mov r25,r24
 442 01fa 8827      		clr r24
 443 01fc 8983      		std Y+1,r24
 444 01fe 9A83      		std Y+2,r25
 149:countermeter.c **** 	//置OE_L为低读取低8位
 150:countermeter.c ****     PORTA &= ~(1<<OE_L);
 446               	.LM30:
 447 0200 8091 3B00 		lds r24,59
 448 0204 8F7E      		andi r24,lo8(-17)
 449 0206 8093 3B00 		sts 59,r24
 151:countermeter.c **** 	asm volatile("nop");
 451               	.LM31:
 452               	/* #APP */
 453 020a 0000      		nop
 152:countermeter.c **** 	//1个脉冲锁存计数值
 153:countermeter.c ****     PORTA |= (1<<OE_L);
 455               	.LM32:
 456               	/* #NOAPP */
 457 020c 8091 3B00 		lds r24,59
 458 0210 8061      		ori r24,lo8(16)
 459 0212 8093 3B00 		sts 59,r24
 154:countermeter.c **** 	asm volatile("nop");
 461               	.LM33:
 462               	/* #APP */
 463 0216 0000      		nop
 155:countermeter.c ****     PORTA &= ~(1<<OE_L);
 465               	.LM34:
 466               	/* #NOAPP */
 467 0218 8091 3B00 		lds r24,59
 468 021c 8F7E      		andi r24,lo8(-17)
 469 021e 8093 3B00 		sts 59,r24
 156:countermeter.c **** 	asm volatile("nop");
 471               	.LM35:
 472               	/* #APP */
 473 0222 0000      		nop
 157:countermeter.c ****     //读低8位数据  
 158:countermeter.c ****     counter_value |= PINB ;  
 475               	.LM36:
 476               	/* #NOAPP */
 477 0224 8091 3600 		lds r24,54
 478 0228 282F      		mov r18,r24
 479 022a 3327      		clr r19
 480 022c 8981      		ldd r24,Y+1
 481 022e 9A81      		ldd r25,Y+2
 482 0230 822B      		or r24,r18
 483 0232 932B      		or r25,r19
 484 0234 8983      		std Y+1,r24
 485 0236 9A83      		std Y+2,r25
 159:countermeter.c ****     //置OE_L为高      
 160:countermeter.c ****     PORTA |= (1<<OE_L);	
 487               	.LM37:
 488 0238 8091 3B00 		lds r24,59
 489 023c 8061      		ori r24,lo8(16)
 490 023e 8093 3B00 		sts 59,r24
 161:countermeter.c ****     //设置PORTB位输出
 162:countermeter.c ****     DDRB = 0XFF;
 492               	.LM38:
 493 0242 8FEF      		ldi r24,lo8(-1)
 494 0244 8093 3700 		sts 55,r24
 163:countermeter.c **** 	//使能数码管刷新
 164:countermeter.c **** 	sei();	
 496               	.LM39:
 497               	/* #APP */
 498 0248 7894      		sei
 165:countermeter.c **** 	return counter_value;
 500               	.LM40:
 501               	/* #NOAPP */
 502 024a 8981      		ldd r24,Y+1
 503 024c 9A81      		ldd r25,Y+2
 504               	/* epilogue: frame size=2 */
 505 024e 2296      		adiw r28,2
 506 0250 0FB6      		in __tmp_reg__,__SREG__
 507 0252 F894      		cli
 508 0254 DEBF      		out __SP_H__,r29
 509 0256 0FBE      		out __SREG__,__tmp_reg__
 510 0258 CDBF      		out __SP_L__,r28
 511 025a DF91      		pop r29
 512 025c CF91      		pop r28
 513 025e 0895      		ret
 514               	/* epilogue end (size=9) */
 515               	/* function read_counters size 108 (89) */
 520               	.Lscope2:
 523               	.global	capture
 525               	capture:
 166:countermeter.c **** }
 167:countermeter.c **** 
 168:countermeter.c **** 
 169:countermeter.c **** 
 170:countermeter.c **** void capture(unsigned int compare)
 171:countermeter.c **** {
 527               	.LM41:
 528               	/* prologue: frame size=2 */
 529 0260 CF93      		push r28
 530 0262 DF93      		push r29
 531 0264 CDB7      		in r28,__SP_L__
 532 0266 DEB7      		in r29,__SP_H__
 533 0268 2297      		sbiw r28,2
 534 026a 0FB6      		in __tmp_reg__,__SREG__
 535 026c F894      		cli
 536 026e DEBF      		out __SP_H__,r29
 537 0270 0FBE      		out __SREG__,__tmp_reg__
 538 0272 CDBF      		out __SP_L__,r28
 539               	/* prologue end (size=10) */
 540 0274 8983      		std Y+1,r24
 541 0276 9A83      		std Y+2,r25
 172:countermeter.c **** 
 173:countermeter.c **** 	//清零外部计数器
 174:countermeter.c ****     PORTA &= ~(1<<CLEAR);
 543               	.LM42:
 544 0278 8091 3B00 		lds r24,59
 545 027c 8F7B      		andi r24,lo8(-65)
 546 027e 8093 3B00 		sts 59,r24
 175:countermeter.c **** 	asm volatile("nop");
 548               	.LM43:
 549               	/* #APP */
 550 0282 0000      		nop
 176:countermeter.c ****     //置清零为高
 177:countermeter.c **** 	PORTA |= (1<<CLEAR);
 552               	.LM44:
 553               	/* #NOAPP */
 554 0284 8091 3B00 		lds r24,59
 555 0288 8064      		ori r24,lo8(64)
 556 028a 8093 3B00 		sts 59,r24
 178:countermeter.c **** 	//清计数值
 179:countermeter.c ****     TCNT1H = 0;	
 558               	.LM45:
 559 028e 1092 4D00 		sts 77,__zero_reg__
 180:countermeter.c ****     TCNT1L = 0;
 561               	.LM46:
 562 0292 1092 4C00 		sts 76,__zero_reg__
 181:countermeter.c **** 
 182:countermeter.c **** 	//设置输出比较寄存器为所需值
 183:countermeter.c ****     OCR1AH = compare >> 8;	
 564               	.LM47:
 565 0296 8981      		ldd r24,Y+1
 566 0298 9A81      		ldd r25,Y+2
 567 029a 892F      		mov r24,r25
 568 029c 9927      		clr r25
 569 029e 8093 4B00 		sts 75,r24
 184:countermeter.c ****     OCR1AL = compare;
 571               	.LM48:
 572 02a2 8981      		ldd r24,Y+1
 573 02a4 8093 4A00 		sts 74,r24
 185:countermeter.c ****     //比较匹配时OC1A/OC1B 电平取反
 186:countermeter.c ****     TCCR1A = (1<<COM1A0); //0x40;//
 575               	.LM49:
 576 02a8 80E4      		ldi r24,lo8(64)
 577 02aa 8093 4F00 		sts 79,r24
 187:countermeter.c **** 	//清比较匹配标志
 188:countermeter.c ****     TIFR |= (1<<OCF1A);
 579               	.LM50:
 580 02ae 8091 5800 		lds r24,88
 581 02b2 8061      		ori r24,lo8(16)
 582 02b4 8093 5800 		sts 88,r24
 189:countermeter.c **** 
 190:countermeter.c **** 	if (compare == 15625)
 584               	.LM51:
 585 02b8 8981      		ldd r24,Y+1
 586 02ba 9A81      		ldd r25,Y+2
 587 02bc 2DE3      		ldi r18,hi8(15625)
 588 02be 8930      		cpi r24,lo8(15625)
 589 02c0 9207      		cpc r25,r18
 590 02c2 21F4      		brne .L11
 191:countermeter.c ****     {
 192:countermeter.c **** 		// start with fClk/256 (15625 Hz) and compare clear
 193:countermeter.c ****         TCCR1B = (1<<WGM12)|(1<< CS12); //0x0C;//
 592               	.LM52:
 593 02c4 8CE0      		ldi r24,lo8(12)
 594 02c6 8093 4E00 		sts 78,r24
 595 02ca 03C0      		rjmp .L13
 596               	.L11:
 194:countermeter.c ****     }
 195:countermeter.c **** 	else
 196:countermeter.c ****     {
 197:countermeter.c **** 		// start with fClk/8 (500 kHz) and compare clear
 198:countermeter.c ****         TCCR1B = (1<<WGM12)|(1<<CS11);  //0x0A;//
 598               	.LM53:
 599 02cc 8AE0      		ldi r24,lo8(10)
 600 02ce 8093 4E00 		sts 78,r24
 601               	.L13:
 199:countermeter.c ****     }
 200:countermeter.c **** 
 201:countermeter.c **** 	// wait for bit
 202:countermeter.c ****     while ( ! (unsigned char) ( TIFR & (1<< OCF1A)) );
 603               	.LM54:
 604 02d2 8091 5800 		lds r24,88
 605 02d6 9927      		clr r25
 606 02d8 9295      		swap r25
 607 02da 8295      		swap r24
 608 02dc 8F70      		andi r24,0x0f
 609 02de 8927      		eor r24,r25
 610 02e0 9F70      		andi r25,0x0f
 611 02e2 8927      		eor r24,r25
 612 02e4 8170      		andi r24,lo8(1)
 613 02e6 9070      		andi r25,hi8(1)
 614 02e8 0097      		sbiw r24,0
 615 02ea 09F4      		brne .L14
 616 02ec F2CF      		rjmp .L13
 617               	.L14:
 203:countermeter.c **** 	// clear flags
 204:countermeter.c **** 	TIFR |= (1<<OCF1A);
 619               	.LM55:
 620 02ee 8091 5800 		lds r24,88
 621 02f2 8061      		ori r24,lo8(16)
 622 02f4 8093 5800 		sts 88,r24
 623               	.L15:
 205:countermeter.c **** 	// counter input now enabled
 206:countermeter.c **** 	// for the specified time
 207:countermeter.c **** 	
 208:countermeter.c **** 	// wait again for bit
 209:countermeter.c ****     while ( ! (unsigned char) ( TIFR & (1<< OCF1A)) );
 625               	.LM56:
 626 02f8 8091 5800 		lds r24,88
 627 02fc 9927      		clr r25
 628 02fe 9295      		swap r25
 629 0300 8295      		swap r24
 630 0302 8F70      		andi r24,0x0f
 631 0304 8927      		eor r24,r25
 632 0306 9F70      		andi r25,0x0f
 633 0308 8927      		eor r24,r25
 634 030a 8170      		andi r24,lo8(1)
 635 030c 9070      		andi r25,hi8(1)
 636 030e 0097      		sbiw r24,0
 637 0310 09F4      		brne .L16
 638 0312 F2CF      		rjmp .L15
 639               	.L16:
 210:countermeter.c **** 	// stop timer
 211:countermeter.c **** 	TCCR1B = 0;
 641               	.LM57:
 642 0314 1092 4E00 		sts 78,__zero_reg__
 643               	/* epilogue: frame size=2 */
 644 0318 2296      		adiw r28,2
 645 031a 0FB6      		in __tmp_reg__,__SREG__
 646 031c F894      		cli
 647 031e DEBF      		out __SP_H__,r29
 648 0320 0FBE      		out __SREG__,__tmp_reg__
 649 0322 CDBF      		out __SP_L__,r28
 650 0324 DF91      		pop r29
 651 0326 CF91      		pop r28
 652 0328 0895      		ret
 653               	/* epilogue end (size=9) */
 654               	/* function capture size 102 (83) */
 656               	.Lscope3:
 658               	.global	main
 660               	main:
 212:countermeter.c **** 	// counter input disabled
 213:countermeter.c **** }
 214:countermeter.c **** 
 215:countermeter.c **** 
 216:countermeter.c **** 
 217:countermeter.c **** /****************************************************************************/
 218:countermeter.c **** /*  main  *******************************************************************/
 219:countermeter.c **** /****************************************************************************/
 220:countermeter.c **** 
 221:countermeter.c **** int main(void) 
 222:countermeter.c **** {
 662               	.LM58:
 663               	/* prologue: frame size=12 */
 664 032a C0E0      		ldi r28,lo8(__stack - 12)
 665 032c D0E0      		ldi r29,hi8(__stack - 12)
 666 032e DEBF      		out __SP_H__,r29
 667 0330 CDBF      		out __SP_L__,r28
 668               	/* prologue end (size=4) */
 223:countermeter.c **** 	int i,j;
 224:countermeter.c **** 	unsigned char dp,ms;
 225:countermeter.c **** 	unsigned long lv;
 226:countermeter.c **** 	unsigned int count;
 227:countermeter.c ****     //设置PORTA为输出高电平
 228:countermeter.c **** 	DDRA  = 0XFF;	
 670               	.LM59:
 671 0332 8FEF      		ldi r24,lo8(-1)
 672 0334 8093 3A00 		sts 58,r24
 229:countermeter.c ****     PORTA = 0XFF;
 674               	.LM60:
 675 0338 8FEF      		ldi r24,lo8(-1)
 676 033a 8093 3B00 		sts 59,r24

⌨️ 快捷键说明

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