1

关于投票
菜农对模拟总线的菜经
 
菜农对模拟总线的菜经
hotpower 发表于 2007-1-20 16:29 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴

1-wire总线的读估计领会的不好~~~
建议:

//读一个字节
uchar ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
  DQ = 0; // 给脉冲信号//应该注解为发送同步脉冲
  dat>>=1;//估计时间太小
  DQ = 1; // 给脉冲信号//应该注解为释放数据总线
//在此处加延时,我认为16.4KBPS的速率应该在3uS~15uS处再读
//否则你速度太快,可能测不出1820的写'1'数据
  if(DQ)//以上不延时,DQ=1将释放不了1-wire总线//读数据信号
   dat|=0x80;//释放不了总线,DQ恒为0,故该句永远"休眠"~~~
  longdelay2(40);  //4
}
return(dat);
}


//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i="0";
for (i=8; i>0; i--)
{
  DQ = 0;发送同步脉冲
//在此处加延时,否则你速度太快,1820可能测不出下降沿
  DQ = dat&0x01;//发送数据
  longdelay2(50);   //5
  DQ = 1;//释放总线
//倒塌了,此处应该加延时!!!
  dat>>=1;//该句有点延时效果但太小!!!
}
//delay(4);
}

菜农对模拟总线的菜经:

总线协议都会照顾到双方的利益,不会因为自己飞快就不照顾对方,只要对方符合参赛条件.
1-wire应该算串行同步协议,复位,写'1',写'0'都是用低电平触发对方,以达到同步对方的目的.
同步过程是需要时间的,故特别在写'1'或读'1'时,都应该在同步完成后再读写.
所以应该在3uS~15uS内再执行此操作.
一般模拟IO时,信号跳变需要延时.
例如:
  DQ = 0;//发送同步脉冲,通知对方开始准备发送数据
  dat>>=1;//此句虽然做移位操作,对硬件来说可以认为是延时
  DQ = 1;//释放数据总线
  delay(xxx);//必须在此处加延时,等待本方真正释放总线,即完成对总线的充电过程!!!
//本来可以用while(!DQ);//等待总线释放,但由于是在接收过程,对方可能发送'1'而导致该语句死机!!!故应该加延时等待才是!!!
  if(DQ)//此时才该读数据信号
//......

如果楼主的程序在2051上运行的很好,真是楼主的服气~~~因为1820速度很快.

系统分类: 单片机
用户分类: 串口通讯专栏
标签: 无标签
来源: 原创
发表评论 阅读全文(629) | 回复(0)

0

关于投票
KeilC51/ARM软件之必备软串口调试软件(下载)

 
Keil C51/ARM软件之必备软串口调试软件(下载)
雁塔菜农 发表于 2006-2-26 9:25:00

实际上,菜农从准备介入ARM应用开始就进行了大量的调研工作.

最后目标直取"华山"---KARM,就如同玩AVR直奔GCCAVR一样...

所以,在"思想转型"一定不要盲目跟风,要先冷静地"选材"才是.

最起码应该芯片大路货,交流有论坛,疑问有人答....

一般来说,设计软件的初期都是搭结构,搞算法和最基本的硬件模块,所以硬件仿真

真没多大的需要,而且软件仿真要来的快得多,只是最后肯定必须上硬件也可以直接

烧写芯片直接运行...

但是串口连续的数据流输入很闹心,所以应该也必须找个好的软串口调试工具软件.

 

推荐: Keil软件仿真串口自动输入数据工具2.0

Keil软件仿真串口自动输入数据工具2.0
hotpower 发表于 2005-9-10 09:26 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴

本程序是Keil软件仿真串口自动输入数据工具,
      您是不是在使用Keil的软件仿真调试串口每次必须手工输入数据感到烦恼?本程序解决
您的烦恼,根据您的需要自动将数据发到Keil的软件仿真串口中。
      请先运行Keil uVersion,然后进入软件仿真调试状态打开串口调试窗口。将需要模拟发
送的数据在本程序中输入。

2.0增加了2进制编辑器和自动检测Keil是否退出调试状态。
下载地址:
http://202.114.122.192/~hexi1/KeilCOMTool.rar
http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1809986

 

http://www.daxia.com/bbs/moredata30_37405.shtml

返回大虾电子网首页 返回历史帖子

[+5][原创]Keil软件仿真串口自动输入数据工具


帖子编号: 37405/839700, 发表用户:hexi    发表时间:2006-3-29 23:48:34     访问次数:314 发贴IP:202.114.124.35

文章内容:
本程序是Keil软件仿真串口自动输入数据工具,
      您是不是在使用Keil的软件仿真调试串口每次必须手工输入数据感到烦恼?本程序解决
您的烦恼,根据您的需要自动将数据发到Keil的软件仿真串口中。
      请先运行Keil uVersion,然后进入软件仿真调试状态打开串口调试窗口。将需要模拟发
送的数据在本程序中输入。

2.0增加了2进制编辑器和自动检测Keil是否退出调试状态。

下载地址:
http://202.114.122.192/~hexi1/KeilCOMTool.rar
FAQ:
1.为什么程序运行Keil没什么反应?
请进入Debug方式,开始调试你的程序,并且将Keil中的Seril #1或Seril #2...窗口打开。
2.能否仿真两个串口呢?
可以,请先打开要被仿真的Keil中的Serial #1, #2。。。然后运行两个本程序,选好对应的串口。
3.为什么有时候Keil收到的数据和发的数据不一样?为什么有时候会丢失数据Keil没收到?
可能是你的机器响应速度慢,请将每个字符发送间隔时间调大点试试看。
4.在十六进制输入时,是否可以在文本框直接输入?
不可以,但是现在程序中带的16进制编辑器比文本输入更方便。
采用文本框直接16进制输入,将会出现很多问题,有的人弄不清楚字符格式该是怎样,
有的人说不能直观的输入字符(比如除二进制字符还含文本字符),有的人说有没有数据保存
文件的功能,省得Copy+Paste+Save,有的人说能不能知道字符的位置(在前面加上
偏移地址信息)。所以在程序中专门做一个16进制编辑器,能准确、快速的输入数据。
现在的16进制字符编辑器可以直接输入16进制或直接输入字符,用户很可以方便的的
输入,输入完毕后只需要多点一下鼠标,关闭编辑窗口。

6. 能否实现接收Keil串口输出的数据?
不能,目前还未打算实现此功能。因为在Keil窗口中可以看到发送的数据,也能看到收到的数据。

注:有网友说原创者提供的链接不能下载,菜农就上传一个,望hexi能谅解菜农,若hexi有意见,菜农将及时删除.
KeilCOMTool2.rar  rar
 
 
系统分类: 单片机
用户分类: 串口通讯专栏
标签: 无标签
来源: 整理
发表评论 阅读全文(2030) | 回复(1)

1

关于投票
请教一个串口收发程序!

http://www.5i51arm.com/viewthread.php?tid=403&highlight

发表于 2007-1-16 10:24  资料 短消息 
请教一个串口收发程序!

实现每接受一个数据,就发送0x01出去的功能,调试出来的结果是:接受到底一个数据,发送出0x01,但是后面 不管接收了多少,没有数据发送出去了。请大家帮我看看,谢谢!源程序 如下:

#include
#include

bit flag;
int i;

InitiateUarts()
{
   //set the RCLK and TCLK to use the Baud Rate Generator for serial 0 and serial 1
   RCLK=1;
   TCLK=1;

   //set the PCON.6/SMOD=0 to make sure that
   //bit 7 of S0CON and S1CON will function as SM0 for UARTs 0 and 1 respectively.
   PCON=0x00;
   
   //disable the multiprocessor communication
   SM2_0=0;
   SM2_1=0;

   //set mode 3 for serial 0
   SM0_0=1;
   SM0_1=1;

   //set mode 3 for serial 1
   SM1_0=1;
   SM1_1=1;

   //enable serial 0 reception
   REN_0=1;
   REN_1=1;

   //set the baud rate to 9600, using Baud Rate Generator
   BRGCON=0x02;
   BRGR0=0xD2;
   BRGR1=0x04;
   BRGCON=0x03;

   //set the priority of serial 0 to the highest level "11"
   PS0=1;  // == IP0.4=1
   IP0H=0x10;  

   //set the priority of serial 1 to the highest level "11"
   PS1=1;
   IP1H=0x01;
  
}

Serial_0() interrupt 6 using 1
{
   if(RI_0)
   {
     flag=1;
     RI_0=0; //clear the flag of serial 0 interrupt
      
   }

}


function()
{
  if(flag)
    {
      S0BUF=0x01;
          flag=0;
           }
        //for(i=0;i<1000;i++);
}

main()
{
   //enable the Uarts 0 and 1 interrupts  
   

   //initiate the uarts 0 and 1
   InitiateUarts();
   EA=1;
   IEN0=0x90;
   IEN1=0x01;


   while(1)
     function();
}

这个问题很简单,虽然菜农没用过669,但道理是一样的~~~

在51系列和任意MCU/ARM/DSP中,串口一般都有发送和接收中断.
其中:
接收中断是在串口接收到一个字符后(这里不说带FIFO的串口).
RI=1将激活串口的接收中断.
进入中断服务程序ISR()后,应该立即取出数据!!!
同时也要求清除RI=0.
这样才能保证下次接收中断的来临,否则就再也进入不了下次的中断了.

同理,发送中断也是如此,但它可以不再发送字符.
因为TI=1引发中断只是告诉你刚发送出去的字符发送成功了.

本例中楼主应用了前后台的设计思路,这样中断处理的时间会很小的.
楼主的设计实际在接收中断里发送数据.
但从以上的论述,即使接收数据无用也应该读出(哪怕无用!!!),要养成这个好习惯.
这样用到其他的MCU或ARM/DSP时就会很快的掌握的.

这是菜农的首次回帖,本来应该由老树或其他斑竹回复的,这样论坛才有生气~~~
否则就倒塌了~~~

发表于 2007-1-17 18:12  资料 主页 文集 短消息 
今天在DSP上遇到同一类问题,估计是被优化了

将全局标志bit flag;
改为:volatile bit flag;

参见帖子:http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2414907

系统分类: 单片机
用户分类: 串口通讯专栏
标签: 无标签
来源: 原创
发表评论 阅读全文(737) | 回复(1)

1

关于投票
给出3个版本LIN总线协议的下载地址

建议用下载工具下载.

LIN 2.1
LIN 2.0
LIN 1.3

LIN联盟的网站

系统分类: 通信网络
用户分类: 串口通讯专栏
标签: 无标签
来源: 整理
发表评论 阅读全文(1033) | 回复(1)

2

关于投票
追求高波特率可能带来的苦果

http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?v=&ID=2401969

追求高波特率可能带来的苦果
hotpower 发表于 2007-1-8 00:14 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴

首先是双方主频的稳定度,一方的微小漂移就会造成误码.
造成误码就要容错,容错就需校验机制.
校验机制就要牵扯通讯协议.
通讯协议就有同步和数据进制及编码和解码问题和过程等等.

再者硬件成本也要增加,线长及寄生电容等都会逼迫你降低通讯速率.
即使使用带屏蔽的双绞线.

高波特率会使编解码的间隔时间减小而造成处理的有效时间降低.

所以,追求高波特率可能带来的苦果,这不是单相思而能为之的.

既然选用51系列,当然采用单周期的MCU更好,而且RAM也要大些,这样可以弥补
没有FIFO带来的烦恼.

故建议波特率选择要适度,而且要选取11.0592MHz倍数的晶振,且至少用绞线

系统分类: 单片机
用户分类: 串口通讯专栏
标签: 无标签
来源: 原创
发表评论 阅读全文(1088) | 回复(0)

0

关于投票
nRF401无线收发串口中断服务程序
nRF401无线收发串口中断服务程序
HotPower 发表于 2004-9-4 20:51 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴

/*------------------------------------
    nRF401无线收发串口中断服务程序

   HotPower@126.com  2004.7.18
------------------------------------*/
void sioproc() interrupt SIO_VECTOR// using 1
{
unsigned char i;
unsigned int crc;
  if (RI) {//接收中断
    RI = 0;
    if (!nRFTXEN && SioBuffers.RXCount) {//每次接收20个数据
      i = SBUF;
      SioBuffers.RXCount --;
      SioBuffers.RXBuffers[19 - SioBuffers.RXCount] = i;
      switch(SioBuffers.RXCount) {
        case 19:
               if (i != 0x55) SioBuffers.RXCount = 20;
                 break;
        case 18:
               if (i != 0xaa) SioBuffers.RXCount = 20;
                 break;
        case 0:
               crc = 0;
               for (i = 1; i <= 8; i ++) {
                 crc = crc16r(GetRXBuffWord(i + i), crc);
               }
               if (crc != GetRXBuffWord(18))
                 SioBuffers.RXCount = 20;
                else {
                 nRFTXEN = 1;//发送
                 for (i = 0; i < 20; i ++) {
                   SioBuffers.TXBuffers[i] = SioBuffers.RXBuffers[i];
                 }
                 SioBuffers.TXMAXCount = TX_MAXCount;
                 SioBuffers.TXCount = TX_Count + 32;
                 TI = 1;//接收结束立即转为发送
               }
               break;
      }
    }
  }
  if (TI) {//发送中断
    TI = 0;
    if (nRFTXEN && SioBuffers.TXCount) {
      SioBuffers.TXCount --;
      if (SioBuffers.TXCount > 19) {
        SBUF = 0x00;
      }
      else {
        SBUF = SioBuffers.TXBuffers[19 - SioBuffers.TXCount];
      }
        if (SioBuffers.TXCount == 0) {
        if (SioBuffers.TXMAXCount) {
          SioBuffers.TXMAXCount --;
          SioBuffers.TXCount = TX_Count;
        }
        else {
          nRFTXEN = 0;//发送结束立即转为接收
          SioBuffers.RXCount = 20;
        }
      }
    }
  }
}
系统分类: 单片机
用户分类: 串口通讯专栏
标签: 无标签
来源: 原创
发表评论 阅读全文(844) | 回复(1)
总共 , 当前 /