搜索
bottom↓
回复: 29

帮忙看一下NEC单片机的这段程序是不是有问题?

[复制链接]

出10入10汤圆

发表于 2008-8-27 21:17:57 | 显示全部楼层 |阅读模式
用的是UPD78F9202芯片,P2和P4口接LED,1秒钟闪烁一次,为什么P2口的LED闪烁,而P4口的不闪?

/*uPD78F9202*/

#pragma sfr   
#pragma DI
#pragma EI
#pragma NOP
#pragma interrupt INTTMH1 int_TMH1

#pragma section @@CNST OPT AT 80H
const char OPTION=0b10010110;      /* reset脚设定为输入口,内部8m高速振荡*/

#define OFF 0
#define ON 1


#define _5MS 5
#define _500MS 100

bit bSendEn;
unsigned char n5msCount;
unsigned char n500msCount;
unsigned char nOutData;
unsigned char nP4Buff;
void int_TMH1(void);
void hard_ini(void);

/*********************************************************/
void hard_ini(void)
{
        PPCC=0b00000001;        /*Fcpu=4M,Fxp=4M,(指令周期2/4=0.5us)*/
        PCC=0b00000000;                /**/
  WDTM=0b01111000;                /*看门狗关,0b01111000*/
  
/*IO初始化*/
        PU2=0;
        PU3=0;
        PU4=0;
  PM2=0b11110000;                /*p20-p23输出*/
  PMC2=0b00000000;                /*p20-p23为端口/复用模式,非ADC模式*/
  PM3=0b11111011;                     /*p34输入p32输出*/
  PM4=0b11110110;                /*p43 p40输出*/
  P4=0b00000000;
  nP4Buff=0;

/*8位定时器H1初始化*/
  TMHMD1=0b00100000;                /*H1模式设定:计数时钟=Fxp/16=4/16=0.25M=4us*/
  CMP01=249;                        /*比较寄存器01设定:(249+1)*4us=1ms产生一次中断*/
        TMMKH1=0;                     /*CMP01中断允许*//**/
        TMHE1=1;                      /*启动定时器工作*//**/
}


/****************************************************/
void int_TMH1(void)                //H1中断,1ms一次
{                                       
        TMIFH1=0;       
        if (!(n5msCount-=1))
                {
                        n5msCount=_5MS;
                        if (!(n500msCount-=1))
                                {
                                        n500msCount=_500MS;
                                        P2.1=!P2.1;
                                        P2.0=!P2.0;
                                        P4.3=!P4.3;
                                        P2.3=!P2.3;
                                        P4.0=!P4.0;
                                }
                }
}

void main()
{
        DI();
        hard_ini();
        n5msCount=_5MS;
        n500msCount=_500MS;
        EI();
  while(1)
  {
    NOP();
  }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2008-8-27 22:42:16 | 显示全部楼层
你烧录到单片机里面看看是否不闪?
因为我以前也碰过用软件仿真结果不对的情况。

出10入10汤圆

 楼主| 发表于 2008-8-27 22:51:45 | 显示全部楼层
软仿可以,关键就是烧到芯片里不闪。

出0入42汤圆

发表于 2008-8-28 07:22:03 | 显示全部楼层
这个问题要解决啊,幸亏是FLASH片子,否则这个软件仿真可会害死人的。。。

出0入0汤圆

发表于 2008-8-28 08:01:50 | 显示全部楼层
我用TM80时候也是碰到这个问题啊 郁闷啊

出10入10汤圆

 楼主| 发表于 2008-8-28 09:23:19 | 显示全部楼层
我用的是KOS系列的upd78f9202,楼上用的是ko系列的吧。
是不是与编译器的设置有关系?
编译器的这个选项如何设置?请NEC-etouch 帮忙解释一下。

(原文件名:未命名.JPG)

出0入0汤圆

发表于 2008-8-28 12:47:54 | 显示全部楼层
你把P2口的程序去掉 看看 只是看p4

出0入0汤圆

发表于 2008-8-29 23:48:26 | 显示全部楼层
PU4=9;

出10入10汤圆

 楼主| 发表于 2008-8-30 08:16:59 | 显示全部楼层
【7楼】 cctnt :
PU4=9;意思是内部上拉电阻连接。
可是:设定为输出上拉电阻是不需要连接的,芯片内部电路也是自动关闭上拉电阻的。

出0入0汤圆

发表于 2008-8-30 09:31:03 | 显示全部楼层
再改
PM4=0b01100000;

出10入10汤圆

 楼主| 发表于 2008-8-30 09:45:22 | 显示全部楼层
【9楼】 cctnt:
我用得是78f9202.

(原文件名:未命名.JPG)


(原文件名:未命名.JPG)

出0入0汤圆

发表于 2008-9-1 11:32:04 | 显示全部楼层
TO:
szxszx

你是说Using Fixed Area of ...
这个设置吧,
这个设置是指选用不同的起始文件,如果在KOS核中,建议你在这里不打勾,否则程序没有写多少,系统就会报错。

出10入10汤圆

 楼主| 发表于 2008-9-5 08:58:46 | 显示全部楼层
同样的电路板,跑下面的程序P4口就又输出,为什么?


#pragma sfr
#pragma section @@CNST OPT AT 80H
const char OPTION=0x96;//10011110


void delay(unsigned int i)
{
  while(i>0)
  {
    i--;
  }
}

void main()
{
  WDTM=0x78;
  PM2=0xf0;
  PM4=0xf6;
  P2=0x0;
  P4=0x0;
  while(1)
  {
    P4.0=1;
    P4.3=1;
    delay(2000);
    P4.0=0;
    P4.3=0;   
    delay(2000);
   
  }
}

出0入0汤圆

发表于 2008-9-5 09:08:38 | 显示全部楼层
你取反是这样取的???
                                        P2.1=!P2.1;
                                        P2.0=!P2.0;
                                        P4.3=!P4.3;
                                        P2.3=!P2.3;
                                        P4.0=!P4.0;
是不是弄错了,这个感叹号起什么作用啊???想取反可以用异或或都非啊,"^"或"~"

出10入10汤圆

 楼主| 发表于 2008-9-5 10:15:08 | 显示全部楼层
同样的操作方式,为何P2有输出,P4无输出?
怀疑是开发软件装的有问题,哪位帮忙把下面的程序编译一下,生成.HEX文件,我烧到芯片试一下。芯片型号:upd78f9202。
/*uPD78F9202*/

#pragma sfr   
#pragma DI
#pragma EI
#pragma NOP
#pragma interrupt INTTMH1 int_TMH1

#pragma section @@CNST OPT AT 80H
const char OPTION=0b10010110;      /* reset脚设定为输入口,内部8m高速振荡*/

#define OFF 0
#define ON 1


#define _5MS 5
#define _500MS 100

bit bSendEn;
unsigned char n5msCount;
unsigned char n500msCount;
unsigned char nOutData;
unsigned char nP4Buff;
void int_TMH1(void);
void hard_ini(void);

/*********************************************************/
void hard_ini(void)
{
        PPCC=0b00000001;        /*Fcpu=4M,Fxp=4M,(指令周期2/4=0.5us)*/
        PCC=0b00000000;                /**/
  WDTM=0b01111000;                /*看门狗关,0b01111000*/
  
/*IO初始化*/
        PU2=0;
        PU3=0;
        PU4=0;
  PM2=0b11110000;                /*p20-p23输出*/
  PMC2=0b00000000;                /*p20-p23为端口/复用模式,非ADC模式*/
  PM3=0b11111011;                     /*p34输入p32输出*/
  PM4=0b11110110;                /*p43 p40输出*/
  P4=0b00000000;
  nP4Buff=0;

/*8位定时器H1初始化*/
  TMHMD1=0b00100000;                /*H1模式设定:计数时钟=Fxp/16=4/16=0.25M=4us*/
  CMP01=249;                        /*比较寄存器01设定:(249+1)*4us=1ms产生一次中断*/
        TMMKH1=0;                     /*CMP01中断允许*//**/
        TMHE1=1;                      /*启动定时器工作*//**/
}


/****************************************************/
void int_TMH1(void)                //H1中断,1ms一次
{                                       
        TMIFH1=0;        
        if (!(n5msCount-=1))
                {
                        n5msCount=_5MS;
                        if (!(n500msCount-=1))
                                {
                                        n500msCount=_500MS;
                                        P2.1=!P2.1;
                                        P2.0=!P2.0;
                                        P4.3=!P4.3;
                                        P2.3=!P2.3;
                                        P4.0=!P4.0;
                                }
                }
}

void main()
{
        DI();
        hard_ini();
        n5msCount=_5MS;
        n500msCount=_500MS;
        EI();
  while(1)
  {
    NOP();
  }
}

出10入10汤圆

 楼主| 发表于 2008-9-5 10:17:19 | 显示全部楼层
NEC-etouch:
PM+是否支持K0S系列?

出0入0汤圆

发表于 2008-9-5 13:08:39 | 显示全部楼层
支持的,
NEC的软件稍微繁琐一点,安装的时候要分别安装KOS和K0的编译软件。
但是使用的时候就不需要注意这些东西了,PM+会根据你选用的芯片而自动选择所需要的编译器

出10入10汤圆

 楼主| 发表于 2008-9-15 10:03:33 | 显示全部楼层
NEC-etouch,请帮忙,目前问题一直没有解决,项目进度需要已经暂时更换为microchip的mcv08a芯片,以暂时解决燃眉之急。今天又查看了一下c编译器产生的汇编代码,发现有些指令没有编译产生?



 (原文件名:未命名.JPG) 



PMC2未编译问题不大,因为芯片复位后该寄存器为00H,程序初始化也为00H;

而PM4就有问题了,芯片复位后该寄存器值为FFH,即默认为输入,这样程序就无法控制P4口输出高低电平了。

本贴被 szxszx 编辑过,最后修改时间:2008-09-15,10:04:41.

出10入10汤圆

 楼主| 发表于 2008-9-15 10:12:30 | 显示全部楼层
软件模拟仿真中也没有P4口的选项?



 (原文件名:未命名.JPG) 

出10入10汤圆

 楼主| 发表于 2008-9-15 12:22:18 | 显示全部楼层
ok,问题已经解决, PM4初始化放在前面即可。好像没看到资料里有介绍,郁闷!



/*IO初始化*/

  PM4=0b00000000;//11110110;                                                                        /*p43 p40输出*/

  P2=0;

  P3=0;

  P4=0;

  PM2=0b11110000;                                                                        /*p20-p23输出*/

  PMC2=0b00000000;                                                                /*p20-p23为端口/复用模式,非ADC模式*/

  PM3=0b11111011;                                                     /*p34输入p32输出*/

 // PM4=0b00000000;//11110110;                                                                        /*p43 p40输出*/

出10入10汤圆

 楼主| 发表于 2008-9-15 14:11:04 | 显示全部楼层
经过多次试验,发现是编译器的问题,去掉程序中的中文注释,就能够正常编译,看来编译器对中文注释支持不是很好,目前没发现对英文注释有何问题,大家使用时要注意这一点。我用的是UltraEdit编辑器。

出0入0汤圆

发表于 2008-9-16 07:54:22 | 显示全部楼层
TO szxszx 

为什么我的中文注释有时候可以有时候乱码呢?

PM3=0b11111011;                                                     /*p34输入p32输出*/ 

不知你是怎么解决的?我也用的UltraEdit编辑器

出0入0汤圆

发表于 2008-9-16 09:24:52 | 显示全部楼层
NEC的PM+对中文的支持的确不好,所以我们一直不鼓励用中文支持



TO anxiangbo

你出现乱码的原因可能是:

你用UE编写了代码后,可能又在PM+的编辑器中修改过代码,这就会产生乱码

出10入10汤圆

 楼主| 发表于 2008-9-16 20:50:13 | 显示全部楼层
对,不要再PM+中修改保存,有问题直接用UltraEdit编辑器操作。

出10入10汤圆

 楼主| 发表于 2008-9-16 21:01:29 | 显示全部楼层
NEC-etouch:

1、【18楼】中提到的问题如何解决?

2、下图中的这个选项是干什么的?好像是用来“指定源文件中注释使用的汉字编码类型的”,怎么使用?



 (原文件名:未命名.JPG) 

出0入0汤圆

发表于 2008-9-17 16:36:59 | 显示全部楼层
 szxszx 



你好

第一个问题:

这个软件仿真有着不理想的地方,的确没有P4口的IO口仿真

第二个问题:



Specifies the kanji code (2-byte code) in the source files.

sjis Shift JIS (Default for PC-9800 Series, IBM PC/AT compatibles, and HP9000 Series 700)

euc EUC (Default for SPARCstation)

none No 2-byte codes



这个东西我没有去研究,个人理解:这是为了NEC软件为了支持日文的一个设置选项,1个日文汉字也是由2个字节构成。

SJIS和EUC分别是针对不同的电脑类型而对应的配置。



根据经验:如果你的程序里面没有出现中文注释,这三个选项都不会对你程序编译有问题,如果你的程序里面有中文注释用SJIS这个选项,可能就会编译不了。



希望有懂得人来指导一下

出0入0汤圆

发表于 2008-9-19 22:01:15 | 显示全部楼层
手册中对于PM4,设置的时候,PM4要先写0,在手册中55页有的,注:。。。。。。

出0入0汤圆

发表于 2008-10-6 09:12:45 | 显示全部楼层

出10入10汤圆

 楼主| 发表于 2008-10-6 19:11:37 | 显示全部楼层
楼上东张西望的什么意思?

出0入8汤圆

发表于 2009-1-28 22:11:13 | 显示全部楼层
很有帮助的一帖,正在初学NEC的芯片,谢谢各位!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 04:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表