打印
[PIC®/AVR®/dsPIC®产品]

调用读写程序没有实现功能

[复制链接]
1996|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuxh|  楼主 | 2021-11-5 21:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pzsh 于 2021-11-8 16:57 编辑

使用PIC12F1571作为项目的主控MCU,现需要**功能保存按键档位状态。
我使用了MCC已生成memory的文件,但实际调用读写程序没有实现功能

使用特权

评论回复
沙发
supernan| | 2021-11-5 21:41 | 只看该作者
使用上有问题

使用特权

评论回复
板凳
zhenykun| | 2021-11-5 21:43 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
地板
chuxh|  楼主 | 2021-11-5 21:45 | 只看该作者
#define Addr 0X0010                 //memory地址
#define savevalue  0X00AA           //memory测试数据
unsigned int keysaveaddr;                   //存储地址定义
unsigned int Buf[ERASE_FLASH_BLOCKSIZE];    //定义指向擦除flash块大小的指针
unsigned int Writedata;                     //写入数据
unsigned int readword;                      //读取数据

void Lowlight()
{
    Highflag = 0;
    Lowflag = 1;
    if(keyvalue == 1)                   //低亮档a
    {                                   //输出1:5% 其他:0
        light_timer = 0;                //5%使用PWM产生,20ms
        PWM_EN = 1;
        PWMduty = Lowlight1;
        output2_SetLow();
        output3_SetLow();
        output4_SetLow();
        //memory        数据存储
        Writedata = savevalue;
        keysaveaddr = Addr;
        FLASH_EraseBlock(keysaveaddr);                               //memory 擦除
        delay(10);
        FLASH_WriteWord(keysaveaddr, Buf, Writedata);         //memory   写数据
        delay(10);
    }
    else if(keyvalue == 2)                   //低亮档b
    {                                   //输出2:100% 其他:0
        output2_SetHigh();
        PWM_EN = 0;
        light_timer = 0;
        output1_SetLow();
        output3_SetLow();
        output4_SetLow();  
    }
    else if(keyvalue == 3)                   //低亮档c
    {                                   //输出3:100% 其他:0
        output3_SetHigh();
        output1_SetLow();
        output2_SetLow();
        output4_SetLow();
    }
    else if(keyvalue == 4)                   //低亮档d
    {                                   //输出4:100% 其他:0
        output4_SetHigh();
        output1_SetLow();
        output2_SetLow();
        output3_SetLow();
    }
    if(keyvalue == 5)                   //低亮档e
    {                                   //输出1:爆闪8Hz(占空80%) 其他0
        light_timer = 0;                //100ms输出high,25ms输出low
        //Pwm_timer = 0;                //
        //T0125ms = 0;
        //PWM_EN = 1;
        //PWMduty = Lowlight5;
        // PWM8Hz = 1;
        P8Hz_EN = 1;
        output2_SetLow();
        output3_SetLow();
        output4_SetLow();
        
    }
}

void main(void)
{
    // initialize the device
   
    SYSTEM_Initialize();
    keyvalue = 1;
   
    keysaveaddr == Addr;
    readword = FLASH_ReadWord(keysaveaddr);        //memory  读
    if(readword == savevalue)
    {
        output2_SetHigh();
        output1_SetLow();
        output3_SetLow();
        output4_SetLow();
    }
    else
    {
        Highlight();
    }

使用特权

评论回复
5
dengdc| | 2021-11-5 21:46 | 只看该作者
HEF是程序区的最后128个地址的低字节。你设定#define Addr 0X0010, 这是自杀式的代码啊,把自己写的程序都擦了

使用特权

评论回复
6
dingy| | 2021-11-5 21:49 | 只看该作者
针对1571来说,地址应该是0380h-03FFh

使用特权

评论回复
7
huangchui| | 2021-11-5 21:51 | 只看该作者
应该用Flash编程吧?

使用特权

评论回复
8
songqian17| | 2021-11-5 21:54 | 只看该作者

使用特权

评论回复
9
heweibig| | 2021-11-5 21:57 | 只看该作者
操作flash要特别小心

使用特权

评论回复
10
huangchui| | 2021-11-5 22:03 | 只看该作者
要清楚编译器生成的代码占用的空间是什么范围;

使用特权

评论回复
11
wyjie| | 2021-11-5 22:06 | 只看该作者
要清楚, 你自己要放的数据是什么范围;

使用特权

评论回复
12
dingy| | 2021-11-5 22:08 | 只看该作者
上面这2个范围一定不能重合;

使用特权

评论回复
13
dingy| | 2021-11-5 22:11 | 只看该作者
你需要看一下编译器手册(http://www.microchip.com.cn/newc ... 3/5e65e2ef6e8ab.pdf), 4.8.50 --ROM:调整ROM 范围, 这个章节来熟悉一下怎么实现。。

使用特权

评论回复
14
chuxh|  楼主 | 2021-11-5 22:13 | 只看该作者
嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
15
pzsh| | 2021-11-8 16:57 | 只看该作者
对照一下数据手册的memory部分看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

936

主题

11296

帖子

2

粉丝