zhoukok的笔记 https://bbs.21ic.com/?589263 [收藏] [复制] [RSS]

日志

应广单片机使用心得,FPPA多核处理

已有 2080 次阅读2010-9-15 07:48 |系统分类:单片机| 应广

1、定时器的应用
和其他单片机一样,FPPA的定时器一样有:时钟选择端、预分频处理、最大计数位数,
和51以及其他MCU不同之处在于,他的编程语法不同。但是思路不变。
A、时钟选择端:FPPA有很多时钟选择,像其他台系单片机一样,有内部RC振荡(内部RC高速振荡和内部RC低速振荡),外部RC振荡,晶体振荡,以及外部时钟源。其中,晶体振荡精确性比较好,在精确度容许的情况下,可以采用外部RC振荡以及内部RC振荡。
B、预分频处理:FPPA的预分频处理也和MCU一样,有1/1;1/4;1/16;1/64;
C、最大计数位数;在51单片机中,有16位的定时器,最大计数为65536,最小计数为256,而FPPA有一个16位的定时器,而且,他的计数范围可以分得更多,他可以分为:BIT8------BIT15即可以从2的9次方到2的16次方中选择。


FPPA定时器的语法:
$ T16M (系统时钟:不同的时钟源,时钟不同) , (预分频系数),(计数位数);


示例:
$T16M SYSCLK,1/16,BIT15;
(系统时钟 /16)*65536=中断溢出时间



2、中断的使用
FPPA211 有4个中断。分别是定时器中断,外部中断源(PA0,PB0)
AD中断。
一、和其他MCU一样,中断都有自己的中断使能端,中断请求端,同时,还有一个总中断端,一个完整的中断必须具备:该中断的使能端使能,中断请求端有效,总中断开启。


二、在中断服务程序中,必须注意堆栈的使用,要有足够的堆栈单元存放需要保存的数据,一般为ALU和状态寄存器。同时在中断中,必须查询中断请求位,因为4个中断源共用一个中断服务入口地址。


三、全局中断在进入中断入口时,会关闭,当中断返回时,即遇到RETI时,会重新使能全局中断。中断服务程序中,必须手动清除中断请求标志位。


四、只有FPP0能执行中断


ENGINT:ENABLE GOLBE INTERRUPT :全局中断使能
DISGINT:DISABLE GOLBE INTERRUPT :禁止全局中断使能



3、掉电模式
一、FPPA掉电模式会停止所有振荡,指令为STOPSYS。
注意在进入掉电模式之前,必须使能内部低速振荡,以便唤醒是恢复系统运作。即CLKMD的2位必须为高。


4、IO口的设置
IO口是单片机必不可少的单元,和其他MCU一样,FPPA的IO口同样有着齐全的功能,包括控制寄存器(pac,pbc),上拉电阻寄存器(pah,pbh),数据(pa,pb)
pac,pbc:高电平为输出,低电平为输入
pah,pbh:高电平使能上拉,低电平禁止上拉
pa,pb:数据寄存器(在输入时,读入的是端口电平;在输出时,输出的是数据寄存器的内容)



5、复位
一个系统复位的条件有很多,譬如最基本的上电复位,内部看门狗产生的复位,复位引脚产生的复位,低电压产生复位等
在FPPA中,复位后,大部分寄存器都被置为上电初始值,在上电或者低电压复位时,数据存储器上的值是不确定的,而在WDT和RESET引脚上产生的复位,数据存储器保持不变。


5.1、VDD/2
这是FPPA的特殊功能,可以为LCD提供VDD/2,具体实现很简单,只要把对应的引脚设置为输入则可。在输出高电平时候,输出为VDD,而输出低电平时,输出为GND。


5.2、ADC
ADC在MCU中已经很常见了,而FPPA也带有该功能。
注意:
在进行AD采集时,基准电压浮动不能太大,转换速率不一定要最快,在FPPA中,有一个最佳的AD转换时间,一般为500khZ
FPPA支持的语法,在使用时很方便。
在进行AD转换时,步骤如下:
*1、将AD输入口设置成模拟输入,关闭上拉使能。PBPH=0,ADCDI=0X04;
*2、使能输入口,选定参考电压:$ ADCC ENABLE,PB0~PB3,AD_VER(可以选内部电源和外部电源输入)
*3、设置AD模式:$ ADCM 8BIT,/8(可以选择分频系数,来设定转换速率)
*4、开始转换: SET1 AD_START
*5、等待转换完毕,也可以用中断方式, WAIT1  AD_DONE
*6、读取AD转换值:MOV A,ADCR



5.3FPPEN使用
FPPEN是FPPA特有的内核调度器,总共8位,为1使能,为0禁止
在使能FPPEN的时候,要注意先初始化程序,然后进行使能,否则可能会产生错误。


5.4 关于PMW输出
现在的MCU一般都带有PWM输出,基本原理为定时计数器,和输出比较器结合产生。
而FPPA没自带PWM输出单元,必须软件模拟来实现,一般来说,有以下几种常用方法
1、用2个计数单元分别计数高电平时间和低电平时间,而周期则为高电平加低电平的时间
当我们需要产生不同的PWM时候,可以通过改变高电平的时间和低电平的时间来改变PWM的周期和占空比
不过,灵活性不错,同时可以加入延时程序,进一步改变PWM的周期和占空比。在一般情况下,这种方法比较实用,也比较简单。
int pwm_duty,pwm_freq;
  pwm_duty=100;
  pwm_freq =100;
 while(1)
 {
   while(---pwm_duty)
  {
   pwm_out=0;
   delay(uint x);
  }
  while(---pwm_freq)
  {
   pwm_out=1;
   delay(uint x)
  }
  pwm_duty=100;
  pwm_freq=100;
 }


2、定时器+计数单元
我们可以通过定时器来产生PWM,具体做法如下
用定时器定义一段基本时间,由于现在的定时器计时范围越来越大,所以可以产生很多不同周期的PWM,不过这种方法需要的计数单元比较多,需要一个中断时间的计数单元,当计数单元等于高电平上限的时候,便翻转电平,当计数单元等于周期长度的时候,就意味着整个PWM周期结束,计数单元清0。重复以上就可以产生可调的PWM。这种方法的优点在有中断的支持,所以PWM的优先级高,可以不被打扰,因而可以产生稳定的PWM波形。
void  interrupt_ser(void)
{
 int pwm_duty=100;
 int pwm_freq=200;
 push ;
 if(++pwm_count==pwm_duty)
 pwm_out=0;
 if(++pwm_count==pwm_freq)
 {
  pwm_out=1;
  pwm_count=0;
 }
 pop;
}


5.5 关于DELAY的用法
 DELAY在程序设计中很常见,但是以DLEAY A,DELAY I,DELAY RAM,等形式出现的延时语法很少,FPPA支持的这种语法,在实际试用起来很方便,比如在进行红外或者无线编码时,很有用,如果时钟选择好,延时效果很好,产生的波形也很好,这点可以用到PWM的产生与调节上。
不过,在与中断一起使用的时候,需要特别注意的是:DELAY的时间不要超过中断时间,如果超过中断时间,因为在中断返回主程序的时候,DELAY 会重新计数,而不会接着中断打断的那时候数据继续往下减,这样的话,如果中断时间过短或者DELAY时间过长,则会造成延时不会结束,使得程序瘫痪。


 


 


 


 



 


路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)