Board logo

标题: 模拟串口通信出错,大家帮忙看看是怎么回事呢? [打印本页]

作者: feifeiyue    时间: 2006-8-25 16:24     标题: 模拟串口通信出错,大家帮忙看看是怎么回事呢?


我用的gz60,模拟串口通信,用查询方式,没有用中断,现在遇到问题就是用time产生每位的时间间隔时计数不溢出,程序走到检验time是否溢出时就走不动了,大家帮忙分析一下问题吧,谢谢了!


作者: strongchen    时间: 2006-8-28 09:37

你的总线频率的定时器频率分别是多少?定时器有没有在走?
作者: guoguoer    时间: 2006-8-28 11:11

总线频率是2M,定时器频率是1M,也就是每1us计数一次,定时器有计数变化但是计到一定数就不动了,而且每次这个数还不一定,我改用中断的方式,还是不能计数溢处,程序采用单片运行,到了中断产生的时候程序就跳出不来了,况且这时coderwarrior调试窗口右下脚的command的窗口总出现
STOPPED
Can't step instuction which branches to itself
这是怎么回事啊?斑主帮忙分析一下吧,谢谢!!
作者: strongchen    时间: 2006-8-28 11:30

把你的程序贴上来看看。最好是把整个project打包贴上来。
作者: guoguoer    时间: 2006-8-31 15:28

*******************************************************/
#include
#include

#define BT_TRD PTB_PTB2
#define BT_RED PTB_PTB3

unsigned char ii;
unsigned char inch;

//////////////////////////////////////////////////
// 定时计数器1初始化
void Timer1_Init(void)
{
T1SC_TSTOP=1; //停止计数器1
T1SC_TRST=1; //复位计数器1,清除计数器的计数值和设定的分频系数
//以上两位同时置1使计数器停在$0000上

T1SC=0x45; //启动计数器,使能溢出中断,32分频总线频率,即每16uS计数1次,晶振8M,总线频率为2M
T1MODH=0x00;
T1MODL=0x07; //波特率为9600,104us传输一位,即每7个计数发生溢出一次
}

////////////////////////////////////////////////
//系统集成模块初始化

void SIM_INIT(void)
{
CONFIG1=0x39; //5V
CONFIG2=0x09;
}

/////////////////////////////////////////////////

void main()
{
EnableInterrupts; /* enable interrupts */

SIM_INIT();

DDRB_DDRB2=1; //PTB2为输出口,为模拟串口发送数据端
DDRB_DDRB3=0; //PTB3为输入口,为模拟串口接受数据端

ii=0;
PTB_PTB2=1; //空闲状态置位高电平
inch=0x55; //发送数据0x55
Timer1_Init();
for(;;);

}

//////////////////////////////////////////////////////////
//中断服务程序
//////////////////////////////////////////////////////////
interrupt void T1_OverFlow_ISR(void)
{
T1SC_TOIE=0; //溢出中断禁止
T1SC_TOF=0; //清处溢出标志位

if(ii==0)
{
BT_TRD=0; //发送起始位0
ii++;
}
else if((ii>0)&&(ii<8))
{
if(inch&0x01) //先发送lsb,判断1还是0
{
BT_TRD=1; //发1
}
else
{
BT_TRD=0; //发0
}
inch=(inch>>1); //发送次低位
ii++;
}
else if(ii==8)
{
BT_TRD=1; //发停止位
ii++;
}
else
{
ii=0; //循环发送0x55
}
T1SC_TOIE=1; //溢出中断使能
}

以上是我的程序,程序采用循环发送0x55,每次计数满发送一位,现在的问题是程序不产生中断,是我中断设置的问题还是计数器的问题呢,斑主给分析一下吧,谢谢!!

作者: guoguoer    时间: 2006-8-31 15:43

#include
#include
上面include的两个,未贴上。
作者: guoguoer    时间: 2006-8-31 16:02

#include
#include
奇怪,怎么总贴不上了,看这次怎样.
作者: guoguoer    时间: 2006-8-31 16:05

怎么回事啊,其中一个include的hidef.h,另一个include的68HC908GZ48.h,这次应该可以了吧.祈祷!
作者: strongchen    时间: 2006-8-31 16:25

可以发到strongchen_free@yahoo.com.cn。
作者: mainie000    时间: 2006-8-31 23:03

呵呵  我现在是用延时的方法模拟串口。。希望你那个整出来哈
作者: yxr20004    时间: 2006-9-1 14:05

把interrupt void T1_OverFlow_ISR(void)
改为interrupt 6 void T1_OverFlow_ISR(void)
就OK
作者: guoguoer    时间: 2006-9-5 16:39

在Prm文件中已经声明了阿,interrupt 6 void T1_OverFlow_ISR(void),这是不是跟你上面提到的一样呢? 谢谢回复!!你说的我还没有具体试,有时间试。
作者: seuafu2005    时间: 2006-9-6 16:03

在prm文件中声明了就不需要在中断函数中标注数字了
作者: guoguoer    时间: 2006-9-11 10:20

中断怎么用呢? 我觉得我的问题可能出在中断上,中断到底怎么用呢?高手指点一下吧。谢谢!!
作者: strongchen    时间: 2006-9-11 10:29

发到strongchen_free@yahoo.com.cn,我帮你看看。
作者: guoguoer    时间: 2006-9-12 09:56

哦 好的啊 我已经发了啊,没有收到吗?我再发一次吧,注意查收,谢谢!!
作者: strongchen    时间: 2006-9-12 11:42

我看了你的project。Timer 1定时溢出的中断号应该是6,但你的程序里写的是7。其实如果不清楚中断号,最好用这样的格式:

VECTOR ADDRESS 0xFFF2 T1_OverFlow_ISR
作者: guoguoer    时间: 2006-9-14 10:40

你的意思是不知道中断号的话,直接调用它的中断地址是吗? 中断地址我在哪能查看呢,中断号和中断地址应该是写在一起的啊,在project中的什么什么的地方呢? 我把中断号改为6试试,看怎样! 谢谢版主的回复!!
作者: seuafu2005    时间: 2006-9-14 10:46

关于中断,基本上有三种写法
在prm文件中可以写
1。VECTOR ADDRESS 0xFFF2 T1_OverFlow_ISR
或者2。VECTOR 6 T1_OverFlow_ISR

在prm文件中声明了以后,中断函数中不要有中断号interrupt void T1_OverFlow_ISR(void)

第三种方式:
在中断函数中写
interrupt 6 void T1_OverFlow_ISR(void)
prm文件中不作任何定义


三种方式不可以同时使用

中断地址可以在你所用芯片的datasheet中查到
作者: guoguoer    时间: 2006-9-17 21:56

哦,谢谢楼上的指点!
作者: fjczd    时间: 2009-2-4 12:09

串口也能模拟吗??






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0