搜索
bottom↓
回复: 97

被12F675搞死了,写个方波程序,找不着北,怎么没有PR2寄存器

[复制链接]

出0入0汤圆

发表于 2009-7-3 20:49:58 | 显示全部楼层 |阅读模式
被12F675搞死了,写个方波程序,找不着北,怎么没有PR2寄存器,

GIE,PEIE,TMR1IF,TMR1L,TMR1H,T1CON,TMR1IE要用到这几个,可是怎么没有PR2???怎么设置周期啥的

对了,PR2是什么东西?

出0入90汤圆

发表于 2009-7-3 20:57:58 | 显示全部楼层
兄弟,我最近也用12f675,我想用内置晶振,MCLR也用内部的,但是ICD2说不支持两种同时配置的编程,而且按照正常的配置烧写的代码怎么都无法运行。我郁闷死了!

出0入0汤圆

发表于 2009-7-3 20:58:36 | 显示全部楼层
只能说明连数据手册都没有看说。。上来就说单片机有问题。。。
对楼主无语!!!

出0入0汤圆

 楼主| 发表于 2009-7-3 21:02:22 | 显示全部楼层
刚学PIC,上来就能看得懂,你是神啊,切!

出0入0汤圆

发表于 2009-7-3 21:12:13 | 显示全部楼层
兄弟,683才有啊,是不是用PWM啊,呵呵,629和675都没有,675多个AD。看资料还是要仔细一点,我也吃亏过。。。

出0入0汤圆

发表于 2009-7-3 21:12:37 | 显示全部楼层
不行就用定时器做也可以呀。

出0入0汤圆

 楼主| 发表于 2009-7-3 21:17:08 | 显示全部楼层
说到我心头上了,感激,真的不能用PWM?  请教了,我也试着用定时器,不过在仿真上不出波形,惨,搞了一天没什么头绪,有没例子借鉴,谢过!

出0入0汤圆

发表于 2009-7-3 21:17:46 | 显示全部楼层
巧妇难为无米之炊

出0入0汤圆

发表于 2009-7-3 21:43:32 | 显示全部楼层
我给你发一个吧,还有仿真哦!是个三色LED灯变换。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3434735&bbs_page_no=1&bbs_id=9999

出0入0汤圆

发表于 2009-7-3 21:46:06 | 显示全部楼层
楼主是什么态度?
我当初学PIC,至少知道先看手册再提问。12F675的id给你注册了真浪费。

出0入0汤圆

发表于 2009-7-3 21:48:14 | 显示全部楼层
【9楼】 flyunlimit 飞行无极限
还记得我吧,上次就是那个开启LP振荡器害惨我了导致GP4和GP5不能用,还是你帮我搞定,不过你以前叫兔斯基,咋改名了?
最近也在疯狂的玩PIC呢

出0入0汤圆

发表于 2009-7-3 21:49:15 | 显示全部楼层
读书不求甚解总要吃亏的,不说了,我也一样!!!呵呵

出0入0汤圆

发表于 2009-7-3 21:54:29 | 显示全部楼层
看手册!

自己不看手册,

只能怪人,还能怪到单片机?

出0入0汤圆

 楼主| 发表于 2009-7-3 21:55:26 | 显示全部楼层
挖,,谢谢qxs5264 ,好人...不像有些人,不指导也就算了,还要侮辱一翻....哎,谁没有刚开始,将心比心

出0入0汤圆

发表于 2009-7-3 21:56:42 | 显示全部楼层
最后一次用PIC是去年底,就是12F675。之后就再没碰过。

使用情况就是1楼的那样,全内部,像PIC的8脚单片机仿真需要特殊的仿真用型号,是12个脚的,把仿真用的脚独立出来了,但我没实际用过。像12系的PIC单片机,我都是直接编程后看结果,分析现象,然后再调程序。

1楼可以把配置和初始化程序放上来看看。也许能解决

改名了,中英文一致。

出0入0汤圆

发表于 2009-7-4 03:18:02 | 显示全部楼层
you have to read the datasheet if you want to do something with the chip. no other way out.

here is a short piece of code that generates a pwm signal based on an analog signal. hope it helps.

===========code=================
#include <htc.h>

// hardware configuration

#define Vin_a        GPIO0        //analyg in on GPio0;
#define LED                GPIO5        //led out on gpio5;
// end hardware configuration

#define GETBIT(var,bit) (((var)>>(bit))&1)                 /* read bit from var */
#define SETBIT(var,bit) ((var)|=(1<<(bit)))                /* set bit from var to 1 */
#define CLRBIT(var,bit) ((var)&=(~(1<<(bit))))        /* clear bit from var (set it to 0) */

#define Vin_d_th        ((long) 2500*1023/5000)                //input voltage threshold to turn on the LED. from 0-1023 (10bit adc)
#define wait2                NOP();NOP()
#define wait4                wait2;wait2
#define wait8                wait4;wait4
#define adc_bits        8                                                        //how many bits in pwm stepping
#define Length                (1<<adc_bits)                                //total length of pwm, should be consistent with sampling bits - 10 here


__CONFIG(MCLRDIS & INTIO & WDTDIS & BORDIS);

void
main(void)
{
        int Vin_d;                                //adc result for Vin_a
        int i=0;                                //where we are in length?
       
        CMCON=7;                                //turn off comparators;
        TRISIO=0b1;                                //input on GPIO0, all others digital output;
        ADCON0=0b10000001;                //right adjusted, fosc/2, Vdd reference, AN0 analog input, adc starts right away and will always be on;
        ANSEL=0b1010001;                //1/16th Fosc, analog input on GPIO0;
        LED=0;
        while (1){
                //TODO Auto-generated main function
                GODONE=1;                                                //start the adc process       
                while (GODONE) ;                                //wait for adc to complete
                Vin_d=((ADRESH<<8)+(ADRESL))>>(10-adc_bits);                //read both the msb and lsb.
                for (i=0; i<Length; i++)
                        if (i<Vin_d)
                                LED=1;
                        else
                                LED=0;
//                wait8;                                                        //wait to charge up Chold
        }
}
==========end code====================


(原文件名:12f675 pwm.PNG)

出0入0汤圆

发表于 2009-7-4 03:19:36 | 显示全部楼层
the maximum pwm steps in the above program is handled by adc_bits. it can be anything from 1 to 10 bits (the maximum resolution of the adc).

出0入0汤圆

发表于 2009-7-4 09:12:49 | 显示全部楼层
不是说不指教楼主。。。数据里面本身写得很详细,也是中文的!你先多看几眼,再上来问也就不一样了。。。
问题是你一上来就说是单片机问题,PIC12F675本身就没有PWM,,,这些都是单片机本身最基本的内部硬件资源,如你看第页数据手册再上来问,PIC12F629怎么没有PMW之类的问题,,问题的性质就不一样!

出0入0汤圆

发表于 2009-7-4 09:17:29 | 显示全部楼层
像629或675之类不带串口的,我一般将数据送到EEPROM中,在读出看是否正确,如果没有EEPROM的就麻烦了,以前51调试我都用串口读数据看的,PIC系列我常用的一些都没有,还好有EEPROM,我还没有用过仿真器,都不知道咋用呢。

出0入0汤圆

发表于 2009-7-4 09:39:04 | 显示全部楼层
像这种这么小的单片机,,试验时可以用个LED做指示。。运行到哪,闪多少次,什么时亮,什么灭。。都可以输出用于程序排错!!

出0入0汤圆

发表于 2009-7-4 10:26:19 | 显示全部楼层
如果是AD转换数据呢,或者是红外接收数据呢?还是要送到EEPROM的,功能简单就直接用灯代替了。

出0入0汤圆

 楼主| 发表于 2009-7-4 14:22:24 | 显示全部楼层
我知道自己是新手,但做技术没有理由不去认真学习...路在脚下...小生刚刚上路..一路上........请各位前辈多指教,

这里是我写的一个程序,请问下我初始化GPIO=0x01;已经让GP0为高电平了,为什么后面程序运行出来,GP0口是低电平,请指教!


#include<pic.h>
#include<pic12f6x.h>
#include<htc.h>
#define GPIOIT(adr,bit) ((unsigned)(&adr)*8+(bit))
static bit GP_0 @  GPIOIT(GPIO,0);
static bit GP_2 @  GPIOIT(GPIO,2);
static bit GP_5 @  GPIOIT(GPIO,5);
void delay(unsigned int n)
{ unsigned int i;
  unsigned int j;
for(i=0;i<n;i++)
{ for(j=0;j<1140;j++);
}
}

main()
{
TRISIO=0x00;
INTCON=0x00;
GPIO=0x01;
while(1)
{unsigned int k;
for(k=0;k<3;k++)
{

GP_5=1;
delay(30);
GP_5=0;
delay(30);
if(k==2)
{
GP_5=1;
delay(2);
GP_5=0;
for(;;)
{
unsigned int m;
for(m=0;m<3;m++)
{
GP_2=1;
delay(10);
GP_2=0;
delay(10);
}
delay(40);
}
}
}

}
}

出0入0汤圆

 楼主| 发表于 2009-7-4 14:33:20 | 显示全部楼层

GP0低电平 (原文件名:00010.jpg)

出0入0汤圆

发表于 2009-7-4 19:14:37 | 显示全部楼层
"这里是我写的一个程序,请问下我初始化GPIO=0x01;已经让GP0为高电平了,为什么后面程序运行出来,GP0口是低电平,请指教! "

because you didn't read the datasheet.

出0入0汤圆

发表于 2009-7-4 22:24:50 | 显示全部楼层
翻译楼上的话,因为你没有读datasheet
这也是我要说。

PIC的一大特点之一:I/O端口的“读-写”。

你这里的问题是2方面的,一是IO直接接LED,不串电阻,LED把电平拉低了。后面任何对IO的操作,都会导致GP0变成低电平。二是即便你不串电阻,对IO进行整体操作也能避免,但我你没有。

以上,是“任何”一本讲PIC的书都会重点提到的,难道你什么都不看吗?

出0入0汤圆

发表于 2009-7-4 22:36:28 | 显示全部楼层
纠正一下24L,应该是
读->修改->写

出0入0汤圆

发表于 2009-7-4 22:39:09 | 显示全部楼层
对。应该是 读->修改->写

我就觉的我上面的写的怪怪的。

出0入0汤圆

 楼主| 发表于 2009-7-4 22:39:55 | 显示全部楼层
这个图只是示意而已,我是在真正的板上编程的,不会有不串电阻,LED把电平拉低了问题.楼上的,你的第二点看不懂.

出0入0汤圆

 楼主| 发表于 2009-7-4 22:42:33 | 显示全部楼层
读->修改->写 ???深奥

出0入0汤圆

发表于 2009-7-4 22:43:04 | 显示全部楼层
随便复制过来的。


PIC芯片的IO口寄存器只有两个,一个方向寄存器,一个数据寄存器,其中数据寄存器有两个功能,写为输出值,读为引脚物理值,而修改IO口值时会先读入引脚值再进行修改然后再写出,这样在以下情况下会引起无意识的误操作:

假如PA0、1、2、3皆设为输出且输出高电平,但由于外部原因使得引脚电平并没有达到PIC认可以的高电平值,比如没有串电阻或电阻太小而接到LED或NPN基极,这样当需要把其中一个脚清零时,比如BSF PA,0时,PA1、2、3也会被清零,原因是PIC先读入了引脚值,而引脚值对PIC来说是0,所以……,大家可以小心了!

另外在连续使用改写(变成另一种电平)单个引脚指令时同样会存在误操作,比如:

BSF PA,0 (或 BCF PA,0)

(加入NOP——》就没问题了!:))

BSF PA,1 (或 BCF PA,1)

结果将会使PA0被清零,而不想要的1,这时因为从写入到输出高电平需要时间,所以如果连续操作必须在中间加入NOP/CLRWDT,这样才不会有问题发生!

出0入0汤圆

 楼主| 发表于 2009-7-4 22:55:21 | 显示全部楼层
如果连续操作必须在中间加入NOP/CLRWDT,这样才不会有问题发生!
这句话不太理解,我正在看datasheet,能否指点下我的程序能怎么改下,要让GP0口高电平,你们说的被拉低的可能性是不会有的,我编程的那个板是成熟的板

出0入90汤圆

发表于 2009-7-4 22:59:43 | 显示全部楼层
楼上兄弟,你看看我的配置字:
__CONFIG(INTIO&UNPROTECT&PWRTEN&BOREN&MCLRDIS&WDTDIS);

configuration bit里是设置为sets in code,所以不用管。你看看,为什么烧了程序进去没反应啊?我只是改变IO口电平变化罢了。

CMCON=0x07;
ANSEL=0x00;//设置全部为数字IO
TRISIO=0x0c;//GP2,GP3为输入,其他为输出
GPIO=0x30;

出0入0汤圆

发表于 2009-7-4 23:02:56 | 显示全部楼层
LZ把GP_5和GP_2等等位操作语句用//屏蔽去掉,
再运行看看
GP_0是否高电平,如果是高电平,说明是其它IO操作时影响了GP_0

出0入0汤圆

 楼主| 发表于 2009-7-4 23:06:39 | 显示全部楼层
31楼的谢谢你的提醒,我的程序可以了,我估计你是编程的时候设置的FUSE位不对吧

出0入0汤圆

 楼主| 发表于 2009-7-4 23:17:00 | 显示全部楼层
必须对ANSEL(9Fh)和CMCON(19h)寄存器进行初始化以便将模拟通道配置为数字输入端。配置为模拟输入端的引脚将读为0。ANSEL 寄存器是为PIC12F675 定义的。


这个是手册上提到的,但是作为新手确实没有意识到,没有人的提醒,一味的看手册真是盲目啊

出0入0汤圆

 楼主| 发表于 2009-7-5 00:02:09 | 显示全部楼层
这个PIC单片机分论坛好冷哦

出0入0汤圆

发表于 2009-7-5 00:06:19 | 显示全部楼层
"这个PIC单片机分论坛好冷哦"

thanks to that, you are learning.

the program i gave to you earlier specifically set ansel and cmcon registers. you didn't learn from it.

you have to read the datasheet or you will never learn.

出0入0汤圆

 楼主| 发表于 2009-7-5 00:18:25 | 显示全部楼层
sure ,I will .

出0入0汤圆

 楼主| 发表于 2009-7-5 11:40:00 | 显示全部楼层
找了个PIC网站,例子好多,全用汇编的,本人不会汇编,欲哭无泪

出0入90汤圆

发表于 2009-7-5 15:20:45 | 显示全部楼层
呵呵,没有泪就自己加把劲用C学!郁闷,我写的程序在proteus里跑得好好的,就是烧到芯片里没反应,太郁闷了!

出0入0汤圆

发表于 2009-7-5 15:43:25 | 显示全部楼层
这样的问题都多是熔丝设置的问题..

出0入90汤圆

发表于 2009-7-5 18:10:25 | 显示全部楼层
郁闷啊,就每一个人能给个能用的内部晶振,内部MCLR的配置字出来吗?????????????????????

出0入0汤圆

 楼主| 发表于 2009-7-5 21:19:48 | 显示全部楼层
-------------------配置位设置-----------------------------------------------
__CONFIG(INTIO&UNPROTECT&PWRTEN&BOREN&MCLREN&WDTDIS);

看下对你有没有用

出0入0汤圆

 楼主| 发表于 2009-7-6 13:21:39 | 显示全部楼层
无语,12F675还真捉弄人,仿真上好好的,烧到板上就不按正常的程序运行了.

出0入0汤圆

发表于 2009-7-6 15:04:43 | 显示全部楼层
按说没那么别扭吧?而且内部的配制没有能够影响单片机到没有反应的地方。全看外部了。除非中了小概率事件,单片机是坏的。

我手头上目前没C的,全是汇编的。

__CONFIG        H'3FA4' ;_INTRC_OSC_NOCLKOUT,_MCLRE_OFF,WDT OFF,PWRTE ON

INIT_SYS
        bsf         status,RP0        ;bank1
        MOVLW         H'C0'                ;T0CS=0, TO ENABLE GP2
        MOVWF         OPTION_reg        

        MOVLW         B'00011111'     ;GPIO 0~4 =input               
        MOVWF         TRISIO
        MOVLW         B'00101111'
        MOVWF        ANSEL                ;T32, AN 0~3 ARE ANALOG

        BCF     STATUS,RP0      ; BANK0
        MOVLW         B'00000001'
        MOVWF        ADCON0                ; LEFT JUSTIFIED,VDD,A/D ON
        return

出0入90汤圆

发表于 2009-7-6 19:25:29 | 显示全部楼层
郁闷,汇编的搞不清楚,pic12f675兄弟的配置字跟我一样,只能在proteus里用,烧到芯片里去试不会跑的,连个改变IO口电平都做不到!

出0入0汤圆

发表于 2009-7-6 20:20:32 | 显示全部楼层
把你开头的自定义配置注销,用IDE的configuration Bits自己的手动配置。


(原文件名:12f675.JPG)

然后,你用的什么烧录工具?

出0入0汤圆

 楼主| 发表于 2009-7-7 00:11:50 | 显示全部楼层
我用的是点击此处打开 ourdev_459014.jpg(文件大小:1.07M,只有400K以内的图片才能直接显示) (原文件名:11.jpg)


我做了3个样板,3个板全配置是Highst,可是只有一个板是Highst,其中一个板变成Lowest,还有一个变成MidLow,郁闷,程序运行起来,灯闪的频率就不一样了,
Highst肯定最快,Lowest最慢,杂一个程序就变成像三种程序样?

出0入0汤圆

 楼主| 发表于 2009-7-7 00:12:50 | 显示全部楼层

(原文件名:12.jpg)

出0入0汤圆

 楼主| 发表于 2009-7-7 00:24:30 | 显示全部楼层
我的在板上能运行了,只是配置位的时候,出现Highst变成Lowest的情况,这个是怎么回事

出0入0汤圆

发表于 2009-7-7 03:00:14 | 显示全部楼层
a good practice is to embed the fuse configuration with your program, and never EVER let the programmer to decide fuse configuration. Otherwise, you will have lots of weird behaviors, :).

出0入0汤圆

 楼主| 发表于 2009-7-7 09:25:32 | 显示全部楼层
can you confine oneself to the facts ?   What you say is useless for me!

出0入0汤圆

发表于 2009-7-7 09:36:01 | 显示全部楼层
我印象中bandgap是片子出厂时已校准的,同样单片机的内部振荡也是出厂校准的,PIC编程时,应该先读取配置情况和FLASH最后一位上的振荡的校准值,然后这些项保留不动,再配置其它项。

PIC的内部振荡配置好了还是很准的,但是如果电压偏差太大、振荡的校准值不加载或被修改,都会导致不准,如果再做一些长延时的程序,偏差累积就会导致时间不一样。

出0入0汤圆

 楼主| 发表于 2009-7-7 09:44:51 | 显示全部楼层
那我现在该怎么办,楼上请指导下!

我现在程序里没设置配置位.

出0入0汤圆

发表于 2009-7-7 10:13:21 | 显示全部楼层
回46楼

烧录工具---自制JDM+WINPIC800

出0入90汤圆

发表于 2009-7-7 10:49:05 | 显示全部楼层
我是用ICD2直接烧的!郁闷啊,我的单片机没有先读配置,直接烧写了,当时也没有做data protect,后来看datasheet里说,不做代码保护的话,内部RC校准就没了。这个,这个,是不是校准没了,单片机就再也无法使用内部晶振了呢?还是说,内部校准没了后,需要自己在代码里或者烧写的时候手动配置呢????因为,我是用SOP8的封装在万用板上搭的电路,也不好改,所以没有换芯片试过。

出0入0汤圆

发表于 2009-7-7 11:07:00 | 显示全部楼层
楼上,建议买个PICKIT2,非常方便实用!

出0入0汤圆

 楼主| 发表于 2009-7-7 14:46:31 | 显示全部楼层
我也和55楼一样,初学都没注意到这个问题,有点严重了

出0入0汤圆

发表于 2009-7-7 18:52:25 | 显示全部楼层
'can you confine oneself to the facts ?   What you say is useless for me! '

it is useless to YOU because you cannot understand it.

出0入90汤圆

发表于 2009-7-7 19:50:11 | 显示全部楼层
来个人回答问题啊!!!!回答我55楼的问题!!!!!!!!!!!!!

出0入0汤圆

发表于 2009-7-7 22:27:39 | 显示全部楼层
中文不懂,帮不上忙,楼主还是自己看中文DataSheet吧。

出0入0汤圆

 楼主| 发表于 2009-7-7 23:08:23 | 显示全部楼层
"来个人回答问题啊!!!!回答我55楼的问题!!!!!!!!!!!!!"

此站这么冷,说明大家水平还是都有限,真的多看看书为妙!

不过AVR的高手在AVR那边比较多.

出0入0汤圆

发表于 2009-7-8 08:14:47 | 显示全部楼层
"此站这么冷"

we can help you learn. But end of the day, you have to learn for yourself.

just remember this old chinese proverb:

when you give a man a fish, you give a man a diner.

when you teach a man to fish, you give a man a lifetime of diners.

出0入0汤圆

发表于 2009-7-8 09:42:01 | 显示全部楼层
内部校准没有了,只是会时间不准,不至于不运行。ICD2如果不设置。默认是不会改芯片的校准值的。

出0入0汤圆

 楼主| 发表于 2009-7-8 22:45:21 | 显示全部楼层
时间不准是个很严重的问题!

出0入0汤圆

发表于 2009-7-9 01:24:35 | 显示全部楼层
【47楼】 pic12f675
我做了3个样板,3个板全配置是Highst,可是只有一个板是Highst,其中一个板变成Lowest,还有一个变成MidLow,郁闷,程序运行起来,灯闪的频率就不一样了,
Highst肯定最快,Lowest最慢,杂一个程序就变成像三种程序样?
-----------------------------
这个是出厂的校准值,和你没有太大关系,只和Power On Reset, Brown Out Detect的检测电压有关,你不用去管他,这些不会影响你程序正常运行时的频率的


楼主说的时间不准有多不准,和你的标准相差多少?

你说你的内部校准没有了,有两个办法解决
1. 找一片没有被擦掉的,先读出来再写
2.  OSCCAL一共六位,根据手册上说的000000最小,111111最大,你一位一位的试,六次就能得到一个较好的结果了

你是用汇编还是C语言,貌似没有看到你在上面的程序写
OSCCAL = _READ_OSCCAL_DATA(); 

P.S. 你说这里冷清可以用google搜PIC例子和论坛

出0入0汤圆

发表于 2009-7-9 11:12:32 | 显示全部楼层
现在已经没有了,就自己试吧,很早以前用微芯的芯片,现在已经太长时间没用了。不过我记得这个真要注意,不要随便擦除,可以先把芯片读取一下,保留一下这个参数,然后再写。不过现在已经擦除的就要自己试一下了。

出0入0汤圆

发表于 2009-7-9 11:32:27 | 显示全部楼层
微芯的芯片复位后的第一条指令就是加载这个常数,而你用不用这个数据写到OSCCAL里面就是代码的事了,所以一般程序的0位置的指令应该是将W里面的值写到OSCCAL里面,以此来调整单片机内部振荡器的速度,因为现在你的最后一个单元已经被擦除掉了,所以上电后取回来的那个W值就不再是厂家的校准值了,所以有两个方法,一是保留原来的代码不变,但在最后 一个单元修改校准值,直到自己感觉可以了就行,呵呵。相当于你自己校准了。
    另外一个办法就是不管最后一个单元里面校准是多少了,直接在开始的指令里面用固定数据修正,这样不断修改这个值就差不多了。不过这样就是每个芯片的程序就不一样了。
    这两种方法,其实实质是一样的。
    对了,不知道微芯的OSCCAL为什么没有实现上电后将厂家的校准值直接加载到OSCCAL里面,反而把这个校准值放在了最后单元的程序区里面,我以前也出现过这种问题,不注意就擦掉了!

出0入0汤圆

 楼主| 发表于 2009-7-9 22:31:36 | 显示全部楼层
OSCCAL = _READ_OSCCAL_DATA(); 这个语句做什么用,是可以读出芯片里OSCCAL的数据?每个都这样执行,它会自动读?

出0入0汤圆

发表于 2009-7-9 23:03:21 | 显示全部楼层
这句话是把OSCCAL的值读出来,放进OSCCAL寄存器中
12F675不会自动把校验值写进去,这要你来完成

出0入0汤圆

 楼主| 发表于 2009-7-9 23:18:11 | 显示全部楼层
那这个数据就会是芯片内部的?

出0入0汤圆

 楼主| 发表于 2009-7-9 23:18:22 | 显示全部楼层
那这个数据就会是芯片内部的?

出0入0汤圆

发表于 2009-7-10 08:34:39 | 显示全部楼层
【63楼】 flyunlimit 飞行无极限
众里寻你千百度,蓦然回首,你却躲在这里。

帮我搞定这个!谢谢!

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=3442952&bbs_id=9999

出0入0汤圆

发表于 2009-7-10 09:40:58 | 显示全部楼层
【71楼】 pic12f675
是的,这个数据实际上是一条retlw xx指令,放在芯片Flash的最后面

(原文件名:2009-7-10 9-44-27.jpg)

出0入0汤圆

 楼主| 发表于 2009-7-10 20:22:17 | 显示全部楼层
有一批货要做,可是客护没给测试程序,如果自己编个程序测试,又没设好配置位,导致内部校准不同就惨了,压力好大
OSCCAL = _READ_OSCCAL_DATA();这个就放在程序main()里面就可以了吗

出0入0汤圆

发表于 2009-7-10 21:34:14 | 显示全部楼层
唉,真要建议楼上好好看一下手册,上面都有的,我已经好几年不用了,我仍然能够记得有这个。
芯片出厂的时候,在最后一个单元有一条指令就把校准值读到了寄存器W里面了,这条指令如果不小心被擦掉了当然就没了。而芯片并不会把这个值写到OSCCAL里面。
    其实以前有的芯片复位后会指向最后一个单元,因为空间回环,执行完最后一条命令后就已经把校准值取到W里面了,然后进入了我们自己的程序,我们的程序只要在最前面加一句把W内容写到OSCCAL里面就行了。
    现在很多芯片就复位到0了,所以可能就要靠自己去读最后一个单元的值了。无论怎样,在新的芯片写之前注意保存一下最后那个校准值。批量因为芯片是新的,不要擦除,直接写就可以了。
    另外再说一句,如果手册不能好好看的话,真的好担心做出来的产品会怎样!

出0入0汤圆

发表于 2009-7-10 23:14:23 | 显示全部楼层
是的,就放在main函数中
一般市面上销售的编程器及软件会保存这个值,不用担心这个值会被擦掉

建议楼主周末重读12F675的Datasheet,为你的客户表示担心:)

出0入0汤圆

 楼主| 发表于 2009-7-11 15:12:18 | 显示全部楼层
我已经发了2快样板给客户了,对那两块样板表示沉痛哀悼,以及对12F675的Datasheet的强烈谴责.我方将对此发表声明,看了一点Datasheet上有个说校准的,但是汇编看不懂,

出0入0汤圆

 楼主| 发表于 2009-7-12 23:08:02 | 显示全部楼层
喝酒与技术

出0入90汤圆

发表于 2009-7-12 23:34:41 | 显示全部楼层
我郁闷啊!同样的一小段改变IO口电平的程序,用汇编写的就能跑,用C语言写的就不能跑,极度郁闷!!!!!!!!!!!!!

出0入0汤圆

发表于 2009-7-12 23:51:26 | 显示全部楼层
楼上,我才想起来一个很严重的问题。PICC对程序的优化很变态,稍稍显得无意义的语句都会给你优化掉。你检查一下C编译后的汇编程序吧。

出0入90汤圆

发表于 2009-7-13 09:13:40 | 显示全部楼层
恩,晚上回去我就看看!郁闷,我用picc写16f的程序都没有这种诡异的现象,难道我真的需要开始用汇编写代码不成?

出0入0汤圆

 楼主| 发表于 2009-7-13 19:11:31 | 显示全部楼层
....................返古

出0入0汤圆

发表于 2009-7-13 19:27:23 | 显示全部楼层
楼主是个不看手册的主。我这个七年前用过pic的都记得加载那个寄存在器。
连芯片有什么资源都不清楚还要批量。
写方波要么用位取反加延时。要么用定时器。pwm不也是定时器嘛。

出0入0汤圆

 楼主| 发表于 2009-7-13 20:22:39 | 显示全部楼层
....楼上的,定时当然会拉,只是没有PWM功用,后面他们说了才知道...但是客户的PCB板上那个口竟然有个PWM的丝印,无语

出0入90汤圆

发表于 2009-7-13 21:21:52 | 显示全部楼层
靠,我看了下C的汇编文件,我靠,单片机只有0x3ff地址,结果汇编文件的第2句就call 0x400了,郁闷!

出0入0汤圆

 楼主| 发表于 2009-7-13 22:12:31 | 显示全部楼层

出0入0汤圆

发表于 2009-7-13 23:05:28 | 显示全部楼层
楼上call 400不就正好回到开始吗?

出0入90汤圆

发表于 2009-7-13 23:55:41 | 显示全部楼层
郁闷啊!到底有没有人用PICC写PIC12F675程序的啊?发一个例子出来看下啊!郁闷啊,我现在非要自己用C语言写完了代码后,在汇编里面手动修改call 0x400到0x3ff才能运行,而且运行的极度不好!

出0入0汤圆

发表于 2009-7-14 00:13:13 | 显示全部楼层
对于楼主绝对不支持,为客户担心,这已经不仅仅是水平的问题了。
    对于C语言我估计也不会用,否则不可能出现这种情况。数据手册好好的放着不看,就是看了我也敢保证没有细看。尤其是很多的细节。那有看手册的时候没有注意不同型号的硬件资源区别的?
    对于一个芯片地址有没有回滚也没注意看,最好在说之前仔细看一下手册,否则会让人笑话的,做技术的不要搞的太外行。偶而出错或者偶而说点外行话,任何人都有这种可能,但是不要总这么说!

出0入0汤圆

发表于 2009-7-14 08:27:25 | 显示全部楼层
【88楼】 honami520
我在8楼不就是吗?
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3434735&bbs_page_no=1&bbs_id=9999

出0入90汤圆

发表于 2009-7-14 08:41:13 | 显示全部楼层
楼上的,我还真把你的程序烧进芯片里试了下!结果IO口没有任何变化!你给的程序时在proteus里仿真的,我自己写的在proteus里也仿真的好好的啊,但是烧进芯片就不能跑,编译器把C得弄成汇编后,就不行,非要自己用汇编写的才能跑!楼上有些,不知道你们用过PIC12F675没?是不是用C写的,如果是用C写的,有没有烧进芯片里面,没有的话,你可以试试再说。楼主自己也说了,后来修改后可以仿真了,但是烧进芯片也不运行,这和我一样。还有飞行无极兄弟,他烧进芯片跑过,但是,他是用汇编写的,不是C。

出0入0汤圆

发表于 2009-7-14 09:11:53 | 显示全部楼层
晕死,我这个既有仿真,而且也有实物,因为有一个项目用到七彩变幻的背光,还能有错吗?

出0入0汤圆

发表于 2009-7-14 09:21:01 | 显示全部楼层
675我也用过,我再给你发个项目,是通过滚轮开关来采样AD转换作为按键输入的,
#include "pic.h"
#include "pic12f6x.h"
#include "math.h"

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#define FAN_ON   GPIO0
#define FAN_LOW  GPIO1
#define LAMP_ION GPIO5

#define VoltageADR_H  0
#define VoltageADR_L   1
//+++++R3---R2---R1---R0-----
//        U2   U1   U0
#define         R0        107//40
#define         R1        13//20
#define         R2        6//10
#define         R3        15//62
#define         RA        (R0+R1+R2+R3)

#define        POW        0
#define        IN                1

__CONFIG(UNPROTECT & BOREN & MCLREN & PWRTEN & WDTEN & INTIO);

/**************************************************************************
*    函数原型: void DelayXms(void)
*    功                   能: 延时程序
**************************************************************************/
void DelayXms(uint j){
        uint i;
        for(;j > 0;j--){
                CLRWDT();
                i=196;
                while(i){
                        i--;
                }
        }
}

/**************************************************************************
*    函数原型: void DATA_WRITE(void)
*    功                   能: 写EEPROM
**************************************************************************/
/*
void DATA_WRITE(uchar ADDR, uchar DATA){
        WREN = 1;
        EEADR = ADDR;
        EEDATA = DATA;
        EECON2 = 0x55;
        EECON2 = 0xaa;
        WR = 1;
        DelayXms(10);
}

/**************************************************************************
*    函数原型: void DATA_READ(void)
*    功                   能: 读EEPROM
**************************************************************************/
/*
uchar DATA_READ(uchar ADDR){
        EEADR = ADDR;
        RD = 1;
        DelayXms(10);
        return(EEDATA);
}

/**************************************************************************
*    函数原型: void InitSys(void)
*    功                   能: 系统初始化
**************************************************************************/
void InitSys(){
        CMCON  = 0x07;        //关闭比较器功能
        TRISIO = 0x14;        //I/O口设置方向寄存器
        GPIO   = 0x00;        //
        WPU    = 0x14;        //弱上拉寄存器

        ANSEL        = 0x1c;        //模拟选择寄存器:
}

/**************************************************************************
*    函数原型: void Voltage_Test(void)
*    功                   能: 电压采样
**************************************************************************/
uint Voltage_Test( uchar mode){
        uchar i;
        uint cAVerage;
        uint cTemp;

        cAVerage = 0;

        DelayXms(10);
        if(mode == POW){
                ADCON0        = 0x89;                //A/D 控制寄存器:0x89--->AN2,  0x8d--->AN3
        }
        else{
                ADCON0        = 0x8d;                //A/D 控制寄存器:0x89--->AN2,  0x8d--->AN3
        }

        for(i=0; i<64; i++){
                DelayXms(2);
                GODONE = 1;
                while(GODONE == 1);
                cTemp  = ADRESH;
                cTemp &= 0x03;
                cTemp <<= 8;
                cTemp += ADRESL;
                cAVerage += cTemp;
                if(i>0){
                        cAVerage >>= 1;
                }
        }
        return(cAVerage);
}

/**************************************************************************
*    函数原型: void ABS(void)
*    功                   能: 绝对值计算
**************************************************************************/
uint ABS(uint a, uint b){
        uint cTemp;
        if(a>b){
                cTemp = a-b;
        }
        else{
                cTemp = b-a;
        }
        return(cTemp);
}

/**************************************************************************
*    函数原型: void compare(void)
*    功                   能: 采样电压与电源输入电压比较
**************************************************************************/
uchar compare(void){
        uint v_POW, v_IN;
        uint v_U0, v_U1, v_U2;
        uint cTemp0, cTemp1,  cTemp2;       
       
        v_POW = Voltage_Test(POW);
        v_IN = Voltage_Test(IN);
        if(v_IN<0x10){
                return(2);
        }
        v_U0 = ((R0*(v_POW>>1))/RA)<<1;                       
        v_U1 = (((R0+R1)*(v_POW>>1))/RA)<<1;
        v_U2 = (((R0+R1+R2)*(v_POW>>1))/RA)<<1;

        cTemp0 = ABS(v_IN, v_U0);
        cTemp1 = ABS(v_IN, v_U1);
        cTemp2 = ABS(v_IN, v_U2);

        if(cTemp0<=cTemp1){
                if(cTemp0<=cTemp2){//----------2
                        return(0);
                }
                else{//--------0
                        return(2);
                }
        }
        else{
                if(cTemp1<=cTemp2){//----------1
                        return(1);
                }
                else{//--------0
                        return(2);
                }
        }
}

/**************************************************************************
*    函数原型: void Control(void)
*    功                   能: 输出
**************************************************************************/
void Control(void){
        switch(compare()){
                case 0:                                        //高速
                        FAN_ON           = 1;
                        FAN_LOW          = 0;
                        LAMP_ION         = 1;
                        break;
                       
                case 1:                                        //低速
                        FAN_ON           = 0;
                        FAN_LOW          = 1;
                        LAMP_ION         = 1;
                        break;

                default:                                        //关
                        FAN_ON           = 0;
                        FAN_LOW          = 0;
                        LAMP_ION         = 0;
                        break;
        }
}

/**************************************************************************
*    函数原型: void main(void)
*    功                   能: 主程序
**************************************************************************/
void main(void){
        InitSys();
        while(1){
                CLRWDT();
                Control();
        }
}

出0入0汤圆

发表于 2009-7-14 09:22:27 | 显示全部楼层
把你的程序贴上来,还有是不是编程器有问题呢?

出0入90汤圆

发表于 2009-7-14 09:33:17 | 显示全部楼层
呵呵,楼上的,真热心啊!跟楼上的汇报下,我用一段同样的IO口初始化代码,发现个新的现象。公司电脑里汇编出来的和家里电脑汇编出来的结果是不一样的。家里汇编出来就有个call 0x400这个鬼句子,公司里就没有。不过目前板子不在手上,所以,初步怀疑,我家里电脑上装的编译器是有问题的。

出0入90汤圆

发表于 2009-7-14 14:04:20 | 显示全部楼层
嘿嘿,我的问题解决了,果然是编译器的问题,换了个版本的编译器就好了,一切OK!!!!!!!!!!!!!!

出0入0汤圆

 楼主| 发表于 2009-7-17 13:10:02 | 显示全部楼层
让这贴沉下去吧!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-8 23:53

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

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