Usage example
Start data transfer by the end of A/D conversion.
(Get A/D conversion results of 4 pins and copy them to RAM. Then, calculate the average of the results.)
[GUI setting example]
DMA controller |
Used | |||
DMA0 |
Used | |||
DMAoperation setting |
Used | |||
Transfer direction setting |
SFR to internal RAM | |||
Transfer data size setting |
8 bits | |||
SFR address |
ADCR - 0x000fff1e | |||
RAM address |
0xffe00 | |||
Transfer byte count |
4 | |||
Trigger signal |
INTAD (Please set INTAD) | |||
DMA0 transfer end interrupt (INTDMA0) |
Used | |||
Priority |
Low |
A/D convertor |
Used | |||
ADC |
Used | |||
A/D convertor operation setting |
Used | |||
Comparator operation setting |
Operation | |||
Resolution setting |
8 bits | |||
VREF(+) setting |
VDD | |||
VREF(-) setting |
VSS | |||
Trigger mode setting |
Software trigger mode | |||
Operation mode setting |
Countinous select mode | |||
ANI0 - ANI7 analog input selection |
ANI0 - ANI3 | |||
A/D channel selection |
ANI0 - ANI3 | |||
Conversion time mode |
Normal 1 | |||
Conversion time |
34 (1088/fCLK)(μs) | |||
Conversion result upper/lower bound value setting |
Generates an interrupt request (INTAD) when ADLL≦ADCRH≦ADUL | |||
Upper bound (ADUL) value |
255 | |||
Lower bound (ADLL) value |
0 | |||
Use A/D interrupt (INTAD) |
Used |
[API setting example]
r_main.c
void main(void)
{
R_MAIN_UserInit();
/* Start user code. Do not edit comment generated here */
/* Enable DMA0 transfer */
R_DMAC0_Start();
/* Start the AD converter */
R_ADC_Start();
while (1U)
{
NOP();
}
/* End user code. Do not edit comment generated here */
}
r_cg_dmac_user.c
/* Start user code for include. Do not edit comment generated here */
#include "r_cg_adc.h"
/* End user code. Do not edit comment generated here */
/* Start user code for pragma. Do not edit comment generated here */
#pragma address (g_adc_buf = 0x0ffe00)
/* End user code. Do not edit comment generated here */
/* Start user code for global. Do not edit comment generated here */
volatile uint8_t g_adc_buf[5][4];
volatile uint8_t g_adc_buf_cnt = 0U;
/* End user code. Do not edit comment generated here */
static void __near r_dmac0_interrupt(void)
{
/* Start user code. Do not edit comment generated here */
uint8_t i;
uint8_t j;
uint16_t temp;
/* Stop the AD converter */
R_ADC_Stop();
/* Disable DMA0 transfer */
R_DMAC0_Stop();
/* Change DMA0_RAM address */
if ((++g_adc_buf_cnt) < 4U)
{
DRA0 += 4U;
}
else
{
DRA0 = _FE00_DMA0_RAM_ADDRESS;
g_adc_buf_cnt = 0U;
/* Calculate the average */
for (i = 0; i < 4U; i++)
{
temp = 0U;
for (j = 0; j < 4U; j++)
{
temp += g_adc_buf[j][i];
}
g_adc_buf[4][i] = temp / 4U;
}
}
/* Enable DMA0 transfer */
R_DMAC0_Start();
/* Start the AD converter */
R_ADC_Start();
/* End user code. Do not edit comment generated here */
}