打印

在我的**中

[复制链接]
楼主: 程序匠人
手机看帖
扫描二维码
随时随地手机跟帖
21
程序匠人|  楼主 | 2008-7-1 18:07 | 只看该作者 回帖奖励 |倒序浏览

回13楼lanyong 报错如下

Error[450]   : psect "lanyong0" was never defined

使用特权

评论回复
22
lanyong| | 2008-7-1 18:15 | 只看该作者

啊,我picc18可以的啊.

要在linker里面把 -L-planyong0=400h -L-planyong1=500h 弄进去.

使用特权

评论回复
23
lanyong| | 2008-7-1 18:16 | 只看该作者

哪里有picc下啊.

我两年前用过.

使用特权

评论回复
24
hotpower| | 2008-7-1 18:20 | 只看该作者

www.pic16.com

使用特权

评论回复
25
程序匠人|  楼主 | 2008-7-1 18:24 | 只看该作者

回22楼,弄了,不行

Error[450]   : psect "lanyong0" was never defined 

使用特权

评论回复
26
lanyong| | 2008-7-1 18:30 | 只看该作者

picc18 8.35可以的.

picc的,好象真不行.

搞不懂哈.

使用特权

评论回复
27
lanyong| | 2008-7-1 18:56 | 只看该作者

晕,不知道是啥玩意,可以了

picc8.05

#include <pic.h>

/*
linker: 
-L-ptext0=400h -L-ptext1=500h 

*/

#pragma psect text=text0 
void test(void){} 

#pragma psect text=text1
void test1(void){} 

void main(void) 

test(); 
test1(); 

 

使用特权

评论回复
28
程序匠人|  楼主 | 2008-7-1 21:07 | 只看该作者

怎么一会儿行一会儿不行?

使用特权

评论回复
29
yewuyi| | 2008-7-2 09:10 | 只看该作者

呵呵,我在PICC8.05下也没有编译通过

使用特权

评论回复
30
cheungman| | 2008-7-2 10:38 | 只看该作者

re

MPLAB IDE v8.02 + PICC18 v8.5

编译通过.

#include <pic18.h>

/*
linker: 
-L-planyong0=50h -L-planyong1=100h -L-planyong2=150h
*/

#pragma psect text=lanyong%%u 
void test(void)
{
    unsigned char i;
    i = 0xaa;    


#pragma psect text1=lanyong%%u 
void test1(void)
{
    unsigned char i;
    i = 0x55;


#pragma psect main=lanyong%%u
void main(void) 

    while(1)
    {
        test(); 
        test1(); 
    }
}

编译结果如下:
Program ROM   $000000 - $000003  $000004 (       4) bytes
Program ROM   $000018 - $00001B  $000004 (       4) bytes
Program ROM   $000050 - $000055  $000006 (       6) bytes
Program ROM   $000100 - $000105  $000006 (       6) bytes
Program ROM   $000150 - $000159  $00000A (      10) bytes
                                 $00001E (      30) bytes total Program ROM

通过view0->program memory->symbolic可以看到函数是绝对定位在所指定的地址上.

lanyong兄的此心得解决我一个难题,谢了.

昨天写了一个Flash写函数,可以对某一个指定地址上写一个指定数据,不是页写.
匠人要不?我贴出来.

使用特权

评论回复
31
yewuyi| | 2008-7-2 11:16 | 只看该作者

呵呵,如果MCU本身不支持单字节写,那么

对某一个指定地址上写一个指定数据就是假货……


使用特权

评论回复
32
程序匠人|  楼主 | 2008-7-2 12:29 | 只看该作者

cheungman请拿出来让俺学习学习

是先读后写吗?

使用特权

评论回复
33
cheungman| | 2008-7-2 13:11 | 只看该作者

re 程序匠人

代码如下:

/**************************************************************************************************
**Company       : 
**Project Name  : 
**Created by    : 
**Created Date  : 
**Version:      : V1.0
**Target        : PIC18F4680
**XTAL          : 4MHZ
**HardWare      : 
**SofeWare      : MPLAB IDE v8.02 + PICC18 v8.35 
**Function      : Flash读写函数
**Notice        : 可使用MPLAB SIM进行仿真,查看运行效果
**************************************************************************************************/

#include <pic18.h>

__CONFIG(1, HSPLL);            //配置HS,4倍频
__CONFIG(2, WDTDIS);        //禁止看门狗
__CONFIG(4, 0x8b);            //Low voltage ISP disabled

#define addr 0x300            //定义要写入的起始地址

//写周期
void  Write_Cycle()
{
    EEPGD = 1;    //EEPGD:闪存程序存储器或数据EEPROM 选择位
                //1 = 访问闪速程序存储器
                //0 = 访问数据EEPROM
    CFGS = 0;    //CFGS:闪存程序存储器/ 数据EEPROM 或配置寄存器选择位
                //1 = 访问配置寄存器
                //0 = 访问闪存程序存储器或数据EEPROM
    WREN = 1;    //WREN:闪存程序/ 数据EEPROM 写使能位
                //1 = 允许闪存程序/ 数据EEPROM 的写周期
                //0 = 禁止闪存程序/ 数据EEPROM 的写周期
    CARRY = 0;
    if(GIE) 
        CARRY = 1;
    GIE = 0;      //关全局中断

    EECON2 = 0X55;
    EECON2 = 0XAA;

    WR = 1;     //1启动读/写周期;0写周期完成
    NOP();
    NOP();
    while(WR);    //等待写周期完成
    WREN = 0;    //0禁止向程序存储器或EEPROM写操作

    if(CARRY) 
        GIE = 1;//IPEN = 1,开全局中断
}

//擦除函数,每次擦除64个字节
void Flash_Erase(unsigned long address)
{
    TBLPTRL = ((address) & 0xFF);
    TBLPTRH = (((address) >> 8) & 0xFF);
    TBLPTRU = (((address) >> 8) >> 8);

    FREE = 1;          //1 在下一次WR写周期时,执行擦除操作;0 只执行写操作
    Write_Cycle();
}

//写函数,每次写入FLASH是1个字节
void Write_Byte(unsigned long address,unsigned char data)
{
    TBLPTRL = ((address) & 0xFF);
    TBLPTRH = (((address) >> 8) & 0xFF);
    TBLPTRU = (((address) >> 8) >> 8);

    TABLAT = data;
      asm(" TBLWT*");

    FREE = 0;          //只执行写操作
    Write_Cycle();
}

//读函数,每次读一个字节
unsigned char Flash_Read(unsigned long address)
{
    TBLPTRL = ((address) & 0xFF);
    TBLPTRH = (((address) >> 8) & 0xFF);
    TBLPTRU = (((address) >> 8) >> 8);

    asm(" TBLRD*");

    return TABLAT;
}

unsigned char ReadFlashBuf[4];    //读取flash中的数据缓冲区

void main(void)
{    
    Flash_Erase(addr);            //从addr地址起,擦除64个字节

    Write_Byte(addr, 0xaa);        //在addr上写入:0xaa
    Write_Byte(addr+1, 0x55);    //在addr+1上写入:0x55

    ReadFlashBuf[0] = Flash_Read(addr);        //读取flash地址addr到addr+3上数据,并存储在ReadFlashBuf[4]上
    ReadFlashBuf[1] = Flash_Read(addr+1);
    ReadFlashBuf[2] = Flash_Read(addr+2);
    ReadFlashBuf[3] = Flash_Read(addr+3);

    while(1)
    {
    }
}

Mplab Sim仿真效果如下:
https://bbs.21ic.com/upfiles/img/20078/200781713276157.jpg




使用特权

评论回复
34
cheungman| | 2008-7-2 13:55 | 只看该作者

re yewuyi

呵呵,datasheet我有认真读过,擦写操作确实是按64个字节的.

我的芯片是PIC18F4680,公司里找的,我公司是代理MicroChip芯片的,应该不是假货.

下载到几个芯片上测试一下,并用串口打印出来,结果跟仿真一样.

我之所以这么做,是因为PIC18F458跟PIC18F4680的写操作函数是不一样的,详细各位请看datasheet.

为解决两者兼容性问题,我才弄出来这么一个写1 byte的函数出来.

也不知道有没有bug,再测试测试吧.









使用特权

评论回复
35
yewuyi| | 2008-7-2 14:42 | 只看该作者

呵呵,我说的假货的意思

是指如果芯片本身不支持单字节写,那么所谓的单字节写肯定还是先读后整体写,不是真正意义上的象EEPROM那样的单字节读写。



LS是哪个代理?!

使用特权

评论回复
36
cheungman| | 2008-7-2 14:47 | 只看该作者

re yewuyi

Burnon

使用特权

评论回复
37
cheungman| | 2008-7-2 14:49 | 只看该作者

yewuyi大哥能否解释一下"所谓的单字节写肯定还是先读后整体

使用特权

评论回复
38
yewuyi| | 2008-7-2 15:51 | 只看该作者

先读出,然后页擦除掉,再页写

在最后一步页写的时候,有人执行所谓的单字节写,俺个人不推荐这种操作方式。


贝能的朋友不大熟悉,请问你们16F690最好能做到什么样的价格?

请发我的EMAIL:xinyuanpic@163.com

使用特权

评论回复
39
cheungman| | 2008-7-2 16:51 | 只看该作者

re yewuyi

已发邮件,请查收.

使用特权

评论回复
40
bob.xue| | 2008-7-8 19:51 | 只看该作者

从头看到尾,俺对flash的理解

1,写操作:只能对内容是FFH的单元进行写操作。
2,要将某单元内容变为FFH,必须将所在单元的整页擦除。

使用特权

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

本版积分规则