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

📄 counter.lis

📁 本文给出了频率计的一般设计方法及软件的如何编码
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 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 + -