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

📄 countermeter.lss

📁 一个用AVR做出的一个频率计
💻 LSS
📖 第 1 页 / 共 2 页
字号:
 310:	00 00       	nop
    //置清零为高
	PORTA |= (1<<CLEAR);
 312:	80 91 3b 00 	lds	r24, 0x003B
 316:	80 64       	ori	r24, 0x40	; 64
 318:	80 93 3b 00 	sts	0x003B, r24
	//清计数值
    TCNT1H = 0;	
 31c:	10 92 4d 00 	sts	0x004D, r1
    TCNT1L = 0;
 320:	10 92 4c 00 	sts	0x004C, r1

	//设置输出比较寄存器为所需值
    OCR1AH = compare >> 8;	
 324:	89 81       	ldd	r24, Y+1	; 0x01
 326:	9a 81       	ldd	r25, Y+2	; 0x02
 328:	89 2f       	mov	r24, r25
 32a:	99 27       	eor	r25, r25
 32c:	80 93 4b 00 	sts	0x004B, r24
    OCR1AL = compare;
 330:	89 81       	ldd	r24, Y+1	; 0x01
 332:	80 93 4a 00 	sts	0x004A, r24
    //比较匹配时OC1A/OC1B 电平取反
    TCCR1A = (1<<COM1A0); //0x40;//
 336:	80 e4       	ldi	r24, 0x40	; 64
 338:	80 93 4f 00 	sts	0x004F, r24
	//清比较匹配标志
    TIFR |= (1<<OCF1A);
 33c:	80 91 58 00 	lds	r24, 0x0058
 340:	80 61       	ori	r24, 0x10	; 16
 342:	80 93 58 00 	sts	0x0058, r24

	if (compare == 15625)
 346:	89 81       	ldd	r24, Y+1	; 0x01
 348:	9a 81       	ldd	r25, Y+2	; 0x02
 34a:	2d e3       	ldi	r18, 0x3D	; 61
 34c:	89 30       	cpi	r24, 0x09	; 9
 34e:	92 07       	cpc	r25, r18
 350:	21 f4       	brne	.+8      	; 0x35a
    {
		// start with fClk/256 (15625 Hz) and compare clear
        TCCR1B = (1<<WGM12)|(1<< CS12); //0x0C;//
 352:	8c e0       	ldi	r24, 0x0C	; 12
 354:	80 93 4e 00 	sts	0x004E, r24
 358:	03 c0       	rjmp	.+6      	; 0x360
    }
	else
    {
		// start with fClk/8 (500 kHz) and compare clear
        TCCR1B = (1<<WGM12)|(1<<CS11);  //0x0A;//
 35a:	8a e0       	ldi	r24, 0x0A	; 10
 35c:	80 93 4e 00 	sts	0x004E, r24
    }

	// wait for bit
    while ( ! (unsigned char) ( TIFR & (1<< OCF1A)) );
 360:	80 91 58 00 	lds	r24, 0x0058
 364:	99 27       	eor	r25, r25
 366:	92 95       	swap	r25
 368:	82 95       	swap	r24
 36a:	8f 70       	andi	r24, 0x0F	; 15
 36c:	89 27       	eor	r24, r25
 36e:	9f 70       	andi	r25, 0x0F	; 15
 370:	89 27       	eor	r24, r25
 372:	81 70       	andi	r24, 0x01	; 1
 374:	90 70       	andi	r25, 0x00	; 0
 376:	00 97       	sbiw	r24, 0x00	; 0
 378:	09 f4       	brne	.+2      	; 0x37c
 37a:	f2 cf       	rjmp	.-28     	; 0x360
	// clear flags
	TIFR |= (1<<OCF1A);
 37c:	80 91 58 00 	lds	r24, 0x0058
 380:	80 61       	ori	r24, 0x10	; 16
 382:	80 93 58 00 	sts	0x0058, r24
	// counter input now enabled
	// for the specified time
	
	// wait again for bit
    while ( ! (unsigned char) ( TIFR & (1<< OCF1A)) );
 386:	80 91 58 00 	lds	r24, 0x0058
 38a:	99 27       	eor	r25, r25
 38c:	92 95       	swap	r25
 38e:	82 95       	swap	r24
 390:	8f 70       	andi	r24, 0x0F	; 15
 392:	89 27       	eor	r24, r25
 394:	9f 70       	andi	r25, 0x0F	; 15
 396:	89 27       	eor	r24, r25
 398:	81 70       	andi	r24, 0x01	; 1
 39a:	90 70       	andi	r25, 0x00	; 0
 39c:	00 97       	sbiw	r24, 0x00	; 0
 39e:	09 f4       	brne	.+2      	; 0x3a2
 3a0:	f2 cf       	rjmp	.-28     	; 0x386
	// stop timer
	TCCR1B = 0;
 3a2:	10 92 4e 00 	sts	0x004E, r1
 3a6:	22 96       	adiw	r28, 0x02	; 2
 3a8:	0f b6       	in	r0, 0x3f	; 63
 3aa:	f8 94       	cli
 3ac:	de bf       	out	0x3e, r29	; 62
 3ae:	0f be       	out	0x3f, r0	; 63
 3b0:	cd bf       	out	0x3d, r28	; 61
 3b2:	df 91       	pop	r29
 3b4:	cf 91       	pop	r28
 3b6:	08 95       	ret

000003b8 <main>:
	// counter input disabled
}



/****************************************************************************/
/*  main  *******************************************************************/
/****************************************************************************/

int main(void) 
{
 3b8:	c3 e5       	ldi	r28, 0x53	; 83
 3ba:	d4 e0       	ldi	r29, 0x04	; 4
 3bc:	de bf       	out	0x3e, r29	; 62
 3be:	cd bf       	out	0x3d, r28	; 61
	int i,j;
	unsigned char dp,ms;
	unsigned long lv;
	unsigned int count;
    //设置PORTA为输出高电平
	DDRA  = 0XFF;	
 3c0:	8f ef       	ldi	r24, 0xFF	; 255
 3c2:	80 93 3a 00 	sts	0x003A, r24
    PORTA = 0XFF;
 3c6:	8f ef       	ldi	r24, 0xFF	; 255
 3c8:	80 93 3b 00 	sts	0x003B, r24
	//设置PORTB为输出高电平	
	DDRB  = 0XFF;	
 3cc:	8f ef       	ldi	r24, 0xFF	; 255
 3ce:	80 93 37 00 	sts	0x0037, r24
    PORTB = 0XFF;
 3d2:	8f ef       	ldi	r24, 0xFF	; 255
 3d4:	80 93 38 00 	sts	0x0038, r24
	//设置PORTD为输出高电平
	DDRD  = 0XFF;		
 3d8:	8f ef       	ldi	r24, 0xFF	; 255
 3da:	80 93 31 00 	sts	0x0031, r24
    PORTD = 0XFF;
 3de:	8f ef       	ldi	r24, 0xFF	; 255
 3e0:	80 93 32 00 	sts	0x0032, r24
    
	//设置定时器T0
	// 计数时钟为晶振频率64分频 周期为 = 1/(4000000/64 )-> 16 uS
    TCCR0 = (1<<CS01)|(1<<CS00);  //0x03;//
 3e4:	83 e0       	ldi	r24, 0x03	; 3
 3e6:	80 93 53 00 	sts	0x0053, r24
	//使能定时器T0溢出中断	
    TIMSK |= (1<<TOIE0);   
 3ea:	80 91 59 00 	lds	r24, 0x0059
 3ee:	81 60       	ori	r24, 0x01	; 1
 3f0:	80 93 59 00 	sts	0x0059, r24
	//使能全局中断
	sei();
 3f4:	78 94       	sei


/*	输出比较寄存器初值在 fclk/8 (500 kHz, 2 uS) 下的门控值:
	
 	  500 	= 1 mS
	 5000 	= 10 mS
	50000	= 100 mS
	
	在 fclk/256 (15.625 kHz, 64 uS) :下的门控值:
	
 	15625  	= 1 S
*/
	// 清零16位计数器T1
    TCNT1H = 0;	
 3f6:	10 92 4d 00 	sts	0x004D, r1
    TCNT1L = 0;
 3fa:	10 92 4c 00 	sts	0x004C, r1
	// 设置输出比较寄存器初值为 200
    OCR1AH = 0;	
 3fe:	10 92 4b 00 	sts	0x004B, r1
    OCR1AL = 200;
 402:	88 ec       	ldi	r24, 0xC8	; 200
 404:	80 93 4a 00 	sts	0x004A, r24
    //比较匹配时置位 OC1A/OC1B ( 输出高电平)
    TCCR1A = (1<<COM1A1)|(1<<COM1A0);   //0xC0;// 
 408:	80 ec       	ldi	r24, 0xC0	; 192
 40a:	80 93 4f 00 	sts	0x004F, r24
	//启动定时器T1	
    TCCR1B = (1<<CS10);  //0x01;//
 40e:	81 e0       	ldi	r24, 0x01	; 1
 410:	80 93 4e 00 	sts	0x004E, r24

	//等待比较匹配标志位置位
    while ( ! (unsigned char) ( TIFR & (1<<OCF1A)) );
 414:	80 91 58 00 	lds	r24, 0x0058
 418:	99 27       	eor	r25, r25
 41a:	92 95       	swap	r25
 41c:	82 95       	swap	r24
 41e:	8f 70       	andi	r24, 0x0F	; 15
 420:	89 27       	eor	r24, r25
 422:	9f 70       	andi	r25, 0x0F	; 15
 424:	89 27       	eor	r24, r25
 426:	81 70       	andi	r24, 0x01	; 1
 428:	90 70       	andi	r25, 0x00	; 0
 42a:	00 97       	sbiw	r24, 0x00	; 0
 42c:	09 f4       	brne	.+2      	; 0x430
 42e:	f2 cf       	rjmp	.-28     	; 0x414
	//清楚标志
    TIFR |= (1<< OCF1A);    
 430:	80 91 58 00 	lds	r24, 0x0058
 434:	80 61       	ori	r24, 0x10	; 16
 436:	80 93 58 00 	sts	0x0058, r24
	//定时器T1停止计数
    TCCR1B = 0;
 43a:	10 92 4e 00 	sts	0x004E, r1
	// compare bit no HI, start 
	// doing some useful work
	while (1)
	{
		//用最小的门控尝试
		capture(500);		// 1 mS
 43e:	84 ef       	ldi	r24, 0xF4	; 244
 440:	91 e0       	ldi	r25, 0x01	; 1
 442:	0e 94 77 01 	call	0x2ee
		//读取计数值		
		count = read_counters();
 446:	0e 94 13 01 	call	0x226
 44a:	8b 87       	std	Y+11, r24	; 0x0b
 44c:	9c 87       	std	Y+12, r25	; 0x0c
		dp = 3;		// 小数点位置
 44e:	83 e0       	ldi	r24, 0x03	; 3
 450:	8d 83       	std	Y+5, r24	; 0x05
		ms = 2;		// 频率单位 MHz
 452:	82 e0       	ldi	r24, 0x02	; 2
 454:	8e 83       	std	Y+6, r24	; 0x06
		
		if (count < 4096)     // 小于 4.096 MHz
 456:	8b 85       	ldd	r24, Y+11	; 0x0b
 458:	9c 85       	ldd	r25, Y+12	; 0x0c
 45a:	20 e1       	ldi	r18, 0x10	; 16
 45c:	80 30       	cpi	r24, 0x00	; 0
 45e:	92 07       	cpc	r25, r18
 460:	70 f5       	brcc	.+92     	; 0x4be
		{
			//尝试下一个门控值
			capture(5000);		// 10 mS
 462:	88 e8       	ldi	r24, 0x88	; 136
 464:	93 e1       	ldi	r25, 0x13	; 19
 466:	0e 94 77 01 	call	0x2ee
			//读取计数值	
			count = read_counters();
 46a:	0e 94 13 01 	call	0x226
 46e:	8b 87       	std	Y+11, r24	; 0x0b
 470:	9c 87       	std	Y+12, r25	; 0x0c
			dp = 4;		// 小数点位置
 472:	84 e0       	ldi	r24, 0x04	; 4
 474:	8d 83       	std	Y+5, r24	; 0x05
			ms = 2;		// 频率单位 MHz
 476:	82 e0       	ldi	r24, 0x02	; 2
 478:	8e 83       	std	Y+6, r24	; 0x06

			if (count < 4096)	// 小于 409.6 kHz
 47a:	8b 85       	ldd	r24, Y+11	; 0x0b
 47c:	9c 85       	ldd	r25, Y+12	; 0x0c
 47e:	20 e1       	ldi	r18, 0x10	; 16
 480:	80 30       	cpi	r24, 0x00	; 0
 482:	92 07       	cpc	r25, r18
 484:	e0 f4       	brcc	.+56     	; 0x4be
			{
				// 尝试下一个门控值
				capture(50000);	// 100 mS
 486:	80 e5       	ldi	r24, 0x50	; 80
 488:	93 ec       	ldi	r25, 0xC3	; 195
 48a:	0e 94 77 01 	call	0x2ee
				//读取计数值		
				count = read_counters();
 48e:	0e 94 13 01 	call	0x226
 492:	8b 87       	std	Y+11, r24	; 0x0b
 494:	9c 87       	std	Y+12, r25	; 0x0c
				dp = 2;		// 小数点位置
 496:	82 e0       	ldi	r24, 0x02	; 2
 498:	8d 83       	std	Y+5, r24	; 0x05
				ms = 1;		// 频率单位 kHz
 49a:	81 e0       	ldi	r24, 0x01	; 1
 49c:	8e 83       	std	Y+6, r24	; 0x06
			
				if (count < 4096)	//  小于 40.96 kHz
 49e:	8b 85       	ldd	r24, Y+11	; 0x0b
 4a0:	9c 85       	ldd	r25, Y+12	; 0x0c
 4a2:	20 e1       	ldi	r18, 0x10	; 16
 4a4:	80 30       	cpi	r24, 0x00	; 0
 4a6:	92 07       	cpc	r25, r18
 4a8:	50 f4       	brcc	.+20     	; 0x4be
				{
					// 尝试下一个门控值
					capture(15625);		// 1 S
 4aa:	89 e0       	ldi	r24, 0x09	; 9
 4ac:	9d e3       	ldi	r25, 0x3D	; 61
 4ae:	0e 94 77 01 	call	0x2ee
					//	读取计数值	
					count = read_counters();
 4b2:	0e 94 13 01 	call	0x226
 4b6:	8b 87       	std	Y+11, r24	; 0x0b
 4b8:	9c 87       	std	Y+12, r25	; 0x0c
					dp = 0;		// 小数点位置
 4ba:	1d 82       	std	Y+5, r1	; 0x05
					ms = 0;		// 频率单位 Hz
 4bc:	1e 82       	std	Y+6, r1	; 0x06
				}
			}
		}
		
		//将二进制16位计数值转换位BCD码
		lv = 0;
 4be:	1f 82       	std	Y+7, r1	; 0x07
 4c0:	18 86       	std	Y+8, r1	; 0x08
 4c2:	19 86       	std	Y+9, r1	; 0x09
 4c4:	1a 86       	std	Y+10, r1	; 0x0a
		for (j=0;j<8;j++)
 4c6:	1b 82       	std	Y+3, r1	; 0x03
 4c8:	1c 82       	std	Y+4, r1	; 0x04
 4ca:	8b 81       	ldd	r24, Y+3	; 0x03
 4cc:	9c 81       	ldd	r25, Y+4	; 0x04
 4ce:	88 30       	cpi	r24, 0x08	; 8
 4d0:	91 05       	cpc	r25, r1
 4d2:	0c f0       	brlt	.+2      	; 0x4d6
 4d4:	46 c0       	rjmp	.+140    	; 0x562
		{
			i = count % 10;
 4d6:	8b 85       	ldd	r24, Y+11	; 0x0b
 4d8:	9c 85       	ldd	r25, Y+12	; 0x0c
 4da:	2a e0       	ldi	r18, 0x0A	; 10
 4dc:	30 e0       	ldi	r19, 0x00	; 0
 4de:	b9 01       	movw	r22, r18
 4e0:	0e 94 c4 02 	call	0x588
 4e4:	89 83       	std	Y+1, r24	; 0x01
 4e6:	9a 83       	std	Y+2, r25	; 0x02
			lv >>= 4;
 4e8:	8f 81       	ldd	r24, Y+7	; 0x07
 4ea:	98 85       	ldd	r25, Y+8	; 0x08
 4ec:	a9 85       	ldd	r26, Y+9	; 0x09
 4ee:	ba 85       	ldd	r27, Y+10	; 0x0a
 4f0:	68 94       	set
 4f2:	13 f8       	bld	r1, 3
 4f4:	b6 95       	lsr	r27
 4f6:	a7 95       	ror	r26
 4f8:	97 95       	ror	r25
 4fa:	87 95       	ror	r24
 4fc:	16 94       	lsr	r1
 4fe:	d1 f7       	brne	.-12     	; 0x4f4
 500:	8f 83       	std	Y+7, r24	; 0x07
 502:	98 87       	std	Y+8, r25	; 0x08
 504:	a9 87       	std	Y+9, r26	; 0x09
 506:	ba 87       	std	Y+10, r27	; 0x0a
			lv |= ((unsigned long)i << 28);
 508:	89 81       	ldd	r24, Y+1	; 0x01
 50a:	9a 81       	ldd	r25, Y+2	; 0x02
 50c:	aa 27       	eor	r26, r26
 50e:	97 fd       	sbrc	r25, 7
 510:	a0 95       	com	r26
 512:	ba 2f       	mov	r27, r26
 514:	9c 01       	movw	r18, r24
 516:	ad 01       	movw	r20, r26
 518:	01 2e       	mov	r0, r17
 51a:	1c e1       	ldi	r17, 0x1C	; 28
 51c:	22 0f       	add	r18, r18
 51e:	33 1f       	adc	r19, r19
 520:	44 1f       	adc	r20, r20
 522:	55 1f       	adc	r21, r21
 524:	1a 95       	dec	r17
 526:	d1 f7       	brne	.-12     	; 0x51c
 528:	10 2d       	mov	r17, r0
 52a:	8f 81       	ldd	r24, Y+7	; 0x07
 52c:	98 85       	ldd	r25, Y+8	; 0x08
 52e:	a9 85       	ldd	r26, Y+9	; 0x09
 530:	ba 85       	ldd	r27, Y+10	; 0x0a
 532:	82 2b       	or	r24, r18
 534:	93 2b       	or	r25, r19
 536:	a4 2b       	or	r26, r20
 538:	b5 2b       	or	r27, r21
 53a:	8f 83       	std	Y+7, r24	; 0x07
 53c:	98 87       	std	Y+8, r25	; 0x08
 53e:	a9 87       	std	Y+9, r26	; 0x09
 540:	ba 87       	std	Y+10, r27	; 0x0a
			count /= 10;
 542:	8b 85       	ldd	r24, Y+11	; 0x0b
 544:	9c 85       	ldd	r25, Y+12	; 0x0c
 546:	2a e0       	ldi	r18, 0x0A	; 10
 548:	30 e0       	ldi	r19, 0x00	; 0
 54a:	b9 01       	movw	r22, r18
 54c:	0e 94 c4 02 	call	0x588
 550:	cb 01       	movw	r24, r22
 552:	8b 87       	std	Y+11, r24	; 0x0b
 554:	9c 87       	std	Y+12, r25	; 0x0c
 556:	8b 81       	ldd	r24, Y+3	; 0x03
 558:	9c 81       	ldd	r25, Y+4	; 0x04
 55a:	01 96       	adiw	r24, 0x01	; 1
 55c:	8b 83       	std	Y+3, r24	; 0x03
 55e:	9c 83       	std	Y+4, r25	; 0x04
 560:	b4 cf       	rjmp	.-152    	; 0x4ca
		}

		//设置显示参数
		decimal_point = dp;
 562:	8d 81       	ldd	r24, Y+5	; 0x05
 564:	80 93 73 00 	sts	0x0073, r24
		mode_setting  = ms;
 568:	8e 81       	ldd	r24, Y+6	; 0x06
 56a:	80 93 74 00 	sts	0x0074, r24
		led_value     = lv;
 56e:	8f 81       	ldd	r24, Y+7	; 0x07
 570:	98 85       	ldd	r25, Y+8	; 0x08
 572:	a9 85       	ldd	r26, Y+9	; 0x09
 574:	ba 85       	ldd	r27, Y+10	; 0x0a
 576:	80 93 6f 00 	sts	0x006F, r24
 57a:	90 93 70 00 	sts	0x0070, r25
 57e:	a0 93 71 00 	sts	0x0071, r26
 582:	b0 93 72 00 	sts	0x0072, r27
 586:	5b cf       	rjmp	.-330    	; 0x43e

00000588 <__udivmodhi4>:
 588:	aa 1b       	sub	r26, r26
 58a:	bb 1b       	sub	r27, r27
 58c:	51 e1       	ldi	r21, 0x11	; 17
 58e:	07 c0       	rjmp	.+14     	; 0x59e

00000590 <__udivmodhi4_loop>:
 590:	aa 1f       	adc	r26, r26
 592:	bb 1f       	adc	r27, r27
 594:	a6 17       	cp	r26, r22
 596:	b7 07       	cpc	r27, r23
 598:	10 f0       	brcs	.+4      	; 0x59e
 59a:	a6 1b       	sub	r26, r22
 59c:	b7 0b       	sbc	r27, r23

0000059e <__udivmodhi4_ep>:
 59e:	88 1f       	adc	r24, r24
 5a0:	99 1f       	adc	r25, r25
 5a2:	5a 95       	dec	r21
 5a4:	a9 f7       	brne	.-22     	; 0x590
 5a6:	80 95       	com	r24
 5a8:	90 95       	com	r25
 5aa:	bc 01       	movw	r22, r24
 5ac:	cd 01       	movw	r24, r26
 5ae:	08 95       	ret

000005b0 <__divmodhi4>:
 5b0:	97 fb       	bst	r25, 7
 5b2:	09 2e       	mov	r0, r25
 5b4:	07 26       	eor	r0, r23
 5b6:	0a d0       	rcall	.+20     	; 0x5cc
 5b8:	77 fd       	sbrc	r23, 7
 5ba:	04 d0       	rcall	.+8      	; 0x5c4
 5bc:	e5 df       	rcall	.-54     	; 0x588
 5be:	06 d0       	rcall	.+12     	; 0x5cc
 5c0:	00 20       	and	r0, r0
 5c2:	1a f4       	brpl	.+6      	; 0x5ca

000005c4 <__divmodhi4_neg2>:
 5c4:	70 95       	com	r23
 5c6:	61 95       	neg	r22
 5c8:	7f 4f       	sbci	r23, 0xFF	; 255

000005ca <__divmodhi4_exit>:
 5ca:	08 95       	ret

000005cc <__divmodhi4_neg1>:
 5cc:	f6 f7       	brtc	.-4      	; 0x5ca
 5ce:	90 95       	com	r25
 5d0:	81 95       	neg	r24
 5d2:	9f 4f       	sbci	r25, 0xFF	; 255
 5d4:	08 95       	ret

⌨️ 快捷键说明

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