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

📄 counter.s

📁 本文给出了频率计的一般设计方法及软件的如何编码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.dbline 231
;     // deactivate OE_L
;     sbi(PORTD,OE_L);
	sbi 0x12,4
	.dbline 235
; 
; 
;     // set B port back to output
;     outp(0xff,DDRB);
	ldi R24,255
	out 0x17,R24
	.dbline 238
; 
;     // set D port back to output
;     outp(0xff,DDRD);
	out 0x11,R24
	.dbline 241
; 
;     // re-enable display refresh
;     sei();	
	sei
	.dbline 242
;     return counter_value;
	.dbline -2
L12:
	.dbline 0 ; func end
	ret
	.dbsym r counter_value 16 i
	.dbend
	.dbfunc e capture _capture fV
;        compare -> R16,R17
	.even
_capture::
	.dbline -1
	.dbline 250
; }
; 
; 
; //
; // do a capture
; //
; void capture(unsigned int compare)
; {
	.dbline 252
; 
;     cbi(PORTD,CLEAR);       // clear external counters
	cbi 0x12,6
	.dbline 253
;     asm ("nop");
	nop
	.dbline 254
;     sbi(PORTD,CLEAR);       // remove clear
	sbi 0x12,6
	.dbline 256
;     
;     outp(0,TCNT1H);         // clear timer
	clr R2
	out 0x2d,R2
	.dbline 257
;     outp(0,TCNT1L);
	out 0x2c,R2
	.dbline 259
; 
;     outp(compare >> 8,OCR1H);   // set the compare1 register to the
	mov R2,R16
	mov R3,R17
	mov R2,R3
	clr R3
	out 0x2b,R2
	.dbline 260
;     outp(compare,OCR1L);        // required value
	out 0x2a,R16
	.dbline 262
; 
;     outp(0x40,TCCR1A);          // set OC1 bit to toggle on compare
	ldi R24,64
	out 0x2f,R24
	.dbline 264
; 
;     sbi(TIFR,OCF1A);            // clear overflov/compare flags
	in R24,0x38
	ori R24,64
	out 0x38,R24
	.dbline 266
; 
;     if (compare == 15625)
	cpi R16,9
	ldi R30,61
	cpc R17,R30
	brne L14
	.dbline 267
;         outp(0x0C,TCCR1B);      // start with fClk/256 (15625 Hz) and compare clear
	ldi R24,12
	out 0x2e,R24
	rjmp L17
L14:
	.dbline 269
;     else
;         outp(0x0A,TCCR1B);      // start with fClk/8 (500 kHz) and compare clear
	ldi R24,10
	out 0x2e,R24
L16:
	.dbline 271
L17:
	.dbline 271
; 
;     while ( ! (unsigned char) ( inp(TIFR) & BV(OCF1A)) );   // wait for bit
	in R24,0x38
	clr R25
	andi R24,64
	andi R25,0
	tst R24
	breq L16
	.dbline 272
;     sbi(TIFR,OCF1A);    // clear flags
	in R24,0x38
	ori R24,64
	out 0x38,R24
L19:
	.dbline 277
L20:
	.dbline 277
;     
;     // counter input now enabled
;     // for the specified time
;     
;     while ( ! (unsigned char) ( inp(TIFR) & BV(OCF1A)) );   // wait again for bit
	in R24,0x38
	clr R25
	andi R24,64
	andi R25,0
	tst R24
	breq L19
	.dbline 279
; 
;     outp(0,TCCR1B);     // stop timer
	clr R2
	out 0x2e,R2
	.dbline -2
	.dbline 282
;     
;     // counter input disabled
; }
L13:
	.dbline 0 ; func end
	ret
	.dbsym r compare 16 i
	.dbend
	.dbfunc e main _main fV
;             ms -> R10
;             dp -> y+6
;              i -> R14,R15
;              j -> R12,R13
;             lv -> y+0
;          count -> y+4
	.even
_main::
	sbiw R28,7
	.dbline -1
	.dbline 291
; 
; 
; 
; /****************************************************************************/
; /*  main  *******************************************************************/
; /****************************************************************************/
; 
; void main(void) 
; {
	.dbline 298
;     int i,j;
;     unsigned char dp,ms;
;     unsigned long lv;
;     unsigned int count;
; 
;     // set all PORTB as outputs
;     outp(0xff,DDRB);
	ldi R24,255
	out 0x17,R24
	.dbline 301
;     
;     // set all bits hi
;     outp(0xff,PORTB);
	out 0x18,R24
	.dbline 305
; 
; 
;     // set all PORTD as outputs
;     outp(0xff,DDRD);
	out 0x11,R24
	.dbline 308
;     
;     // set all bits hi
;     outp(0xff,PORTD);
	out 0x12,R24
	.dbline 313
; 
; 
;     // setup timer 0
; 
;     outp(0x03, TCCR0);      // prescaler f/64  tPeriod = 1/62500 Hz -> 16 uS
	ldi R24,3
	out 0x33,R24
	.dbline 317
; 
; 
;     // enable timer 0 interrupt
;     sbi(TIMSK, TOIE0);
	in R24,0x39
	ori R24,2
	out 0x39,R24
	.dbline 320
; 
;     // start things running
;     sei();
	sei
	.dbline 345
; 
; 
; /*
;     compare values at fclk/8 (500 kHz, 2 uS) :
;     
;       500   = 1 mS
;      5000   = 10 mS
;     50000   = 100 mS
;     
;     at fclk/256 (15.625 kHz, 64 uS) :
;     
;     15625   = 1 S
; 
; */
; 
; 
;     // first make sure the OC1 pin is in a controlled state
;     // we want it to be HIGH initially
; 
;     // There's no way to set/clear it directly, but it can be forced to 
;     // a defined state by a compare match, se by setting a low compare value
;     // and start the timer, it can be forced into set state
; 
; 
;     outp(0,TCNT1H);     // clear timer
	clr R2
	out 0x2d,R2
	.dbline 346
;     outp(0,TCNT1L);
	out 0x2c,R2
	.dbline 348
; 
;     outp(0,OCR1H);      // set compare to 200
	out 0x2b,R2
	.dbline 349
;     outp(200,OCR1L);
	ldi R24,200
	out 0x2a,R24
	.dbline 351
; 
;     outp(0xC0,TCCR1A);  // set OC1 bit to set on compare
	ldi R24,192
	out 0x2f,R24
	.dbline 354
; 
;     // start timer and wait for one compare match
;     outp(0x01,TCCR1B);      // start with fClk/1 (4 MHz)
	ldi R24,1
	out 0x2e,R24
L23:
	.dbline 355
L24:
	.dbline 355
;     while ( ! (unsigned char) ( inp(TIFR) & BV(OCF1A)) );   // wait for bit
	in R24,0x38
	clr R25
	andi R24,64
	andi R25,0
	tst R24
	breq L23
	.dbline 356
;     sbi(TIFR,OCF1A);    // clear flags
	in R24,0x38
	ori R24,64
	out 0x38,R24
	.dbline 358
; 
;     outp(0,TCCR1B);     // stop timer
	clr R2
	out 0x2e,R2
	rjmp L27
L26:
	.dbline 365
; 
;     // compare bit no HI, start 
;     // doing some useful work
; 
; 
;     while (1)
;     {
	.dbline 367
;         // try a capture at min gate
;         capture(500);   	// 1 mS
	ldi R16,500
	ldi R17,1
	rcall _capture
	.dbline 369
;         // get the data		
;         count = read_counters();
	rcall _read_counters
	std y+5,R17
	std y+4,R16
	.dbline 370
;         dp = 3;     // decimal point
	ldi R24,3
	std y+6,R24
	.dbline 371
;         ms = 2;     // indicate MHz
	ldi R24,2
	mov R10,R24
	.dbline 373
;     	
;         if (count < 4096)       // less than 4.096 MHz
	ldd R24,y+4
	ldd R25,y+5
	cpi R24,0
	ldi R30,16
	cpc R25,R30
	brsh L29
	.dbline 374
;     	{
	.dbline 376
;             // try a capture at next gate value
;             capture(5000);  	// 10 mS
	ldi R16,5000
	ldi R17,19
	rcall _capture
	.dbline 378
;             // get the data		
;             count = read_counters();
	rcall _read_counters
	std y+5,R17
	std y+4,R16
	.dbline 379
;             dp = 4;     // decimal point
	ldi R24,4
	std y+6,R24
	.dbline 380
;             ms = 2;     // indicate MHz
	ldi R24,2
	mov R10,R24
	.dbline 382
; 
;             if (count < 4096)   // less than 409.6 kHz
	ldd R24,y+4
	ldd R25,y+5
	cpi R24,0
	ldi R30,16
	cpc R25,R30
	brsh L31
	.dbline 383
;     		{
	.dbline 385
;                 // try a capture at next gate value
;                 capture(50000);	// 100 mS
	ldi R16,50000
	ldi R17,195
	rcall _capture
	.dbline 387
;                 // get the data		
;                 count = read_counters();
	rcall _read_counters
	std y+5,R17
	std y+4,R16
	.dbline 388
;                 dp = 3;     // decimal point
	ldi R24,3
	std y+6,R24
	.dbline 389
;                 ms = 1;     // indicate kHz
	clr R10
	inc R10
	.dbline 391
;     		
;                 if (count < 4096)   // less than 40.96 kHz
	ldd R24,y+4
	ldd R25,y+5
	cpi R24,0
	ldi R30,16
	cpc R25,R30
	brsh L33
	.dbline 392
;         		{
	.dbline 394
;                     // try a capture at next gate value
;                     capture(15625);		// 1 S
	ldi R16,15625
	ldi R17,61
	rcall _capture
	.dbline 396
;                     // get the data		
;                     count = read_counters();
	rcall _read_counters
	std y+5,R17
	std y+4,R16
	.dbline 397
;                     dp = 0;     // decimal point
	clr R0
	std y+6,R0
	.dbline 398
;                     ms = 0; 	// indicate Hz
	clr R10
	.dbline 399
;         		}
L33:
	.dbline 400
;     		}
L31:
	.dbline 401
;     	}
L29:
	.dbline 404
;     	
;         // convert BINARY counter_value (int) to BCD in led_value (long)
;         lv = 0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	mov R30,R28
	mov R31,R29
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 405
;         for (j=0;j<8;j++)
	clr R12
	clr R13
L35:
	.dbline 406
	.dbline 407
	ldi R18,10
	ldi R19,0
	ldd R16,y+4
	ldd R17,y+5
	rcall mod16u
	mov R14,R16
	mov R15,R17
	.dbline 408
	ldi R24,4
	ldi R25,0
	mov R30,R28
	mov R31,R29
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	st -y,R24
	mov R16,R2
	mov R17,R3
	mov R18,R4
	mov R19,R5
	rcall lsr32
	mov R30,R28
	mov R31,R29
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 409
	ldi R24,28
	ldi R25,0
	mov R2,R14
	mov R3,R15
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	st -y,R24
	mov R16,R2
	mov R17,R3
	mov R18,R4
	mov R19,R5
	rcall lsl32
	mov R30,R28
	mov R31,R29
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	or R2,R16
	or R3,R17
	or R4,R18
	or R5,R19
	mov R30,R28
	mov R31,R29
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 410
	ldi R18,10
	ldi R19,0
	ldd R16,y+4
	ldd R17,y+5
	rcall div16u
	std y+5,R17
	std y+4,R16
	.dbline 411
L36:
	.dbline 405
	mov R24,R12
	mov R25,R13
	adiw R24,1
	mov R12,R24
	mov R13,R25
	.dbline 405
	cpi R24,8
	ldi R30,0
	cpc R25,R30
	brge X1
	rjmp L35
X1:
	.dbline 414
	ldd R0,y+6
	sts _decimal_point,R0
	.dbline 415
	sts _mode_setting,R10
	.dbline 416
	mov R30,R28
	mov R31,R29
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	sts _led_value+1,R3
	sts _led_value,R2
	sts _led_value+2+1,R5
	sts _led_value+2,R4
	.dbline 418
L27:
	.dbline 364
	rjmp L26
X0:
	.dbline -2
	.dbline 420
;     	{
;             i = count % 10;
;             lv >>= 4;
;             lv |= ((unsigned long)i << 28);
;             count /= 10;
;     	}
; 
;         // set display variables
;         decimal_point = dp;
;         mode_setting = ms;
;         led_value = lv;
; 
;     } // loop
; 
; }
L22:
	adiw R28,7
	.dbline 0 ; func end
	ret
	.dbsym r ms 10 c
	.dbsym l dp 6 c
	.dbsym r i 14 I
	.dbsym r j 12 I
	.dbsym l lv 0 l
	.dbsym l count 4 i
	.dbend

⌨️ 快捷键说明

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