10FF

#include "c:/icc/include/iom128v.h"
#include "c:/icc/include/macros.h"
//#include "c:/icc/include/eeprom.h"
//#include "c:/icc/include/float.h"
//#include "c:/icc/include/math.h"
//include "c:/icc/include/stdio.h"
//#include "c:/icc/include/stdlib.h"

#include "C:/Documents and Settings/hkck123/桌面/TEST/ziku.h"
#include "C:/Documents and Settings/hkck123/桌面/TEST/tuku.h"

//LCD显示接口地址
#define  WR_CODE1  (*(volatile unsigned CHAR *)0x1400)
#define  WR_CODE2  (*(volatile unsigned CHAR *)0x1800)
#define  RD_CODE1  (*(volatile unsigned CHAR *)0x1600)
#define  RD_CODE2  (*(volatile unsigned CHAR *)0x1a00)
#define  WR_DATA1  (*(volatile unsigned CHAR *)0x1500)
#define  WR_DATA2  (*(volatile unsigned CHAR *)0x1900)
#define  RD_DATA1  (*(volatile unsigned CHAR *)0x1700)
#define  RD_DATA2  (*(volatile unsigned CHAR *)0x1b00)



unsigned int menu_pic1_flag,menu_pic2_flag,key_press_flag;
unsigned int key_change_flag=0;
unsigned CHAR TEMP[][3];

void mov_pic2(void);
void mov_pic(void);
void key_press(void);
void clr_DISPLAY(void);
void delay(unsigned int t);
void delay(unsigned int t)//set delay time
{
int i,j;
for(i=0;i<t;i++)
{WDR();
for(j=0;j<7372;j++);}//1ms
}
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00; //M103 OUTPUT ONLY
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
PORTE = 0x00;
DDRE  = 0x00;
PORTF = 0x00;
DDRF  = 0x00;
PORTG = 0x00;
DDRG  = 0xff;
}

//Watchdog initialize
// prescale: 128K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR=(1<<WDCE)|(1<<WDE);
//WDTCR=(0<<WDE);
WDTCR = 0x0f; //Vcc=5.0 V 时 看门狗典型溢出时间为0.11s
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// CHAR size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x00; //设置波特率 所有的中断允许禁止
UCSR0A = 0x00;//波特率分频器的分频由16降为8 异步通讯传输速率加倍
UCSR0C = 0x06;//传输字符的个数
UBRR0L = 0x2F;
UBRR0H = 0x00; //在时钟为7.3728MHZ时 设置波特利率为9600
UCSR0B = 0xD8;//
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
//disable all interrupts
XDIV  = 0x00; //XTAL divider
XMCRA = 0x00; //external MEMORY
port_init();
//watchdog_init();
//uart0_init();
//CLI();
MCUCR = 0xf0;
XMCRA = 0x00; //
XMCRB = 0x83; //pc7-pc5设置为普通i/o口 其它为地址线
EICRA=0X00;
EICRB=0X00;
EIMSK=0X40;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
//SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//清屏
void clr_DISPLAY(void)
{
int i,j;
for(i=0;i<64;i++)
{TEMP[i][0]=i;TEMP[i][1]=0;TEMP[i][2]=17;}
TEMP[64][0]=0xff;
DISPLAY();
}

/*****************************************************/
/*                    主程序                         */
/*****************************************************/
void main(void)
{int t,m,k,d;
init_devices();
  uart0_init();
//uart1_init();
watchdog_init();
SPH=0X10;
SPL=0XFF;  //内部SRAM最顶部10FFH
WDR();
/***************初始画面/TEST***************/
delay(1);

WR_CODE1=0x3F;
t=RD_CODE1;
WR_CODE1=0xC0;
t=RD_CODE1;
WR_CODE1=0XB8;
WR_CODE1=0X40;
t=RD_CODE1;
WR_DATA1=0X12;
t=RD_CODE1;
m=RD_DATA1;
WR_CODE1=0x3e;
t=RD_CODE1;
  clr_DISPLAY();
mov_pic();
t=TEMP[1][0];m=TEMP[1][2];k=TEMP[1][1];
DISPLAY();
menu_pic1_flag=1;
delay(2);
  WDR();
/******************************************/
while(1)
{ key_press();
  asm("SLEEP/n");//进入掉电休眠模式
  WDR();
}
}
/********************************************************/
/*                 显示开机画面                        */
/*******************************************************/

void mov_pic(void)
{
unsigned CHAR i,j,t,m,n;
for(i=0;i<65;i++)
{
  if(menu_pic1[i][0]==0xff)break;
  else
for(j=0;j<3;j++)
{ //=menu_pic1[i][j];//TEMP[i][1]=menu_pic1[i][1];TEMP[i][2]=menu_pic1[i][2];
m=menu_pic1[i][j];
TEMP[i][j]=menu_pic1[i][j];
t=TEMP[i][j];
TEMP[i][j]=m;
n=TEMP[i][j];}

}
}

/********************************************************/
/*                    显示图片                          */
/*******************************************************/
void mov_pic2(void)
{
int j,m;
for(m=0;m<8;m++){
    WR_CODE1=0xc0;
    WR_CODE1=0x3f;
    for(j=0;j<64;j++)
         {WR_DATA1=menu_pic2[m*128+j];}
    
    WR_CODE2=0xc0;
    WR_CODE2=0x3f;
    for(j=0;j<64;j++)
      {WR_DATA2=menu_pic2[m*128+j];}     
}}

//显示程序
void DISPLAY(void)
{
unsigned int left,right,t;
unsigned int dis_buf,zh_flag,fb_flag=0;
unsigned int i,j,m,n,k,x,y;
WDR();
for(i=0;i<=65;i++)
{
  if(TEMP[i][0]==0xff)break;
  else
  {
   if(TEMP[i][1]&0x10)
   {
    fb_flag=1;
    TEMP[i][1]-=0x10;
   }
   if(TEMP[i][1]==1)zh_flag=1;
   else zh_flag=0;
   m=16;//TEMP[i][0];
   n=TEMP[i][2];
   x=m/0x10*2+0xb8;
   if((TEMP[i][1]==0)&&(m%0x10<7)||((TEMP[i][1]==1)&&((TEMP[i][1]%0x10)<4)))
   {left=1;right=0;}
   else
   {left=0;right=1;}
   if(zh_flag)
   {
    y=(((m%0x10)%4)*16)+0x40;
    if(fb_flag)
    {
     if(left)
     {WR_CODE1=0xc0;
     WR_CODE1=0x3f;
     WR_CODE1=x;
     WR_CODE1=y;
     for(j=0;j<32;j++)
     {WR_DATA1=~hanzi[n][j];}}
     else
    &nb

181094:

摘要:随着电路设计向着小型化的方向发展,PSD(Programmable System Devices)器件在各种场合的应用越来越多,已经有很多成型的产品出现;而且随着器件的更新换代,新的PSD器件也不断地涌现,可以满足绝大多数客户的应用需求。本文以最近生产的一种在系统可编程(ISP)器件PSD913F2为例,详细说明如何对它进行开发使用。

关键词:ISP IAP 可编程系统器件

PSD913F2具有128KB的主闪速存储器,32KB的第二闪速存储器和2KB的SRAM,可进行在系统编程ISP(In-System-Programming)和在应用重编程IAP(In-Application re-Programming)。存储器ISP意味着存储器在编程时没有MCU的参与(off line),而存储器IAP意味着存储器在编程时有MCU的参考(on line)。IAP只对存储器的部分进行编程,不对PSD的配置和可编程逻辑部分进行编程;而ISP则可以对存储器的全部进行编程。

利用PSD913F2进行产品开发,应用2片式(PSD+MCU)设计方案,即可以满足通常设计的需要。比较方便地地方就是PSD913F2具有JTAG口,可以实现在系统编程,这样对电路的设计和程序的修改均具有非常大的灵活性。

1 PSD913F2的组成结构

PSD913F2的组成框图如图1所示。

由图1可以看出,PSD913F2具有丰富的I/O资源。其中PC口可以用做专用的JTAG口,在这种情况下,就不能再进行引脚复用。当I/O资源紧张时,用做JTAG口的引脚也可以进行引脚复用。

图1 PSD913F2的顶层框图

2 PSD913F2在一种电台中的应用实例

在某种电台的设计中,我们采用了PSD913F2的2片方案,其MCU用的80C196KB,其部分电路如图2所示。

2.1 PSD913F2的Express中的配置

PSD913F2具有在系统可编程的JATG口,这样对于PSD芯片的重配置和应用程序的修改带来很大的方便。图2电路中,利用PSD913F2作为外部程序存储空间,提供外部电路所需的片选信号及带有锁存功能的I/O输出。

首先,通过PSD的应用软件PSDsoft Express对该2片方案进行选择配置,选定所用的MCU为80C196KB,并选定所需的工作方式等。然后,在Express流程图的DEFINE PSD PIN /NODE FUNCTION(定义PSD的引脚功能)项对PSD913F2芯片进行引脚的功能配置。在这里根据电路所需的特性要求配置如下:

①PA口作为地址锁存输出,输出低8位地址。由于该设计需要的RAM空间较大,PSD本身所带的2KB SRAM不能满足设计的要求,故需在外部扩展一片RAM。这时需要用到锁存的低位地址输出,而PSD913F2的PA口和PB口都具有地址存输出的功能。在地址总线和数据总线复用时,一般选择PA口作为地址锁存输出。

②PC口作为专用的JTAG口,利用其全部的6个信号,可以加快程序下载的速度。

③PB口的配置或用做片选或用做具有锁存功能的I/O输出。其PB0为外部RAM的片选ADRAM;PB1为外部DTMF的片选ADDTMF;PB2为外部DSP芯片的片选HPIEN;PB3为DSP主机口的一个锁存信号HRW8;PB4、PB5为继电器控制信号,也即用做具有锁存作用的I/O MODE输出;PB6、PB7是控制外部模拟开关的信号,也是具有锁存作用的I/O MODE输出。

④其它的控制信号如WR、RD、ALE等按使用手册的说明进行配置。

将以上这些引脚配置完毕后,下一步进行内存映射的分布。根据实际需要,程序空间25K以内,不需要利用分页。在片选信号的地址分配如下:

①rs0:8000H~87FFH.可读写,作为数据空的一部分。

②csiop:1000H~10FFH.这段地址共256字节,用做PSD913F2内部资源的片选,其中1000H为内部资源的基地址。这段地址的分配在整个PSD操作过程中最为重要,一定要注意不能和其它地址发生冲突;尤其对96系列的MCU,数据和程序共享64K空间,而不像51系列那样,数据空间和程序空间各64K。

⑤fs0:100H~3FFFH.由于MAIN Flash中要求每个片选的范围是16K,所以程序空间的划分只能以16K为一段进行划分。同理,可得到fs1的地址范围是4000H~7FFFH.这两段程序空间不能放在一个fs0内,否则仿真就会发现程序每隔16K就会重复。这种空间划分根据不同的PSD型号也会有所不同,如:PSD934的片选范围就是以32K为一段。

④ADRAM:8800H~EFFFH。这是外部扩展RAM的空间,紧跟内部2KB的SRAM地址分配。

⑤ADDTMF:F000H~FBFFH。作为外部DRMF发生器的片选用。

⑥HPIEN:FC00H~FFFFH。HRW8地址也是在这一段。

至此,应用Express配置PSD913F2的工作已经基本上结束了。如果还需要进行IAP,则还需要生成用于IAP的C程序,经过修改后再嵌入式到自己的应用程序中。本例不需要进行IAP,在不需要加载程序时,可以越过MERGE MCU/DSP FIRMWARE WITH PSD(嵌入MCU或DSP主程序)选项,直接进行最后一步,通过ISP利用FlashLink将配置下载到PSD内。

2.2 PSD913F2在应用程序中的初始化

PSD913F2的正常工作,还需要在应用程序的开始对端口的功能寄存器进行初始化操作。通过PSD913F2的使用手册,可以查出各端口寄存器相对于csiop的偏移地址。利用csiop的基础加上偏移地址,就可得到该端口寄存器的地址。根据以上的配置,PSD913F2在应用程序中的初始化程序如下:

;CSIOP在1000H~10FFH

PSDPAIN EQU 1000H ;字节读操作

PSDPAOUT EQU 1004H ;字节写操作

PSDPACNT EQU 1002H ;地址输出

PSDPADIR EQU 1006H ;输出模式

PSDPADRV EQU 1008H ;CMOS模式

PSDPBIN EQU 1001H ;字节读

PSDPBOUT EQU 1005H ;字节写

PSDPBDRV EQU 1009H ;字节

PSDPBDIR EQU 1007H ;字节

LD CX,#PSDPADIR

LDB AL,#0FFH ;输出模式

STB AL,[CX]

LD CX,#PSDPACNT

LDB AL,#0FFH

STB AL,[CX] ;地址输出

LD CX,#PSDPBDIR

;OUTPUT MODE(PB4,PB5,PB6,PB7)

LDB AL,#0F0H

STB AL,[CX]

LD CX,#PSDPBDRV ;开漏

STB AL,[CX]

LD CX,#PSDRBCNT

LDB AL,#0

STB AL,[CX] ;I/O模式

3 PSD913F2使用中应注意的问题

在上面的配置中可以发现有两个片选的配置地址重叠,那显了所需信号时序的要求所设。外部DSP所要求的读写时序如图3所示。

由时序图可以看出,数据的读写操作在HRW8的上程式沿有效,其中HPIEN为片选使能端。HPIEN的产生可以由上面引脚定义中的地址设定,不用附加任何逻辑,这样就可以产生一较宽的低脉冲;而HRW8的上升沿也设为片选引脚,它的地址就可以和HPIEN的地址范围相重叠,然后附加上读写信号的逻辑,可以产生一较窄的低脉冲,类似于读写信号,这样利用其上升沿就可以达到手册所提出的时序要求。经实践检验这种方法是完全正确的,另外,在使用PSD913F2时,还需要注意的一些问题如下:

①JTAG口要利用其全部的6个信号,这样编程下载时可以加快下载速度。供给JTAG口的电源和地之间要加一0.01μF的电容,且6个信号线和电源需用10KΩ的电阻进行上拉。

②用做具有锁存作用的I/O口,在外部要用10kΩ的电阻进行上拉,在应用程序中把这些端口初始化为开漏输出。这样才能正确利用其锁存作用,否则只能产生很窄的脉冲,脉宽很窄而使引脚失去锁存功能。

③MCU和PSD913F2的复位要分开,复位的先后顺序应该是PSDF在先,MCU在后,才能保证PSD正常工作。两个复位在一起时,当复位的速度设计得比较低时可能反应不出来。如果MCU的复位较快,就会出现问题。在本例中,MCU的复位和PSD的复位分开操作。

④用仿真器对PSD的配置功能进行仿真时,一定要注意将csiop段地址放在用户板上,否则PSD器件不会工作。另外,利用仿真器不能仿真PSD的地址锁存作用。遇到这种情况,在仿真时,需要地址锁存的那段地址可放在系统板内。在最后下载应用程序时,利用MCU的操作,PSD的地址锁存功能就可以起作用。

4 总结

随着PSD器件的发展,它的内部Flash和SRAM越来越大,I/O口资源越来越丰富,速度也越来越快,完成可以满足常用MCU的DSP的开发应用,其ISP和IAP功能也在很大程序上方便了使用者。在电路设计小型化和产品的维护方面,具有非常大的优势,在以后的应用中一定会越来越广。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值