使用瑞萨单片机(R8C/L36C)时遇到几个问题,求解答
使用瑞萨单片机时遇到几个问题,我写了个流水灯的程序,连接着仿真器时用在线仿真的功能时,能跑起来,但是当拔开仿真器让单片机独立跑程序时,就没有了反应,动都不会动。还有,在我编写TIMERA定时中断时,发现当单片机一触发中断时,PC指针就跳到0XFFFFF。一直无法解决。PS:这些应该都是软件的问题。因为我烧官方给的范例程序进我块板时都没有上述的问题。但程序我已经看了很多遍,一直都没有发现问题在那。我只是个在校的大学生之前用过51和AVR,但从没遇过这样的问题。这是我写的程序:
#include "sfr_r8l36c.h"
#include "BETA01.h"
void main(void);
void delay_ms(unsigned int ms);
void delay_us(unsigned int us);
void init_port(void);
void init_timera(void);
void init_clock(void);
/* timer RA (software int 22) */
#pragma interrupt timer_ra(vect=22)
void timer_ra(void);
void timer_ra (void)
{
/* Toggle LED */
ir_traic = 0;
//p4_2 = !p4_2;
p4_3=0;
while (1);
/* Clear interrupt flag */
}
void delay_ms(unsigned int ms) //8M
{
int delay_i;
while(ms--)
{
delay_i=320;
while (delay_i--);
}
}
void delay_us(unsigned int us) //8M
{
while(us--);
}
void main(void)
{
DISABLE_IRQ;
init_clock();
init_port(); //初始化I/O口
init_timera();;
ENABLE_IRQ; //开总中断
delay_us(1);
// ir_traic=1;
while(1)
{
p4_2=1; //
delay_ms(500);
p4_2=0; //
delay_ms(500);
}
}
void init_clock(void)
{
unsigned char osc_stab = 128;
prcr=0b00001011;
/*
b0:保护 CM0、CM1、CM3、OCD、FRA0、FRA1、FRA2、FRA3 寄存器。 0:禁止写 1:允许写
b1:保护位1 允许写 PM0、PM1 寄存器。 0:禁止写 1:允许写
b2:0
b3:保护位3 允许写 OCVREFCR、 VCA2、VD1LS、VW0C、VW1C、VW2C 寄存器。
0:禁止写 1:允许写
b7,b6,b5,b4:0
*/
cm3=0b00000000;
/*
b0:等待控制位 0:不是等待模式 1:转移到等待模式
b4,b3,b2,b1:0
b5:从等待模式返回时的CPU 时钟分频比选择位 0:CM0 寄存器的 CM06 位、CM1 寄存器的CM16位和 CM17 位的设定有效。
1:无分频
b7,b6:从等待模式或者停止模式返回时的系统时钟选择位
0 0:通过转移到等待模式或者停止模式转移前的CPU 时钟进行返回
0 1:不能设定
1 0:选择高速内部振荡器时钟
1 1:选择 XIN 时钟
*/
cm1=0b00101000;
/*
b0:全部时钟停止的控制位 0:时钟振荡 1:全部时钟停止振荡(停止模式)
b1:XIN-XOUT 内部反馈电阻的选择位 0:内部反馈电阻有效 1:内部反馈电阻无效
b2:XCIN-XCOUT内部反馈电阻的选择位 0:内部反馈电阻有效 1:内部反馈电阻无效
b3:端口和XIN-XOUT的转换位 0:输入 /输出端口P12_0 和 P12_1 1:XIN-XOUT 引脚
b4:低速内部振荡器的振荡停止位 0:低速内部振荡器振荡 1:低速内部振荡器停止振荡
b5:1
b7,b6:CPU时钟分频比的选择位 1 0 0:无分频模式 0 1:2 分频模式
1 0:4 分频模式 1 1:16 分频模式
*/
cm0=0b00000000;
/*
b0:0
b2,b1:等待模式中的外围功能时钟停止位 0 0:在等待模式中,不停止外围功能时钟。
0 1:在等待模式中,停止f1 ~f32 的时钟。
1 0:在等待模式中,停止f1 ~f32 和fC 的时钟。
1 1:在等待模式中,停止f1 ~f32、 fC 和 fC-LCD的时钟。
b3:XCIN时钟停止位 0:振荡 1:停止
b4:XCIN外部时钟的输入允许位 0:禁止外部时钟的输入 1:允许外部时钟的输入
b5:XIN时钟(XIN-XOUT)停止位 0:振荡 1:停止
b6:CPU时钟分频的比选择位 0 0:CM1 寄存器的 CM16 位和CM17 位有效 1:8 分频模式
b7:系统时钟的选择位 (注5) 0:XIN 时钟或者内部振荡器时钟 1:XCIN时钟
*/
cm1=0b00101000;
/*
b0:全部时钟停止的控制位 0:时钟振荡 1:全部时钟停止振荡(停止模式)
b1:XIN-XOUT 内部反馈电阻的选择位 0:内部反馈电阻有效 1:内部反馈电阻无效
b2:XCIN-XCOUT内部反馈电阻的选择位 0:内部反馈电阻有效 1:内部反馈电阻无效
b3:端口和XIN-XOUT的转换位 0:输入 /输出端口P12_0 和 P12_1 1:XIN-XOUT 引脚
b4:低速内部振荡器的振荡停止位 0:低速内部振荡器振荡 1:低速内部振荡器停止振荡
b5:1
b7,b6:CPU时钟分频比的选择位 1 0 0:无分频模式 0 1:2 分频模式
1 0:4 分频模式 1 1:16 分频模式
*/
/*
while (osc_stab)
{
osc_stab--;
}
*/
ocd=0b00000000;
/*
b0:振荡停止检测有效位 0:振荡停止检测功能无效 1:振荡停止检测功能有效
b1:振荡停止检测的中断允许位 0:禁止 1:允许
b2:内部振荡器的时钟选择位 0:选择 XIN时钟 1:选择内部振荡器时钟
b3:时钟监视位 0:XIN 时钟振荡 1:XIN 时钟停止振荡
*/
//fra0=0b00000011;
/*
b0:高速内部振荡器允许位 0:高速内部振荡器停止振荡 1:高速内部振荡器振荡
b1:高速内部振荡器选择位 0:选择低速内部振荡器 1:选择高速内部振荡器
b2:0
b3:fOCO128时钟选择位 0:选择 fOCO-S的128 分频 1:选择 fOCO-F的128 分频
b4,b5,b6,b7:0
*/
//fra2=0b00000000;
/*
b2,b1,b0:选择高速内部振荡器的时钟分频比。 0 0 0:2 分频模式 0 0 1:3 分频模式
0 1 0:4 分频模式 0 1 1:5 分频模式
1 0 0:6 分频模式 1 0 1:7 分频模式
1 1 0:8 分频模式 1 1 1:9 分频模式
b3,b4,b5,b6,b7:0
*/
prcr=0b00000000;
/*
b0:保护 CM0、CM1、CM3、OCD、FRA0、FRA1、FRA2、FRA3 寄存器。 0:禁止写 1:允许写
b1:保护位1 允许写 PM0、PM1 寄存器。 0:禁止写 1:允许写
b2:0
b3:保护位3 允许写 OCVREFCR、 VCA2、VD1LS、VW0C、VW1C、VW2C 寄存器。
0:禁止写 1:允许写
b7,b6,b5,b4:0
*/
}
void init_timera(void)
{
tracr=0b00000000;
/*
b0:定时器RA 的计数开始位 0:停止计数 1:开始计数
b1:定时器RA的计数状态标志(只读) 0:停止计数 1:正在计数
b2:定时器RA 的计数强制停止位 如果置“1”,就强制停止计数。读取值为“0”。
b3:保留
b4:有效边沿的判断标志 0:无有效边沿 1:有有效边沿(测量期间结束)
b5:定时器RA的下溢标志 0:无下溢 1:有下溢
b6,b7:保留
*/
tramr=0b00010000;
/*
b2,b1,b0:定时器RA 的运行模式选择位 0 0 0:定时器模式 0 0 1:脉冲输出模式
0 1 0:事件计数器模式 0 1 1:脉宽测量模式
1 0 0:脉冲周期测量模式 1 0 1:不能设定
1 1 0:不能设定 1 1 1:不能设定
b3:0
b6,b5,b4:定时器RA 的计数源选择位 0 0 0:f1 0 0 1:f8
0 1 0:fOCO 0 1 1:f2
1 0 0:fC32 1 0 1:不能设定
1 1 0:fC 1 1 1:不能设定
b7:定时器RA 的计数源截止位 0:提供计数源 1:截止计数源
*/
trasr=0b00000000;
/*
b1,b0:TRAIO引脚选择位 0 0:不使用TRAIO引脚 0 1:分配到P11_4 (注1)
1 0:分配到INT4 (注 2) 1 1:不能设定
*/
trapre=255; //预分频计数器
tra=255; //TA计数器 分频比=1/(n+1)(m+1) n:TRAPRE 寄存器的设定值 m:TRA寄存器的设定值
//现在是10MS中断一次
traic=0b00000111; //中断优先级为5
/*
b2,b1,b0:中断优先级选择位 0 0 0:0 (禁止中断) 0 0 1:1
0 1 0:2 0 1 1:3
1 0 0:4 1 0 1:5
1 1 0:6 1 1 1:7
b3:中断请求位 0:无中断请求 1:有中断请求
b7,b6,b5,b4:0
*/
traioc=0x00; //在定时器模式中,必须置“0”。
tracr=0b00000001;
/*
b0:定时器RA 的计数开始位 0:停止计数 1:开始计数
b1:定时器RA的计数状态标志(只读) 0:停止计数 1:正在计数
b2:定时器RA 的计数强制停止位 如果置“1”,就强制停止计数。读取值为“0”。
b3:保留
b4:有效边沿的判断标志 0:无有效边沿 1:有有效边沿(测量期间结束)
b5:定时器RA的下溢标志 0:无下溢 1:有下溢
b6,b7:保留
*/
} 自己顶下 没人能解答吗? 再顶下 初始化堆栈指针
设置中断向量 独立跑程序时要使用program flash重新下载程序 的 回复【4楼】bigZ
-----------------------------------------------------------------------
这些都是在软件自动生成的底层程序那里的吧,但我把自己写的程序一点一点的全替换成范例程序,甚至直接用自己的工程文件打开范例程序,但还是不行啊。
回复【5楼】jerico
-----------------------------------------------------------------------
我是用program flash重新下载程序,但是烧完程序,拔了仿真线,之后怎么重启都没反应。 /* timer RA (software int 22) */
#pragma interrupt timer_ra(vect=22)
void timer_ra(void);
void timer_ra (void)
{
/* Toggle LED */
ir_traic = 0;
//p4_2 = !p4_2;
p4_3=0;
while (1);
/* Clear interrupt flag */
}
中断里用while(1)? 回复【7楼】youthvision精彩丑男
-----------------------------------------------------------------------
这是为了在看程序是否进入了中断函数。可事实上中断标志一置位,PC指针就跳到0XFFFFF了。整个单片机就不工作了。根本进不了中断程序。
页:
[1]