nickwolfe 发表于 2012-9-5 23:25:27

怎么用PIC12F1822产生最高频率的5V方波啊?

项目中前辈以前用的是一块PIC12C508(4M内置时钟)在GPIO0管脚产生500KHz的5V方波
当时是用的是DIP-8的12C508

现在客户需要把这个频率提高很多

而且最好不改电路板设计,那就还得接着用这个八条管脚的底座、而且没有外置时钟

查了查microchip现在最快主频的8条腿单片机是PIC12F1822,内置时钟下能达到32MHz

对1822不太熟悉,不知道是不是和以前的12C508一样的接法;

怎么才能让1822达到最高速度,仍旧让RA0输出方波、能做到多少MHz呢?





zhiyiyunmeng@ 发表于 2012-9-6 00:51:08

我感觉有点高了吧,还不如使用专用芯片

nickwolfe 发表于 2012-9-6 04:55:08

要尽量维持以前的设计、布局嘛.......换芯片暂时没法考虑的。现在就那么一个8条腿的DIP座,VSS和VDD以及输出管脚还定了。

所以只好找高主频的DIP-8封装单片机啦。

millwood0 发表于 2012-9-6 06:42:01

能做到多少MHz呢?

depending on your requirements, it can get into multi-Mhz.

mon51 发表于 2012-9-6 07:44:47

本帖最后由 mon51 于 2012-9-6 07:46 编辑

PIC12F508的RC=4M,但内部要4分频,实际工作频率=1M,一个500K的脉冲(t=2US),是如何实现的?难道芯片不做任何事了吗?

khuohuo 发表于 2012-9-6 09:18:53

mon51 发表于 2012-9-6 07:44 static/image/common/back.gif
PIC12F508的RC=4M,但内部要4分频,实际工作频率=1M,一个500K的脉冲(t=2US),是如何实现的?难道芯片不做 ...

+1
一个指令要1uS跳转指令要2uS怎么做到500K,脉冲(t=2US),是如何实现的? 希望LZ高人贴出此部分代码!

nickwolfe 发表于 2012-9-6 14:13:42

看了前辈的程序,你们不许乐.......

用BCF GPIO,0和BSF GPIO,0塞满程序空间,最后GOTO 回开头,基本就是500KHz方波了.......{:loveliness:}

这程序,能在1822上跑么?

俺都不好意思改{:titter:}{:titter:}{:titter:}

yangzichen 发表于 2012-9-6 20:06:11

nickwolfe 发表于 2012-9-6 14:13 static/image/common/back.gif
看了前辈的程序,你们不许乐.......

用BCF GPIO,0和BSF GPIO,0塞满程序空间,最后GOTO 回开头,基本就是50 ...

这个真不失为一种好方法,估计也就只有汇编能做到了

nickwolfe 发表于 2012-9-6 20:17:21

yangzichen 发表于 2012-9-6 20:06 static/image/common/back.gif
这个真不失为一种好方法,估计也就只有汇编能做到了

问题是它有个跳转命令里面没办法BSF或BCF的啊

所以在满足周期的同时,会有一个周期里面“缺一块”。

一点也不严谨,也就用于蒙骗领导罢了。

俺现在接手这个,看到这样的写法都不敢说出来,只好从提高PIC的主频的角度入手,最好能把它那个.hex直接烧入PIC12F1822

这样有朝一日万一追究起来、这个“算法”要被诟病,那就不是俺的责任了.......

有没有用过1822的弟兄啊?

chengzepeng 发表于 2012-9-6 21:29:56

本帖最后由 chengzepeng 于 2012-9-6 21:43 编辑

nickwolfe 发表于 2012-9-6 14:13 static/image/common/back.gif
看了前辈的程序,你们不许乐.......

用BCF GPIO,0和BSF GPIO,0塞满程序空间,最后GOTO 回开头,基本就是50 ...

一个指令周期就1uS了,
GOTO需要两条指令周期,
总共4条指令周期,
最快也就250KHz,
所以4M内部RC是不可能输出500K。

PIC12F1822就可以实现,
因为它的内部时钟最高可以达到32M,
也就是8M指令速度,最高速度可以达到2M,
16F182x系列还有个参考时钟输出,
设置这个可以输出最高和内部时钟1:1,
比如设置时钟为8M,输出设置为不分频就会有8M输出!#include<pic.h>
// 内部RC振荡器,看门狗关,上电延时开,外部复位关,代码保护关,数据保护关,低电复位关,时钟输出开,时钟内外切换关,时钟监视器关
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_ON & IESO_OFF & FCMEN_OFF);

#define OUT RA0

void mcu_init()
{
        OSCCON = 0x70;        // 内部时钟频率为8M
        CLKRCON = 0xD4;        // CLKR脚输出时钟,占空比为50%,CLKRCON=0xD0为8M,CLKRCON=0xD4为500KHz
        ANSELA = 0;
        C1ON   = 0;
        TRISA= 0;
        PORTA= 0;       
}



void main()
{
        mcu_init();
        while(1)                // OUT=500KHz,占空比为25%
        {
                OUT = 1;
                OUT = 0;
        }
}
省电点的方案是,设置参考输出不分频,时钟设置为500KHz,        OSCCON = 0x38;        // 内部时钟频率为8M
        CLKRCON = 0xD0;        // CLKR脚输出时钟,占空比为内部时钟一致,CLKRCON=0xD0为不分频时钟输出500KHz

nickwolfe 发表于 2012-9-7 05:28:05

〉〉16F182x系列还有个参考时钟输出,
〉〉设置这个可以输出最高和内部时钟1:1,
〉〉比如设置时钟为8M,输出设置为不分频就会有8M输出!

12F1822也有参考时钟输出阿

而且1822还有32MHz主频(打开PLL后,8x4=32MHz)

此时输出的参考时钟是8MHz还是32MHz呢?

yangzichen 发表于 2012-9-7 08:43:05

nickwolfe 发表于 2012-9-6 20:17 static/image/common/back.gif
问题是它有个跳转命令里面没办法BSF或BCF的啊

所以在满足周期的同时,会有一个周期里面“缺一块”。


客户用了不找你们经理反应吗?
估计真个主函数里面都是bsf和bcf了

nickwolfe 发表于 2012-9-7 09:15:31

yangzichen 发表于 2012-9-7 08:43 static/image/common/back.gif
客户用了不找你们经理反应吗?
估计真个主函数里面都是bsf和bcf了

客户用的还行,只能说对那个方波驱动的依赖程度不是很高,几百几千个波形中差了一个波形、可能未造成什么实质性损害而以。

但这个雷区俺可不敢乱动。

楼上有弟兄提到“用参考时钟输出”,这倒是很好的解决......用哪根管脚输出1:1的信号,可以指定么?

liqiinhit1 发表于 2012-9-7 09:27:34

我记得不能指定。。。只能看运气了,要是刚好和你原来的引脚一样就爽了

chengzepeng 发表于 2012-9-7 13:45:20

本帖最后由 chengzepeng 于 2012-9-7 13:47 编辑

nickwolfe 发表于 2012-9-7 09:15 static/image/common/back.gif
客户用的还行,只能说对那个方波驱动的依赖程度不是很高,几百几千个波形中差了一个波形、可能未造成什么 ...

芯片上唯一的那个时钟输出脚!不可更改!
旧版为时钟/4,也就是指令时钟直接输出,
后来新版的都带了个参考时钟后就可以更改输出分频和占空比了!
如果你要更改引脚那就用主函数那个,
参考时钟的优点是不占用程序资源,只要把那个脚拿来用就可以,
在程序里面只要初始化一下即可!

不过你一个单片机就拿来做个时钟输出就有点浪费了,
还不如弄个数字IC加晶体更省钱省电更划算!

nickwolfe 发表于 2012-9-8 06:40:35

RE: 怎么用PIC12F1822产生最高频率的5V方波啊?

chengzepeng 发表于 2012-9-6 21:29 static/image/common/back.gif
一个指令周期就1uS了,
GOTO需要两条指令周期,
总共4条指令周期,


>>因为它的内部时钟最高可以达到32M,
>>也就是8M指令速度,最高速度可以达到2M,

>>16F182x系列还有个参考时钟输出,
>>设置这个可以输出最高和内部时钟1:1,
>>比如设置时钟为8M,输出设置为不分频就会有8M输出!

>>    // 内部RC振荡器,看门狗关,上电延时开,外部复位关,代码保护关,数据保护关,低电复位关,时钟输出开,时钟内外切换关,时钟监视器关
>>    __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_ON & IESO_OFF & FCMEN_OFF);

查了查PIC12F1822的PDF,发现这个时钟输出还有些矛盾——如果在CONFIG里面指定了那个“CLKOUTEN_ON”,就没法使用“参考时钟输出”功能了!
要使用“参考时钟输出”,必须关上"CLKOUTEN_ON"选项。
否则得到的只是1/4倍主频输出到CLKOUT管脚上。
例如主频为32MHz时、CLKOUT(RA4?)就是8MHz

换句话说,如果关掉CLKOUTEN_ON,另外使用CLKRCON配置的“参考时钟输出”,则可能得到32MHz的输出呢

PDF中相关部分已用红蓝笔圈出,老大看看是不是这么回事儿?

millwood0 发表于 2012-9-8 07:55:46

the very page you quoted laid it out clearly:

1) clkr's source is system clock, which includes intosc x pll;
2) clkr gets superceded by clkout_en. so in your case, you get 8Mhz with clkout_en, or 32Mhz / clkrdiv.

again, how to solve your problem depends on your problem. i personally like nco.

chengzepeng 发表于 2012-9-8 14:54:18

手册有中文版的,
CLKOUTEN位的说法的确很奇怪,按照手册的做法在仿真器确实没信号输出,谁有实物可以试试,
还有那个配置好像有两个,
写法两个一样,放在首位的为配置1,另外一个是配置2。

nickwolfe 发表于 2012-9-9 14:36:33

chengzepeng 发表于 2012-9-8 14:54 static/image/common/back.gif
手册有中文版的,
CLKOUTEN位的说法的确很奇怪,按照手册的做法在仿真器确实没信号输出,谁有实物可以试试 ...

用实物测了一下,的确能达到5V 32MHz

仿真看不到......奇怪。

chengzepeng 发表于 2012-9-9 14:51:50

nickwolfe 发表于 2012-9-9 14:36 static/image/common/back.gif
用实物测了一下,的确能达到5V 32MHz

仿真看不到......奇怪。

我说的是那个输出设置位到底是打开有参考时钟输出还是关闭才有,
仿真器上是打开才有输出的,
如果实物是关闭才有那么就是说明仿真器错了,
否则就是手册错误了。

还有那个低压编程,如果打开的话内部复位就会无效!#include<pic.h>
// 内部RC振荡器,看门狗关,上电延时开,外部复位关,代码保护关,数据保护关,低电复位关,时钟输出开,时钟内外切换关,时钟监视器关
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_ON & IESO_OFF & FCMEN_OFF);        // CONFIG1

// 闪存写保护关,PLL关,堆栈溢出复位关,欠压复位低,低压编程关
__CONFIG(WRT_OFF & PLLEN_OFF & STVREN_OFF & BORV_LO & LVP_OFF);        // CONFIG2

nickwolfe 发表于 2012-9-9 15:33:13

本帖最后由 nickwolfe 于 2012-9-9 15:39 编辑

chengzepeng 发表于 2012-9-9 14:51 static/image/common/back.gif
我说的是那个输出设置位到底是打开有参考时钟输出还是关闭才有,
仿真器上是打开才有输出的,
如果实物是 ...

就改了CLKOUTEN_ON,然后就可以了。手册没问题。看来是仿真器的哪里不对头

CLKRCON用的是D0。

CLKOUTEN是个负有效的。俺设了CLKOUTEN_ON后,Config Word 1的bit11就变为1了,此前是0。

总之,谢谢老兄的指点

得到的32MHz的5V“方波”虽然波形不怎么样,但还是能用的。

而且同样的思路,使用16MHz的话,还能指定25%、75%的占空比(32MHz不支持改变占空比)。

挺好用的.......

nickwolfe 发表于 2012-9-9 15:44:58

chengzepeng 发表于 2012-9-9 14:51 static/image/common/back.gif
我说的是那个输出设置位到底是打开有参考时钟输出还是关闭才有,
仿真器上是打开才有输出的,
如果实物是 ...

〉〉    // 闪存写保护关,PLL关,堆栈溢出复位关,欠压复位低,低压编程关
〉〉    __CONFIG(WRT_OFF & PLLEN_OFF & STVREN_OFF & BORV_LO & LVP_OFF);      // CONFIG2


PLLEN_OFF可不行,这个必须PLLEN_ON的

否则没有4xPLL给你把8MHz倍频到32MHz去的。

当然,如果你坚持PLLEN_OFF,也可以用SPLL软开关控制PLL功能打开的。

俺是两处都设成1了。

chengzepeng 发表于 2012-9-10 16:50:56

nickwolfe 发表于 2012-9-9 15:44 static/image/common/back.gif
〉〉    // 闪存写保护关,PLL关,堆栈溢出复位关,欠压复位低,低压编程关
〉〉    __CONFIG(WRT_OFF &...

不计较耗电的无所谓了的,
再说你的时钟高了程序处理的速度也快了!
如果你根本就不写程序,只要一个时钟那就有点浪费了!{:titter:}
单纯要个时钟的可以用个晶体加个CD4060,
缺点是修改频率输出只能通过更换引脚或晶体,
如果是单片机的话可以按开关切换频率输出!

蓦然回首; 发表于 2013-12-11 17:52:00

我只想弱弱的问一句PIC12F1822可以用C语言来写程序吗,因为我不喜欢汇编

蓦然回首; 发表于 2013-12-11 17:52:27

我只想弱弱的问一句PIC12F1822可以用C语言来写程序吗,因为我不喜欢汇编

marvel 发表于 2013-12-27 16:58:16

当然可以了。
页: [1]
查看完整版本: 怎么用PIC12F1822产生最高频率的5V方波啊?