微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 双核单片机之初体验

双核单片机之初体验

时间:10-25 来源:互联网 点击:
10. 能否通过一些应用实例来让大家了解应广双核单片机针对某些应用场合的便捷性?

例1:目前价格低于0.2美元的单片机大都不带UART(串口)硬件,如果用一款低价单片机开发需要支持串口通讯的产品,只能是用IO口软件模拟串口。

用IO口软件模拟串口的代码并不复杂,但如果单片机还要处理其它事情,就会遇到麻烦。假定通讯速率是9600,这样每个位宽大约为104us。

一种方法是直接在主程序中循环完成通讯,这样当有数据收发的时候就无法处理其它事情,每个字节会占用超过1ms的时间,数据越多,占用的时间越长,对于数据发送处理还好,数据接收就会很麻烦,理论上需要程序每52us去查看一次IO状态才行,这样的程序只要简单一想就知道编写起来不是一件简单的事情。

另一种方法是用中断,这种处理方法比循环的要简便一些,但要做到同时收发和兼顾处理其它事情,同样也不是一件简单的事情。
对于普通单片机如果只处理串口数据收发,不做其它事情,不管程序循环还是中断方式,程序相对都不会太过复杂,上面只所以复杂是需要同时处理其它的事情。

使用应广双核单片机就可以很好的解决这个问题,首先价格上不会超过0.2美元;其次代码会相对简单,一个内核处理主程序,一个内核专门负责串口通讯,两者都会有很好的实时性。

例2:处理38K红外遥控码。

38K红外遥控码是频率38K占空比为1:2的方波,如果单片机硬件不支持IR接口,就需要单片机能连续输出宽度约为9us和18us的高低电平。如果要单片机输出这种周期持续稳定的方波,在发码期间基本上不能使用中断,象东芝码一次发码时间大约需要60ms,这样就会严重影响程序的计时等功能。

红外码的接收相对要好一些,每个码都有几百微秒的时间,采用中断完全可以实现解码,唯一麻烦的是红外码通常都是数据包,而且数据包中间还包含一些特殊格式,不象串口所有的字节码都是固定格式,这样需要程序按照特定流程才能解码,无法象串口一样只要一个字节的接收程序就可以完成所有数据的接收,所以红外的接收解码程序会比较长,中间如果夹入其它事情处理就会变得很复杂。
以我个人的经验,普通单片机完成红外遥控码的处理,大约需要2~3天时间,最终效果不会太好,但如果使用应广双核单片机,半天即可完成,代码数量要少许多,效果则是更理想。

例3:一个用应广双核单片机做的红外遮挡开光(反射式)全部代码。

IR_SW equ pb.1
IR_INPUT equ pa.0
IR_OUTPUT equ pa.6

byte ir_new
byte ir_old
byte ir_enable
byte i
byte ir_new1
byte ir_new2
byte ir_new3

  goto main0
goto main1

//----------------FPPA0-------------------
main0:
.ADJUST_OTP_IHRCR 8MIPS  // IHRC/2 = 8MIPS, WatchDog Disable, RAM 0,1 temporary be used

sp = 0x30

disgint
inten = 0

mov a,0b000_11_111 //disable timer
mov t16m,a

set1 pbc.1
set0 IR_SW

set0 pac.0
set1 pac.6
set0 IR_OUTPUT

delay 200

ir_new = 0
ir_old = 0
ir_enable = 0

mov a,0
mov intrq,a

set1 fppen.1 //eanble FPPA1

ir_enable = 1
i = 20
while(i)
{
  delay 200
  i--
}

if(IR_INPUT)
{
  ir_old = 1
}
else
{
  ir_old = 0
}

ir_enable = 0
i = 5
while(i)
{
  delay 200
  i--
}

clkmd.1 = 1 //enable watch dog

main0_loop:
wdreset
call check_ir

if(ir_new != ir_old)
{
  if(ir_new != 1)
  {
   tog IR_SW
  }
  ir_old = ir_new
}

i = 100
while(i)
{
  delay 200
  i--
}
goto main0_loop

check_ir:
ir_enable = 1
i = 20
while(i)
{
  delay 200
  i--
}

if(IR_INPUT)
{
  ir_new1 = 1
}
else
{
  ir_new1 = 0
}

i = 5
while(i)
{
  delay 200
  i--
}

if(IR_INPUT)
{
  ir_new2 = 1
}
else
{
  ir_new2 = 0
}

i = 5
while(i)
{
  delay 200
  i--
}

if(IR_INPUT)
{
  ir_new3 = 1
}
else
{
  ir_new3 = 0
}

if((ir_new1 == ir_new2) && (ir_new2 == ir_new3))
{
  ir_new = ir_new1
}
else
{
  ir_new = ir_old
}

ir_enable = 0
i = 20
while(i)
{
  delay 200
  i--
}
ret

//----------------FPPA1-------------------
main1:
sp = 0x38
delay 200
main1_loop: //output 38k IR signal
if(ir_enable)
{
  set1 IR_OUTPUT
  delay 33
  set0 IR_OUTPUT
  delay 67
}
else
{
  set0 IR_OUTPUT
  delay 10
}
goto main1_loop

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top