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

📄 counter.lis

📁 本文给出了频率计的一般设计方法及软件的如何编码
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 00F8           ; 
 00F8           ; /****************************************************************************/
 00F8           ; /*  helpers  ****************************************************************/
 00F8           ; /****************************************************************************/
 00F8           ; 
 00F8           ; 
 00F8           ; void delay(unsigned short us) 
 00F8           ; {
 00F8                   .dbline 172
 00F8           ;     unsigned short  delay_loops;
 00F8           ;     register unsigned short  i;
 00F8           ; 
 00F8           ;     delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty) 
 00F8 25E0              ldi R18,5
 00FA 30E0              ldi R19,0
 00FC 042F              mov R16,R20
 00FE 152F              mov R17,R21
 0100 0D5F              subi R16,253  ; offset = 3
 0102 1F4F              sbci R17,255
 0104 00D0              rcall div16u
 0106 202E              mov R2,R16
 0108 312E              mov R3,R17
 010A 4424              clr R4
 010C 5524              clr R5
 010E 82E0              ldi R24,2
 0110 90E0              ldi R25,0
 0112 8A93              st -y,R24
 0114 022D              mov R16,R2
 0116 132D              mov R17,R3
 0118 242D              mov R18,R4
 011A 352D              mov R19,R5
 011C 00D0              rcall lsl32
 011E 402F              mov R20,R16
 0120 512F              mov R21,R17
 0122                   .dbline 175
 0122 6627              clr R22
 0124 7727              clr R23
 0126 02C0              rjmp L11
 0128           L8:
 0128                   .dbline 175
 0128                   .dbline 175
 0128           L9:
 0128                   .dbline 175
 0128 6F5F              subi R22,255  ; offset = 1
 012A 7F4F              sbci R23,255
 012C           L11:
 012C                   .dbline 175
 012C           ; 
 012C           ;     // one loop takes 5 cpu cycles 
 012C           ;     for (i=0; i < delay_loops; i++) {};
 012C 6417              cp R22,R20
 012E 7507              cpc R23,R21
 0130 D8F3              brlo L8
 0132                   .dbline 175
 0132                   .dbline -2
 0132                   .dbline 176
 0132           ; } 
 0132           L7:
 0132 00D0              rcall pop_gset2
 0134                   .dbline 0 ; func end
 0134 0895              ret
 0136                   .dbsym r delay_loops 20 s
 0136                   .dbsym r i 22 s
 0136                   .dbsym r us 20 s
 0136                   .dbend
 0136                   .dbfunc e read_counters _read_counters fi
 0136           ;  counter_value -> R16,R17
                        .even
 0136           _read_counters::
 0136                   .dbline -1
 0136                   .dbline 183
 0136           ; 
 0136           ; 
 0136           ; //
 0136           ; // read 16 bit counter value 
 0136           ; //
 0136           ; unsigned int read_counters(void)
 0136           ; {
 0136                   .dbline 187
 0136           ;     unsigned int counter_value;
 0136           ; 
 0136           ;     // stop display refresh while reading counters
 0136           ;     cli();
 0136 F894              cli
 0138                   .dbline 190
 0138           ; 
 0138           ;     // turn off all segments
 0138           ;     outp(inp(PORTB) | 0x07, PORTB);
 0138 88B3              in R24,0x18
 013A 8760              ori R24,7
 013C 88BB              out 0x18,R24
 013E                   .dbline 193
 013E           ;     
 013E           ;     // set high B port to input
 013E           ;     outp(0x0f,DDRB);
 013E 8FE0              ldi R24,15
 0140 87BB              out 0x17,R24
 0142                   .dbline 196
 0142           ; 
 0142           ;     // set low D port to input
 0142           ;     outp(0xf0,DDRD);
 0142 80EF              ldi R24,240
 0144 81BB              out 0x11,R24
 0146                   .dbline 200
 0146           ; 
 0146           ; 
 0146           ;     // activate OE_H
 0146           ;     cbi(PORTD,OE_H);
 0146 9598              cbi 0x12,5
 0148                   .dbline 201
 0148           ;     asm ("nop");
 0148 0000              nop
 014A                   .dbline 202
 014A           ;     sbi(PORTD,OE_H);            // one pulse to latch count
 014A 959A              sbi 0x12,5
 014C                   .dbline 203
 014C           ;     asm("nop");
 014C 0000              nop
 014E                   .dbline 204
 014E           ;     cbi(PORTD,OE_H);
 014E 9598              cbi 0x12,5
 0150                   .dbline 205
 0150           ;     asm ("nop");
 0150 0000              nop
 0152                   .dbline 208
 0152           ;     
 0152           ;     // read hi
 0152           ;     counter_value = (inp(PINB) & 0xf0);
 0152 06B3              in R16,0x16
 0154 1127              clr R17
 0156 007F              andi R16,240
 0158 1070              andi R17,0
 015A                   .dbline 210
 015A           ;     // read lo
 015A           ;     counter_value |= (inp(PIND) & 0x0f);
 015A 80B3              in R24,0x10
 015C 9927              clr R25
 015E 8F70              andi R24,15
 0160 9070              andi R25,0
 0162 082B              or R16,R24
 0164 192B              or R17,R25
 0166                   .dbline 212
 0166           ;     // deactivate OE_H
 0166           ;     sbi(PORTD,OE_H);
 0166 959A              sbi 0x12,5
 0168                   .dbline 215
 0168           ; 
 0168           ; 
 0168           ;     counter_value <<= 8;
 0168 102F              mov R17,R16
 016A 0027              clr R16
 016C                   .dbline 219
 016C           ; 
 016C           ;     
 016C           ;     // activate OE_L
 016C           ;     cbi(PORTD,OE_L);
 016C 9498              cbi 0x12,4
 016E                   .dbline 220
 016E           ;     asm("nop");
 016E 0000              nop
 0170                   .dbline 221
 0170           ;     sbi(PORTD,OE_L);            // one pulse to latch count
 0170 949A              sbi 0x12,4
 0172                   .dbline 222
 0172           ;     asm ("nop");
 0172 0000              nop
 0174                   .dbline 223
 0174           ;     cbi(PORTD,OE_L);
 0174 9498              cbi 0x12,4
 0176                   .dbline 224
 0176           ;     asm ("nop");
 0176 0000              nop
 0178                   .dbline 227
 0178           ; 
 0178           ;     // read hi
 0178           ;     counter_value |= (inp(PINB) & 0xf0);
 0178 86B3              in R24,0x16
 017A 9927              clr R25
 017C 807F              andi R24,240
 017E 9070              andi R25,0
 0180 082B              or R16,R24
 0182 192B              or R17,R25
 0184                   .dbline 229
 0184           ;     // read lo
 0184           ;     counter_value |= (inp(PIND) & 0x0f);
 0184 80B3              in R24,0x10
 0186 9927              clr R25
 0188 8F70              andi R24,15
 018A 9070              andi R25,0
 018C 082B              or R16,R24
 018E 192B              or R17,R25
 0190                   .dbline 231
 0190           ;     // deactivate OE_L
 0190           ;     sbi(PORTD,OE_L);
 0190 949A              sbi 0x12,4
 0192                   .dbline 235
 0192           ; 
 0192           ; 
 0192           ;     // set B port back to output
 0192           ;     outp(0xff,DDRB);
 0192 8FEF              ldi R24,255
 0194 87BB              out 0x17,R24
 0196                   .dbline 238
 0196           ; 
 0196           ;     // set D port back to output
 0196           ;     outp(0xff,DDRD);
 0196 81BB              out 0x11,R24
 0198                   .dbline 241
 0198           ; 
 0198           ;     // re-enable display refresh
 0198           ;     sei();    
 0198 7894              sei
 019A                   .dbline 242
 019A           ;     return counter_value;
 019A                   .dbline -2
 019A           L12:
 019A                   .dbline 0 ; func end
 019A 0895              ret
 019C                   .dbsym r counter_value 16 i
 019C                   .dbend
 019C                   .dbfunc e capture _capture fV
 019C           ;        compare -> R16,R17
                        .even
 019C           _capture::
 019C                   .dbline -1
 019C                   .dbline 250
 019C           ; }
 019C           ; 
 019C           ; 
 019C           ; //
 019C           ; // do a capture
 019C           ; //
 019C           ; void capture(unsigned int compare)
 019C           ; {
 019C                   .dbline 252
 019C           ; 
 019C           ;     cbi(PORTD,CLEAR);       // clear external counters
 019C 9698              cbi 0x12,6
 019E                   .dbline 253
 019E           ;     asm ("nop");
 019E 0000              nop
 01A0                   .dbline 254
 01A0           ;     sbi(PORTD,CLEAR);       // remove clear
 01A0 969A              sbi 0x12,6
 01A2                   .dbline 256
 01A2           ;     
 01A2           ;     outp(0,TCNT1H);         // clear timer
 01A2 2224              clr R2
 01A4 2DBC              out 0x2d,R2
 01A6                   .dbline 257
 01A6           ;     outp(0,TCNT1L);
 01A6 2CBC              out 0x2c,R2
 01A8                   .dbline 259
 01A8           ; 
 01A8           ;     outp(compare >> 8,OCR1H);   // set the compare1 register to the
 01A8 202E              mov R2,R16
 01AA 312E              mov R3,R17
 01AC 232C              mov R2,R3
 01AE 3324              clr R3
 01B0 2BBC              out 0x2b,R2
 01B2                   .dbline 260
 01B2           ;     outp(compare,OCR1L);        // required value
 01B2 0ABD              out 0x2a,R16
 01B4                   .dbline 262
 01B4           ; 
 01B4           ;     outp(0x40,TCCR1A);          // set OC1 bit to toggle on compare
 01B4 80E4              ldi R24,64
 01B6 8FBD              out 0x2f,R24
 01B8                   .dbline 264
 01B8           ; 
 01B8           ;     sbi(TIFR,OCF1A);            // clear overflov/compare flags
 01B8 88B7              in R24,0x38
 01BA 8064              ori R24,64
 01BC 88BF              out 0x38,R24
 01BE                   .dbline 266
 01BE           ; 
 01BE           ;     if (compare == 15625)
 01BE 0930              cpi R16,9
 01C0 EDE3              ldi R30,61
 01C2 1E07              cpc R17,R30
 01C4 19F4              brne L14
 01C6                   .dbline 267
 01C6           ;         outp(0x0C,TCCR1B);      // start with fClk/256 (15625 Hz) and compare clear
 01C6 8CE0              ldi R24,12
 01C8 8EBD              out 0x2e,R24
 01CA 02C0              rjmp L17
 01CC           L14:
 01CC                   .dbline 269
 01CC           ;     else
 01CC           ;         outp(0x0A,TCCR1B);      // start with fClk/8 (500 kHz) and compare clear
 01CC 8AE0              ldi R24,10
 01CE 8EBD              out 0x2e,R24
 01D0           L16:
 01D0                   .dbline 271
 01D0           L17:
 01D0                   .dbline 271
 01D0           ; 
 01D0           ;     while ( ! (unsigned char) ( inp(TIFR) & BV(OCF1A)) );   // wait for bit
 01D0 88B7              in R24,0x38
 01D2 9927              clr R25
 01D4 8074              andi R24,64
 01D6 9070              andi R25,0
 01D8 8823              tst R24
 01DA D1F3              breq L16
 01DC                   .dbline 272
 01DC           ;     sbi(TIFR,OCF1A);    // clear flags
 01DC 88B7              in R24,0x38
 01DE 8064              ori R24,64
 01E0 88BF              out 0x38,R24
 01E2           L19:
 01E2                   .dbline 277
 01E2           L20:
 01E2                   .dbline 277
 01E2           ;     
 01E2           ;     // counter input now enabled
 01E2           ;     // for the specified time
 01E2           ;     
 01E2           ;     while ( ! (unsigned char) ( inp(TIFR) & BV(OCF1A)) );   // wait again for bit
 01E2 88B7              in R24,0x38
 01E4 9927              clr R25
 01E6 8074              andi R24,64
 01E8 9070              andi R25,0
 01EA 8823              tst R24
 01EC D1F3              breq L19
 01EE                   .dbline 279
 01EE           ; 
 01EE           ;     outp(0,TCCR1B);     // stop timer
 01EE 2224              clr R2
 01F0 2EBC              out 0x2e,R2
 01F2                   .dbline -2
 01F2                   .dbline 282
 01F2           ;     
 01F2           ;     // counter input disabled
 01F2           ; }
 01F2           L13:
 01F2                   .dbline 0 ; func end
 01F2 0895              ret
 01F4                   .dbsym r compare 16 i
 01F4                   .dbend
 01F4                   .dbfunc e main _main fV
 01F4           ;             ms -> R10
 01F4           ;             dp -> y+6
 01F4           ;              i -> R14,R15
 01F4           ;              j -> R12,R13
 01F4           ;             lv -> y+0
 01F4           ;          count -> y+4
                        .even
 01F4           _main::
 01F4 2797              sbiw R28,7
 01F6                   .dbline -1
 01F6                   .dbline 291
 01F6           ; 
 01F6           ; 
 01F6           ; 
 01F6           ; /****************************************************************************/
 01F6           ; /*  main  *******************************************************************/
 01F6           ; /****************************************************************************/
 01F6           ; 
 01F6           ; void main(void) 
 01F6           ; {
 01F6                   .dbline 298
 01F6           ;     int i,j;
 01F6           ;     unsigned char dp,ms;
 01F6           ;     unsigned long lv;
 01F6           ;     unsigned int count;
 01F6           ; 
 01F6           ;     // set all PORTB as outputs
 01F6           ;     outp(0xff,DDRB);
 01F6 8FEF              ldi R24,255
 01F8 87BB              out 0x17,R24
 01FA                   .dbline 301
 01FA           ;     
 01FA           ;     // set all bits hi
 01FA           ;     outp(0xff,PORTB);
 01FA 88BB              out 0x18,R24
 01FC                   .dbline 305
 01FC           ; 
 01FC           ; 
 01FC           ;     // set all PORTD as outputs
 01FC           ;     outp(0xff,DDRD);
 01FC 81BB              out 0x11,R24
 01FE                   .dbline 308
 01FE           ;     

⌨️ 快捷键说明

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