8장. HSI (High Speed Input)

왜 HSI 인가?

-□고속입력□이라고 부르는 이유는 CPU에 거의 부담을 주지 않고 하드웨어가 직접 펄스의 폭의 측정하여

FIFO(7 * 20bit)에 저장한 후 인터럽트를 발생하기 때문이다.

- 고속 입력 장치는 타이머 1을 기준 시간으로 하여 사건이 발생한 시점을 기록한다.

- 펄스를 입력받는 핀은 HSI.0 ~ 3까지 총 4개의 핀이 있다.

- 펄스의 폭을 측정하는 방법에는 ①매　상승 모서리(positive transition, rising edge)마다 측정하는 방법,

②매 하강 모서리(negative transition, falling edge)마다 측정하는 방법, ③매 상승/하강 모서리 모두를

측정하는 방법, 그리고 ④매 8번째 상승 모서리마다 측정하는 방법이 있다. (모서리 = 사건:Event)

- 어느 핀에서 어떤 사건을 입력받을 것인가를 HSI 모드 레지스터에 써넣으면 고속 입력 장치는 해당하는 사건이 발생할 때마다 사건 발생 시점을 기록한다. 사건의 발생은 FIFO라는 저장 영역에 순서대로 기록이 되는데 총 8개까지 기억이 된다. 사용자는 HSI 데이터 이용가능 인터럽트가 걸리면 hsi_status 레지스터에서 어떤 핀에서 사건이 발생하였는지를 확인해 보아야 한다. 그리고 hsi_time 레지스터에서 발생한 시간값을 읽는다. 이렇게 hsi_time 레지스터를 읽으면 FIFO의 한 층이 제거되는 것이다. 만약 저장 레지스터가 꽉 차도록 읽어가지 않는다면 그 후 발생한 사건은 기록이 되지 않는다.

1. hsi에 관계된 레지스터들

① IOC0 ; hsi 핀들은 이 레지스터를 통해 독립적으로 입력을 허용하거나 억제시킬 수 있다. 만약 핀을 억제시키면 그 핀으로 들어오는 사건은 FIFO에 입력되지 않는다.

hsi.0으로 사건을 입력받으려면 hsi.0 입력허용 ioc0.0 = 1 로 설정해야 한다.

hsi.1으로 사건을 입력받으려면 hsi.1 입력허용 ioc0.2 = 1 로 설정해야 한다.

hsi.2으로 사건을 입력받으려면 hsi.2 입력허용 ioc0.4 = 1 , hso.4 출력억제 ioc1.4 = 0 으로 설정.

hsi.3으로 사건을 입력받으려면 hsi.3 입력허용 ioc0.6 = 1 , hso.5 출력억제 ioc1.6 = 0 으로 설정.

표 8.  HSI 설정 레지스터 IOC0

IOC	1	0
IOC0.0	hsi0 허용	hsi0 억제
IOC0.2	hsi1 허용	hsi1 억제
IOC0.4	hsi2 허용	hsi2 억제, hso4 허용
IOC0.6	hsi3 허용	hsi3 억제, hso5 허용

② hsi_status ; 핀의 허용이나 억제 상태와는 무관하게 hsi 상태 레지스터의 입력 핀은 항상 유효해서, 핀의 현재 상태가 hsi 상태 레지스터 hsi_status에 표시된다. 따라서 이 기능을 이용해 hsi 핀을 범용 입력 핀으로 사용할 수 있다.

6H - 읽을때)
7	6	5	4	3	2	1	0
hsi.3 상태		hsi.2 상태		hsi.1 상태		hsi.0 상태
2 비트중 아래쪽 : 사건의 발생 여부 위 쪽 : 입력 핀의 현재 상태

표 8.  HSI_STATUS 레지스터

hsi_status (0x06)
7	6	5	4	3	2	1	0
hsi.3 상태		hsi.2 상태		hsi.1 상태		hsi.0 상태
2 비트중 아래쪽 : 사건의 발생여부 위 쪽 : 입력 핀의 현재 상태

④ hsi_mode ; 어느 핀에서 어떤 종류의 사건을 기록할 것인가를 정한다.

표 8.  HSI_MODE 레지스터

hsi_mode (0x03) write
7	6	5	4	3	2	1	0
hsi.3 모드		hsi.2 모드		hsi.1 모드		hsi.0 모드
0 0 : 8 positive transition 0 1 : each positive transition 1 0 : each negative transition 1 1 : every transition (positive and negative)

③ ioc1 ; hsi의 인터럽트가 발생되는 방식을 결정하기 위해서 ioc1.7 = 1로 하면 FIFO가 가득 찰 때 인터럽트가 발생하고, ioc1.7 = 0으로 하면 저장 레지스터에 기록이 될 때마다 인터럽트가 발생한다.

표 8.  HSI Interrupt

Interrupt Source	일반적으로 일어날 때	Interrupt 이름	우선순위
HSI FIFO Full	INT_MASK1.6=1 그리고 6번째 개체가 FIFO로 들어 왔을 때. Holding register 전체가 카운트 되지 않는다.	HSI FIFO Full (INT14)	14
	IOC1.7=1, INT_MASK.2=1, INT_MASK1.6,그리고 6번째 개체가 FIFO로 들어 왔을 때. Holding register 전체가 카운트되지 않는다.	HSI Data Available (INT02)	2
HSI FIFO 4	INT_MASK1.2=1, 그리고 4번째 개체가 FIFO로 들어왔을 때. Holding register 전체가 카운트되지 않는다.	HSI FIFO 4 (INT10)	10
HSI.0 External	INT_MASK1.4=1, 그리고 HSI.0 신호가 low에서 high로 변화하거나 최소한 1스테이트 타임이상 high로 유지될 때. 이 인터럽트는 독립적으로, 외부 인터럽트로, 또는 HSI 입력모듈과는 별도로 구성될 수 있다.	HSI.0 Pin (INT04)	4
HSI Data Available	IOC1.7=0, INT_MASK.2=1, FIFO에서 홀딩레지스터로 들어오는 모든 개체에서. 이 인터럽트는 적어도 한번의 HSI 이벤트가 일어났거나, 수행준비중임을 나타낸다.	HSI Data Available (INT02)	2

⑤ hsi_time (04H, 05H); 사건이 발생한 시점(Timer1의 count 수)이 기록되는 레지스터

O 핀 중복

표 8.  HSI 각 핀의 부가기능

HSI Function Name	부가기능	설정방법
HSI.0	HSI.0 pin interrupt (INT04)	INT_MASK1.4를 □1□로 함으로서 HSI.0 Pin interrupt(INT04)를 사용가능하게 한다. 인식을 확신하기 위해서는 2스테이트 타임 이후의 시간이 지나야 한다.
	Timer 2 reset source	IOC0.2를 □1□로 함으로서 HSI.0를 Timer2 reset source로 사용할 수 있다. 이렇게 함으로서 HSI.0 Pin의 상승모서리에서 Timer2를 reset할 수 있다.
HSI.1	Timer 2 clock source	IOC0.7과 IOC3.0을 □0□로 함으로써 HSI.1을 Timer2 clock source로 사용할 수 있게 된다.
HSI.2	HSO.4	IOC1.4를 □1□로 함으로써 HSO.4로 사용할 수 있게 된다. 주의할 사항은 HSI와 HSO로 동시에 쓸 수 없다.
HSI.3	HSO.5	IOC1.6를 □1□로 함으로써 HSO.4로 사용할 수 있게 된다. 주의할 사항은 HSI와 HSO로 동시에 쓸 수 없다.

2. hsi를 이용한 주파수 측정기

함수 발생기로 구형파를 만들어서 196보드의 hsi로 입력하고, 196보드에서는 들어오는 펄스의 주기를 계산해서 주파수로 환산한 후 시리얼 포트로 출력하는 프로그램을 작성해 보자.

이것은 엔코더를 사용해서 모터의 속도를 측정하는 실험과 거의 동일한 실험이다.

□ 프로그램 구조

1. 우선 HSI 인터럽트는 HSI.3에서 입력을 받고, 상승모서리에서 인터럽트가 발생하도록 설정을 한다.(높은 주파수의 측정도 가능하려면 8번째 모서리로 프로그램 개편)

2. TIMER1 오버플로우 인터럽트를 가능하게 하여서 매 오버플로우 인터럽트가 발생할 때마다 특정한 변수의 값을 1씩 증가시킨다.( 타이머가 한번 오버플로우 되는데 약 0.006초 가 걸린다 --> 느린 주파수의 측정도 가능하게 하기 위해)

3. 인터럽트 서비스 루틴에서는 매 인터럽트가 발생할 때마다 이전번에 발생했었던 시점과의 시간차를 구하여서 특정한 변수에다가 기록한다. (오버플로우된 변수의 값도 고려)

4. 메인 루틴에서는 시간차가 기록된 변수의 값을 가지고 입력 신호의 주파수를 계산하여 시리얼 포트로 계속 출력한다.

<자료>  1. 196KC의 HSI 를 제어하기 위한 SFR

	수평 윈도우 0 wsr = 0 read	수평 윈도우 0 wsr = 0 write	수평 윈도우 1 wsr = 1 read/write	수평 윈도우 15 wsr = 0FH read	수평 윈도우 15 wsr = 0FH write
17H	IOS2	PWM0_CONTROL	PWM2_CONTROL	PWM0_CONTROL	IOS2
16H	IOS1	IOC1	PWM1_CONTROL	IOC1	IOS1
15H	IOS0	IOC0		IOC0	IOS0
14H	WSR
13H	INT_MASK1
12H	INT_PEND1
11H	SP_STAT	SP_CON		SP_CON	SP_STAT
10H	IOPORT2
0FH	IOPORT1
0EH	IOPORT0	BAUD RATE
0DH	TIMER2(HI)			T2CAPTURE(HI)
0CH	TIMER2(LO)		IOC3	T2CAPTURE(LO)
0BH	TIMER1(HI)	IOC2		IOC2	TIMER1(HI)
0AH	TIMER1(LO)	WATCHDOG		WATCHDOG	TIMER1(LO)
09H	INT_PEND
08H	INT_MASK
07H	SBUF(Rx)	SBUF(Tx)	PTSSRV(HI)	SBUF(Tx)	SBUF(Rx)
06H	HSI_STATUS	HSO_COMMAND	PTSSRV(LO)	HSO_COMMAND	HSI_STATUS
05H	HSI_TIME(HI)	HSO_TIME(HI)	PTSSEL(HI)	HSO_TIME(HI)	HSI_TIME(HI)
04H	HSI_TIME(LO)	HSO_TIME(LO)	PTSSEL(LO)	HSO_TIME(LO)	HSI_TIME(LO)
03H	AD_RESULT(HI)	HSI_MODE	AD_TIME	HSI_MODE	AD_RESULT(HI)
02H	AD_RESULT(LO)	AD_COMMAND		AD_COMMAND	AD_RESULT(LO)
01H	ZERO_REG(HI)
00H	ZERO_REG_(LO)

1.  I/O control register 0 (IOC0)  : 15H : HWindow 0(write), HWindow 15 (read)

Bit Number	Bit Mnemonic	Bit Name	Reset State	Description
0	HSI0_ENA	Enable HSI.0 as HSI input	0	이 비트는 HSI.O 핀이 HSI FIFO를 통해 입력되어지는 이벤트를 제어한다. 1 = HSI 입력 인에이블, 0 = HSI 입력 디스에이블
1	SW_T2RST	Timer 2 Software Reset	X	이 비트에 □1□을 써넣으면 타이머 2가 리셋된다. HWindow 15에서 이 비트를 읽으면 언제나 □1□로 읽혀진다. 1 = 쓸 때마다 타이머 2 리셋, 0 = no action
2	HSI1_ENA	Enable HSI.1 as HSI input	0	이 비트는 HSI.1 핀이 HSI FIFO를 통해 입력되어지는 이벤트를 제어한다. 1 = HSI 입력 인에이블, 0 = HSI 입력 디스에이블
3	T2RST_ENA	Timer 2 External Reset Source	0	이 비트는 타이머 2의 외부 리셋을 인에이블한다. 이 외부 리셋 소스는 IOC0.5가 선택되어졌을 때 T2RST 또는 HSI.0의 상승에지이다. 1 = 외부 리셋 인에이블, 0 = 디스에이블
4	HSI2_ENA	Enable HSI.2 as HSI input	0	이 비트는 HSI.2 핀이 HSI FIFO를 통해 입력되어지는 이벤트를 제어한다. 1 = HSI 입력 인에이블, 0 = HSI 입력 디스에이블
5	T2RST_SRC	Timer 2 Reset Source	0	이 비트는 타이머 2의 외부 리셋 소스를 선택한다. IOC0.3은 반드시 외부 리셋이 인에이블로 설정되어 있어야한다. 1 = HSI.o 핀 상승 에지, 0 = T2RST 핀(P2.4) 상승 에지
6	HSI3_ENA	Enable HSI.2 as HSI input	0	이 비트는 HSI.3 핀이 HSI FIFO를 통해 입력되어지는 이벤트를 제어한다. 1 = HSI 입력 인에이블, 0 = HSI 입력 디스에이블
7	T2CLK_SRC	Timer 2 Clock Source	0	이 비트는 타이머 2의 외부 클록 소스를 선택한다. IOC3.0은 반드시 외부 클록 소스가 인에이블 하도록 클리어되어야 한다. 1 = HSI.1 pin, 0 = T2CLK pin (P2.3)

2.  I/O control register 1 (IOC1)  : 16H :	HWindow 0(write), HWindow 15 (read)

Bit Number	Bit Mnemonic	Bit Name	Reset State	Description
0	PWM_SEL	Select P2.5/ PWM Output	1	이 비트는 P2.5의 기능이 PWM 출력 핀이거나 표준 출력 포트 핀이 되도록 제어한다. 1 = PWM 출력 핀 0 = 표준 출력 포트 핀
1	EXTINT_SRC	Select External Interrupt INT07 Source	0	이 비트는 EXTINT 외부 인터럽트 소스(INT7, 200EH)를 선택한다. INT_MASK.7은 반드시 이 인터럽트를 인에이블하도록 설정되어야한다. 1 = P0.7 0 = P2.2
2	T1OVF_INT	Enable Timer 1 Overflow Interrupt	0	타이머 1과 타이머 2는 타이머 오버플로 인터럽트(INT00,2000H)를 발생할 수 있다. 이 비트는 타이머 1에서 오버플로 인터럽트를 발생하는지 제어한다. INT_MASK0는 반드시 인터럽트 인에이블 되도록 설정되어야한다. IOS1.5는 인터럽트 상태를 가리킨다. 1 = 타이머 1 인에이블 0 = 타이머 1 디스에이블
3	T2OVF_INT	Enable Timer 2 Overflow Interrupt	0	타이머 1과 타이머 2는 타이머 오버플로 인터럽트(INT00,2000H)를 발생할 수 있다. 이 비트는 타이머 2에서 오버플로 인터럽트를 발생하는지 제어한다. INT_MASK0는 반드시 인터럽트 인에이블 되도록 설정되어야한다. IOS1.4는 인터럽트 상태를 가리킨다. 1 = 타이머 2 인에이블 0 = 타이머 2 디스에이블
4	HSO4_ENA	Enable HSO.4 Pin as Output	0	HSO.4는 HSI.2 입력 핀 기능의 다중기능을 가진다. 이 비트는 HSO.4의 출력 기능을 인에이블한다. 1 = 출력 인에이블 0 = 출력 디스에이블
5	TXD_SEL	Select P2.0/TXD Output	1	이 비트는 P2.0가 시리얼 포트의 TXD 출력 또는 표준 출력 포트인지 제어한다. 1 = 시리얼 포트 TXD 출력 0 = 표준 출력포트 핀
6	HSO5_ENA	Enable HSO.5 Pin as Output	0	HSO.5는 HSI.3 입력 핀 기능의 다중기능을 가진다. 이 비트는 HSO.5의 출력 기능을 인에이블 한다. 1 = 출력 인에이블 0 = 출력 디스에이블
7	HSI_INT	Select HSI Interrupt Source	0	이 비트 HSI 데이터 수용 인터럽트 (INT02, 2004H)의 소스를 선택한다. INT_MASK.2는 반드시 인터럽트 인에이블로 설정되어야 한다.

3.  Interrupt Mask & Interrupt Pending

SFR 번지	7	6	5	4	3	2	1	0
09H: INT_PEND 08H: INT_MASK	EXTINT	serial port	software timer	HSI.0 pin	HSO pin	HSI data	A/D done	timer overflow

SFR 번지	7	6	5	4	3	2	1	0
12H: INT_PEND1 13H: INT_MASK1	NMI	FIFO full	EXTINT1	T2 overflow	T2 capture	HSI FIFO 4th full	RI	TI

4.  I/O status register 1 (IOS1)  : 16H  :	HWindow 0(write),  HWindow15 (read)

Bit Number	Bit Mnemonic	Bit Name	Reset State	Description
0	SWTF0	Software- Timer 0 Flag	0	이 비트가 셋되면 소프트웨어 타이머 0이 끝나고 INT05(200AH) 트리거되는 것을 가리킨다. INT_MSK.5는 인터럽트 인에이블로 설정되어야 한다.
1	SWTF0	HSO.1 State	0	이 비트가 셋되면 소프트웨어 타이머 1이 끝나고 INT05(200AH) 트리거되는 것을 가리킨다. INT_MSK.5는 인터럽트 인에이블로 설정되어야 한다.
2	SWTF0	HSO.2 State	0	이 비트가 셋되면 소프트웨어 타이머 2가 끝나고 INT05(200AH) 트리거되는 것을 가리킨다. INT_MSK.5는 인터럽트 인에이블로 설정되어야 한다.
3	SWTF0	HSO.3 State	0	이 비트가 셋되면 소프트웨어 타이머 3이 끝나고 INT05(200AH) 트리거되는 것을 가리킨다. INT_MSK.5는 반드시 인터럽트 인에이블로 설정되어야 한다.
4	T2_OVF	Timer2 Overflow	0	타이머 1과 타이머 2는 타이머 오버플로 인터럽트(INT00, 2000H)를 발생할 수 있다. 이 비트가 □1□ 되면 타이머 1 인터럽트 발생을 가리키게 된다. INT_MASK.0는 반드시 인터럽트 인에이블로 설정되어야 한다.
5	T1_OVF	Timer1 Overflow	0	타이머 1과 타이머 2는 타이머 오버플로 인터럽트(INT00, 2000H)를 발생할 수 있다. 이 비트가 □1□ 되면 타이머 2 인터럽트 발생을 가리키게 된다. INT_MASK.0는 반드시 인터럽트 인에이블로 설정되어야 한다.
6	FIFO_FULL	Sixth FIFO Entry Flag	0	이 비트가 □1□되었을 때는 HSI FIFO가 홀딩 레지스터와 독립적으로 6 이상 기록되었음을 가리킨다. 이 이벤트는 데이터 사용가는 인터럽트(INT02,20004H)또는 HSI FIFO 포화 인터럽트(INT14, 203CH)를 발생한다. 그러나 둘 중 하나를 설정할 수 없다.
7	HSI_RDY	HSI Holding Register Data Ready	0	이 비트가 □1□이 되었을 때 HSI 홀딩 레지스터가 로드(load)되었음을 가리킨다. IOC1.7를 □0□으로 했을 때 인 이벤트는 HSI 데이터 사용가능 인터럽트(INT02, 2004H)를 발생한다. INT_MASK.2는 반드시 인터럽트 인에이블로 설정되어야 한다.

/*<프로그램 ch8_2xx.c96>*/

/*HSI.0을 이용하여 입력*/

#pragma code

#pragma model(kc)

#include "80c196.h"

unsigned char g_IOS1;

unsigned int g_FIFO_count;

unsigned char g_HSI_status, g_HSI_time;

char String[16];

void PutByte( BYTE datum)

{

sbuf = datum;

while( (sp_stat&0x20) != 0x20 );

}

void Binary_out( int x, int y, unsigned char data )

{

int i;

char_position(x,y);

for( i=7; i>=0; i--)

if( ( ( data>>i ) & 0x01 ) == 0 )

PutByte('0');

else

PutByte('1');

}

void Hex_out( int x, int y, unsigned int data )

{

unsigned char buffer[4];

unsigned char temp[4];

int i, j;

for(i=0; i<4; I++)

{

temp[i] = data%0x10;

data = data >>8;

if(temp[i] > 0x09 ) temp[i] = temp[i] + 'A';

else temp[i] = temp[i] + '0';

}

for(j= i; j>=0; j--)

buffer[i-j]  = temp[j];

Put_string_out(buffer);

}

void Put_string_out(char *str)

{

while( *str ) PutByte(*(str++));

}

/***********************************

int04

************************************/

void hsi_0(void)

{

asm pusha;

sprintf(String, "INT 04 : HSI0        ");

g_HSI_status = hsi_status;

g_HSI_time = hsi_time;

asm popa;

}

/***********************************

int02

************************************/

void hsi_data(void)

{

int i;

asm pusha;

sprintf(String,"INT 02:HSI DATA  ");

g_FIFO_count++;

for(i = 0;i<6;i++)

{

g_HSI_status = hsi_status;

g_HSI_time = hsi_time;

}

asm popa;

}

/***********************************

int10

************************************/

void fifo_4th(void)

{

int i;

asm pusha;

sprintf(String ,"INT 10:FIFO 4th ");

for(i = 0;i<4;i++)

{

g_HSI_status = hsi_status;

g_HSI_time = hsi_time;

}

asm popa;

}

/***********************************

int14

************************************/

void fifo_full(void)

{

int i;

asm pusha;

sprintf(String, "INT 14:FIFO FULL        ");

for(i = 0;i<6;i++)

{

g_HSI_status = hsi_status;

g_HSI_time = hsi_time;

}

asm popa;

}

void main( void )

{

g_FIFO_count= 0;

ioc0 = 0x55;

/*IOC0.0=1 hsi0 enable*/

/*IOC0.2=1 hsi1 enable*/

/*IOC0.4=1 hsi2 enable*/

/*IOC0.6=1 hsi3 enable*/

/*ioc1 = 0x80; Ooops! Tx 기능을 마비 시켰구먼 ioc1.5 => 1*/

ioc1 = 0xa0;

/*IOC1.7=1 : FIFO가 FULL 이면 인터럽트가 발생 */

/*IOC1.7=0 : 홀딩 레지스터에 로드될 때마다 인터럽트가 발생*/

hsi_mode = 0x55;

/* mode 0 : 8 positive transition*/

/* mode 1: each positive transition*/

/* mode 2: each negative transition*/

/* mode 3 : every transition */

/*8비트 중 각각 2비트씩 설정*/

imask1 = 0x44;

/* int_mask1.2 = 1 :   hsi FIFO 4 인터럽터 가능  */

/* int_mask1.6 = 1 :   hsi FIFO full 인터럽터 가능  */

int_mask = 0x14;

/* int_mask1.2 = 1 :   hsi_data 인터럽터 가능 */

/* int_mask1.4 = 1 :   hsi.0 인터럽터 가능 */

enable();

/*인터럽터 사용가능*/

while(1)

{

ioport0 = g_HSI_status;

/* LCD와 달리 Monitor는 scrolling 하여 볼 수 없으므로 아래는 뺍니다.

Hex_out(8,0,g_FIFO_count);

Put_string_out(String); */

}

}

/*<프로그램 ch8_4xx.c96>*/

/*주파수 측정기(HSI.3이용)*/

#pragma code

#pragma model(kc)

#include "80c196.h"

/* #include "lcd.h" */

unsigned long g_HSI_time, temp, timer1over;

unsigned long g_TIME, g_Frequency;

unsigned char g_nIndex, g_en;

unsigned char g_HSI_status;

unsigned long g_timer1, g_timer100;

/* send data to monitor */

void Send_HZ( void )

{

PutByte( 'F' );

PutByte( 'r' );

PutByte( 'e' );

PutByte( 'q' );

PutByte( '=' );

PutByte( g_Frequency/100000 + '0' );

PutByte( (g_Frequency%100000)/10000 + '0' );

PutByte( (g_Frequency%10000)/1000 + '0' );

PutByte( (g_Frequency%1000)/100 + '0' );

PutByte( (g_Frequency%100)/10 + '0' );

PutByte( g_Frequency%10 + '0' );

PutByte( 'H' );

PutByte( 'z' );

PutByte( 0x0d );

PutByte( 0x0a );

}

void PutByte( BYTE datum)

{

sbuf = datum;

while( (sp_stat&0x20) != 0x20 );

}

void hsi_data(void)

{

disable();

g_HSI_status = hsi_status;

g_HSI_time = hsi_time;

if( g_HSI_time < temp )

timer1over++;

temp = g_HSI_time;

if( g_nIndex == 0 )

{

g_timer1 = g_HSI_time;	/*첫번째 펄스가 들어온 시간*/

timer1over = 0;

}

else if(g_nIndex == 100 )

{

g_timer100 = g_HSI_time;	/*100번째 펄스가 들어온 시간*/

g_TIME = g_timer100 - g_timer1 + timer1over*65535;	/*100개의 펄스가 들어온 시간 계산*/

}

g_nIndex++;

enable();

}

void main( void )

{

timer1over = 0;

g_nIndex=0;

g_TIME = 1;

temp = 0;

g_en = 1;

ioc0 = 0x40;	/*IOC0.0=1 hsi0 enable*/

/*IOC0.2=1 hsi1 enable*/

/*IOC0.4=1 hsi2 enable*/

/*IOC0.6=1 hsi3 enable - 선택*/

/*ioc1 = 0x00; Ooops! Tx 마비,, ioc1.5 =>1*/

ioc1 = 0x20;

/*IOC1.7=1 : FIFO가 FULL 이면 인터럽트가 발생 */

/*IOC1.7=0 : 홀딩 레지스터에 로드될 때마다 인터럽트가 발생 -선택*/

hsi_mode = 0x40;	/* mode 0 : 8 positive transition*/

/* mode 1: each positive transition*/

/* mode 2: each negative transition*/

/* mode 3 : every transition */

/*8비트 중 각각 2비트씩 설정*/

int_mask = 0x04;	/* int_mask.2 = 1 :   hsi_data 인터럽터 가능 */

/*Init_LCD();

CLEAR_LCD(); */

enable();	/*인터럽터 사용가능*/

while(1)

{

if( g_nIndex > 100 )

{

disable();

g_Frequency = 125000000/g_TIME;	/*주파수 계산 1st = 0.8 us*/

Send_HZ();	/* Monitor에 출력*/

g_nIndex =0;

temp = 0;

enable();

}

}

}