怎么用PIC12F1822产生最高频率的5V方波啊?
项目中前辈以前用的是一块PIC12C508(4M内置时钟)在GPIO0管脚产生500KHz的5V方波当时是用的是DIP-8的12C508
现在客户需要把这个频率提高很多
而且最好不改电路板设计,那就还得接着用这个八条管脚的底座、而且没有外置时钟
查了查microchip现在最快主频的8条腿单片机是PIC12F1822,内置时钟下能达到32MHz
对1822不太熟悉,不知道是不是和以前的12C508一样的接法;
怎么才能让1822达到最高速度,仍旧让RA0输出方波、能做到多少MHz呢?
我感觉有点高了吧,还不如使用专用芯片 要尽量维持以前的设计、布局嘛.......换芯片暂时没法考虑的。现在就那么一个8条腿的DIP座,VSS和VDD以及输出管脚还定了。
所以只好找高主频的DIP-8封装单片机啦。
能做到多少MHz呢?
depending on your requirements, it can get into multi-Mhz.
本帖最后由 mon51 于 2012-9-6 07:46 编辑
PIC12F508的RC=4M,但内部要4分频,实际工作频率=1M,一个500K的脉冲(t=2US),是如何实现的?难道芯片不做任何事了吗? 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高人贴出此部分代码! 看了前辈的程序,你们不许乐.......
用BCF GPIO,0和BSF GPIO,0塞满程序空间,最后GOTO 回开头,基本就是500KHz方波了.......{:loveliness:}
这程序,能在1822上跑么?
俺都不好意思改{:titter:}{:titter:}{:titter:} nickwolfe 发表于 2012-9-6 14:13 static/image/common/back.gif
看了前辈的程序,你们不许乐.......
用BCF GPIO,0和BSF GPIO,0塞满程序空间,最后GOTO 回开头,基本就是50 ...
这个真不失为一种好方法,估计也就只有汇编能做到了
yangzichen 发表于 2012-9-6 20:06 static/image/common/back.gif
这个真不失为一种好方法,估计也就只有汇编能做到了
问题是它有个跳转命令里面没办法BSF或BCF的啊
所以在满足周期的同时,会有一个周期里面“缺一块”。
一点也不严谨,也就用于蒙骗领导罢了。
俺现在接手这个,看到这样的写法都不敢说出来,只好从提高PIC的主频的角度入手,最好能把它那个.hex直接烧入PIC12F1822
这样有朝一日万一追究起来、这个“算法”要被诟病,那就不是俺的责任了.......
有没有用过1822的弟兄啊? 本帖最后由 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 〉〉16F182x系列还有个参考时钟输出,
〉〉设置这个可以输出最高和内部时钟1:1,
〉〉比如设置时钟为8M,输出设置为不分频就会有8M输出!
12F1822也有参考时钟输出阿
而且1822还有32MHz主频(打开PLL后,8x4=32MHz)
此时输出的参考时钟是8MHz还是32MHz呢? nickwolfe 发表于 2012-9-6 20:17 static/image/common/back.gif
问题是它有个跳转命令里面没办法BSF或BCF的啊
所以在满足周期的同时,会有一个周期里面“缺一块”。
客户用了不找你们经理反应吗?
估计真个主函数里面都是bsf和bcf了
yangzichen 发表于 2012-9-7 08:43 static/image/common/back.gif
客户用了不找你们经理反应吗?
估计真个主函数里面都是bsf和bcf了
客户用的还行,只能说对那个方波驱动的依赖程度不是很高,几百几千个波形中差了一个波形、可能未造成什么实质性损害而以。
但这个雷区俺可不敢乱动。
楼上有弟兄提到“用参考时钟输出”,这倒是很好的解决......用哪根管脚输出1:1的信号,可以指定么? 我记得不能指定。。。只能看运气了,要是刚好和你原来的引脚一样就爽了 本帖最后由 chengzepeng 于 2012-9-7 13:47 编辑
nickwolfe 发表于 2012-9-7 09:15 static/image/common/back.gif
客户用的还行,只能说对那个方波驱动的依赖程度不是很高,几百几千个波形中差了一个波形、可能未造成什么 ...
芯片上唯一的那个时钟输出脚!不可更改!
旧版为时钟/4,也就是指令时钟直接输出,
后来新版的都带了个参考时钟后就可以更改输出分频和占空比了!
如果你要更改引脚那就用主函数那个,
参考时钟的优点是不占用程序资源,只要把那个脚拿来用就可以,
在程序里面只要初始化一下即可!
不过你一个单片机就拿来做个时钟输出就有点浪费了,
还不如弄个数字IC加晶体更省钱省电更划算!
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中相关部分已用红蓝笔圈出,老大看看是不是这么回事儿? 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. 手册有中文版的,
CLKOUTEN位的说法的确很奇怪,按照手册的做法在仿真器确实没信号输出,谁有实物可以试试,
还有那个配置好像有两个,
写法两个一样,放在首位的为配置1,另外一个是配置2。 chengzepeng 发表于 2012-9-8 14:54 static/image/common/back.gif
手册有中文版的,
CLKOUTEN位的说法的确很奇怪,按照手册的做法在仿真器确实没信号输出,谁有实物可以试试 ...
用实物测了一下,的确能达到5V 32MHz
仿真看不到......奇怪。 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: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不支持改变占空比)。
挺好用的....... 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了。 nickwolfe 发表于 2012-9-9 15:44 static/image/common/back.gif
〉〉 // 闪存写保护关,PLL关,堆栈溢出复位关,欠压复位低,低压编程关
〉〉 __CONFIG(WRT_OFF &...
不计较耗电的无所谓了的,
再说你的时钟高了程序处理的速度也快了!
如果你根本就不写程序,只要一个时钟那就有点浪费了!{:titter:}
单纯要个时钟的可以用个晶体加个CD4060,
缺点是修改频率输出只能通过更换引脚或晶体,
如果是单片机的话可以按开关切换频率输出! 我只想弱弱的问一句PIC12F1822可以用C语言来写程序吗,因为我不喜欢汇编 我只想弱弱的问一句PIC12F1822可以用C语言来写程序吗,因为我不喜欢汇编 当然可以了。
页:
[1]