📄 counter.s
字号:
.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 + -