[求助]mega48弄得我一头雾水了,救命ing!
我用mega48v-tqfp和nrf401、icl7135做了一个电压采集无线数据通讯的小模块,电源部分是利用2v的电池升压到5v然后分别转换两路电源4.5v给cpu部分,模拟部分,高频部分供电的。
我以前用的是at90s2313做的,现在换成mega48,其他电路没有修改过,包括pcb设计部分也没有做大的改动,我把原来的2313 程序移植到了mega48上,我使用的是外部的3.6864mhz晶体,外部有个复位芯片来给系统复位的。测试的时候我的看门狗没有启用的。因为熔丝位我没有编程。
#define _volt_get 1 //是否使用外部中断采集电压
#define _io_change 0 //是否更改txen,cs的控制io
我的每个模块都有地址,电压采集采用模块递推的方式启动,比如,#1启动#2-6处于等待自己时隙状态,然后#2又启动#3-7,这样递推下去,只要中间不连续断掉5个模块我的启动链是可以启动所有的模块发送数据到我的无线服务器的。每个模块固定的响应时间为100ms超过了则自动进入下一个模块了。
1.我把熔丝设置为ckdiv8=1 sut[1..0]="11" cksel[3..0]="1101"其他的我采用默认值。
2.
我先用了测试定时器的程序来测试时钟设置,5ms用t0定时,用示波器观测是正确的。
3.然后我测试了异步串口通讯,用有线的方式通过pc串口调试器来观测发现数据是正确,响应的数据也是正常的。
4.接着我把弄了个nrf401的测试程序,每1s发送一帧数据,然后我在旁边用我以前自己制作无线监听头配合我做的一个监听软件来观察数据,正确的,然后把我手工焊接的8个电路板全部烧录这个程序,都是正常的。
5.接着我做了一个外部中断0的测试程序,因为我的数据采集是通过int0中断产生的。采集的数据通过有线的方式把数据传到调试器,我对比协议格式,看到我的采集数据是可以跟我加的电压一致的,我调整采集源电压,对应的ad数据在变化,计算出来跟实际值是一致的,这就说明我的外部中断0启用了,而且服务程序也是正确的。
6.最后我开始把所有的模块集成起来,把所有的功能都实现,测试时间是在11.4上午,我把完整的程序编译后烧写到mega48中,用无线监听头配合后台测试软件发命令跟模块通讯,可以采集到模块的电压放大系数,序列号,和电压ad量,但是电压ad量居然为0,其他都正常,地址修改也正常。就只有ad不正常,我怀疑是int0没有被正常启动,但是我对比了我的int0测试程序和我集成后的程序是一样的,然后我把这个hex烧写到另外一个扳子上,不过不是通过nrf401发数据,是通过有线的方式,
发现程序居然没有响应我的后台命令,由于我开机会发送数据出来,这时是可以看到开机发送的数据,但是后台发命令不可以响应了。同样的一个hex用无线的方式可以响应,用有线就不可以了。nrf401也是通过txd,rxd跟串口连接的,都是串口,却不能响应了。
请教:
大虾们,对于这个现象,您可以帮我分析下是我的程序的原因?还是我的硬件有问题导致不稳定呢?
7.而且之前我发现我的控制nrf401模式的txen,cs引脚会开机后过段时间无故的失控,好象是有点象复位的感觉,因为我开机发送数据1帧,先把nrf401设置到发送模式txen=1,(cs=0是固定的频道选择是初始化时就设置好的以后不变化的);但是我发现有时候开机就发现 txen和cs居然成25ms的周期脉冲波形,高15ms,低10ms。有时候开机是正常的,只要我从串口发数据下去就出现那个波形,出现这个波形的时候,从调试器可以看到不断有开机测试帧的前20个字节的数据上来,之后的10个字节就是错误的。 但是有时候我开机又是正常的,而且响应也是正常的。异常现象出现在断电后迅速插上电,而且一旦出现这个现象后,即使断电重新开始仍然是那个现象。重新烧录程序后也是那样。
对于这个现象看起来好象是在复位,我的初步判断是这样的。但是我用示波器观测我的reset引脚没有发现任何复位信号。因为它是开机还会正常发送数据,只是响应了数据后就会出现这个问题。但是我的com0中断服务程序是专门测试过正常的啊。
请教:
大虾们,,您说我这个现象又是什么原因呢?可以帮我分析下吗?好象这个现象把我之前测试通过的模块程序给推翻了。
8.但是在11.4上午的测试中,是同一个电路板,同一个测试程序,发现有可以了,效果跟11.3不同了,没有出现txen和cs周期性脉冲的现象了。 现象跟 《第6条》的一样。但是到了下午,我怀疑是pd4,pd3的第二功能影响了我的txen,cs的控制,所以把这个两个控制信号换到pd6,pd7,就只改了#define 宏,名称都没有变化,烧写进去,居然连通讯都不正常了,我可以看到发送指示灯在收到一个命令后有数据响应出来,因为它在闪烁,有数据发送它会闪烁一次。但是无线舰艇后台收不到,我怀疑是我的监听有问题,用一个狂发数据带地址16号的模块来测试,后台可以正常正确的收到数据。
说明它没有出问题。
然后我用这个16号狂发来启动我的这个ad模块(地址18号),发现在后台也可以收到他们的响应数据,16号在前面,紧跟着的是18号。但是电压数据还是0.
因此我无法判断是哪里有问题了。因此我外部中断给禁止了,把ad缓冲自己填了个常数进去,然后想来测试下,发现这时居然程序根本就不响应了,连开机都不发送了,再重新烧程序,开机可以发送,但是不能响应了。把同样的hex烧写到有线通讯的那个板子上也不行了。我把串口测试的那个程序烧到有线通讯的那个板子上响应是正常。
请教:
大虾们,您说这些不稳定是什么原因造成的呢?可以帮我分析下吗?
我现在被它弄的一头雾水了,我已经没有清晰的思路去判断是软件还是硬件出问题了。
特意来请教大虾们,您帮我分析下,可以吗?
希望您可以在有空的时候帮我分析下,给我个回复,好吗?
附录:
我的初始化程序:
//****************************************
//函数功能:进行定时器,串口等初始化操作
//入口函数:无
//出口参数:无
//***************************************
void system_ini(void)
{
uchar m;
#if _debug <1
uchar n,crc_data1,err;
eeprom_struct struct_back,good_eep;
#endif
float2char f_zoom;
/*============================*/
//timsk|=0x80; //开启t1 2313使用
timsk1|=0x01; //开启t1 mega48使用
//ucr|=0x80; //接收结束中断使能 2313使用
ucsr0b|=0x80; //接收结束中断使能 mega48使用 启用uart
#if _baud_9600> 0 //这样做的好处是节约代码空间
//ubrr=23;
ubrr0=23
#else
//ubrr=15; //95--2400 23--9600 15--14400 11--19200
ubrr0=11;
#endif
tccr1a=0x00; //这里2313和mega48一致 t1采用定时方式
tccr0a=0x00; //mega48专用
//mcucr=0x02; //中断0下降沿触发? 2313使用
//gimsk=0x40; //外中断0使能 2313
#if _volt_get <1
data1[0]=0x00;
data1[1]=0x00;
data1[2]=0x88;
data1[3]=0x43;
#else
eicra|=0x02; //中断0下降沿触发?mega48使用
eimsk|=0x01; //外部中断0 请求使能
#endif
/*============================*/
pb_direct_define;
pb_data_define;
pc_direct_define;
pc_data_define;
pd_direct_define;
pd_data_define;
set_cs_l();
receive_mode();
/*============================*/
end_t0();
end_t1();
/*============================*/
f_zoom.f_data=default_zoom;
#if _debug <1
err=0;
for(m=0;m <=120;m+=40)
{
struct_back=copy_eeprom(m);
crc_data1=calcrc(struct_back.e_u.eep_data,8);
if(crc_data1)
err++;
else
{
good_eep=copy_eeprom(m);
system_site=good_eep.e_u.eeprom.e_addr;
for(n=0;n <4;n++)
system_zoom[n]=good_eep.e_u.eeprom.a[n];
}
}
if(err)
{
if(err==4)
{
system_site=wirless_address;
for(m=0; m <4; m++)
system_zoom[m]=f_zoom.c_data[m];
}
else
write_eeprom(good_eep);
}
#else
system_site=wirless_address;
for(m=0; m <4; m++)
system_zoom[m]=f_zoom.c_data[m];
#endif
/*============================*/
//wdtcr=0x0b; //watch dog is 120ms 2313
//wdtcsr=0x0b; //125ms mega48
/*============================*/
/*============================*/
header_length=0;
head_ok=0;
now_send_volt=0;
data_length=0;
system_unlock=0;
send_data_ok=0;
receive_ok=0;
/*============================*/
receive_enable();
trasmit_enable();
/*============================*/
__enable_interrupt();
/*============================*/
}
谢谢!
email:songyifang@china-gold.com
qq:346678927
msn:housevian@hotmail.com
发表时间:2005年11月5日11:38:14