1、设置输入口DDR1
2、设定中断级别ILR4
3、使能AD输入ADC2:ANS0--ANS3
4、设定采样时间ADC2:TIM1--TIM0
5、选择时钟ADC2:CKDIV1 CKDIV0
6、设定AD转换精度ADC2:AD8
7、选择操作模式ADC2:EXT
8、选择启动触发ADC2:ADCK
9、使能中断ADC2:ADIE=1
10、激活AD转换器ADC1:AD=1
中断处理:
1、ADC1:AD1=0
2、读取转换值ADDH、ADDL
3、激活AD转换器ADC1:AD=1
程序1:查询方式::::::::::::::::::
LIN_UART_Syn.rar
#include "mb95200.h"
int ADVoltage=0x01;
void UART_chars(unsigned char cdata);
void UART_init (void)
{
BGR1 = 0x00; // Reloadvalue = 0d51 = 0x33 (500KHz, 9600Baud)
BGR0 = 0x33; // Reloadvalue = 0x33 = 0x00<<8 + 0x33 (500KHz, 9600Baud)
SMR = 0x87; // enable SOT, Reset, synchronous mode
SSR = 0x00; // clear flags, no interrupt
ECCR_SSM = 1; // have ST/STP bit
SCR = 0xc3; // enable transmit, Odd parity
}
char UART_readbyte (void)
{
while (! SSR_RDRF); // wait, until a byte is received
return (RDR_TDR); // return the received byte
}
void delay(unsigned int i)
{
unsigned int m,n;
for(m=0;m<i;m++)
{
for(n=0;n<6000;n++)
{
asm("\tNOP");
}
}
}
void UART_sendbyte (char ch)
{
while (! SSR_TDRE);
RDR_TDR = ch; //transmit data
}
void UARTPut(const char *data,unsigned char len)
{
unsigned char i;
for(i=0; i<len; i++) UART_sendbyte(data[i]);
}
void UART_chars(unsigned char cdata)
{
unsigned char i;
i=cdata>>4;
if(i>=0 && i<=9) UART_sendbyte(i+0x30);
else UART_sendbyte(i+0x37);
i=cdata & 0x0F;
if(i>=0 && i<=9) UART_sendbyte(i+0x30);
else UART_sendbyte(i+0x37);
}
void InitADC(void)
{
ADC2 = 0x81; // 8-bit resolution, enable interrupts
ADC1 = 0x01; // AN0 pin as input, start AD
}
void AD_Sample (void)
{
ADVoltage=ADD_ADDL;
ADC1=0x01;
//ADC2 = 0x81;
}
/******************************************************************************
NAME : main ()
FUNCTION: synchronously transmit a byte or receive a byte
******************************************************************************/
void main (void)
{
//unsigned char rec_data = 0;
DDR0_P00 = 0; //P00 intput
//DDR0_P05 = 1; //P05 output
//DDR0_P06 = 0; //P06 input
DDR0_P03 = 1; //P03 output
DDR0_P04 = 0; //P04 input
AIDRL = 0xfe; //Port input enabled
PDR0_P00 = 0x00;
//PDR0_P05 = 0x01;
UART_init ();
InitIrqLevels(); // initialise Interrupt level register and IRQ vector table
__EI(); // global interrupt enable
//__set_il(3); // set global interrupt mask to allow all IRQ levels
InitADC(); // init AD - converte
while (1)
{
asm("\tNOP");
//UART_sendbyte(0xaa);
delay(10);
UARTPut("ADVal:",7);
//DDR0_P00 = 0;
//delay(1);
AD_Sample();
UART_chars(ADVoltage);
UARTPut("\n",2);
//rec_data = UART_readbyte ();
asm("\tNOP");
asm("\tNOP");
}
}
AD的引脚接到地线时:采集的电压是:(00~=0V)
AD引脚悬空的采集电压是:(96~=2.94V)
程序2:中断方式::::::::::::::::::
#include "mb95200.h"
int ADVoltage=0x01;
void UART_chars(unsigned char cdata);
void UART_init (void)
{
BGR1 = 0x00; // Reloadvalue = 0d51 = 0x33 (500KHz, 9600Baud)
BGR0 = 0x33; // Reloadvalue = 0x33 = 0x00<<8 + 0x33 (500KHz, 9600Baud)
SMR = 0x87; // enable SOT, Reset, synchronous mode
SSR = 0x00; // clear flags, no interrupt
ECCR_SSM = 1; // have ST/STP bit
SCR = 0xc3; // enable transmit, Odd parity
}
char UART_readbyte (void)
{
while (! SSR_RDRF); // wait, until a byte is received
return (RDR_TDR); // return the received byte
}
void delay(unsigned int i)
{
unsigned int m,n;
for(m=0;m<i;m++)
{
for(n=0;n<6000;n++)
{
asm("\tNOP");
}
}
}
void UART_sendbyte (char ch)
{
while (! SSR_TDRE);
RDR_TDR = ch; //transmit data
}
void UARTPut(const char *data,unsigned char len)
{
unsigned char i;
for(i=0; i<len; i++) UART_sendbyte(data[i]);
}
void UART_chars(unsigned char cdata)
{
unsigned char i;
i=cdata>>4;
if(i>=0 && i<=9) UART_sendbyte(i+0x30);
else UART_sendbyte(i+0x37);
i=cdata & 0x0F;
if(i>=0 && i<=9) UART_sendbyte(i+0x30);
else UART_sendbyte(i+0x37);
}
void InitADC(void)
{
ADC2 = 0x81; // 8-bit resolution, enable interrupts
ADC1 = 0x01; // AN0 pin as input, start AD
}
__interrupt void ISR_ADC (void)
{
ADVoltage=ADD_ADDL; // voltage calculating
ADC1=0x01; // clear interrupt flag, start AD again
}
/******************************************************************************
NAME : main ()
FUNCTION: synchronously transmit a byte or receive a byte
******************************************************************************/
void main (void)
{
//unsigned char rec_data = 0;
DDR0_P00 = 0; //P00 intput
//DDR0_P05 = 1; //P05 output
//DDR0_P06 = 0; //P06 input
DDR0_P03 = 1; //P03 output
DDR0_P04 = 0; //P04 input
AIDRL = 0xfe; //Port input enabled
PDR0_P00 = 0x00;
//PDR0_P05 = 0x01;
UART_init ();
InitIrqLevels(); // initialise Interrupt level register and IRQ vector table
__EI(); // global interrupt enable
__set_il(3); // set global interrupt mask to allow all IRQ levels
InitADC(); // init AD - converte
while (1)
{
asm("\tNOP");
//UART_sendbyte(0xaa);
delay(10);
UARTPut("ADVal:",7);
//DDR0_P00 = 0;
//delay(1);
UART_chars(ADVoltage);
UARTPut("\n",2);
asm("\tNOP");
asm("\tNOP");
}
}
1、ILR4 = 0xDF;
。。。。。。。
2、
__interrupt void DefaultIRQHandler (void);
__interrupt void ISR_ADC (void);
。。。。。。。。。。。。。。。。。。
3、
修改:#pragma intvect ISR_ADC 18
中断请求号 中断级设置寄存器 中断源
IRQ0 L00【1:0】 外部中断ch4
IRQ1 L01【1:0】 外部中断ch5
IRQ2 L02【1:0】 外部中断ch2、ch6
IRQ3 L03【1:0】 外部中断ch7
外部中断电路0注意事项:
1、边缘极性选择位SL值位过程中,使中断请求位EIE清0(禁止中断请求),设定边缘极性后,外部中断请求标志位EIR清0
2、若外部中断请求标志位置1,且使能中断中断请求使能位,操作不能从中断服务例程中回复,必须始终清理中断服务例程中的外部中断请求使能位
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |