1. 프로그램 개요
P22는 Green 0 LED, P24는 Red LED, P26은 Green 1 LED가 연결되어 있다.
P10에 연결된 회로의 Analog값을 측정하기 위하여 Interrupt 방식의 ADC를 구현한다. 측정된 값은 64개를 취득하면 시리얼로 그 데이터를 전송한다.
시리얼 통신은 Timer 1의 Overflow를 이용한 방식으로 설정하고, 그 BaudRtae는 9600이다.
Timer 0을 이용해서 1ms Interrupt를 생성하고, 200ms 타이머를 생성한다. 200ms 마다 Red Led의 출력이 반전이 되도록 하여 시스템이 동작 중 임을 표시한다.
2. 회로도
/* LED 부분 회로도 추가 */
3. Code
⑴ main routine
void main()
{
u8 i;
InitSystem(); // 포트초기화, 타이머초기화, 시리얼포트초기화, ADC핀 초기화
bAdcflag=FALSE; // ADC완료 플래그
INT_EnAll(); // Enable global interrupt.
printf("\nHello"); // 프로그램 시작을 시리얼로 전송
LED_G_0=0;LED_R=0;LED_G_1=0; // LED ALL ON
DelayXms(1000); // 1초 딜레이
LED_G_0=1;LED_R=1;LED_G_1=1; // LED ALL OFF
INT_EnADC(); // Enable ADC interrupt.
while(1) // 시스템 동작 루틴
{
if(LedTime==0) // LedTime의 값이 0이면(타이머 인터럽트에서 1ms마마 1씩 감소중
{
LED_R = !LED_R; // LED_R을 반전시켜서 LED_R에 출력시킴. RED LED 토글
LedTime=200; // 200ms 딜레이를 위한 변수 값 저장
}
if(bAdcflag==TRUE) // ADC가 64회 완료 되었는가?
{
printf("\nADC:"); // 줄을 바꾸라는 명령과 “ADC”출력
for(i=0;i<TEST_ADC_DATA_CNT;i++) // 64회동안 루프를 돌면서
{
printf("%04X ",TestBuf[i].W); // ADC 결과값 버퍼의 값을 출력함, 4자리 HEX 값 출력
}
bAdcflag=FALSE; // ADC 완료 플래그를 클리어시킴
TestBufLen=0; // TestBufLen도 클리어시켜 다음 ADC 인터럽트를 대비함
INT_EnADC(); // 64회 AD변환 후 ADC 인터럽트를 Disable 시켜두었으므로 다시 AD 변환을
// 위해서는 인터럽트를 Enable 시켜야함
}
}
}
'MEGAWIN' 카테고리의 다른 글
MG82F6D Series ADC with Interrupt - 4 (0) | 2022.11.08 |
---|---|
MG82F6D Series ADC with Interrupt - 3 (0) | 2022.11.08 |
MG82F6D Series ADC with Interrupt - 2 (0) | 2022.11.08 |
MG32F02A072 SPI (0) | 2022.10.27 |
MG82F6D16 GPIO MODE (0) | 2022.10.25 |