//****************************************
#define CLK_PM50 PORTAbits.RA3
#define DATA_PM50 PORTAbits.RA4
#define O1_PM50 PORTAbits.RA2
//*****************************************
/*****************************************
** 函数名: PM50_READ
** 输 入:data voise
** 输 出:
** 功能描述:
** 全局变量:无
** 调用模块:无
** 作 者:qingdao_mcu
** 日 期:13:13 2009-5-25
** 版本 1.0
******************************************/
void PM50_READ(unsigned char data)
{
unsigned char i,j,count;
i = (data-1) | 0x80; //语音段的地址为80~ffh; 第一段的地址是80h。
count = 8;
CLK_PM50 = 1;
//-----------------------
DATA_PM50 = 0;
DelayInt5ms ();
DelayInt5ms ();
ClrWdt();
DelayInt5ms ();
DelayInt5ms (); // >40MS
DATA_PM50 = 1;
Delay10TCYx(1000); // >10US
do{
CLK_PM50 = 0;
j = i&(0x01); //地址数据由低到高位,依次发送
if (j==0)
DATA_PM50 = 0;
else
DATA_PM50 = 1;
ClrWdt();
CLK_PM50 = 1;
Delay10TCYx(50);
i = i >> 1;
count --;
}while(count != 0);
DATA_PM50 = 1;
CLK_PM50 = 1;
Delay10TCYx(10);
while(O1_PM50 == 1)
{ClrWdt();
}
DelayInt5ms ();
DelayInt5ms ();
ClrWdt();
Nop();
}
这个程序在运行时间会吃音。困扰我2天了。用示波器测试O1脚,如果能正常发音,则会输出一个长长的1,如果不发音,只是会出现一个很短的高脉冲。
开始以为吃音是我mcu的速度快,demo程序中是51mcu,我用16MHZ的。后延时加了很多,且示波器看也没有什么信号迟滞和畸变。
因为我用的是开关电源,按照说明书上的要求,今天到电子市场买了几个47uh的电感,焊接上也不管用。
无意在示波器中观察到一个奇怪的现象,PORTAbits.RA3 上的电平是变化的。本身被置高的,竟在PORTAbits.RA4和 PORTAbits.RA1变化后,自动归0。百思不解。看初始化也没有错。
ADCON1 = 0x0F; //// All of I/Os work as digital I/O.
PORTA = 0;
LATA = 0;
// CMCON = 0X07; // 比较器关
// 2 语音 中 OUT O1
// 3 语音中 clk out
// 4 语音中 dat out
TRISA = 0b11100100; // 语音测试
没办法,把3个io口从RA换到RC。
#define CLK_PM50 PORTCbits.RC2
#define DATA_PM50 PORTCbits.RC1
#define O1_PM50 PORTCbits.RC0
问题解决。
可能的原因:在放音时间段中clk的变化出现的异常。
可是为什么ra3会出现变化,(确定程序没有对它进行操作),还没明白。待续....
文章评论(0条评论)
登录后参与讨论