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