打印
[PIC®/AVR®/dsPIC®产品]

PIC12LF1822AD结果串口发送每隔5个跳异常

[复制链接]
1683|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用PIC12LF1822AN1做串口转换,AD结果高8位通过串口发送,每隔5、6个出现一个数据异常,分析不出哪出的问题
原文件:MPLAB8.70 PROTEUS7.10
1822_AD_UART.rar (150.2 KB)




/************************************************************
项目名称:1822AD_串口显示
要求:1822AD_串口显示,左对齐取高八位
设计:robin_chen559
日期:2013.12.15
备注:
************************************************************/
#include<pic.h>              //包含头文件pic12lf1822.h


#define LED_G  RA0             //RA0为LED_G口
#define uchar unsigned char
#define uint  unsigned int

uint AD_VAL_AVR = 0;              //AD处理结果  

//子程序声明

void Init_star(void);       //系统初始化
void Init_UART(void);       //串口初始化
void Delay_MS(uint MS);     //延迟子程序
void Init_AD(void);         //AD初始化
void AD_AVR(void);          //AD结果处理

//子程序
void Init_star(void)        //系统初始化子程序
{
   OSCCON = 0b01101010;        //4M系统时钟
   APFCON = 0b10000100;        //端口复用定义RA5/4 RD TX,RA2 CPP
   TRISA  = 0b00101010;        //A口输入输出设置,RA5/1/3输入,RA4/0/2输出
   ANSELA = 0b00001110;        //RA1/RA2/RA3拟输入_AD,其他全部是数字输入
}

void Init_UART(void)
{
INTCON  = 0b11000000;         //开总中断GIE,外设中断PEIE
TXIE    = 0;                  //发送中断
ADIE    = 0;                  //禁止AD中断
TXSTA   = 0b00100110;         //串口配置字
RCSTA   = 0b10010000;         //接受寄存器配置P295
BAUDCON = 0b01001000;         //16位波特率计数器,固定波特率
SPBRGH  = 0b00000000;         //011,16位异步,9600波特率,查表103
SPBRGL  = 0b01100111;
}

void Init_AD(void)
{
ADCON0 = 0B00000101;          //AD使能,选AN1
ADCON1 = 0B00110011;          //AD结果左对齐,内rc,2V内部考电压
FVRCON = 0b11000010;          //2v内部参考电压配置
}

void AD_AVR(void)                 //AD结果处理
{
uchar n;
uchar m;
AD_VAL_AVR = 0;

   ADGO = 1;                     //开始AD转换
   for(n=0;n<5;n++)              //延时20uS待电平稳定
   {NOP();}
   while(ADGO == 1);             //等待AD转换完成
   ADIF = 0;                     //清除转换完成标志
   AD_VAL_AVR =ADRESH;           //AD结果5次自加
  
  
  //AD_VAL_AVR=AD_VAL_AVR/10;      //AD结果10次求均值
  // TXIE = 1;                     //串口发送中断使能
}

void Delay_MS(uint MS)         //延时函数
{
  uint i;
  uchar j;

   for(i=0;i<MS;i++)
沙发
yklstudent| | 2013-12-17 14:58 | 只看该作者
想知道为什么出问题吗?  因为你这种粗心的人 做粗心的事  出问题是必然的

使用特权

评论回复
板凳
robin_chen559|  楼主 | 2013-12-18 09:01 | 只看该作者
yklstudent 发表于 2013-12-17 14:58
想知道为什么出问题吗?  因为你这种粗心的人 做粗心的事  出问题是必然的 ...

呵呵,这倒是个问题~~~:$
这个一行行查过了呀,仿真这样,今天把板子改一下,看看跑板是不是也这样~~~

使用特权

评论回复
地板
yklstudent| | 2013-12-18 10:29 | 只看该作者
robin_chen559 发表于 2013-12-18 09:01
呵呵,这倒是个问题~~~
这个一行行查过了呀,仿真这样,今天把板子改一下,看看跑板是不是也这样~~~ ...

看看是不是你家狗忘记关了?

使用特权

评论回复
5
robin_chen559|  楼主 | 2013-12-18 17:39 | 只看该作者
yklstudent 发表于 2013-12-18 10:29
看看是不是你家狗忘记关了?

恩,还真是看门狗重启了,之前MPLAB都是设都是默认09a4,1cff关狗的。这个项目文件建好后还真没去看配置字。都是ffff,ffff,看门狗放出来的,十分感谢。

使用特权

评论回复
6
robin_chen559|  楼主 | 2013-12-18 17:59 | 只看该作者
yklstudent 发表于 2013-12-18 10:29
看看是不是你家狗忘记关了?

兄台高义,也很细心,谢了~~~

使用特权

评论回复
7
yklstudent| | 2013-12-18 19:30 | 只看该作者
robin_chen559 发表于 2013-12-18 17:59
兄台高义,也很细心,谢了~~~

养狗要管好啊 不然伤人伤己啊

使用特权

评论回复
8
robin_chen559|  楼主 | 2013-12-18 20:04 | 只看该作者
yklstudent 发表于 2013-12-18 19:30
养狗要管好啊 不然伤人伤己啊

哎,带俺pic的哥们也不喜欢放狗,都不用狗的,不是个好习惯呀看来~~~

使用特权

评论回复
9
lskam| | 2014-7-30 10:24 | 只看该作者
楼主,问你个问题, AD_VAL_AVR =ADRESH;           //AD结果5次自加           这里的AD结果5次自加是什么意思?

使用特权

评论回复
10
yklstudent| | 2014-7-30 11:26 | 只看该作者
lskam 发表于 2014-7-30 10:24
楼主,问你个问题, AD_VAL_AVR =ADRESH;           //AD结果5次自加           这里的AD结果5次自加是什么 ...

估计楼主原本想着平均滤波 不过实际没做

使用特权

评论回复
11
yklstudent| | 2014-7-30 11:27 | 只看该作者
估计楼主想做平均滤波用的

使用特权

评论回复
12
lskam| | 2014-7-31 10:26 | 只看该作者
yklstudent 发表于 2014-7-30 11:27
估计楼主想做平均滤波用的

大哥。小弟PIC新手,借楼主代码,向你请教个问题

void AdConvert(void)
{
   ADCON0 = 0B00000101;          //AD使能,选AN1
   ADCON1 = 0B10110011;          //AD结果左对齐,内rc,2V内部考电压
   FVRCON = 0b11000011;          //2v内部参考电压配置
   ADGO = 1;                     //开始AD转换
   for(n=0;n<5;n++)              //延时20uS待电平稳定
     {NOP();}
   while(ADGO == 1);             //等待AD转换完成
   ADIF = 0;                     //清除转换完成标志
   AD_VAL_AVR  = ADRESL & 0x00FF;        //读取ADC采样结果
   AD_VAL_AVR |= ADRESH <<8 ;
   AD_VAL_AVR= AD_VAL_AVR*2/1024;;
}
这段代码采AD时,ADRESL和ADRESH会有值,如果是10位的ad和2v的基准,那实际的电压值是 AdConvert_Value = (float)AD_VAL_AVR*2/1024;是这样计算的吧,,

使用特权

评论回复
13
yklstudent| | 2014-7-31 13:06 | 只看该作者
应该没错 具体去试下就知道了

使用特权

评论回复
14
lskam| | 2014-8-1 08:57 | 只看该作者
yklstudent 发表于 2014-7-31 13:06
应该没错 具体去试下就知道了

大哥,再问你个问题哈。。。手册上说这款芯片是超级功耗的,30UA/MHZ  的。。可是我实测出来的,都是几百个微安。。。这已经是我代码什么都不干的情况下实测的,,要是加上AD都快1MA了,,我是用内部晶振的。。硬件电路只有一个最小系统。。。这是怎么回事的?

使用特权

评论回复
15
yklstudent| | 2014-8-1 16:46 | 只看该作者
lskam 发表于 2014-8-1 08:57
大哥,再问你个问题哈。。。手册上说这款芯片是超级功耗的,30UA/MHZ  的。。可是我实测出来的,都是几百 ...

LF系列的可以
不过你要确定你把耗电的功能模块全关了才行
具体可以问下这个版块的版主

使用特权

评论回复
16
robin_chen559|  楼主 | 2014-8-15 12:49 | 只看该作者
lskam 发表于 2014-7-30 10:24
楼主,问你个问题, AD_VAL_AVR =ADRESH;           //AD结果5次自加           这里的AD结果5次自加是什么 ...

开始不会,学郭天祥教程多次取值平均一下呀~~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

302

帖子

10

粉丝