PIC12F675 GP4 不工作

电器工程 图片 C 嵌入式 编程
2022-01-21 19:50:26

我在一个项目中使用了PIC12F675,除了一件事,一切都很好。GP4 不能用作数字 IO。我已经查看了很多配置和代码,但找不到任何东西。

配置:

#pragma config FOSC = INTRCCLK
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = OFF
#pragma config BOREN = ON
#pragma config CP = OFF
#pragma config CPD = OFF

代码:

#include <xc.h>
#include <math.h>
#include "config.h"
#define _XTAL_FREQ 4000000

void delay(unsigned int freq){
    for(int i = 0; i < (int)freq; i++){
        __delay_ms(1);
    }
}

void dClock(unsigned int freq){
    GPIO1 = 1;
    delay(freq);
    GPIO1 = 0;
    delay(freq);
}

void InitADC(){
    ANSEL = 0x11;
    ADCON0 = 0b10000001;
    CMCON = 0x7;
    VRCON = 0;
}

unsigned int GetADCValue(){
    ADCON0 = 0b10000011;
    while(GO_nDONE);
    return (ADRESH << 8) + ADRESL;
}

void main(void) {
    TRISIO0 = 1; //analog input
    TRISIO1 = 0; //output
    TRISIO2 = 0; //indication
    TRISIO3 = 1; //mode
    TRISIO4 = 0; //halt
    TRISIO5 = 1; //pulse_button

    char pressed = 0;
    GPIO1 = 0;

    InitADC();

    while(1){
        if(GPIO4 == 0){
            if(GPIO3 == 0){
                GPIO2 = 1;
                unsigned int freq = GetADCValue();
                dClock(freq);
            }
            else{
                GPIO2 = 0;
                if(GPIO5 == 1 && pressed == 0){
                    GPIO1 = 1;
                    __delay_ms(50);
                    GPIO1 = 0;
                    pressed = 1;
                }
                else if(GPIO5 == 0 && pressed == 1){
                    pressed = 0;
                }
            }

        }
    }
    return;
}
2个回答

您已将 PIC 配置为使用 GP4 输出内部时钟信号

#pragma config FOSC = INTRCCLK

用 INTRCIO 替换 INTRCCLK。

只是为了添加到 Spehro 的正确答案:

由于您使用的微控制器只有 8 个引脚,因此它们必须共享功能以提供设备能够提供的各种功能。

我只是想提供一种“路线图”来帮助解释配置是如何工作的。

查看数据表第 2 页上的引脚功能图:

数据表引脚图

您会注意到物理引脚 3 至少有五个功能:GP4、AN3、!T1G、OSC2 和 CLKOUT。有时您必须在配置中指定引脚应具有的功能。这绝对不是很清楚。我发现在数据表中搜索对我遇到问题的寄存器或引脚功能的引用很有帮助。

这是发现 GP4 的第 52 页的摘录:

数据表 FOSC 细节

微控制器通常可以使用内部振荡器(如果有的话)或使用外部振荡器(例如晶体)进行操作。更进一步,他们可以将其内部振荡器连接到一个引脚,以便为其他设备提供时钟。此处的配置寄存器具有三个位 ( FOSC),用于确定如何设置。

101如果您查看以和列出的两种模式100,它们都指定使用内部振荡器,但其中一个选项将 GP4 连接到时钟,而另一个选项保持其作为 GPIO 的功能。

定义的常量INTRCCLKINTRCIO提到的 Spehro 应该反映这些值。