Microchip PIC16F1619实验:双速时钟启动

分享到:

大家好,我是混森蓝兽,感谢社区给我提供这次pic16系列单片机试用的机会!我是初学者,第一次接触这个系列的,我将把我学习的过程记录下来,希望以后这些记录能对像我这样的初学者有用。

开篇我先大概的说一下双数启动是啥意思吧。就这么说,dalao出场,自带收割战场的蓝火加特林,战力很强。但是有一个问题,就是越厉害的武器越是会有一段出场的冷却缓冲时间。在这段缓冲时间里,dalao是没啥输出的,所以需要前面有小弟帮忙砍人挡枪。待缓冲结束,小弟退场,dalao开启无双收割模式,大杀四方。
 
       接下来是正题了,说说我们这个PIC16的双速启动模式。
 
       当振荡器模块被配置为HS模式时,系统使用外部晶振提供的频率作为系统时钟。但是晶振起振与代码执行之间是存在延时的,在这段延时期间,单片机是无法执行任何程序的。HS模式下,上电之后晶振起振,提供时钟信号,但是这个信号不能马上被系统使用,因为这时候的时钟信号可能还不大稳定,所以需要等待一段稳定时间,振荡器才能用作系统时钟源。振荡器起振定时器(OST)的作用就在这里,HS模式OST会被使能接收到晶振的振荡信号后它会开始计数,当计数到1024次振荡时,稳定时间已过,外部晶振开始作用于系统时钟源。
 
       对于一些需要快速启动的系统,这段延时可能会是一个比较让人头疼的问题,例如需要经常休眠然后需要快速启动的系统,这段延时启动会降低系统的反应敏捷度,空等延时也是浪费了无意义的电量损耗。双速时钟启动模式,则可以解决这个问题。
双速时钟启动简单来说,就是在启动延时这段时间里,启动内部振荡器来提供时钟信号,程序上电就能跑,然后当1024次震荡周期过了之后,切换回外部晶振提供的时钟信号。两者合作,度过这段虚无的时光。
 
1.双速启动顺序
      1. 从上电复位或休眠中唤醒。
       2. 使用内部振荡器以OSCCON寄存器的IRCF<3:0>位设置的频率(默认只500 kHz)开始执行指令。
       3. OST使能,计数1024个时钟周期。
       4. OST超时,等待内部振荡器下降沿出现。
       5. OSCSTAT寄存器的OSTS位置1(根据此标志位判断是外部时钟源运行,还是内部振荡器运行)。
       6. 系统时钟保持为低电平,直到新时钟下一个下降沿出现(HS模式)。
       7. 系统时钟切换到外部时钟源。
2.通过以下设置来配置双速启动模式:
       1.配置字CONFIG1的bit 12(IESO)=1,使能内/外部时钟切换模式
       2.SCS(在OSCCON寄存器中)= 00,由配置字中的FOSC<1:0>决定时钟来源。
       3. 配置字中的FOSC<2:0>位被配置HS模式,即FOSC<2:0> = 010。

3.实验代码

#include <htc.h>

#include <pic16f1619.h>
#define _XTAL_FREQ  500000 
 
// CONFIG1
#pragma config FOSC = HS        // Oscillator Selection Bits (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switch Over (Internal External Switch Over mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
 
void main()
{
    OSCCON = 0x38; //0011 1000 时钟初始化
    PORTA |= 0x04;
    TRISA &= 0xfb; 
    while(1)
    {
            RA2=1;
            __delay_ms(100);
             RA2=0;
            __delay_ms(100);
    }
}

不过,事实上虽然有代码了,但是没办法进入双速时钟模式,因为板子根本就没有外部晶振。将工程编译烧录之后,确实可以看到D6在闪烁,因为muc以配置的500KHz时钟在运行。dalao不存在的,只有挡刀的小兵。

115125uh8jsxojaujowjjl

继续阅读
简述Microchip PIC16F87XA与PIC16F88X的五点不同之处

除了配备中文版数据手册以外,PIC16F88X系列单片机较之前的PIC16F87XA系列有了不少的改进,以PIC16F877A与PIC16F887粗略对比发现有以下几点不同

基于Microchip Curiosity PIC32MX470的温湿度计+RTOS+GUI:第一步,点灯

首先下载官方的开发工具,包括MPLAB、XC32、Harmony,但是要想在MPLAB中创建Harmony的工程,得按照help_harmony_vol_I.pdf中的说明,先在MPLAB中安装harmony的plug-in

基于Microchip Curiosity PIC32MX470的温湿度计+RTOS+GUI:第二步,Harmony

uCOS-III跑起来了,但是温湿度计和OLED还没到,打算用这段空窗期把串口调出来,顺便熟悉一下这块板卡的外设。

基于Microchip Curiosity PIC32MX470的温湿度计+RTOS+GUI:第四步,点灯

温湿度可以正常读取了,接下来就是调SPI和OLED显示,尝试将数据通过OLED屏显示出来。

基于Microchip Curiosity PIC32MX470的温湿度计+RTOS+GUI:温湿度计

串口可用之后,很多debug信息就可以通过串口打印输出了,所以我打算先把读到的温湿度数据通过串口打印出来,然后再调OLED显示,之后再将数据通过OLED屏显示,一步一步来。

©2019 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss