📄 adc_demo.c
字号:
/**************************************************************************/
/* */
/* Copyright (C) 2005 Oki Electric Industry Co.,LTD. */
/* */
/* System Name : ML674051/ML674061 series */
/* Module Name : AD Converter demo program for AME-51 */
/* File Name : adc_sample.c */
/* Revision : 01.00 */
/* Date : 2005/05/18 */
/* initial version */
/* */
/**************************************************************************/
#include "ML674061.h"
#include "irq.h"
/* constants */
#define ROUND 10
#define CHANNEL 3 /* ch1-ch3 */
#define AD_DATA_1 0
#define AD_DATA_2 1
#define AD_DATA_3 2
#define PORT 0 /* default test is for port UART0 */
/* set PORT to 1 if test port UART1 */
#define PORT_OFFSET 0x1000
/* functions */
void init_adc(void); /* initialize ADC */
void adc_handler(void); /* ADC interrupt handler */
void reg_irq_handler_adc(void); /* registration of IRQ handler */
extern void init_uart(int portNum);
extern void both_switches(void);
/* global variables */
volatile int ADC_Mode; /* ADC Mode flag */
int sampling_count; /* the number of times of conversion */
volatile int ADC_end_flag; /* AD conversion end flag */
volatile int channel_number; /* AD channel number */
extern volatile int counter; /* timer counter */
extern volatile char both_switches_flag; /* this flag will be cleared after both switches
are pushed simultaneously and released */
extern volatile UBYTE switch2_state; /* 0=opened 1=closed */
extern volatile UBYTE switch3_state; /* 0=opened 1=closed */
volatile UHWORD select_buff[ROUND]; /* the data changed in select mode are stored */
volatile UHWORD scan_buff[ROUND][CHANNEL]; /* the data changed in scan mode are stored */
volatile UHWORD scan_result[CHANNEL]; /* the sum total data of scan mode are stored */
volatile UHWORD select_result; /* the sum total data of select mode is stored */
/****************************************************************************/
/* Entry point */
/* Function : adc demo */
/* Parameters */
/* Input : Nothing */
/* Output : 0 */
/****************************************************************************/
int adc_entry(void)
{
int adc_result; /* temporary variable */
int n1000,n100,n10,n1;
int remainder;
reg_irq_handler_adc(); /* register the ADC interrupt handler */
init_adc(); /* initial setting of ADC */
init_uart(0); /* initialize UART0 */
led_on(LED_6); /* put "6" on LED display */
channel_number =0; /* select channel 0 - AIN0 */
sampling_count =0; /* put result into 1st word of array */
put_value(PM4,7); /* initialize LED port pins as output */
put_value(PO4,7); /* turn off all LEDs */
both_switches_flag=1; /* gets cleared when both switches are pushed */
put_value(UARTTHR0+PORT*PORT_OFFSET,0x0D); /* send CR to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,0x0A); /* send LF to UART */
while (both_switches_flag)
{
if (counter>25) /* do a conversion every 250ms */
{
counter = 0;
ADC_Mode = 0; /* set to mode 0 */
ADC_end_flag = 0; /* clear end flag */
set_hbit(ADCON1,ADCON1_STS); /* start AD conversion */
while (ADC_end_flag != 1); /* wait for conversion to complete */
adc_result = select_buff[channel_number]; /* get result */
if (adc_result < 256)
{
put_value(PO4,7); /* turn off all LEDs */
}
else if (adc_result < 512)
{
put_value(PO4,6); /* turn on one LED */
}
else if (adc_result < 768)
{
put_value(PO4,4); /* turn on two LEDs */
}
else
{
put_value(PO4,0); /* turn on all LEDs */
}
n1000=(adc_result/1000)+'0'; /* calculate 1000s digit */
remainder=adc_result%1000;
n100=(remainder/100)+'0'; /* calculate 100s digit */
remainder=remainder%100;
n10=(remainder/10)+'0'; /* calculate 10s digit */
n1=(remainder%10)+'0'; /* calculate 1s digit */
put_value(UARTTHR0+PORT*PORT_OFFSET,'A'); /* send "A" to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,'I'); /* send "I" to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,'N'); /* send "N" to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,'0'); /* send "0" to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,'='); /* send "=" to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,n1000); /* send 1000s to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,n100); /* send 100s to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,n10); /* send 10s to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,n1); /* send 1s to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,0x0D); /* send CR to UART */
put_value(UARTTHR0+PORT*PORT_OFFSET,0x0A); /* send LF to UART */
}
both_switches(); /* check for both switches pushed */
}
put_value(PO4,7); /* turn off all LEDs */
return 0;
}
/****************************************************************************/
/* initialize ADC */
/* Function : init_adc */
/* Parameters */
/* Input : Nothing */
/* Output : Nothing */
/****************************************************************************/
void init_adc(void)
{
set_wbit(PORTSEL2, 0x00150000) ; /* select port(PD0-2) secondary function */
/* PD3 is used for LED seg g, (AIN3 not used) */
set_hbit(ADCON2,ADCON2_CLK64); /* APB_CLK:32MHz -> ACKSEK:1/64 */
set_hbit(ADINT,ADINT_ADSTIE | ADINT_ADSNIE); /* enable irq of selectmode & scanmode */
clr_hbit(ADINT,ADINT_INTST | ADINT_INTSN); /* clear irq of selectmode & scanmode */
return;
}
/****************************************************************************/
/* ADC end process */
/* Function : end_process */
/* Parameters */
/* Input : Nothing */
/* Output : Nothing */
/****************************************************************************/
void end_process(void)
{
put_hvalue(ADINT,0x0); /* disable ADC interrupt */
return;
}
/****************************************************************************/
/* ADC Interruption processing */
/* Function : adc_handler */
/* Parameters */
/* Input : Nothing */
/* Output : Nothing */
/****************************************************************************/
void adc_handler(void)
{
if(ADC_Mode == 0){
select_buff[sampling_count] = get_hvalue(ADR0);
clr_hbit(ADINT,ADINT_INTST); /* interruption factors are cleared */
}
else if(ADC_Mode == 1){
put_hvalue(ADCON0,0x0); /* stop A/D */
scan_buff[sampling_count][AD_DATA_1] = get_hvalue(ADR1);
scan_buff[sampling_count][AD_DATA_2] = get_hvalue(ADR2);
scan_buff[sampling_count][AD_DATA_3] = get_hvalue(ADR3);
clr_hbit(ADINT,ADINT_INTSN); /* interruption factors are cleared */
}
ADC_end_flag = 1; /* AD conversion completion */
return;
}
/****************************************************************************/
/* Registration of IRQ Handler */
/* Function : reg_irq_handler */
/* Parameters */
/* Input : Nothing */
/* Output : Nothing */
/* Note : Initialization of IRQ needs to be performed before this process. */
/****************************************************************************/
void reg_irq_handler_adc(void)
{
/* register IRQ handler into IRQ handler table */
IRQ_HANDLER_TABLE[INT_AD] = adc_handler; /* ADC Interrupt Number 11 */
set_wbit(ILC1, ILC1_ILR11 & ILC1_INT_LV7 ); /* Interruption level of
|| || IRQ number 11 is set as 7
IRQ number interrypt level */
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -