世俱杯 2025

登录 免费注册 世俱杯 2025 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

很简单的程序,PORTC没有输出,不知道为什么?

作者:joylight 栏目:单片机
很简单的程序,PORTC没有输出,不知道为什么?
#include <avr/io.h>
#include <avr/pgmspace.h>
#define uCHAR unsigned CHAR

uCHAR xw;

prog_uCHAR motoxw[]=
{
  0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x18,0x10,0x11
};

void main(void)
{  
  xw=0;
  DDRC|=(1<<DDC0)|(1<<DDC1)|(1<<DDC2)|(1<<DDC3)|(1<<DDC4);   
  PORTC=motoxw[xw];
  ;      
}

以上程序在WinAvr环境下编译通过,在AvrStudio里软件调试时,
执行最后一条语句PORTC=motoxw[xw];后,PORTC输出为0。若把最后的xw换成0就能正常输出0x01,我看了几遍都没发现问题,请各位帮忙看看。

2楼: >>参与讨论
coldra
试了一下,的确很奇怪
 
3楼: >>参与讨论
joylight
吧xw定义在main()中也不行
 
4楼: >>参与讨论
coldra
我稍改并试了一下下面的程序,也让人哭笑不得
#include <avr/io.h>
#include <avr/pgmspace.h>
#define uCHAR unsigned CHAR

uCHAR xw=0,TEMP=1;

prog_uCHAR motoxw[]=
{
  0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x18,0x10,0x11
};

void main(void)
{  
  
  DDRC|=(1<<DDC0)|(1<<DDC1)|(1<<DDC2)|(1<<DDC3)|(1<<DDC4);   
  xw=1;
  TEMP=2;
  TEMP=motoxw[xw];
  TEMP=motoxw[TEMP];
  PORTC=motoxw[xw];
  PORTC=motoxw[0];
PORTC=motoxw[0];      
}  
很少用WINAVR,可能是设置有问题吧,谁熟悉来指点一下吧

看了一下编译后的汇编,有一句
00000074:   9120008D    LDS     R18,0x008D  
明明0x008D中为3,可是R18却得零,不知道怎么回事

5楼: >>参与讨论
cleopeng
在AvrStudio里看看反汇编代码
在AvrStudio里看看反汇编代码,若把xw换成0就能正常输出0x01可能是编译器用LPM指令,用xm是用LDS指令。

6楼: >>参与讨论
joylight
改成PORTC=pgm_read_byte(motoxw+xw);就可以了
我属于小孩级别的,对汇编不熟。
经高人指点,改成PORTC=pgm_read_byte(motoxw+xw);就可以了
好像是和库函数有关系,FLASH不支持数组访问方式。

7楼: >>参与讨论
cleopeng
用这句试一下
PORTC=(const)motoxw[xw]; 

8楼: >>参与讨论
jackwu
楼上这句PORTC=(const)motoxw[xw]; 试下来不是不好!

用下面的已经能很好的解决问题了:
const prog_uchar motoxw[]=
{0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x18,0x10,0x11};

PORTC=pgm_read_byte(motoxw+xw);

另外别忘记了熔丝配置,M16不在JTAG仿真时,才能用PC5 PC4 PC3 PC2作为I/O口。


参与讨论
昵称:
讨论内容:
 
 
相关帖子
请教:ADC 转换时间问题?
为什么T1中断会影响到LCD显示(MEGA169)
AVR与打印机的讨论
AVR仿真器低价装让
ICE200还有人需要吗?


Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号