打印
[MCU]

松翰mcu的问题

[复制链接]
2127|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gzaboy|  楼主 | 2013-10-5 10:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MCU, AD, dc, ADC, AN
我在使用松翰的MCU。但是以下问题让我郁闷了好多天了。

问题1:如果用最简单的程序,就是程序main里只有while(1){NOP(1);}这样的,也会让看门狗溢出。这是怎么回事呢?试了几个松翰的芯片均如此。
比如这样简单的程序:
#include <SN8P2711A.h>
void main(void){
WDTR = 0x5A;
  while(1){
    NOP(1);
  }
}
一执行,看门狗就溢出,是怎么回事呢?



问题2:关于以下程序的数组v_range[90],如果定义在RAM里(用unsigned int v_range[90]定义), 程序执行结果一切正常。但放到ROM里, 那结果就如main函数的while循环里描叙的那样,执行的时候只能正常AD转换到数组的第29或者30个参数这样,不超过就正常ADC,只要一超过就卡机了。因为问题1的看门狗问题,程序关闭了看门狗。不然会一直重启看门狗。

问题3:把以下程序改成只保留相同的数组放到ROM里,去掉ADC和中断功能。只是简单的从0到89循环数组里的内容输出到相同的Port。程序完全正常执行。所以现在问题不知出在哪里。说是ADC问题,但数组放到RAM里就正常,放ROM就卡死;说是数组问题吧,但是去掉ADC后就算放到ROM里也正常。头痛中。


#include <SN8F27E611.h>

unsigned int adc_buf, i, n;

unsigned int __ROM v_range[90]={
51,54,57,62,69,76,83,89,92,94,
96,97,98,99,101,103,105,107,109,110,
111,112,113,114,115,116,117,118,119,120,
121,122,123,124,125,126,127,128,129,130,
131,132,133,134,135,136,137,138,139,140,
141,142,143,144,145,146,147,148,149,150,
151,152,153,154,155,156,157,158,159,160,
161,162,163,165,167,169,172,177,183,188,
195,202,209,215,221,227,233,239,245,255};

void delay (unsigned int i);

void main(void){
  //WDTR = 0x5A;

  //////port initialize

  P1M = 0xEF;                //P1 Input-Output value
  P1UR = 0x00;                //P1 pull up value
  P1CON = 0x10;                //P1 Analog-Digital value

  //////adc initialize
  FGIE = 1;
  FADCIEN = 0;

  ADM = 0x04;                //ADC input channel mode: AIN4
  FGCHS = 1;                //AIN channel enable

  FADCKS1 = 0;
  FADCKS0 = 1;                //Fcpu/8

  FADCIEN = 1;                //Interrupt enable
  FADCIRQ = 0;                //Clear ADC interrupt request flag

  VREFH = 0x02;                //Internal VREFH: 4.0V
  FEVHENB = 0;                //Internal VREFH enabled

  FADENB = 1;                //start adc
  delay(30);
  i = 0;

  FADS = 1;

  while(1){               
        if(adc_buf < v_range[0]){
                adc_buf = 0x01;
        } else {
                for(n=0;n<89;n++){ //这里循环到29就会出现卡死,方法已经试过把数组拆分,分开多组判断循环均无法解决。
                        if(adc_buf>=v_range[n] && adc_buf<v_range[n+1]){
                                adc_buf = n+1;
                                break;
                        }
                }
        }
        FP10 = adc_buf;
        FP11 = adc_buf>>1;
        FP12 = adc_buf>>2;
        FP13 = adc_buf>>3;
        FP15 = adc_buf>>4;
        FP16 = adc_buf>>5;
        FP17 = adc_buf>>6;
  }
}

void __interrupt [0x0E] intrp(void){
  if(FADCIRQ){
          FADCIRQ=0;               
        adc_buf = ADB;
        FADS = 1;
  }
}

void delay (unsigned int i){unsigned int j,k;for (j=i;j>0;j--) {for(k=0;k<10;k++){NOP(1);}}}


以下附上map文件的编译出错地方的信息。

/*** Linking error! The following segment information maybe incorrect! ***/

0XFFFFFFFF        0X0000                Data                _Function_intrp_isr_data                E:\Sonix\Projects\ADC_INTRP\ADC_INTRP_F27E611\Obj\F27E611.o
评论
logokfu 2013-10-5 11:02 回复TA
楼主显然是不理解看门狗的使用方法。 

相关帖子

沙发
logokfu| | 2013-10-5 10:59 | 只看该作者
楼主是新手啊,呵呵,你的第一个问题我是这样回答的:

你的看门狗应该这样写。
#include <SN8P2711A.h>
void main(void){

  while(1){
    WDTR = 0x5A;
    NOP(1);
  }
}

使用特权

评论回复
板凳
logokfu| | 2013-10-5 11:09 | 只看该作者
for(n=0;n<89;n++){ //这里循环到29就会出现卡死,方法已经试过把数组拆分,分开多组判断循环均无法解决。
请问你这个卡死是什么意思?

使用特权

评论回复
地板
www5911839| | 2013-10-5 11:24 | 只看该作者
看门狗是这样用的吗?

#include <SN8P2711A.h>
void main(void){
WDTR = 0x5A;
  while(1){
    NOP(1);
  }
}

使用特权

评论回复
5
www5911839| | 2013-10-5 11:27 | 只看该作者
新上手一款MCU, 芯片手册、官网DEMO应该看看

使用特权

评论回复
6
shiyue0415| | 2013-10-5 11:42 | 只看该作者
松翰的MCU没用过

使用特权

评论回复
7
gzaboy|  楼主 | 2013-10-5 11:49 | 只看该作者
本帖最后由 gzaboy 于 2013-10-5 11:56 编辑
www5911839 发表于 2013-10-5 11:24
看门狗是这样用的吗?

#include


看了。有时候要开发一样产品,赶时间。不可能全部看完的。说说你的解决办法。另外,官方文档PDF就是这么写的。

使用特权

评论回复
评论
logokfu 2013-10-5 12:30 回复TA
主程序并不是指main,而是指while死循环里面的内容。 
8
gzaboy|  楼主 | 2013-10-5 11:58 | 只看该作者
**kfu 发表于 2013-10-5 10:59
楼主是新手啊,呵呵,你的第一个问题我是这样回答的:

你的看门狗应该这样写。

但官方PDF里有一句,在主程序中中有一次清看门狗的的话啊。

使用特权

评论回复
9
gzaboy|  楼主 | 2013-10-5 12:00 | 只看该作者
**kfu 发表于 2013-10-5 11:09
请问你这个卡死是什么意思?

就是程序不动了。怎么调节ad口电压也没用。输出不变化了。

使用特权

评论回复
10
gzaboy|  楼主 | 2013-10-5 12:02 | 只看该作者
关于看门狗的,我的确是理解错了。改正好了。不过在卡的地方还是会卡死。循环是正常了。

使用特权

评论回复
11
gzaboy|  楼主 | 2013-10-5 12:03 | 只看该作者
**kfu 发表于 2013-10-5 10:59
楼主是新手啊,呵呵,你的第一个问题我是这样回答的:

你的看门狗应该这样写。

谢谢你,理解了。之前用stc,因为稳定性比较好。一直没有用过看门狗。这次刚用松翰的几天。就遇到这些问题。着实郁闷啊。

使用特权

评论回复
12
李冬发| | 2013-10-5 14:47 | 只看该作者
先把狗关了吧。

使用特权

评论回复
13
ygl968| | 2013-10-5 14:50 | 只看该作者
关注

使用特权

评论回复
14
gzaboy|  楼主 | 2013-10-6 13:39 | 只看该作者
李冬发 发表于 2013-10-5 14:47
先把狗关了吧。

一开始就是关了的。问题依旧啊

使用特权

评论回复
15
gzaboy|  楼主 | 2013-10-6 13:42 | 只看该作者
在编译后的文件里。一直存在连接错误:
/*** Linking error! The following segment information maybe incorrect! ***/

0XFFFFFFFF        0X0000                Data                _Function_intrp_isr_data                E:\Sonix\Projects\ADC\ADC_INTRP_F27E611\Obj\F27E611.o

这个指向的错误函数就是中断函数。
我如果不用中断。用轮训来获取adc。则一点问题也没有。什么都是正常的。无论数组是放在ram还是rom都正常,看门狗开不开也正常。就是用了中断就这样了。而且很奇怪的是。如果用了中断,数组放ram里正常,放rom里就不正常了。头大了……。这芯片……。郁闷啊

使用特权

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

本版积分规则

3

主题

19

帖子

1

粉丝