搜索
bottom↓
回复: 9

使用瑞萨单片机(R8C/L36C)时遇到几个问题,求解答

[复制链接]

出0入0汤圆

发表于 2011-5-10 10:21:38 | 显示全部楼层 |阅读模式
使用瑞萨单片机时遇到几个问题,我写了个流水灯的程序,连接着仿真器时用在线仿真的功能时,能跑起来,但是当拔开仿真器让单片机独立跑程序时,就没有了反应,动都不会动。还有,在我编写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:保留
        */
       
}

出0入0汤圆

 楼主| 发表于 2011-5-10 11:22:28 | 显示全部楼层
自己顶下

出0入0汤圆

 楼主| 发表于 2011-5-10 14:03:30 | 显示全部楼层
没人能解答吗?

出0入0汤圆

 楼主| 发表于 2011-5-10 16:40:49 | 显示全部楼层
再顶下

出0入0汤圆

发表于 2011-5-10 16:57:01 | 显示全部楼层
初始化堆栈指针
设置中断向量

出0入0汤圆

发表于 2011-5-10 17:05:16 | 显示全部楼层
独立跑程序时要使用program flash重新下载程序 的

出0入0汤圆

 楼主| 发表于 2011-5-10 17:12:02 | 显示全部楼层
回复【4楼】bigZ  
-----------------------------------------------------------------------
这些都是在软件自动生成的底层程序那里的吧,但我把自己写的程序一点一点的全替换成范例程序,甚至直接用自己的工程文件打开范例程序,但还是不行啊。
回复【5楼】jerico  
-----------------------------------------------------------------------
我是用program flash重新下载程序,但是烧完程序,拔了仿真线,之后怎么重启都没反应。

出0入0汤圆

发表于 2011-5-10 17:26:19 | 显示全部楼层
/* 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)?

出0入0汤圆

 楼主| 发表于 2011-5-10 17:30:00 | 显示全部楼层
回复【7楼】youthvision  精彩丑男
-----------------------------------------------------------------------
这是为了在看程序是否进入了中断函数。可事实上中断标志一置位,PC指针就跳到0XFFFFF了。整个单片机就不工作了。根本进不了中断程序。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 20:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表