搜索
bottom↓
回复: 23

M64IO口输出不正常

[复制链接]

出0入0汤圆

发表于 2013-8-20 19:40:47 | 显示全部楼层 |阅读模式
我的熔丝位设置是无掉电检测,内部8Mhz,使能JTAG,使能ISP,无加密。
今天调了一天的程序,连IO口都驾驭不了。
我写了一个最简单的程序,
void main(void)
{
       DDRA=0XFF;
       PORTA^=0XFF;
}
就只是上面这个程序而已,用示波器观察PORTA口,出来144.6的方波,我的程序里边没有加while(1);出现方波是不正常的,另外写了许多端口程序诸如
void main(void)
{
      DDRA=0XFF;
      PORTA=0XFF;
      delay_ms(100);
      PORTA=0X00;
}
理论上走完这个程序PA口应当保持低电平,但实际输出却是高电平。
说明:板子焊接没问题,reset脚始终保持高电平。

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2013-8-20 20:13:20 | 显示全部楼层
>>用示波器观察PORTA口,出来144.6的方波,我的程序里边没有加while(1);出现方波是不正常的

出现方波正常不过。给你算一下。

M64 有 32K WORD,留低 0.5K 作为 INT Jump Vector,即 31.5K 或更小可执行指令位。由於程序里边没有加while(1),所以M64会顺序执行至0x7FFF, 8MHz 时钟需时约 31.5K/8 MHz = 3.937ms。下一个指令就是地址0x0000。由於 PORTA^=0xFF 指令,故PORTA 口电平反转,3.937ms 後又再反转。

所以出现方波频率为 1/(2*3.937ms) = 127Hz,和你测得的相差不远。

出0入0汤圆

 楼主| 发表于 2013-8-21 09:29:43 | 显示全部楼层
alias 发表于 2013-8-20 20:13
>>用示波器观察PORTA口,出来144.6的方波,我的程序里边没有加while(1);出现方波是不正常的

出现方波正常 ...

大师,那另外的问题是我使用的一些简单的端口操作,如
{DDRA=0XFF;
PORTA=0XFF;
delay_ms(1);
PORTA=0x00;
}
或者
{DDRA=0XFF;
PORTA=0XFF;
init_indevice();
PORTA=0x00;
}
什么的这两个程序我用示波器观察的时候,PORTA始终保持高电平,理论上来说应该是低电平的才对。我把PORTA=0x00改为while(1){PORTA=0X00;}效果也一样,
这个怎么解决呢?

出0入0汤圆

发表于 2013-8-21 10:25:59 | 显示全部楼层
以下三个 Main 程式,请你每一个独立运行後看看是否正确,再回帖告诉大家运行结果。

  1. void main(void)
  2. {
  3.     DDRA  = 0xff; //PORTA as OUTPUT
  4.     PORTA = 0x00; //All pins of PORTA LOW

  5.     while (1);
  6. }

  7. // ==第二个==

  8. void main(void)
  9. {
  10.     DDRA  = 0xff; //PORTA as OUTPUT
  11.     PORTA = 0xFF; //All pins of PORTA High

  12.     while (1);
  13. }

  14. //==第三个==

  15. void main(void)
  16. {
  17.     DDRA  = 0xff; //PORTA as OUTPUT
  18.     PORTA = 0x55; //

  19.     while (1);
  20. }
复制代码

出390入22汤圆

发表于 2013-8-21 10:33:09 | 显示全部楼层
楼主是新手,给提个醒,M64出厂熔丝设置是兼容M103,要改为非兼容,否则单片机工作不正常

出0入0汤圆

 楼主| 发表于 2013-8-21 11:28:50 | 显示全部楼层
liudingding 发表于 2013-8-21 10:33
楼主是新手,给提个醒,M64出厂熔丝设置是兼容M103,要改为非兼容,否则单片机工作不正常 ...

大师,熔丝位我改了非兼容模式,上面的三个void main(void)的测试也测试正常
#include <iom64v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int

#define RS_ON PORTC|=(1<<0);
#define RW_ON PORTC|=(1<<1);
#define EN_ON PORTC|=(1<<2);

#define RS_OFF PORTC&=~(1<<0);
#define RW_OFF PORTC&=~(1<<1);
#define EN_OFF PORTC&=~(1<<2);


void delay(void)                         
{
        unsigned int x,y,w;
        for(w=0;w<=300;w++)
                                          
                for(x=1;x>0;x--)
                        for(y=1;y>0;y--);
}

//一、写指令函数
void write_command(unsigned char com)
{
        RS_OFF;
//        RW_OFF;
        PORTB=com;
        delay();
        EN_ON;

        EN_OFF;       
}
  
//二、写数据函数(四线模式数据要分两次写)

void write_data(unsigned char data)
{
        RS_ON;
//        RW_OFF;
        PORTB=data;
        delay();
        EN_ON;
        EN_OFF;
}


//三、初始化LCD1602函数
void LCD_init(void)
{                         
        RW_OFF;               
        write_command(0x38);                                        //设置16X2显示,5X2点阵,8位数据接口
        write_command(0x0f);                                        //开显示,显示光标,光标闪烁
        write_command(0x06);                                        //写一字后地址加一,光标加一
        write_command(0X01);
        write_command(0X80);
       
}
void main(void)
{
         DDRA=0XFF;
         DDRC=0XFF;
                  PORTA=0X55;
         LCD_init();
         while(1);
}
这个main测出的PORTA是0x55,PORTA最先得到的是0x55后LCD_init()里边最后一个函数是write_command(0X80);PORTA测出来应该是0x80才对啊。
void main(void)
{
         DDRA=0XFF;
         DDRC=0XFF;
                          LCD_init();
                  PORTA=0X55;
         while(1);
}
这个main测出来的却是0x00;
请问这是什么问题呢?
现在我的熔丝位是:掉电2.7V;使能掉电检测;内部8M,65ms启动;使能ISP编程;Boot区大小4096;无加密;SPM/LPM访问无限制;允许SPM/LPM访问Boot区;
还有其它熔丝位要改的吗?或者是其它的问题。

出0入0汤圆

 楼主| 发表于 2013-8-21 16:31:27 | 显示全部楼层
liudingding 发表于 2013-8-21 10:33
楼主是新手,给提个醒,M64出厂熔丝设置是兼容M103,要改为非兼容,否则单片机工作不正常 ...

今天下午又试了一下,发现只要有子函数,单片机就走不下去。比如我写一个PWM让OCR1A输出PWM
TCCR1B = 0x00; //stop
TCNT1H = 0xFE; //setup
TCNT1L = 0x71;
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x01;
OCR1BL = 0x8F;
ICR1H  = 0x01;
ICR1L  = 0x99;
TCCR1A = 0x82;
TCCR1B = 0x19; //start Timer
直接在main里边写这些指令就能够正常输出PWM,而建一个tiner_init()之后再在主函数里边调用就不行了。程序就跑不下去。

出0入0汤圆

 楼主| 发表于 2013-8-21 16:40:23 | 显示全部楼层
liudingding 发表于 2013-8-21 10:33
楼主是新手,给提个醒,M64出厂熔丝设置是兼容M103,要改为非兼容,否则单片机工作不正常 ...

现在我的猜想是ICCAVR编译器是D版的,编译器出错!

出0入0汤圆

发表于 2013-8-21 16:54:01 | 显示全部楼层
>>这个main测出的PORTA是0x55,PORTA最先得到的是0x55后LCD_init()里边
>>最后一个函数是write_command(0X80);PORTA测出来应该是0x80才对啊。

明明自己 Write_command() 内用了 PORTB 来存放 0x80,还在奇怪为什么 PORTA 不是 0x80。

出0入0汤圆

 楼主| 发表于 2013-8-21 19:31:57 | 显示全部楼层
alias 发表于 2013-8-21 16:54
>>这个main测出的PORTA是0x55,PORTA最先得到的是0x55后LCD_init()里边
>>最后一个函数是write_command(0X80 ...

你说的那部分是对的,但是为何
void main(void)
{
          DDRA=0XFF;
          DDRC=0XFF;
                           LCD_init();
                   PORTA=0X55;
          while(1);
}
这个测出来的PORTA是0x00呢?总之程序我是改了又改,发现一个共同点,只要调用子函数,无论是什么子函数,程序就跑步下去,我在子函数下面设置的PORTA如何测也测不出来。

出10入23汤圆

发表于 2013-8-21 19:40:44 | 显示全部楼层
huangyewei 发表于 2013-8-21 16:31
今天下午又试了一下,发现只要有子函数,单片机就走不下去。比如我写一个PWM让OCR1A输出PWM
TCCR1B = 0x ...

有子函数就不行?
虽然我不知道你的什么情况,我也遇到过一个类似的现象,也是不能写子函数,放在Main中就没问题(不知道是不是真没问题,但至少跑的简单程序没错),一写函数就死了
我的原因是那片Mega128是我拿烙铁从另一块板上拆下来的(拆迁保证是好的,没上过几次电),烫了比较久(没有风枪),应该是烫坏了,同样的程序就跑不起来了(没动Flash),连一个最简单的串口发送函数都不行,但是只要把串口发送函数挪到主函数里就对了

出0入0汤圆

 楼主| 发表于 2013-8-21 19:50:04 | 显示全部楼层
zouzhichao 发表于 2013-8-21 19:40
有子函数就不行?
虽然我不知道你的什么情况,我也遇到过一个类似的现象,也是不能写子函数,放在Main中 ...

你用的是ICCAVR吗?我刚搜索了几篇帖子,也有出现过类似的现象的,他们说是ICCAVR编译器的问题,我现在正在学AVR studio。

出0入0汤圆

 楼主| 发表于 2013-8-21 19:51:22 | 显示全部楼层
zouzhichao 发表于 2013-8-21 19:40
有子函数就不行?
虽然我不知道你的什么情况,我也遇到过一个类似的现象,也是不能写子函数,放在Main中 ...

芯片一般是没那么容易被烫坏的。我从来没试过老铁会烫坏器件的。

出10入23汤圆

发表于 2013-8-21 19:54:50 | 显示全部楼层
huangyewei 发表于 2013-8-21 19:50
你用的是ICCAVR吗?我刚搜索了几篇帖子,也有出现过类似的现象的,他们说是ICCAVR编译器的问题,我现在正 ...

一直都用WinAVR GCC

出10入23汤圆

发表于 2013-8-21 19:57:48 | 显示全部楼层
huangyewei 发表于 2013-8-21 19:51
芯片一般是没那么容易被烫坏的。我从来没试过老铁会烫坏器件的。

几乎确定是烫坏的,拆了比较长的时间,拆后没有改程序,PCB板也一样(只用了串口和IO)

出10入23汤圆

发表于 2013-8-21 19:59:27 | 显示全部楼层
huangyewei 发表于 2013-8-21 19:51
芯片一般是没那么容易被烫坏的。我从来没试过老铁会烫坏器件的。

但是你的什么原因我不知道,我只是提供我的一个例子

出0入0汤圆

发表于 2013-8-21 20:23:56 | 显示全部楼层
本帖最后由 alias 于 2013-8-21 20:35 编辑

  1. void delay(void)                        
  2. {
  3.         unsigned int x,y,w;
  4.         for(w=0;w<=300;w++)
  5.                                           
  6.                 for(x=1;x>0;x--)
  7.                         for(y=1;y>0;y--);
  8. }
复制代码
楼主知否 for(x=1;x>0;x--) 和 for(y=1;y>0;y--) 只会被执行一次?

还有你使用 PORTB 作输出 command/data 至 LCD,但你有否把 PORTB 用 DDRB=0xFF 设定为输出?

出0入0汤圆

 楼主| 发表于 2013-8-21 20:39:42 | 显示全部楼层
alias 发表于 2013-8-21 20:23
你使用 PORTB 作输出 command/data 至 LCD,但你有否把 PORTB 用 DDRB=0xFF 设定为输出?
...

主要的问题不是有没有把PORTB设定为输出,而是调用了子函数之后程序能不能继续跑下去。
PORTA=0X00;子函数;PORTA=0XFF;while(1);
这种结构测试的结果都是PORTA=0X00.

出0入0汤圆

发表于 2013-8-22 09:51:00 | 显示全部楼层
本帖最后由 alias 于 2013-8-22 09:57 编辑

>> 主要的问题不是有没有把PORTB设定为输出,而是调用了子函数之后程序能不能继续跑下去。

好,送佛送到西,我就到论坛下载了 ICCAVR6.31,用你提供的程式,看看你说的是否真确。附件内是 ICCAVR 的工程,你自己也可以验证一下。



最後结果? 不说也罢。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-8-22 10:15:58 | 显示全部楼层
再提一下,以上是使用 ICCAVR 编译器,编译工程结果得出的.HEX文档,加载到 AVRStudio 的反编译器和 Simulator/Debugger 上断点执行。

出0入0汤圆

 楼主| 发表于 2013-8-22 10:24:56 | 显示全部楼层
alias 发表于 2013-8-22 09:51
>> 主要的问题不是有没有把PORTB设定为输出,而是调用了子函数之后程序能不能继续跑下去。

好,送佛送到西 ...

很感谢你的回答,真的是大师级的任务。
我已经到达了被毁三观的境界了,我用你的m64_test工程测试的结果是0x55,用我的工程把你的代码拷过来,代码完全一样,测试的结果却是0xaa。
望大师继续跟帖,帮我分析一下。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-8-22 10:41:35 | 显示全部楼层
还用分析,只能说是低级错误。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-8-22 10:49:56 | 显示全部楼层
huangyewei 发表于 2013-8-21 20:39
主要的问题不是有没有把PORTB设定为输出,而是调用了子函数之后程序能不能继续跑下去。
PORTA=0X00;子函 ...

我哭!我知道是什么原因了。就一个生成的目标没有去改它,默认的生成目标是atmega1280.我改成m64的就可以了!
在此,再次感谢alias大师的帮忙!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-8-22 10:52:19 | 显示全部楼层
alias 发表于 2013-8-22 10:41
还用分析,只能说是低级错误。

问题解决了,才发现我忘了吃早餐了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-3 16:58

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

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