?? countermeter.lst
字號:
350 018a F894 cli
351 018c DEBF out __SP_H__,r29
352 018e 0FBE out __SREG__,__tmp_reg__
353 0190 CDBF out __SP_L__,r28
354 0192 DF91 pop r29
355 0194 CF91 pop r28
356 0196 0895 ret
357 /* epilogue end (size=9) */
358 /* function delay size 57 (38) */
364 .Lscope1:
366 .global read_counters
368 read_counters:
121:countermeter.c **** }
122:countermeter.c ****
123:countermeter.c ****
124:countermeter.c ****
125:countermeter.c **** //讀16位計數值
126:countermeter.c **** unsigned int read_counters(void)
127:countermeter.c **** {
370 .LM17:
371 /* prologue: frame size=2 */
372 0198 CF93 push r28
373 019a DF93 push r29
374 019c CDB7 in r28,__SP_L__
375 019e DEB7 in r29,__SP_H__
376 01a0 2297 sbiw r28,2
377 01a2 0FB6 in __tmp_reg__,__SREG__
378 01a4 F894 cli
379 01a6 DEBF out __SP_H__,r29
380 01a8 0FBE out __SREG__,__tmp_reg__
381 01aa CDBF out __SP_L__,r28
382 /* prologue end (size=10) */
128:countermeter.c **** unsigned int counter_value;
129:countermeter.c ****
130:countermeter.c **** // 讀數據時關閉中斷
131:countermeter.c **** cli();
384 .LM18:
385 /* #APP */
386 01ac F894 cli
132:countermeter.c **** //關閉數碼管顯示
133:countermeter.c **** PORTA |= 0X07;
388 .LM19:
389 /* #NOAPP */
390 01ae 8091 3B00 lds r24,59
391 01b2 8760 ori r24,lo8(7)
392 01b4 8093 3B00 sts 59,r24
134:countermeter.c **** //設置PORTB位輸入
135:countermeter.c **** DDRB = 0X00;
394 .LM20:
395 01b8 1092 3700 sts 55,__zero_reg__
136:countermeter.c **** //置OE_H為低讀取高8位
137:countermeter.c **** PORTA &= ~(1<<OE_H);
397 .LM21:
398 01bc 8091 3B00 lds r24,59
399 01c0 8F7D andi r24,lo8(-33)
400 01c2 8093 3B00 sts 59,r24
138:countermeter.c **** asm volatile("nop");
402 .LM22:
403 /* #APP */
404 01c6 0000 nop
139:countermeter.c **** //1個脈沖鎖存計數值
140:countermeter.c **** PORTA |= (1<<OE_H);
406 .LM23:
407 /* #NOAPP */
408 01c8 8091 3B00 lds r24,59
409 01cc 8062 ori r24,lo8(32)
410 01ce 8093 3B00 sts 59,r24
141:countermeter.c **** asm volatile("nop");
412 .LM24:
413 /* #APP */
414 01d2 0000 nop
142:countermeter.c **** PORTA &= ~(1<<OE_H);
416 .LM25:
417 /* #NOAPP */
418 01d4 8091 3B00 lds r24,59
419 01d8 8F7D andi r24,lo8(-33)
420 01da 8093 3B00 sts 59,r24
143:countermeter.c **** asm volatile("nop");
422 .LM26:
423 /* #APP */
424 01de 0000 nop
144:countermeter.c **** //讀高8位數據
145:countermeter.c **** counter_value = PINB;
426 .LM27:
427 /* #NOAPP */
428 01e0 8091 3600 lds r24,54
429 01e4 9927 clr r25
430 01e6 8983 std Y+1,r24
431 01e8 9A83 std Y+2,r25
146:countermeter.c **** //置OE_H為高
147:countermeter.c **** PORTA |= (1<<OE_H);
433 .LM28:
434 01ea 8091 3B00 lds r24,59
435 01ee 8062 ori r24,lo8(32)
436 01f0 8093 3B00 sts 59,r24
148:countermeter.c **** counter_value <<= 8;
438 .LM29:
439 01f4 8981 ldd r24,Y+1
440 01f6 9A81 ldd r25,Y+2
441 01f8 982F mov r25,r24
442 01fa 8827 clr r24
443 01fc 8983 std Y+1,r24
444 01fe 9A83 std Y+2,r25
149:countermeter.c **** //置OE_L為低讀取低8位
150:countermeter.c **** PORTA &= ~(1<<OE_L);
446 .LM30:
447 0200 8091 3B00 lds r24,59
448 0204 8F7E andi r24,lo8(-17)
449 0206 8093 3B00 sts 59,r24
151:countermeter.c **** asm volatile("nop");
451 .LM31:
452 /* #APP */
453 020a 0000 nop
152:countermeter.c **** //1個脈沖鎖存計數值
153:countermeter.c **** PORTA |= (1<<OE_L);
455 .LM32:
456 /* #NOAPP */
457 020c 8091 3B00 lds r24,59
458 0210 8061 ori r24,lo8(16)
459 0212 8093 3B00 sts 59,r24
154:countermeter.c **** asm volatile("nop");
461 .LM33:
462 /* #APP */
463 0216 0000 nop
155:countermeter.c **** PORTA &= ~(1<<OE_L);
465 .LM34:
466 /* #NOAPP */
467 0218 8091 3B00 lds r24,59
468 021c 8F7E andi r24,lo8(-17)
469 021e 8093 3B00 sts 59,r24
156:countermeter.c **** asm volatile("nop");
471 .LM35:
472 /* #APP */
473 0222 0000 nop
157:countermeter.c **** //讀低8位數據
158:countermeter.c **** counter_value |= PINB ;
475 .LM36:
476 /* #NOAPP */
477 0224 8091 3600 lds r24,54
478 0228 282F mov r18,r24
479 022a 3327 clr r19
480 022c 8981 ldd r24,Y+1
481 022e 9A81 ldd r25,Y+2
482 0230 822B or r24,r18
483 0232 932B or r25,r19
484 0234 8983 std Y+1,r24
485 0236 9A83 std Y+2,r25
159:countermeter.c **** //置OE_L為高
160:countermeter.c **** PORTA |= (1<<OE_L);
487 .LM37:
488 0238 8091 3B00 lds r24,59
489 023c 8061 ori r24,lo8(16)
490 023e 8093 3B00 sts 59,r24
161:countermeter.c **** //設置PORTB位輸出
162:countermeter.c **** DDRB = 0XFF;
492 .LM38:
493 0242 8FEF ldi r24,lo8(-1)
494 0244 8093 3700 sts 55,r24
163:countermeter.c **** //使能數碼管刷新
164:countermeter.c **** sei();
496 .LM39:
497 /* #APP */
498 0248 7894 sei
165:countermeter.c **** return counter_value;
500 .LM40:
501 /* #NOAPP */
502 024a 8981 ldd r24,Y+1
503 024c 9A81 ldd r25,Y+2
504 /* epilogue: frame size=2 */
505 024e 2296 adiw r28,2
506 0250 0FB6 in __tmp_reg__,__SREG__
507 0252 F894 cli
508 0254 DEBF out __SP_H__,r29
509 0256 0FBE out __SREG__,__tmp_reg__
510 0258 CDBF out __SP_L__,r28
511 025a DF91 pop r29
512 025c CF91 pop r28
513 025e 0895 ret
514 /* epilogue end (size=9) */
515 /* function read_counters size 108 (89) */
520 .Lscope2:
523 .global capture
525 capture:
166:countermeter.c **** }
167:countermeter.c ****
168:countermeter.c ****
169:countermeter.c ****
170:countermeter.c **** void capture(unsigned int compare)
171:countermeter.c **** {
527 .LM41:
528 /* prologue: frame size=2 */
529 0260 CF93 push r28
530 0262 DF93 push r29
531 0264 CDB7 in r28,__SP_L__
532 0266 DEB7 in r29,__SP_H__
533 0268 2297 sbiw r28,2
534 026a 0FB6 in __tmp_reg__,__SREG__
535 026c F894 cli
536 026e DEBF out __SP_H__,r29
537 0270 0FBE out __SREG__,__tmp_reg__
538 0272 CDBF out __SP_L__,r28
539 /* prologue end (size=10) */
540 0274 8983 std Y+1,r24
541 0276 9A83 std Y+2,r25
172:countermeter.c ****
173:countermeter.c **** //清零外部計數器
174:countermeter.c **** PORTA &= ~(1<<CLEAR);
543 .LM42:
544 0278 8091 3B00 lds r24,59
545 027c 8F7B andi r24,lo8(-65)
546 027e 8093 3B00 sts 59,r24
175:countermeter.c **** asm volatile("nop");
548 .LM43:
549 /* #APP */
550 0282 0000 nop
176:countermeter.c **** //置清零為高
177:countermeter.c **** PORTA |= (1<<CLEAR);
552 .LM44:
553 /* #NOAPP */
554 0284 8091 3B00 lds r24,59
555 0288 8064 ori r24,lo8(64)
556 028a 8093 3B00 sts 59,r24
178:countermeter.c **** //清計數值
179:countermeter.c **** TCNT1H = 0;
558 .LM45:
559 028e 1092 4D00 sts 77,__zero_reg__
180:countermeter.c **** TCNT1L = 0;
561 .LM46:
562 0292 1092 4C00 sts 76,__zero_reg__
181:countermeter.c ****
182:countermeter.c **** //設置輸出比較寄存器為所需值
183:countermeter.c **** OCR1AH = compare >> 8;
564 .LM47:
565 0296 8981 ldd r24,Y+1
566 0298 9A81 ldd r25,Y+2
567 029a 892F mov r24,r25
568 029c 9927 clr r25
569 029e 8093 4B00 sts 75,r24
184:countermeter.c **** OCR1AL = compare;
571 .LM48:
572 02a2 8981 ldd r24,Y+1
573 02a4 8093 4A00 sts 74,r24
185:countermeter.c **** //比較匹配時OC1A/OC1B 電平取反
186:countermeter.c **** TCCR1A = (1<<COM1A0); //0x40;//
575 .LM49:
576 02a8 80E4 ldi r24,lo8(64)
577 02aa 8093 4F00 sts 79,r24
187:countermeter.c **** //清比較匹配標志
188:countermeter.c **** TIFR |= (1<<OCF1A);
579 .LM50:
580 02ae 8091 5800 lds r24,88
581 02b2 8061 ori r24,lo8(16)
582 02b4 8093 5800 sts 88,r24
189:countermeter.c ****
190:countermeter.c **** if (compare == 15625)
584 .LM51:
585 02b8 8981 ldd r24,Y+1
586 02ba 9A81 ldd r25,Y+2
587 02bc 2DE3 ldi r18,hi8(15625)
588 02be 8930 cpi r24,lo8(15625)
589 02c0 9207 cpc r25,r18
590 02c2 21F4 brne .L11
191:countermeter.c **** {
192:countermeter.c **** // start with fClk/256 (15625 Hz) and compare clear
193:countermeter.c **** TCCR1B = (1<<WGM12)|(1<< CS12); //0x0C;//
592 .LM52:
593 02c4 8CE0 ldi r24,lo8(12)
594 02c6 8093 4E00 sts 78,r24
595 02ca 03C0 rjmp .L13
596 .L11:
194:countermeter.c **** }
195:countermeter.c **** else
196:countermeter.c **** {
197:countermeter.c **** // start with fClk/8 (500 kHz) and compare clear
198:countermeter.c **** TCCR1B = (1<<WGM12)|(1<<CS11); //0x0A;//
598 .LM53:
599 02cc 8AE0 ldi r24,lo8(10)
600 02ce 8093 4E00 sts 78,r24
601 .L13:
199:countermeter.c **** }
200:countermeter.c ****
201:countermeter.c **** // wait for bit
202:countermeter.c **** while ( ! (unsigned char) ( TIFR & (1<< OCF1A)) );
603 .LM54:
604 02d2 8091 5800 lds r24,88
605 02d6 9927 clr r25
606 02d8 9295 swap r25
607 02da 8295 swap r24
608 02dc 8F70 andi r24,0x0f
609 02de 8927 eor r24,r25
610 02e0 9F70 andi r25,0x0f
611 02e2 8927 eor r24,r25
612 02e4 8170 andi r24,lo8(1)
613 02e6 9070 andi r25,hi8(1)
614 02e8 0097 sbiw r24,0
615 02ea 09F4 brne .L14
616 02ec F2CF rjmp .L13
617 .L14:
203:countermeter.c **** // clear flags
204:countermeter.c **** TIFR |= (1<<OCF1A);
619 .LM55:
620 02ee 8091 5800 lds r24,88
621 02f2 8061 ori r24,lo8(16)
622 02f4 8093 5800 sts 88,r24
623 .L15:
205:countermeter.c **** // counter input now enabled
206:countermeter.c **** // for the specified time
207:countermeter.c ****
208:countermeter.c **** // wait again for bit
209:countermeter.c **** while ( ! (unsigned char) ( TIFR & (1<< OCF1A)) );
625 .LM56:
626 02f8 8091 5800 lds r24,88
627 02fc 9927 clr r25
628 02fe 9295 swap r25
629 0300 8295 swap r24
630 0302 8F70 andi r24,0x0f
631 0304 8927 eor r24,r25
632 0306 9F70 andi r25,0x0f
633 0308 8927 eor r24,r25
634 030a 8170 andi r24,lo8(1)
635 030c 9070 andi r25,hi8(1)
636 030e 0097 sbiw r24,0
637 0310 09F4 brne .L16
638 0312 F2CF rjmp .L15
639 .L16:
210:countermeter.c **** // stop timer
211:countermeter.c **** TCCR1B = 0;
641 .LM57:
642 0314 1092 4E00 sts 78,__zero_reg__
643 /* epilogue: frame size=2 */
644 0318 2296 adiw r28,2
645 031a 0FB6 in __tmp_reg__,__SREG__
646 031c F894 cli
647 031e DEBF out __SP_H__,r29
648 0320 0FBE out __SREG__,__tmp_reg__
649 0322 CDBF out __SP_L__,r28
650 0324 DF91 pop r29
651 0326 CF91 pop r28
652 0328 0895 ret
653 /* epilogue end (size=9) */
654 /* function capture size 102 (83) */
656 .Lscope3:
658 .global main
660 main:
212:countermeter.c **** // counter input disabled
213:countermeter.c **** }
214:countermeter.c ****
215:countermeter.c ****
216:countermeter.c ****
217:countermeter.c **** /****************************************************************************/
218:countermeter.c **** /* main *******************************************************************/
219:countermeter.c **** /****************************************************************************/
220:countermeter.c ****
221:countermeter.c **** int main(void)
222:countermeter.c **** {
662 .LM58:
663 /* prologue: frame size=12 */
664 032a C0E0 ldi r28,lo8(__stack - 12)
665 032c D0E0 ldi r29,hi8(__stack - 12)
666 032e DEBF out __SP_H__,r29
667 0330 CDBF out __SP_L__,r28
668 /* prologue end (size=4) */
223:countermeter.c **** int i,j;
224:countermeter.c **** unsigned char dp,ms;
225:countermeter.c **** unsigned long lv;
226:countermeter.c **** unsigned int count;
227:countermeter.c **** //設置PORTA為輸出高電平
228:countermeter.c **** DDRA = 0XFF;
670 .LM59:
671 0332 8FEF ldi r24,lo8(-1)
672 0334 8093 3A00 sts 58,r24
229:countermeter.c **** PORTA = 0XFF;
674 .LM60:
675 0338 8FEF ldi r24,lo8(-1)
676 033a 8093 3B00 sts 59,r24
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -