szxszx 发表于 2008-8-27 21:17:57

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

用的是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();
}
}

RENESAS-etouch 发表于 2008-8-27 22:42:16

你烧录到单片机里面看看是否不闪?
因为我以前也碰过用软件仿真结果不对的情况。

szxszx 发表于 2008-8-27 22:51:45

软仿可以,关键就是烧到芯片里不闪。

ahfong2006 发表于 2008-8-28 07:22:03

这个问题要解决啊,幸亏是FLASH片子,否则这个软件仿真可会害死人的。。。

dongdaxing 发表于 2008-8-28 08:01:50

我用TM80时候也是碰到这个问题啊 郁闷啊

szxszx 发表于 2008-8-28 09:23:19

我用的是KOS系列的upd78f9202,楼上用的是ko系列的吧。
是不是与编译器的设置有关系?
编译器的这个选项如何设置?请NEC-etouch 帮忙解释一下。
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_392556.JPG
(原文件名:未命名.JPG)

dongdaxing 发表于 2008-8-28 12:47:54

你把P2口的程序去掉 看看 只是看p4

cctnt 发表于 2008-8-29 23:48:26

PU4=9;

szxszx 发表于 2008-8-30 08:16:59

【7楼】 cctnt :
PU4=9;意思是内部上拉电阻连接。
可是:设定为输出上拉电阻是不需要连接的,芯片内部电路也是自动关闭上拉电阻的。

cctnt 发表于 2008-8-30 09:31:03

再改
PM4=0b01100000;

szxszx 发表于 2008-8-30 09:45:22

【9楼】 cctnt:
我用得是78f9202.
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_395285.JPG
(原文件名:未命名.JPG)

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_395374.JPG
(原文件名:未命名.JPG)

RENESAS-etouch 发表于 2008-9-1 11:32:04

TO:
szxszx

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

szxszx 发表于 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);
   
}
}

kuang 发表于 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;
是不是弄错了,这个感叹号起什么作用啊???想取反可以用异或或都非啊,"^"或"~"

szxszx 发表于 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();
}
}

szxszx 发表于 2008-9-5 10:17:19

NEC-etouch:
PM+是否支持K0S系列?

RENESAS-etouch 发表于 2008-9-5 13:08:39

支持的,
NEC的软件稍微繁琐一点,安装的时候要分别安装KOS和K0的编译软件。
但是使用的时候就不需要注意这些东西了,PM+会根据你选用的芯片而自动选择所需要的编译器

szxszx 发表于 2008-9-15 10:03:33

NEC-etouch,请帮忙,目前问题一直没有解决,项目进度需要已经暂时更换为microchip的mcv08a芯片,以暂时解决燃眉之急。今天又查看了一下c编译器产生的汇编代码,发现有些指令没有编译产生?

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_417963.JPG

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



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

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

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

szxszx 发表于 2008-9-15 10:12:30

软件模拟仿真中也没有P4口的选项?

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_417987.JPG

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

szxszx 发表于 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输出*/

szxszx 发表于 2008-9-15 14:11:04

经过多次试验,发现是编译器的问题,去掉程序中的中文注释,就能够正常编译,看来编译器对中文注释支持不是很好,目前没发现对英文注释有何问题,大家使用时要注意这一点。我用的是UltraEdit编辑器。

anxiangbo 发表于 2008-9-16 07:54:22

TO szxszx 

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

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

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

RENESAS-etouch 发表于 2008-9-16 09:24:52

NEC的PM+对中文的支持的确不好,所以我们一直不鼓励用中文支持



TO anxiangbo

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

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

szxszx 发表于 2008-9-16 20:50:13

对,不要再PM+中修改保存,有问题直接用UltraEdit编辑器操作。

szxszx 发表于 2008-9-16 21:01:29

NEC-etouch:

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

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

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_419603.JPG

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

RENESAS-etouch 发表于 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这个选项,可能就会编译不了。



希望有懂得人来指导一下

feng89 发表于 2008-9-19 22:01:15

手册中对于PM4,设置的时候,PM4要先写0,在手册中55页有的,注:。。。。。。

lpwei 发表于 2008-10-6 09:12:45

http://www.ourdev.cn/bbs/emotion/em150.gif

szxszx 发表于 2008-10-6 19:11:37

楼上东张西望的什么意思?

fangmcu 发表于 2009-1-28 22:11:13

很有帮助的一帖,正在初学NEC的芯片,谢谢各位!!!
页: [1]
查看完整版本: 帮忙看一下NEC单片机的这段程序是不是有问题?