📄 counter.lis
字号:
01FE ; // set all bits hi
01FE ; outp(0xff,PORTD);
01FE 82BB out 0x12,R24
0200 .dbline 313
0200 ;
0200 ;
0200 ; // setup timer 0
0200 ;
0200 ; outp(0x03, TCCR0); // prescaler f/64 tPeriod = 1/62500 Hz -> 16 uS
0200 83E0 ldi R24,3
0202 83BF out 0x33,R24
0204 .dbline 317
0204 ;
0204 ;
0204 ; // enable timer 0 interrupt
0204 ; sbi(TIMSK, TOIE0);
0204 89B7 in R24,0x39
0206 8260 ori R24,2
0208 89BF out 0x39,R24
020A .dbline 320
020A ;
020A ; // start things running
020A ; sei();
020A 7894 sei
020C .dbline 345
020C ;
020C ;
020C ; /*
020C ; compare values at fclk/8 (500 kHz, 2 uS) :
020C ;
020C ; 500 = 1 mS
020C ; 5000 = 10 mS
020C ; 50000 = 100 mS
020C ;
020C ; at fclk/256 (15.625 kHz, 64 uS) :
020C ;
020C ; 15625 = 1 S
020C ;
020C ; */
020C ;
020C ;
020C ; // first make sure the OC1 pin is in a controlled state
020C ; // we want it to be HIGH initially
020C ;
020C ; // There's no way to set/clear it directly, but it can be forced to
020C ; // a defined state by a compare match, se by setting a low compare value
020C ; // and start the timer, it can be forced into set state
020C ;
020C ;
020C ; outp(0,TCNT1H); // clear timer
020C 2224 clr R2
020E 2DBC out 0x2d,R2
0210 .dbline 346
0210 ; outp(0,TCNT1L);
0210 2CBC out 0x2c,R2
0212 .dbline 348
0212 ;
0212 ; outp(0,OCR1H); // set compare to 200
0212 2BBC out 0x2b,R2
0214 .dbline 349
0214 ; outp(200,OCR1L);
0214 88EC ldi R24,200
0216 8ABD out 0x2a,R24
0218 .dbline 351
0218 ;
0218 ; outp(0xC0,TCCR1A); // set OC1 bit to set on compare
0218 80EC ldi R24,192
021A 8FBD out 0x2f,R24
021C .dbline 354
021C ;
021C ; // start timer and wait for one compare match
021C ; outp(0x01,TCCR1B); // start with fClk/1 (4 MHz)
021C 81E0 ldi R24,1
021E 8EBD out 0x2e,R24
0220 L23:
0220 .dbline 355
0220 L24:
0220 .dbline 355
0220 ; while ( ! (unsigned char) ( inp(TIFR) & BV(OCF1A)) ); // wait for bit
0220 88B7 in R24,0x38
0222 9927 clr R25
0224 8074 andi R24,64
0226 9070 andi R25,0
0228 8823 tst R24
022A D1F3 breq L23
022C .dbline 356
022C ; sbi(TIFR,OCF1A); // clear flags
022C 88B7 in R24,0x38
022E 8064 ori R24,64
0230 88BF out 0x38,R24
0232 .dbline 358
0232 ;
0232 ; outp(0,TCCR1B); // stop timer
0232 2224 clr R2
0234 2EBC out 0x2e,R2
0236 A4C0 rjmp L27
0238 L26:
0238 .dbline 365
0238 ;
0238 ; // compare bit no HI, start
0238 ; // doing some useful work
0238 ;
0238 ;
0238 ; while (1)
0238 ; {
0238 .dbline 367
0238 ; // try a capture at min gate
0238 ; capture(500); // 1 mS
0238 04EF ldi R16,500
023A 11E0 ldi R17,1
023C AFDF rcall _capture
023E .dbline 369
023E ; // get the data
023E ; count = read_counters();
023E 7BDF rcall _read_counters
0240 1D83 std y+5,R17
0242 0C83 std y+4,R16
0244 .dbline 370
0244 ; dp = 3; // decimal point
0244 83E0 ldi R24,3
0246 8E83 std y+6,R24
0248 .dbline 371
0248 ; ms = 2; // indicate MHz
0248 82E0 ldi R24,2
024A A82E mov R10,R24
024C .dbline 373
024C ;
024C ; if (count < 4096) // less than 4.096 MHz
024C 8C81 ldd R24,y+4
024E 9D81 ldd R25,y+5
0250 8030 cpi R24,0
0252 E0E1 ldi R30,16
0254 9E07 cpc R25,R30
0256 48F5 brsh L29
0258 .dbline 374
0258 ; {
0258 .dbline 376
0258 ; // try a capture at next gate value
0258 ; capture(5000); // 10 mS
0258 08E8 ldi R16,5000
025A 13E1 ldi R17,19
025C 9FDF rcall _capture
025E .dbline 378
025E ; // get the data
025E ; count = read_counters();
025E 6BDF rcall _read_counters
0260 1D83 std y+5,R17
0262 0C83 std y+4,R16
0264 .dbline 379
0264 ; dp = 4; // decimal point
0264 84E0 ldi R24,4
0266 8E83 std y+6,R24
0268 .dbline 380
0268 ; ms = 2; // indicate MHz
0268 82E0 ldi R24,2
026A A82E mov R10,R24
026C .dbline 382
026C ;
026C ; if (count < 4096) // less than 409.6 kHz
026C 8C81 ldd R24,y+4
026E 9D81 ldd R25,y+5
0270 8030 cpi R24,0
0272 E0E1 ldi R30,16
0274 9E07 cpc R25,R30
0276 C8F4 brsh L31
0278 .dbline 383
0278 ; {
0278 .dbline 385
0278 ; // try a capture at next gate value
0278 ; capture(50000); // 100 mS
0278 00E5 ldi R16,50000
027A 13EC ldi R17,195
027C 8FDF rcall _capture
027E .dbline 387
027E ; // get the data
027E ; count = read_counters();
027E 5BDF rcall _read_counters
0280 1D83 std y+5,R17
0282 0C83 std y+4,R16
0284 .dbline 388
0284 ; dp = 3; // decimal point
0284 83E0 ldi R24,3
0286 8E83 std y+6,R24
0288 .dbline 389
0288 ; ms = 1; // indicate kHz
0288 AA24 clr R10
028A A394 inc R10
028C .dbline 391
028C ;
028C ; if (count < 4096) // less than 40.96 kHz
028C 8C81 ldd R24,y+4
028E 9D81 ldd R25,y+5
0290 8030 cpi R24,0
0292 E0E1 ldi R30,16
0294 9E07 cpc R25,R30
0296 48F4 brsh L33
0298 .dbline 392
0298 ; {
0298 .dbline 394
0298 ; // try a capture at next gate value
0298 ; capture(15625); // 1 S
0298 09E0 ldi R16,15625
029A 1DE3 ldi R17,61
029C 7FDF rcall _capture
029E .dbline 396
029E ; // get the data
029E ; count = read_counters();
029E 4BDF rcall _read_counters
02A0 1D83 std y+5,R17
02A2 0C83 std y+4,R16
02A4 .dbline 397
02A4 ; dp = 0; // decimal point
02A4 0024 clr R0
02A6 0E82 std y+6,R0
02A8 .dbline 398
02A8 ; ms = 0; // indicate Hz
02A8 AA24 clr R10
02AA .dbline 399
02AA ; }
02AA L33:
02AA .dbline 400
02AA ; }
02AA L31:
02AA .dbline 401
02AA ; }
02AA L29:
02AA .dbline 404
02AA ;
02AA ; // convert BINARY counter_value (int) to BCD in led_value (long)
02AA ; lv = 0;
02AA 40E0 ldi R20,0
02AC 50E0 ldi R21,0
02AE 60E0 ldi R22,0
02B0 70E0 ldi R23,0
02B2 EC2F mov R30,R28
02B4 FD2F mov R31,R29
02B6 4083 std z+0,R20
02B8 5183 std z+1,R21
02BA 6283 std z+2,R22
02BC 7383 std z+3,R23
02BE .dbline 405
02BE ; for (j=0;j<8;j++)
02BE CC24 clr R12
02C0 DD24 clr R13
02C2 L35:
02C2 .dbline 406
02C2 .dbline 407
02C2 2AE0 ldi R18,10
02C4 30E0 ldi R19,0
02C6 0C81 ldd R16,y+4
02C8 1D81 ldd R17,y+5
02CA 00D0 rcall mod16u
02CC E02E mov R14,R16
02CE F12E mov R15,R17
02D0 .dbline 408
02D0 84E0 ldi R24,4
02D2 90E0 ldi R25,0
02D4 EC2F mov R30,R28
02D6 FD2F mov R31,R29
02D8 2080 ldd R2,z+0
02DA 3180 ldd R3,z+1
02DC 4280 ldd R4,z+2
02DE 5380 ldd R5,z+3
02E0 8A93 st -y,R24
02E2 022D mov R16,R2
02E4 132D mov R17,R3
02E6 242D mov R18,R4
02E8 352D mov R19,R5
02EA 00D0 rcall lsr32
02EC EC2F mov R30,R28
02EE FD2F mov R31,R29
02F0 0083 std z+0,R16
02F2 1183 std z+1,R17
02F4 2283 std z+2,R18
02F6 3383 std z+3,R19
02F8 .dbline 409
02F8 8CE1 ldi R24,28
02FA 90E0 ldi R25,0
02FC 2E2C mov R2,R14
02FE 3F2C mov R3,R15
0300 4424 clr R4
0302 37FC sbrc R3,7
0304 4094 com R4
0306 5524 clr R5
0308 47FC sbrc R4,7
030A 5094 com R5
030C 8A93 st -y,R24
030E 022D mov R16,R2
0310 132D mov R17,R3
0312 242D mov R18,R4
0314 352D mov R19,R5
0316 00D0 rcall lsl32
0318 EC2F mov R30,R28
031A FD2F mov R31,R29
031C 2080 ldd R2,z+0
031E 3180 ldd R3,z+1
0320 4280 ldd R4,z+2
0322 5380 ldd R5,z+3
0324 202A or R2,R16
0326 312A or R3,R17
0328 422A or R4,R18
032A 532A or R5,R19
032C EC2F mov R30,R28
032E FD2F mov R31,R29
0330 2082 std z+0,R2
0332 3182 std z+1,R3
0334 4282 std z+2,R4
0336 5382 std z+3,R5
0338 .dbline 410
0338 2AE0 ldi R18,10
033A 30E0 ldi R19,0
033C 0C81 ldd R16,y+4
033E 1D81 ldd R17,y+5
0340 00D0 rcall div16u
0342 1D83 std y+5,R17
0344 0C83 std y+4,R16
0346 .dbline 411
0346 L36:
0346 .dbline 405
0346 8C2D mov R24,R12
0348 9D2D mov R25,R13
034A 0196 adiw R24,1
034C C82E mov R12,R24
034E D92E mov R13,R25
0350 .dbline 405
0350 8830 cpi R24,8
0352 E0E0 ldi R30,0
0354 9E07 cpc R25,R30
0356 0CF4 brge X1
0358 B4CF rjmp L35
035A X1:
035A .dbline 414
035A 0E80 ldd R0,y+6
035C 00921200 sts _decimal_point,R0
0360 .dbline 415
0360 A0921300 sts _mode_setting,R10
0364 .dbline 416
0364 EC2F mov R30,R28
0366 FD2F mov R31,R29
0368 2080 ldd R2,z+0
036A 3180 ldd R3,z+1
036C 4280 ldd R4,z+2
036E 5380 ldd R5,z+3
0370 30920F00 sts _led_value+1,R3
0374 20920E00 sts _led_value,R2
0378 50921100 sts _led_value+2+1,R5
037C 40921000 sts _led_value+2,R4
0380 .dbline 418
0380 L27:
0380 .dbline 364
0380 5BCF rjmp L26
0382 X0:
0382 .dbline -2
0382 .dbline 420
0382 ; {
0382 ; i = count % 10;
0382 ; lv >>= 4;
0382 ; lv |= ((unsigned long)i << 28);
0382 ; count /= 10;
0382 ; }
0382 ;
0382 ; // set display variables
0382 ; decimal_point = dp;
0382 ; mode_setting = ms;
0382 ; led_value = lv;
0382 ;
0382 ; } // loop
0382 ;
0382 ; }
0382 L22:
0382 2796 adiw R28,7
0384 .dbline 0 ; func end
0384 0895 ret
0386 .dbsym r ms 10 c
0386 .dbsym l dp 6 c
0386 .dbsym r i 14 I
0386 .dbsym r j 12 I
0386 .dbsym l lv 0 l
0386 .dbsym l count 4 i
0386 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -