您当前的位置:五五电子网电子知识电工技术电工文摘基于SOP的简易运动控制芯片方案探讨 正文
基于SOP的简易运动控制芯片方案探讨

基于SOP的简易运动控制芯片方案探讨

点击数:7746 次   录入时间:03-04 11:43:15   整理:http://www.55dianzi.com   电工文摘

回读数据锁存:
CPU要读相应功能的数据,就必须先锁存其数据,才能读;否则,只能读取上次锁存的数据。共有下面三种功能数据:
 脉冲计数器值:32bit;
 通用输入口值:8bit;
 按键编码值:7bit;
CPU读数据是按8 bit字节读方式进行的,32 bit脉冲计数器值需要读4次,可按0~3任意顺序读取。8 bit值只能从地址0读取。格式为:
a、(*锁存地址)=  任意数据;
b、变量=(*读地址);
其中:锁存地址和读地址,可参见地址分配表一。

8/8位通用输入/输出口:
该芯片包含8位通用输入口和8位通用输出口。
8位通用输入口读命令为:
a、(*锁存地址)=  任意数据;
b、变量=(*读地址);
其中:锁存地址=基地址+12;
            读地址    =基地址+0;(所有读地址相同)

8位通用输出口写命令为:
a、(*写地址)=  数据;
其中:写地址=基地址+11;
            写数据为8位字节数据。

8X8键盘接口:
该芯片支持8X8矩阵键盘,自动扫描键盘,识别按键键码,CPU通过接口可读取当前按键编码值。命令如下:
a、(*锁存地址)=  任意数据;
b、变量=(*读地址);
其中:锁存地址=基地址+28;
            读地址    =基地址+0;(所有读地址相同)

按键编码格式:

标志位:为1表示有键正按下,为0表示没有按键;
X:忽略;
回读码:取0~7为当前按键所对应的行(或列)编码,特指输入线(KBC_0~7);
扫描码:取0~7为当前按键所对应的列(或行)编码;特指输出线(KBS_0~7);

七、编程示例
//A、地址常量定义:(设芯片基地址为0xe000)

#define   MC_sys_CLK                                       32000000                                             //定义芯片工作频率

#define   MC_CNT_WR_Base_Addr                 (volatile unsigned char *) 0xe000     //定义计数器值写基地址
#define   MC_CNT_Latch_WR_Base_Addr     (volatile unsigned char *) 0xe00A    //定义计数器锁存写基地址

#define   MC_FRQ_WR_Base_Addr                (volatile unsigned char *) 0xe004     //定义频率值写基地址

#define   MC_Startup_WR_Base_Addr            (volatile unsigned char *) 0xe008     //定义启动写基地址

#define   MC_Stop_WR_Base_Addr                 (volatile unsigned char *) 0xe009     //定义停止写基地址

#define   MC_GPOut_WR_Base_Addr             (volatile unsigned char *) 0xe00B     //定义通用输出值写基地址

#define   MC_GPIn_Latch_WR_Base_Addr    (volatile unsigned char *) 0xe00C     //定义通用输入值锁存写基地址

#define   MC_KB_Latch_WR_Base_Addr       (volatile unsigned char *) 0xe01C     //定义键盘编码值锁存写基地址

#define   MC_ RD_Base_Addr                           (volatile unsigned char *) 0xe000     //定义回读值读基地址

//B、子程序片:

//0、延迟子程序:芯片读/写命令间要求有一定的定时间隔。
void delay(int n)
{     int i;
      for( i = 0; i<n ; i++);
}

//1、写第n通道脉冲数值(必须为奇数)
cnt = Np*2-1;
MC_CNT_WR_Base_Addr[n*16+0] = (char)((cnt>>  0) & 0x0ff);delay(10);
MC_CNT_WR_Base_Addr[n*16+1] = (char)((cnt>>  8) & 0x0ff); delay(10);
MC_CNT_WR_Base_Addr[n*16+2] = (char)((cnt>>16) & 0x0ff); delay(10);
MC_CNT_WR_Base_Addr[n*16+3] = (char)((cnt>>24) & 0x0ff); 

//2、读第n通道脉冲数值
MC_CNT_Latch_WR_Base_Addr [n*16+0] = (char)0; delay(10); //锁存第n通道脉冲数值
Cnt  = MC_ RD_Base_Addr [0]; delay(10);                                       //回读数据0字节
Cnt |= MC_ RD_Base_Addr [1]<<8; delay(10);                                //回读数据1字节
Cnt |= MC_ RD_Base_Addr [2]<<16; delay(10);                              //回读数据2字节
Cnt |= MC_ RD_Base_Addr [3]<<24;                                                //回读数据3字节
if( Cnt ==0xffffffff)
{
    //第n通道脉冲输出完处理
}

//3、写第n通道脉冲频率值
Nfrq= frq_pulse*0x10000000/MC_sys_CLK;  //注意整数运算溢出问题
MC_FRQ_WR_Base_Addr [n*16+0] = (char)((Nfrq>>  0) & 0x0ff); delay(10);
MC_FRQ_WR_Base_Addr [n*16+1] = (char)((Nfrq>>  8) & 0x0ff); delay(10);
MC_FRQ_WR_Base_Addr [n*16+2] = (char)((Nfrq>>16) & 0x0ff); delay(10);
MC_FRQ_WR_Base_Addr [n*16+3] = (char)((Nfrq>>24) & 0x0ff);

//4、启动多个通道脉冲工作
MC_Startup_WR_Base_Addr[0] = (F0 & 1) | ((F1<<1)&2) | ((F2<<2)&4 | ((F3<<3)&8) ;

//5、停止多个通道脉冲工作
MC_Stop_WR_Base_Addr[0] = (F0 & 1) | ((F1<<1)&2) | ((F2<<2)&4 | ((F3<<3)&8) ;

//6、8位通用输出口输出
MC_GPOut_WR_Base_Addr [0] = (char)(GPOut &0x0ff) ;

//7、8位通用输入口输入
MC_GPIn_Latch_WR_Base_Addr [0] = (char)0; delay(10);   //锁存通用输入口值

上一页  [1] [2] [3]  下一页


本文关键字:暂无联系方式电工文摘电工技术 - 电工文摘