- 论坛徽章:
- 0
|
我现在在写一个计度器驱动程序,用的是“JD型机电脉冲计度器,规格100脉冲/千瓦.时”,与NEC的uPD78F9222单片机的2个端口直连。我写的几个驱动程序烧写入单片机,上电后计度器要么一次转2小格,要么干脆不转。做了无数次实验就没了现一次走1小格的情况。对着计度器我都欲哭无泪了。那位懂计度器驱动的高手帮忙指点下,到底怎么样的时序才能让计度器走1小格啊
计度器不走的程序如下,用的是NEC的uPD78F9222单片机
#pragma SFR
#pragma DI
#pragma EI
#pragma NOP
#pragma interrupt INTTM000 ISR_275ms //中断入口
unsigned char flag_M=0;
/****************************************************************/
void Init_CPU() //初始化
{
PCC=0;
PPCC=0;
LSRCM = 0x00;
//
PM4.2=0;
PM4.0=0;
PU4.2=0;
PU4.0=0;
//
WDTM = 0x67;
}
/**********************************************************/
void delay(unsigned int n) //delay 10ms
{
unsigned int i;
for(i=0;i<80*n;i++);
}
/****************************************************************/
void Init_275ms() //定时器定时275ms
{
//
P4.2=0;
P4.0=0;
// 定时器初始化
CRC00=0x00;
PRM00=0xA2;
CR000=0x2191;
//定时器中断初始化
TMMK000=1;
TMIF000=0;
TMMK000=0;
}
/******************************************************************/
void ISR_275ms(void) //中断服务程序
{
TMC00=0x00; //关定时器
if(flag_M==1)P4.2=0;
if(flag_M==2){P4.0=0;flag_M=0;}
}
/******************************************************************/
void motor()
{
flag_M++;
TMC00=0x04; //开定时器
if(flag_M==1)P4.2=1;
if(flag_M==2)P4.0=1;
}
/********************************************************************/
void main(void)
{
DI();
Init_CPU();
Init_275ms();
EI();
while(1)
{
motor();
delay(200); //延时约2 S
}
}
用软件模拟,P4.2,P4.0出的脉冲如下,延时约2秒的时间可看做是单片机计数的工作时间
这个程序烧入单片机,计度器里有响动的声音,但就是不转。
另外软件模拟,转2小格P4.2,P4.0出的脉冲的时序图如下,其中144ms高改为275ms,间隔347ms改为367ms也是一样的,一次转2小格。
程序如下:
#pragma SFR
#pragma DI
#pragma EI
#pragma NOP
#pragma interrupt INTTM000 ISR_F1 //CR000中断入口
#pragma interrupt INTTM010 ISR_F2 //CR010中断入口
unsigned char flag_F2=0; //标志
/****************************************************************/
void Init_CPU() //MCU初始华
{
PCC=0;
PPCC=0;
LSRCM = 0x00;
//
PM4.2=0; //输出方式
PM4.0=0;
PU4.2=0; //不接上拉电阻
PU4.0=0;
//
WDTM = 0x67;
}
/******************************************************************/
void delay(unsigned int n)// 延时10ms
{
unsigned int i;
for(i=0;i<80*n;i++);
}
/****************************************************************/
void Init_round()
{
//
P4.2=0;
P4.0=0;
//
CRC00=0x00;
PRM00=0xA2;
CR000=0x1194; //定时器CR000寄存器初值144ms
CR010=0x2A5B; //定时器CR010寄存器初值347ms
//
TMMK000=1; //中断屏蔽
TMMK010=1;
TMIF000=0; //清中断标志
TMIF010=0;
TMMK000=0; //中断屏蔽开
TMMK010=0;
//
}
/******************************************************************/
void ISR_F1(void) //CR000中断服务
{
P4.2=0;
}
void ISR_F2(void) //CR010中断服务
{
flag_F2++;
//
if(flag_F2==1)
{
P4.0=1;
TMMK000=1; //CR000中断屏蔽
TMC00=0x00; //定时器关
CR010=0x1194; // CR010寄存器重赋初值144ms
TMC00=0x04; //定时器开
}
if(flag_F2==2)
{
P4.0=0;
flag_F2=0;
TMMK000=0; // CR000 中断屏蔽开
TMC00=0x00;
CR000=0x1194; //144ms
CR010=0x2A5B; //347ms
}
}
/******************************************************************/
void motor()
{
TMC00=0x04; //定时器开
P4.2=1;
}
/********************************************************************/
void main(void)
{
DI();
Init_CPU();
Init_round();
EI();
while(1)
{
motor();
delay(200); //延时2S
}
} |
|