|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
很简单的程序,PORTC没有输出,不知道为什么? |
作者:joylight 栏目:单片机 |
#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 于 2006/2/17 16:15:00 发布:
试了一下,的确很奇怪 |
3楼: | >>参与讨论 |
作者: joylight 于 2006/2/17 16:33:00 发布:
吧xw定义在main()中也不行 |
4楼: | >>参与讨论 |
作者: coldra 于 2006/2/17 16:44:00 发布:
我稍改并试了一下下面的程序,也让人哭笑不得 #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 于 2006/2/17 16:45:00 发布:
在AvrStudio里看看反汇编代码 在AvrStudio里看看反汇编代码,若把xw换成0就能正常输出0x01可能是编译器用LPM指令,用xm是用LDS指令。 |
6楼: | >>参与讨论 |
作者: joylight 于 2006/2/17 16:51:00 发布:
改成PORTC=pgm_read_byte(motoxw+xw);就可以了 我属于小孩级别的,对汇编不熟。 经高人指点,改成PORTC=pgm_read_byte(motoxw+xw);就可以了 好像是和库函数有关系,FLASH不支持数组访问方式。 |
7楼: | >>参与讨论 |
作者: cleopeng 于 2006/2/17 17:08:00 发布:
用这句试一下 PORTC=(const)motoxw[xw]; |
8楼: | >>参与讨论 |
作者: jackwu 于 2006/2/20 9:59:00 发布:
楼上这句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口。 |
|
|
Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号 |