查看: 1567|回复: 15
|
PIC16f877A 的UART 在receive时
[复制链接]
|
|
请问PIC16f877A 的UART 在receive时要怎样才能分辨出receive的是send的东西?
还有,请问这样写的话,当DLY没receive到时,下一个接收到的(STEP)会不会被当成DLY?
if(RCIF)
{
while(RCIF)
DLY = RCREG;
while(RCIF)
STEP = RCREG;
while(RCIF)
MODE = RCREG;
select(MODE);
}
else
return; |
|
|
|
|
|
|
|
发表于 31-10-2008 10:42 AM
|
显示全部楼层
原帖由 zew 于 30-10-2008 09:47 PM 发表
请问PIC16f877A 的UART 在receive时要怎样才能分辨出receive的是send的东西?
还有,请问这样写的话,当DLY没receive到时,下一个接收到的(STEP)会不会被当成DLY?
请问电脑是不是送出3个bytes? 然后你要收那3个bytes?
如不是, 请说明你要做的东西或应用。
也请说明你用的compiler, 版本。 |
|
|
|
|
|
|
|
楼主 |
发表于 31-10-2008 09:12 PM
|
显示全部楼层
是的,电脑先送出三个byte。然后接收那3个byte.
我肯定我写错了,但不知怎么改。
我用的是PICC LITE C COMPILER。
[ 本帖最后由 zew 于 31-10-2008 09:15 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 31-10-2008 09:25 PM
|
显示全部楼层
原帖由 zew 于 31-10-2008 09:12 PM 发表
是的,电脑先送出三个byte。然后接收那3个byte.
我肯定我写错了,但不知怎么改。
我用的是PICC LITE C COMPILER。
你需要有Protocol, 要加入Start byte, End byte 之类的, 那么当你收时, 才知道那一个是第一个Byte。 |
|
|
|
|
|
|
|
楼主 |
发表于 3-11-2008 11:54 PM
|
显示全部楼层
- while(1)
-
- {
- if(RCIF); //wait for data
-
- {
-
- REC_BYTE = RCREG;
- {
-
- if(DATA_FLAG)
-
- {
- DATA_FLAG=0;
- B=REC_BYTE
- SETUP();
- }
-
- else
-
- {
-
- C =REC_BYTE;
- SELECT_MODE(C);
-
- }
-
- }
- }
-
- }
- SELECT_MODE(C)
- {
- switch(C)
- {
- case 48: //keyboard (ascii 0)
- STA=0; //motor status=1,ready to run
- RESET();
- break;
-
-
- case 49: //keyboard(ascii 1)
- DATA_FLAG=1;
- ON=1; //motor status=1,ready to
- break;
-
- default:
- break;
- }
- }
复制代码
DATA_FLAG=0,每次要set都去选要set的case最后set DATA_FLAG=1,
接着send data 去B。
这样能不能?还有没有更好的方法? |
|
|
|
|
|
|
|
发表于 4-11-2008 09:42 AM
|
显示全部楼层
原帖由 zew 于 3-11-2008 11:54 PM 发表
DATA_FLAG=0,每次要set都去选要set的case最后set DATA_FLAG=1,
接着send data 去B。
这样能不能?还有没有更好的方法?
如果按你的code, 应该是有时走, 有时不走。。。然后你也不知道为什么。。。
如果你想大家帮你, 你就讲清楚你是要做什么, 你的应用是什么?
然后你有什么指令, 然后那个指令的功能?
还有你的硬体是什么?电路图?
如果你是简单讲, 大家还是有很多疑问,那就简单的回答。
如果你是清楚讲, 那大家就清楚的回答。 |
|
|
|
|
|
|
|
楼主 |
发表于 5-11-2008 06:33 PM
|
显示全部楼层
原帖由 pic 于 4-11-2008 09:42 AM 发表
如果你想大家帮你, 你就讲清楚你是要做什么, 你的应用是什么?
然后你有什么指令, 然后那个指令的功能?
还有你的硬体是什么? ...
我其实要control stepper motor,是用来drive一个gear system。
我的指令是用来控制速度,position,还有direction。
我要从电脑发指令然后从SERIAL comm 输送到pic。
暂时只是在program UART,所以么什么硬件。 |
|
|
|
|
|
|
|
发表于 6-11-2008 10:01 AM
|
显示全部楼层
原帖由 zew 于 5-11-2008 06:33 PM 发表
我其实要control stepper motor,是用来drive一个gear system。
我的指令是用来控制速度,position,还有direction。
我要从电脑发指令然后从SERIAL comm 输送到pic。
你这样说明大家就有底咯, 至少现在很清楚你的应用, 就是这么简单。
请问是学校作业还是商业性质的? |
|
|
|
|
|
|
|
楼主 |
发表于 6-11-2008 01:50 PM
|
显示全部楼层
这个是学校作业。
大致上已经完成超过50%。因为用按键的话已经得到速度与方向控制。
可是position的控制还没有完成!(就是我的指令是让它停在我要的角度,然后下一次开始转时,又要它从那个位置开始。)
我想用UART去控制PIC,还有去track position。 |
|
|
|
|
|
|
|
发表于 6-11-2008 05:49 PM
|
显示全部楼层
原帖由 zew 于 6-11-2008 01:50 PM 发表
这个是学校作业。
大致上已经完成超过50%。因为用按键的话已经得到速度与方向控制。
可是position的控制还没有完成!(就是我的指令是让它停在我要的角度,然后下一次开始转时,又要它从那个位置开始。)
我想用U ...
我分享我的XY Protocol, 很简单的Protocol。
大概是:
"X",[byte1],[byte2],[byte3], [byte1],[byte2],[byte3], "Y"
“X” = Start Byte
“Y”= Stop Byte,
总共8byte 送出。
MCU 开始是等“X", 等到后, 继续收6个byte, 第8个byte 一定要是”Y", 不然就是错。
然后第二的byte, 要等于第五的byte, 等等。 |
|
|
|
|
|
|
|
楼主 |
发表于 6-11-2008 06:09 PM
|
显示全部楼层
回复 10# pic 的帖子
谢谢,我知道怎么做了。
不过请问怎样用open loop去track stepper motor的位置?
我用PIC save最后一个pulse的位置,然后下一次再从那个位置开始。
不过这个方法有问题,因为如果的位置有error的话,我save的data就没用了。 |
|
|
|
|
|
|
|
发表于 6-11-2008 10:14 PM
|
显示全部楼层
原帖由 zew 于 6-11-2008 06:09 PM 发表
谢谢,我知道怎么做了。
不过请问怎样用open loop去track stepper motor的位置?
我用PIC save最后一个pulse的位置,然后下一次再从那个位置开始。
不过这个方法有问题,因为如果的位置有error的话,我save的data就 ...
这个就是 Open Loop 的问题。你是无法知道 stepper motor 位置的 error 的。 |
|
|
|
|
|
|
|
发表于 6-11-2008 10:44 PM
|
显示全部楼层
原帖由 zew 于 6-11-2008 06:09 PM 发表
谢谢,我知道怎么做了。
不过请问怎样用open loop去track stepper motor的位置?
我用PIC save最后一个pulse的位置,然后下一次再从那个位置开始。
不过这个方法有问题,因为如果的位置有error的话,我save的data就 ...
一般开机时, motor 一定要回去Home position,reset, 然后从Home 开始。 |
|
|
|
|
|
|
|
发表于 6-11-2008 11:16 PM
|
显示全部楼层
原帖由 pic 于 6-11-2008 10:44 PM 发表
一般开机时, motor 一定要回去Home position,reset, 然后从Home 开始。
对。Printer 和 scanner 也是这样的。通常 home position 都会有一个 limit switch 来 detect。 |
|
|
|
|
|
|
|
楼主 |
发表于 7-11-2008 12:25 AM
|
显示全部楼层
原帖由 waiweng83 于 6-11-2008 11:16 PM 发表
对。Printer 和 scanner 也是这样的。通常 home position 都会有一个 limit switch 来 detect。
请问要怎么做?
是在motor那边设limit switch 然后每次开始转时,让motor自由地转,直到trigger那个limit switch为止是吗? |
|
|
|
|
|
|
|
发表于 7-11-2008 09:01 AM
|
显示全部楼层
在你的 home position 放一个 limit switch,然后每次开机时,你的 motor 就一直转,直到动到 limit switch 才停。然后你就 set position = 0。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|