⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc_demo.c

📁 最新版IAR FOR ARM(EWARM)5.11中的代码例子
💻 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 + -