查看: 2005|回复: 10
|
PIC18F452, 有资料进来时,LED 会闪一闪
[复制链接]
|
|
大家好! 我的单晶片一直接收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就不会闪一闪;我应该怎么写呢?
(本人还是新手,请多多指教! )
谢谢! |
|
|
|
|
|
|
|
发表于 14-2-2008 08:34 AM
|
显示全部楼层
原帖由 jovikang2002 于 28-1-2008 10:30 AM 发表
大家好! 我的单晶片一直接收GPS资料,然后资料会显示在 Hyper Terminal
Coding 如下:
如果我想,当有资料进来时,LED 会闪一闪; 没资料或出现问题时,LED就不会闪一闪;我应该怎么写呢?
(本人还是新手,请多多指教! )
对不起,现在才看到你的帖。。。
这里提供一个简单的方法:
- #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)
- int16 RxCnt;
- #int_rda
- void rda_isr()
- {
- char c;
- c=fgetc(COMM4);
- fputc(c,COMM4);
-
- RxCnt=0xffff; // relaod Counter for LED indication
- output_high(pin_A0); // Turn On LED
- }
- Void main()
- {
- enable_interrupts(INT_RDA);
- enable_interrupts(GLOBAL);
- while(true)
- {
-
- // Simple Delay
- if(--RxCnt==0) //Decrease Counter, Turn off LED when zero
- {
- // Turn off LED
- output_Low(Pin_A0);
- }
- }
- }
复制代码
不明白再问。
没有人用18F452了, 尽可能用18F4520。
还有, 你用很多Comm port?如不是, 不要用STREAM 这个指令。
Code 应该不是你自己写的, 对吗? |
|
|
|
|
|
|
|
楼主 |
发表于 14-2-2008 10:13 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 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不是最便宜的吗?
如有错误,请纠正! 谢谢! |
|
|
|
|
|
|
|
楼主 |
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 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. |
|
|
|
|
|
|
| |
本周最热论坛帖子
|