打印

请教基本的问题

[复制链接]
2933|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include <p24Fxxxx.h>
#include <stdio.h>
int main(void)
{
    unsigned short a = 0x83FF;
    unsigned char  i = 0;
    TRISB |= a; /*configure PORTB<13:10> as output*/  
   
    while(1)
    {
    PORTB = 0x4000;
    for(i=0;i<16;i++)
    {
     
     PORTB += 0x0400;
     PORTB |= 0xBFFF;
    }
    }   
}

以上是我编写的程序。编译通过。
用KIT2烧录程序。烧完后板子指示灯没有反应。
不知道有没有烧录成功,还是程序有问题?
第一次用PIC单片机,对开发工具还不是很熟。

1.jpg (182.45 KB )

1.jpg
沙发
yewuyi| | 2011-11-14 20:37 | 只看该作者
俺不清楚你要干什么,但至少 PORTB += 0x0400;
     PORTB |= 0xBFFF;
好象不太有道理,PORTB是BYTE型,为何要和WORD型的0400相加?

使用特权

评论回复
板凳
wangz2011| | 2011-11-14 21:33 | 只看该作者
PORTB += 0x0400;
PORTB |= 0xBFFF;
不清楚你要做什么。

使用特权

评论回复
地板
hlhfootbal|  楼主 | 2011-11-15 08:30 | 只看该作者
我用的是pic24fj64ga002.
我看资料上PORTB是16位的,所以应该是WORD型。

PORTB += 0x0400;
PORTB |= 0xBFFF;
以上第一句:在for循环里,循环16次,每次加一,让PORTB<13:10>输出0到16数据。
以上第二句:让PORTB BIT 14 输出低电平,去控制LED等。for循环外有一句  PORTB = 0x4000;
是让PORTB BIT 14 输出高电平。

使用特权

评论回复
5
xaq79| | 2011-11-15 09:18 | 只看该作者
把PORTB改为 LATB 试试看

16位的输出一般对LATX操作

使用特权

评论回复
6
asspeed| | 2011-11-15 10:53 | 只看该作者
unsigned short a = 0x83FF; unsigned char i = 0;
TRISB |= a; /*configure PORTB<13:10> as output*/

a=0x83FF
TRISB=0xffff

TRISB |=a;
结果是多少?

使用特权

评论回复
7
xymxym| | 2011-11-15 10:58 | 只看该作者
硬件先确认有没有问题,电源有木有,复位O不O,振荡起不起,配置位正不正。

使用特权

评论回复
8
hlhfootbal|  楼主 | 2011-11-15 14:26 | 只看该作者
多谢各位帮忙。我的逻辑写错了。改了下程序,指示灯有反应了。
但是PORB<13:10>口没有测到相应的波形,现状是在PORB 10口和11口测到高电平,在12口和13口测到低电平。此程序的目的是让PORB<13:10>依次输出0000-1111的波形。
是因为没有加延时,看不出来,还是程序没写对?
延时函数怎么写?
多谢!
#include <p24Fxxxx.h>
#include <stdio.h>

int main(void)
{
    unsigned short a = 0x0000;
    unsigned char  i = 0;
    TRISB = a; /*configure PORTB<15:0> as output*/  
   
    while(1)
    {
    PORTB = 0xC000;
    for(i=0;i<16;i++)
    {
     
     PORTB += 0x0400;
     PORTB = PORTB && 0xBFFF;
     /*delay(10);*/
    }
    }   
}

使用特权

评论回复
9
yewuyi| | 2011-11-15 15:17 | 只看该作者
PIC有16位宽度的IO吗?

使用特权

评论回复
10
hlhfootbal|  楼主 | 2011-11-15 15:22 | 只看该作者
我用的是pic24fj64ga002.
PORTB是16位的。你可以查下资料。

使用特权

评论回复
11
yewuyi| | 2011-11-15 16:49 | 只看该作者
我用的是pic24fj64ga002.
PORTB是16位的。你可以查下资料。
hlhfootbal 发表于 2011-11-15 15:22


没用过PIC24的16位机,不过别家16位机器虽然数据总线是16位的,但IO宽度一般还是8位的,呵呵,如果PIC24搞成16位宽度,那到真的是很爽很拉风。

使用特权

评论回复
12
hlhfootbal|  楼主 | 2011-11-15 18:10 | 只看该作者
有什么爽的,有什么拉风的

使用特权

评论回复
13
yadaovs| | 2011-11-16 00:05 | 只看该作者
最后 一条语句错了,按位与写成逻辑与了

使用特权

评论回复
14
xymxym| | 2011-11-16 08:24 | 只看该作者
mcc18有个库delays.h,有现成的延时函数,还是很精准的。这24的就不知道了。。。

使用特权

评论回复
15
hlhfootbal|  楼主 | 2011-11-16 17:07 | 只看该作者
13# yadaovs

你是说这句吗?PORTB = PORTB && 0xBFFF;

使用特权

评论回复
16
hlhfootbal|  楼主 | 2011-11-16 17:08 | 只看该作者
14# xymxym
24的好像没有这个库函数
我在程序里加#include <delays.h>编译有误

使用特权

评论回复
17
yadaovs| | 2011-11-16 21:53 | 只看该作者
15# hlhfootbal 是啊

使用特权

评论回复
18
hlhfootbal|  楼主 | 2011-11-16 21:55 | 只看该作者
我程序里对寄存器直接进行算术运算了。
后来改用变量,变量算术运算,再赋值给寄存器,就好了。
但还是没有延时函数啊。

使用特权

评论回复
19
hlhfootbal|  楼主 | 2011-11-16 22:13 | 只看该作者
17# yadaovs 谢谢赐教

使用特权

评论回复
20
hlhfootbal|  楼主 | 2011-11-17 09:21 | 只看该作者
延时函数自己做了一个。
在for循环里,循环16次,每次加一,让PORTB<13:10>输出0到16数据。
我这样处理是不是有问题啊。

#include <p24Fxxxx.h>
#include <stdio.h>

int main(void)
{
    unsigned short a = 0x0000;
    unsigned short b = 0x4000;
    unsigned char  i = 0;
    TRISB = a; /*configure PORTB<15:0> as output*/  
   
    void delay()
    {
     unsigned char t;
     while(--t)
      {;}
    }

    while(1)
    {
    PORTB = b;
     for(i=0;i<16;i++)
    {
     b += 0x0400;
     PORTB =b;
    }
    }   
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

417

帖子

1

粉丝