#ifndef _delay_inc_ #define _delay_inc_ messg "include 'delay.inc'" LIST ; Title : delay time ; By : komi ; Last update : 2005.08.30 ; Version : 0.1 NOLIST ;---------------------------------------------------------------------------- ; 解説 ;---------------------------------------------------------------------------- ; ;---------------------------------------------------------------------------- #ifndef CLOCK_FREQ error "Please define that is CPU CLOCK frequency.(ADCON.INC)" #endif ;------------------------------------------------------------------ U_DELAY UDATA delay_times res 1 delay_times1 res 1 ;------------------------------------------------------------------ ;------------------------------------------------------------------ ; μ秒単位 ; 現時点のVerでは 154usec @20MHz まで delay_us_V1 MACRO usecV1 variable T, x, y local label1 T = D'1000000000' / (CLOCK_FREQ /4) ; T [nsec] 命令フェッチ周期 x = (usecV1 * D'1000') / T ; x 必要命令数 if (x > D'773') error "too long seconds.(delay_us_V1:DELAY.INC)" endif if (x > D'12') y = (x) / 3 -2 x = (x) % 3 +2 banksel delay_times MOVLW y MOVWF delay_times label1: DECFSZ delay_times, F GOTO label1 endif while (x >= 0) if (x >= 2) GOTO $+1 x -= 2 else NOP x -- endif endw ENDM ;------------------------------------------------------------------ ; msec単位 delay_ms_V1 MACRO msecV1 variable T, x, y, z local label1, label2, label3 T = D'1000000000' / (CLOCK_FREQ /4) ; T [nsec] 命令フェッチ周期 x = (msecV1 * D'1000000') / T ; x 必要命令数 y = x / 256 z = (x % 256) /4 banksel delay_times MOVLW y MOVWF delay_times label1: MOVLW D'84' MOVWF delay_times1 label2: DECFSZ delay_times1, F GOTO label2 DECFSZ delay_times, F GOTO label1 ;2 MOVLW z ;1 MOVWF delay_times ;1 label3: GOTO $+1 ;2 NOP ;1 DECFSZ delay_times, F ;1 GOTO label3 ;2 ENDM ;------------------------------------------------------------------ ;---------------------------------------------------------------------------- LIST #endif