佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2005|回复: 10

PIC18F452, 有资料进来时,LED 会闪一闪

[复制链接]
发表于 28-1-2008 10:30 AM | 显示全部楼层 |阅读模式
大家好! 我的单晶片一直接收GPS资料,然后资料会显示在 Hyper Terminal
Coding 如下:

#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=38400, parity=n, bits=8, xmit=PIN_C6, rcv=PIN_C7, STREAM=COMM4)
main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(true);
}
#int_rda
void rda_isr()
{
char c;
c=fgetc(COMM4);
putc(c,COMM4);
}

如果我想,当有资料进来时,LED 会闪一闪; 没资料或出现问题时,LED就不会闪一闪;我应该怎么写呢?
(本人还是新手,请多多指教! )
谢谢!
回复

使用道具 举报


ADVERTISEMENT

发表于 14-2-2008 08:34 AM | 显示全部楼层
原帖由 jovikang2002 于 28-1-2008 10:30 AM 发表
大家好! 我的单晶片一直接收GPS资料,然后资料会显示在 Hyper Terminal
Coding 如下:

如果我想,当有资料进来时,LED 会闪一闪; 没资料或出现问题时,LED就不会闪一闪;我应该怎么写呢?
(本人还是新手,请多多指教! )


对不起,现在才看到你的帖。。。

这里提供一个简单的方法:
  1. #include <18F452.h>
  2. #fuses HS,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=20000000)
  4. #use rs232(baud=38400, parity=n, bits=8, xmit=PIN_C6, rcv=PIN_C7, STREAM=COMM4)
  5. int16 RxCnt;

  6. #int_rda
  7. void rda_isr()
  8. {
  9.    char c;

  10.    c=fgetc(COMM4);
  11.    fputc(c,COMM4);
  12.    
  13.    RxCnt=0xffff; // relaod Counter for LED indication
  14.    output_high(pin_A0); // Turn On LED
  15. }

  16. Void main()
  17. {
  18.     enable_interrupts(INT_RDA);
  19.    enable_interrupts(GLOBAL);
  20.    while(true)
  21.    {
  22.            
  23.       // Simple Delay
  24.       if(--RxCnt==0) //Decrease Counter, Turn off LED when zero
  25.       {
  26.          // Turn off LED
  27.          output_Low(Pin_A0);
  28.       }
  29.    }
  30. }
复制代码

不明白再问。

没有人用18F452了, 尽可能用18F4520。
还有, 你用很多Comm port?如不是, 不要用STREAM 这个指令。
Code 应该不是你自己写的, 对吗?
回复

使用道具 举报

 楼主| 发表于 14-2-2008 10:13 AM | 显示全部楼层

回复 2# pic 的帖子

谢谢,大大! 真的是万分感谢!
成功了!
[ 没有人用18F452了, 尽可能用18F4520.] 哦。
没有用很多Comm port.. 如果不是,为什么不要用STREAM这个指令呢? 在CCS HELP file里,没解释到这一点哦... 请赐教
是的,这代码是我上司写的... 要我去明白,所以我就考考自己...
大大,我用 int8 counter 代替 int16 RxCnt... 会得到一样的效果,那么它们的分别在哪?我怎样判断应该用哪个呢?
再次的,谢谢大大!
在此等待你的回复
回复

使用道具 举报

发表于 14-2-2008 01:01 PM | 显示全部楼层
原帖由 jovikang2002 于 14-2-2008 10:13 AM 发表
没有用很多Comm port.. 如果不是,为什么不要用STREAM这个指令呢? 在CCS HELP file里,没解释到这一点哦... 请赐教

如用一个以上的Com port, 才用Stream, 是让program 知道你要收哪一个Com, 送去哪一个Com 用的。
一般PIC MCU 有1~2 个 Hardware USART,
要更多可以做Software USART。

我用 int8 counter 代替 int16 RxCnt... 会得到一样的效果,那么它们的分别在哪?我怎样判断应该用哪个呢?

用int16 (0-65535) , count 到0 会用更长的时间。
如用int8 (0-255) , count 到0 会用较短更长的时间。

你可以用Int 8, 没问题的。那个其实是delay, 太快的话LED可能看不到就关了, 是用来延长LED on的时间。
回复

使用道具 举报

发表于 14-2-2008 01:17 PM | 显示全部楼层
gps 的 baud rate 已经是 fix 的?
只有send data ?
那里可以买到 rs232? 会比 bluetooth 贵很多吗?

int8 和 16 是initialise 1byte 和 2byte 给你的data.
8 bit 是到 256, 16bit 是 65535 (都是 unsigned)
如果signed 就-128~127 , 和 -32768~32767
在 renesas C compiler 如果没注明就是 signed.
之前用 8051 keil C 没记错要注明 signed or unsigned.

分别在与如果你的value 大过 8bit , 虽然都能走,但是可能 compiler 会把他分loop , 所以你的 program 会用比较多的 rom. 尝试看看 asm file, 就知道了。选择对的, 才不会浪费资源。(个人看法, 有错情纠正)
回复

使用道具 举报

 楼主| 发表于 14-2-2008 02:44 PM | 显示全部楼层

回复 5# chan1314 的帖子

在这GPS fix 38400, 但是可以更改,透过传送$PGRMC,,,,,,,,,,x,,,,* x=你要的baud rate's mode,可以refer GPS module's datasheet。
只有send data? <---不明白.. 但是这GPS module是一直接收资料的...
rs232不是最便宜的吗?
如有错误,请纠正! 谢谢!
回复

使用道具 举报

Follow Us
 楼主| 发表于 14-2-2008 02:52 PM | 显示全部楼层

回复 4# pic 的帖子

哦! 谢谢大大!   
的确! 我试int8,虽然有亮,但是灯很小。
我也去试int32, 结果LED一直亮,没闪一闪。
这是因为delay太长,过于data in的时间;所以LED还没不亮(OFF) 就已经data in而造成LED 一直ON? 这样解释对吗?
回复

使用道具 举报

发表于 14-2-2008 03:09 PM | 显示全部楼层
原帖由 jovikang2002 于 14-2-2008 02:52 PM 发表
哦! 谢谢大大!   
的确! 我试int8,虽然有亮,但是灯很小。
我也去试int32, 结果LED一直亮,没闪一闪。
这是因为delay太长,过于data in的时间;所以LED还没不亮(OFF) 就已经data in而造成LED 一 ...

是的。 可以自己实验最好的reload value, 不一定是0xffff。(65535)
RxCnt=0xffff; // relaod Counter for LED indication

不要用int32, 他是4bytes, 会吃较多的ROM的。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 14-2-2008 03:13 PM | 显示全部楼层

回复 5# chan1314 的帖子

/* 分别在与如果你的value 大过 8bit , 虽然都能走,但是可能 compiler 会把他分loop , 所以你的 program 会用比较多的 rom. 尝试看看 asm file, 就知道了。选择对的, 才不会浪费资源。(个人看法, 有错情纠正)*/
谢谢分享与教导chan1314
哦! 我试了,也看了asm,越高的int用rom越高... (以下是我得到result)
int8   -   234bytes
int16 -   246bytes
int32 -   268bytes
回复

使用道具 举报

 楼主| 发表于 14-2-2008 03:17 PM | 显示全部楼层

回复 8# pic 的帖子

哦..
我刚试了
也刚发出那帖子
谢谢!
回复

使用道具 举报

发表于 17-2-2008 03:51 PM | 显示全部楼层
原帖由 jovikang2002 于 14-2-2008 03:13 PM 发表
/* 分别在与如果你的value 大过 8bit , 虽然都能走,但是可能 compiler 会把他分loop , 所以你的 program 会用比较多的 rom. 尝试看看 asm file, 就知道了。选择对的, 才不会浪费资源。(个人看法, 有错情纠正)* ...


chan1314讲得没错, 不过同时你注意, 不止rom usage会多, ram usage也会比较多。
所以在没必要的时候不要用int16/int32,浪费rom, ram, 还有增加processing time.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 24-1-2025 09:00 PM , Processed in 0.123161 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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