在我的**中

[复制链接]
11479|40
 楼主| 程序匠人 发表于 2008-7-1 18:07 | 显示全部楼层

回13楼lanyong 报错如下

Error[450]   : psect "lanyong0" was never defined
lanyong 发表于 2008-7-1 18:15 | 显示全部楼层

啊,我picc18可以的啊.

要在linker里面把 -L-planyong0=400h -L-planyong1=500h 弄进去.
lanyong 发表于 2008-7-1 18:16 | 显示全部楼层

哪里有picc下啊.

我两年前用过.
hotpower 发表于 2008-7-1 18:20 | 显示全部楼层

www.pic16.com

  
 楼主| 程序匠人 发表于 2008-7-1 18:24 | 显示全部楼层

回22楼,弄了,不行

Error[450]&nbsp;&nbsp;&nbsp;:&nbsp;psect&nbsp;&quot;lanyong0&quot;&nbsp;was&nbsp;never&nbsp;defined&nbsp;<br />
lanyong 发表于 2008-7-1 18:30 | 显示全部楼层

picc18 8.35可以的.

picc的,好象真不行.<br /><br />搞不懂哈.
lanyong 发表于 2008-7-1 18:56 | 显示全部楼层

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

picc8.05<br /><br />#include&nbsp;&ltpic.h&gt<br /><br />/*<br />linker:&nbsp;<br />-L-ptext0=400h&nbsp;-L-ptext1=500h&nbsp;<br /><br />*/<br /><br />#pragma&nbsp;psect&nbsp;text=text0&nbsp;<br />void&nbsp;test(void){}&nbsp;<br /><br />#pragma&nbsp;psect&nbsp;text=text1<br />void&nbsp;test1(void){}&nbsp;<br /><br />void&nbsp;main(void)&nbsp;<br />{&nbsp;<br />test();&nbsp;<br />test1();&nbsp;<br />}&nbsp;<br />&nbsp;<br />
 楼主| 程序匠人 发表于 2008-7-1 21:07 | 显示全部楼层

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

  
yewuyi 发表于 2008-7-2 09:10 | 显示全部楼层

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

  
cheungman 发表于 2008-7-2 10:38 | 显示全部楼层

re

MPLAB&nbsp;IDE&nbsp;v8.02&nbsp;+&nbsp;PICC18&nbsp;v8.5<br /><br />编译通过.<br /><br />#include&nbsp;&ltpic18.h&gt<br /><br />/*<br />linker:&nbsp;<br />-L-planyong0=50h&nbsp;-L-planyong1=100h&nbsp;-L-planyong2=150h<br />*/<br /><br />#pragma&nbsp;psect&nbsp;text=lanyong%%u&nbsp;<br />void&nbsp;test(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;0xaa;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br /><br />#pragma&nbsp;psect&nbsp;text1=lanyong%%u&nbsp;<br />void&nbsp;test1(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;0x55;<br />}&nbsp;<br /><br />#pragma&nbsp;psect&nbsp;main=lanyong%%u<br />void&nbsp;main(void)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test1();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />编译结果如下:<br />Program&nbsp;ROM&nbsp;&nbsp;&nbsp;$000000&nbsp;-&nbsp;$000003&nbsp;&nbsp;$000004&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)&nbsp;bytes<br />Program&nbsp;ROM&nbsp;&nbsp;&nbsp;$000018&nbsp;-&nbsp;$00001B&nbsp;&nbsp;$000004&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)&nbsp;bytes<br />Program&nbsp;ROM&nbsp;&nbsp;&nbsp;$000050&nbsp;-&nbsp;$000055&nbsp;&nbsp;$000006&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6)&nbsp;bytes<br />Program&nbsp;ROM&nbsp;&nbsp;&nbsp;$000100&nbsp;-&nbsp;$000105&nbsp;&nbsp;$000006&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6)&nbsp;bytes<br />Program&nbsp;ROM&nbsp;&nbsp;&nbsp;$000150&nbsp;-&nbsp;$000159&nbsp;&nbsp;$00000A&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10)&nbsp;bytes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$00001E&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30)&nbsp;bytes&nbsp;total&nbsp;Program&nbsp;ROM<br /><br />通过view0-&gtprogram&nbsp;memory-&gtsymbolic可以看到函数是绝对定位在所指定的地址上.<br /><br />lanyong兄的此心得解决我一个难题,谢了.<br /><br />昨天写了一个Flash写函数,可以对某一个指定地址上写一个指定数据,不是页写.<br />匠人要不?我贴出来.<br />
yewuyi 发表于 2008-7-2 11:16 | 显示全部楼层

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

对某一个指定地址上写一个指定数据就是假货……<br /><br /><br />
 楼主| 程序匠人 发表于 2008-7-2 12:29 | 显示全部楼层

cheungman请拿出来让俺学习学习

是先读后写吗?
cheungman 发表于 2008-7-2 13:11 | 显示全部楼层

re 程序匠人

代码如下:<br /><br />/**************************************************************************************************<br />**Company&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;<br />**Project&nbsp;Name&nbsp;&nbsp;:&nbsp;<br />**Created&nbsp;by&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;<br />**Created&nbsp;Date&nbsp;&nbsp;:&nbsp;<br />**Version:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;V1.0<br />**Target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;PIC18F4680<br />**XTAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;4MHZ<br />**HardWare&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;<br />**SofeWare&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;MPLAB&nbsp;IDE&nbsp;v8.02&nbsp;+&nbsp;PICC18&nbsp;v8.35&nbsp;<br />**Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Flash读写函数<br />**Notice&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;可使用MPLAB&nbsp;SIM进行仿真,查看运行效果<br />**************************************************************************************************/<br /><br />#include&nbsp;&ltpic18.h&gt<br /><br />__CONFIG(1,&nbsp;HSPLL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//配置HS,4倍频<br />__CONFIG(2,&nbsp;WDTDIS);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//禁止看门狗<br />__CONFIG(4,&nbsp;0x8b);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Low&nbsp;voltage&nbsp;ISP&nbsp;disabled<br /><br />#define&nbsp;addr&nbsp;0x300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义要写入的起始地址<br /><br />//写周期<br />void&nbsp;&nbsp;Write_Cycle()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;EEPGD&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;//EEPGD:闪存程序存储器或数据EEPROM&nbsp;选择位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1&nbsp;=&nbsp;访问闪速程序存储器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0&nbsp;=&nbsp;访问数据EEPROM<br />&nbsp;&nbsp;&nbsp;&nbsp;CFGS&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;//CFGS:闪存程序存储器/&nbsp;数据EEPROM&nbsp;或配置寄存器选择位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1&nbsp;=&nbsp;访问配置寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0&nbsp;=&nbsp;访问闪存程序存储器或数据EEPROM<br />&nbsp;&nbsp;&nbsp;&nbsp;WREN&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;//WREN:闪存程序/&nbsp;数据EEPROM&nbsp;写使能位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1&nbsp;=&nbsp;允许闪存程序/&nbsp;数据EEPROM&nbsp;的写周期<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0&nbsp;=&nbsp;禁止闪存程序/&nbsp;数据EEPROM&nbsp;的写周期<br />&nbsp;&nbsp;&nbsp;&nbsp;CARRY&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(GIE)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CARRY&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;GIE&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关全局中断<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;EECON2&nbsp;=&nbsp;0X55;<br />&nbsp;&nbsp;&nbsp;&nbsp;EECON2&nbsp;=&nbsp;0XAA;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WR&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1启动读/写周期;0写周期完成<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;&nbsp;while(WR);&nbsp;&nbsp;&nbsp;&nbsp;//等待写周期完成<br />&nbsp;&nbsp;&nbsp;&nbsp;WREN&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;//0禁止向程序存储器或EEPROM写操作<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(CARRY)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GIE&nbsp;=&nbsp;1;//IPEN&nbsp;=&nbsp;1,开全局中断<br />}<br /><br />//擦除函数,每次擦除64个字节<br />void&nbsp;Flash_Erase(unsigned&nbsp;long&nbsp;address)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TBLPTRL&nbsp;=&nbsp;((address)&nbsp;&&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;TBLPTRH&nbsp;=&nbsp;(((address)&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;TBLPTRU&nbsp;=&nbsp;(((address)&nbsp;&gt&gt&nbsp;8)&nbsp;&gt&gt&nbsp;8);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;FREE&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1&nbsp;在下一次WR写周期时,执行擦除操作;0&nbsp;只执行写操作<br />&nbsp;&nbsp;&nbsp;&nbsp;Write_Cycle();<br />}<br /><br />//写函数,每次写入FLASH是1个字节<br />void&nbsp;Write_Byte(unsigned&nbsp;long&nbsp;address,unsigned&nbsp;char&nbsp;data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TBLPTRL&nbsp;=&nbsp;((address)&nbsp;&&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;TBLPTRH&nbsp;=&nbsp;(((address)&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;TBLPTRU&nbsp;=&nbsp;(((address)&nbsp;&gt&gt&nbsp;8)&nbsp;&gt&gt&nbsp;8);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TABLAT&nbsp;=&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;        TBLWT*&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;FREE&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//只执行写操作<br />&nbsp;&nbsp;&nbsp;&nbsp;Write_Cycle();<br />}<br /><br />//读函数,每次读一个字节<br />unsigned&nbsp;char&nbsp;Flash_Read(unsigned&nbsp;long&nbsp;address)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TBLPTRL&nbsp;=&nbsp;((address)&nbsp;&&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;TBLPTRH&nbsp;=&nbsp;(((address)&nbsp;&gt&gt&nbsp;8)&nbsp;&&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;TBLPTRU&nbsp;=&nbsp;(((address)&nbsp;&gt&gt&nbsp;8)&nbsp;&gt&gt&nbsp;8);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;        TBLRD*&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TABLAT;<br />}<br /><br />unsigned&nbsp;char&nbsp;ReadFlashBuf[4];&nbsp;&nbsp;&nbsp;&nbsp;//读取flash中的数据缓冲区<br /><br />void&nbsp;main(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Flash_Erase(addr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//从addr地址起,擦除64个字节<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Write_Byte(addr,&nbsp;0xaa);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在addr上写入:0xaa<br />&nbsp;&nbsp;&nbsp;&nbsp;Write_Byte(addr+1,&nbsp;0x55);&nbsp;&nbsp;&nbsp;&nbsp;//在addr+1上写入:0x55<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ReadFlashBuf[0]&nbsp;=&nbsp;Flash_Read(addr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取flash地址addr到addr+3上数据,并存储在ReadFlashBuf[4]上<br />&nbsp;&nbsp;&nbsp;&nbsp;ReadFlashBuf[1]&nbsp;=&nbsp;Flash_Read(addr+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;ReadFlashBuf[2]&nbsp;=&nbsp;Flash_Read(addr+2);<br />&nbsp;&nbsp;&nbsp;&nbsp;ReadFlashBuf[3]&nbsp;=&nbsp;Flash_Read(addr+3);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />Mplab&nbsp;Sim仿真效果如下:<br />https://bbs.21ic.com/upfiles/img/20078/200781713276157.jpg<br /><br /><br /><br /><br />
cheungman 发表于 2008-7-2 13:55 | 显示全部楼层

re yewuyi

呵呵,datasheet我有认真读过,擦写操作确实是按64个字节的.<br /><br />我的芯片是PIC18F4680,公司里找的,我公司是代理MicroChip芯片的,应该不是假货.<br /><br />下载到几个芯片上测试一下,并用串口打印出来,结果跟仿真一样.<br /><br />我之所以这么做,是因为PIC18F458跟PIC18F4680的写操作函数是不一样的,详细各位请看datasheet.<br /><br />为解决两者兼容性问题,我才弄出来这么一个写1&nbsp;byte的函数出来.<br /><br />也不知道有没有bug,再测试测试吧.<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
yewuyi 发表于 2008-7-2 14:42 | 显示全部楼层

呵呵,我说的假货的意思

是指如果芯片本身不支持单字节写,那么所谓的单字节写肯定还是先读后整体写,不是真正意义上的象EEPROM那样的单字节读写。<br /><br /><br /><br />LS是哪个代理?!
cheungman 发表于 2008-7-2 14:47 | 显示全部楼层

re yewuyi

Burnon
cheungman 发表于 2008-7-2 14:49 | 显示全部楼层

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

  
yewuyi 发表于 2008-7-2 15:51 | 显示全部楼层

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

在最后一步页写的时候,有人执行所谓的单字节写,俺个人不推荐这种操作方式。<br /><br /><br />贝能的朋友不大熟悉,请问你们16F690最好能做到什么样的价格?<br /><br />请发我的EMAIL:xinyuanpic@163.com<br /><br />
cheungman 发表于 2008-7-2 16:51 | 显示全部楼层

re yewuyi

已发邮件,请查收.
bob.xue 发表于 2008-7-8 19:51 | 显示全部楼层

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

1,写操作:只能对内容是FFH的单元进行写操作。<br />2,要将某单元内容变为FFH,必须将所在单元的整页擦除。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部