佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1501|回复: 15

PIC16f877A 的UART 在receive时

[复制链接]
发表于 30-10-2008 09:47 PM | 显示全部楼层 |阅读模式
请问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;
回复

使用道具 举报


ADVERTISEMENT

发表于 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 | 显示全部楼层
  1.         while(1)                                                                   
  2.    
  3.         {                                 

  4.                 if(RCIF);                        //wait for data       
  5.        
  6.                 {

  7.                           REC_BYTE = RCREG;
  8.                         {
  9.        
  10.                                 if(DATA_FLAG)
  11.                        
  12.                                 {
  13.                                         DATA_FLAG=0;
  14.                                          B=REC_BYTE
  15.                                         SETUP();                       
  16.                                 }
  17.        
  18.                                 else
  19.        
  20.                                 {
  21.        
  22.                                         C =REC_BYTE;
  23.                                         SELECT_MODE(C);               
  24.                        
  25.                                 }
  26.        
  27.                         }       

  28.                 }               
  29.    
  30.         }               

  31. SELECT_MODE(C)
  32. {
  33.         switch(C)   
  34.         {       
  35.                 case 48:         //keyboard (ascii 0)                         
  36.                 STA=0;          //motor status=1,ready to run
  37.                 RESET();
  38.                 break;
  39.        
  40.         
  41.                 case 49:           //keyboard(ascii 1)
  42. DATA_FLAG=1;
  43.                 ON=1;          //motor status=1,ready to           
  44.                 break;
  45.                
  46.                 default:
  47.                 break;          
  48.         }  
  49. }
复制代码


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, 应该是有时走, 有时不走。。。然后你也不知道为什么。。。

如果你想大家帮你, 你就讲清楚你是要做什么, 你的应用是什么?
然后你有什么指令, 然后那个指令的功能?
还有你的硬体是什么?电路图?
如果你是简单讲, 大家还是有很多疑问,那就简单的回答。
如果你是清楚讲, 那大家就清楚的回答。
回复

使用道具 举报

Follow Us
 楼主| 发表于 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。

你这样说明大家就有底咯, 至少现在很清楚你的应用, 就是这么简单。

请问是学校作业还是商业性质的?
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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。
回复

使用道具 举报


ADVERTISEMENT

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 15-6-2024 05:40 AM , Processed in 0.068600 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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