佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2260|回复: 15

PIC 16F84A 115200 bps

[复制链接]
不要问 该用户已被删除
发表于 24-5-2007 01:34 PM | 显示全部楼层 |阅读模式
各位PIC大大,

请问各位PIC大大,有谁会用PIC 16F84A 写出串联输出为115200bps?
我用serout指令只能做到9600的串联输出。请各位帮帮忙
回复

使用道具 举报


ADVERTISEMENT

发表于 25-5-2007 10:00 AM | 显示全部楼层
16F84A, 如用20Mhz的crystal, 是可以拿到115200bps 的software UART。

如是4Mhz, 最多可以去到9600bps而已。


不建议使用16F84A。
16F84A是已经过时的MCU, 替代的是16F628A
回复

使用道具 举报

发表于 28-5-2007 11:19 AM | 显示全部楼层
PIC 兄,似乎你需要开个置顶楼来告诉大家有关 PIC 16F628 已取代 PIC 16F84 的事实,因你也回过太多这事情了吧。。。

[ 本帖最后由 tjtan81 于 28-5-2007 11:26 AM 编辑 ]
回复

使用道具 举报

不要问 该用户已被删除
 楼主| 发表于 28-5-2007 01:27 PM | 显示全部楼层

回复 #2 pic 的帖子

PIC 兄

我已经换了PIC 16F628。可是有一个问题,我用PICBasic 写不出串联输出为115200bps。
请问有什么例子吗? 我现在试用的指令有 DEBUG 和 hserout。
DEBUG $AA  和   hserout $AA

可是我再HyperTerminal那里拿不到我要输出的数据。

用DEBUG 指令拿到的是 $D6
用hserout指令拿到的是 $00
就是拿不回$AA

DEBUG program
-------------------------------------------

INCLUDE "modedefs.bas"
DEFINE OSC 20
DEFINE DEBUG_REG PORTB
DEFINE DEBUG_BIT 0
DEFINE DEBUG_MODE 0
DEFINE DEBUG_BAUD 115200
TRISB = %00001010

start:
       Debug $AA
       goto start


hserout program
------------------------------
INCLUDE "modedefs.bas"
DEFINE HSERIAL_RCSTA=$90
DEFINE HSERIAL_TXSTA=$24
DEFINE HSERIAL_SPBRG=10 ' 115200 Bauds for 20M xtal
DEFINE HSERIAL_CLEAR=ON
TRISB = %00001010

start:
       hserout $AA
       goto start

[ 本帖最后由 不要问 于 28-5-2007 01:31 PM 编辑 ]
回复

使用道具 举报

发表于 28-5-2007 02:20 PM | 显示全部楼层
原帖由 不要问 于 28-5-2007 01:27 PM 发表
PIC 兄

我已经换了PIC 16F628。可是有一个问题,我用PICBasic 写不出串联输出为115200bps。
请问有什么例子吗? 我现在试用的指令有 DEBUG 和 hserout。
DEBUG $AA  和   hserout $AA

可是我再HyperTer ...

我不喜欢用PICBASIC,它语法是独特的。。。
你能用CCS C吗?我比较熟悉。。。我只专在一门CCS C而已,其他的也要摸索一翻。。。

CCS C的源码如下,很简单的。。。


  1. #include <16F628A.h>
  2. #fuses   HS, noPROTECT,noWDT,put,brownout,nolvp,nomclr
  3. #use delay(clock=20000000) // 20 Mhz
  4. #use rs232(baud=115200, xmit=PIN_B2, rcv=PIN_B1)

  5. void main()
  6. {
  7.    while(1)
  8.    {
  9.       printf("This is 115200bps\n\r");
  10.    }
  11. }
复制代码
回复

使用道具 举报

发表于 28-5-2007 02:26 PM | 显示全部楼层
原帖由 tjtan81 于 28-5-2007 11:19 AM 发表
PIC 兄,似乎你需要开个置顶楼来告诉大家有关 PIC 16F628 已取代 PIC 16F84 的事实,因你也回过太多这事情了吧。。。

呵呵。。。是说过好几次了。。。
回复

使用道具 举报

Follow Us
不要问 该用户已被删除
 楼主| 发表于 28-5-2007 02:58 PM | 显示全部楼层
原帖由 pic 于 28-5-2007 02:20 PM 发表

我不喜欢用PICBASIC,它语法是独特的。。。
你能用CCS C吗?我比较熟悉。。。我只专在一门CCS C而已,其他的也要摸索一翻。。。

CCS C的源码如下,很简单的。。。


#include <16F628A.h>
#f ...


我没有用过CCS C, 现在下载着 CCS PCWH 和 HI-TECH dsPICC 你是用那一个??
C 看起来很简单。。。   现在学应该不迟吧 !!
回复

使用道具 举报

不要问 该用户已被删除
 楼主| 发表于 29-5-2007 09:25 AM | 显示全部楼层
我用着CCS PCWH v4.023, 现在开始学。
请问用HI-TECH 好?? 还是CCS PCWH??
我的个人要求是简单和方便用就好了。
还有的是,哪里可以有CCS C 的教学电子书。
回复

使用道具 举报


ADVERTISEMENT

发表于 29-5-2007 01:01 PM | 显示全部楼层
原帖由 不要问 于 29-5-2007 09:25 AM 发表
我用着CCS PCWH v4.023, 现在开始学。
请问用HI-TECH 好?? 还是CCS PCWH??
我的个人要求是简单和方便用就好了。
还有的是,哪里可以有CCS C 的教学电子书。

Hitech 很好,但CCS比较适合初学者,因为它有很多内建的功能。
回复

使用道具 举报

发表于 30-5-2007 01:07 PM | 显示全部楼层
想请问你,如果我要发0xAA 去我的serial port,请问要怎么写?


可以用 putc(0xAA);



  1. #include <16F628A.h>
  2. #fuses   HS, noPROTECT,noWDT,put,brownout,nolvp,nomclr
  3. #use delay(clock=20000000) // 20 Mhz
  4. #use rs232(baud=115200, xmit=PIN_B2, rcv=PIN_B1)

  5. void main()
  6. {
  7.    while(1)
  8.    {
  9.       putc(0xAA);
  10.    }
  11. }
复制代码

[ 本帖最后由 pic 于 30-5-2007 02:11 PM 编辑 ]
回复

使用道具 举报

发表于 30-5-2007 02:04 PM | 显示全部楼层
谢谢~
发送0xAA我已经做到了。 现在多了一个问题,pic可以同时有两个serial port吗? 因为我是用putc来发送资料,不知要怎么设定两个serial port.

谢谢你的帮忙


PIC MCU 是可以有2serial port,一个Hardware, 一个Software USART.
但为什么你要用到两个呢?

可以知道你的应用吗?不然很难精确的回覆你。
回复

使用道具 举报

不要问 该用户已被删除
 楼主| 发表于 1-6-2007 10:06 AM | 显示全部楼层
这是我要做的制作。 PIC controller 会发送一组hex码去ID reader那里,然后ID reader 会回复PIC controller一组hex。这里地下有block diagram 和发送hex码去ID reader。我已经可以用两个serial port 了。现在我有问题在于读取ID reader回复的hex数据。ID reader回复的hex的有10组 8bits 数据 (ex : 0xAA 0x00 0x0C 0x00 0x01 0x00 0x22 0xA5 0x8A 0xBB )。我尝试用了getc() 来读取,可是没有反应。



#use rs232(baud=115200,parity=N,xmit=PIN_B0,rcv=PIN_B1,bits=8)
void REQUEST_ID_1 ()
{
   putc(0xAA);putc(0x00);putc(0x04);putc(0x10);putc(0x06);
   putc(0x00);putc(0x00);putc(0x12);putc(0xBB);
}

#use rs232(baud=115200,parity=N,xmit=PIN_B2,rcv=PIN_B3,bits=8)
void REQUEST_ID_2 ()
{
   putc(0xAA);putc(0xBB);
}

void main()
{   

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   REQUEST_ID_1();

}
回复

使用道具 举报

发表于 1-6-2007 05:51 PM | 显示全部楼层
你的code有错,我迟点回覆你
回复

使用道具 举报

发表于 2-6-2007 06:57 PM | 显示全部楼层

  1. // Example Code: to demo how to setup two USART on a single PIC MCU
  2. // 2 USRT is setup, their stream name is PLC and FPGA
  3. // Written by : PIC@cari (2 Jun 2007)

  4. #include <16F628A.h>
  5. #fuses   HS, noPROTECT,noWDT,put,brownout,nolvp,nomclr
  6. #use delay(clock=20000000) // 20 Mhz
  7. #use rs232(baud=115200, xmit=PIN_B2, rcv=PIN_B1,stream=PLC) //Hardware USART
  8. #use rs232(baud=115200, xmit=PIN_B3, rcv=PIN_B0,stream=FPGA) //Software USART

  9. void SendToPLC ()
  10. {
  11.    // Send 0xAA to PLC (Pin B2)
  12.    fputc(0xAA, PLC);
  13. }

  14. void SendToFPGA ()
  15. {
  16.    // Send 0xAA to FPGA (Pin B3)
  17.    fputc(0xAA, FPGA);
  18. }

  19. void main()
  20. {
  21. int c,d;

  22.    SendToPLC();
  23.    SendToFPGA ();

  24.    while(1)
  25.    {
  26.       // If there is incoming from PLC
  27.       if(kbhit(PLC))
  28.       {
  29.          c=fgetc(PLC);         
  30.       }

  31.       // If there is incoming from FPGA
  32.       if(kbhit(FPGA))
  33.       {
  34.          d=fgetc(FPGA);         
  35.       }

  36.    }
  37. }
复制代码
回复

使用道具 举报

不要问 该用户已被删除
 楼主| 发表于 4-6-2007 10:56 AM | 显示全部楼层
原帖由 pic 于 2-6-2007 06:57 PM 发表

// Example Code: to demo how to setup two USART on a single PIC MCU
// 2 USRT is setup, their stream name is PLC and FPGA
// Written by : PIC@cari (2 Jun 2007)



谢谢PIC 兄,
我要得发送和接收都已经可以了。我在测试的时候,kbhit(PLC)和kbhit(FPGA) 不会进入if-statement里边,所以我改了一些就可以用了。

// Example Code: to demo how to setup two USART on a single PIC MCU
// 2 USRT is setup, their stream name is PLC and FPGA
// Written by : PIC@cari (2 Jun 2007)

#include <16F628A.h>
#fuses   HS, noPROTECT,noWDT,put,brownout,nolvp,nomclr
#use delay(clock=20000000) // 20 Mhz
#use rs232(baud=115200, xmit=PIN_B2, rcv=PIN_B1,stream=PLC) //Hardware USART
#use rs232(baud=115200, xmit=PIN_B3, rcv=PIN_B0,stream=FPGA) //Software USART

void SendToPLC ()
{
   // Send 0xAA to PLC (Pin B2)
   fputc(0xAA, PLC);
}

void SendToFPGA ()
{
   // Send 0xAA to FPGA (Pin B3)
   fputc(0xAA, FPGA);
}

void main()
{
int c,d;

   SendToPLC();
   SendToFPGA ();

   while(1)
   {
      // If there is incoming from PLC
      #use rs232(baud=115200, xmit=PIN_B2, rcv=PIN_B1,stream=PLC)
      if(kbhit())
      {
         c=fgetc(PLC);         
      }

      // If there is incoming from FPGA
      #use rs232(baud=115200, xmit=PIN_B3, rcv=PIN_B0,stream=FPGA)
      if(kbhit())
      {
         d=fgetc(FPGA);         
      }

   }
}

[ 本帖最后由 不要问 于 4-6-2007 10:59 AM 编辑 ]
回复

使用道具 举报

发表于 4-6-2007 01:38 PM | 显示全部楼层
这个不行吗?

if(kbhit(PLC))
{
   c=fgetc(PLC);         
}

奇怪了,但我都是这样写的。。。没问题的。。。  


#use rs232(baud=115200, xmit=PIN_B2, rcv=PIN_B1,stream=PLC) //Hardware USART
#use rs232(baud=115200, xmit=PIN_B3, rcv=PIN_B0,stream=FPGA) //Software USART

记得:
COM1 - PLC
Port.B2= TX
Port.B1= RX

COM2 - FPGA
Port.B3= TX
Port.B0= RX



KBHIT( )
--------------------------------------------------------------------------------
Syntax:
value = kbhit()
value = kbhit (stream)

Parameters:
stream is the stream id assigned to an available RS232 port.  If the stream parameter is not included, the function uses the primary stream used by getc().

Returns:
0 (or FALSE) if getc() will need to wait for a character to come in, 1 (or TRUE) if a character is ready for getc()

Function:
If the RS232 is under software control this function returns TRUE if the start bit of a character is being sent on the RS232 RCV pin.  If the RS232 is hardware this function returns TRUE if a character has been received and is waiting in the hardware buffer for getc() to read.  This function may be used to poll for data without stopping and waiting for the data to appear.  Note that in the case of software RS232 this function should be called at least 10 times the bit rate to ensure incoming data is not lost.

[ 本帖最后由 pic 于 4-6-2007 01:43 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 23-12-2024 10:48 PM , Processed in 0.129344 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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