PIC12F675 GP4不起作用


9

我正在为一个项目使用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;
}

1
不会#pragma config FOSC = INTRCCLK告诉PIC在GP4上输出时钟吗?FOSC您应该使用其他选项吗?
brhans

@brhans是的,我现在注意到了!INTRCCLK使微控制器使用其内部时钟,并将其连接到GP4。但是,INTRCIO所做的相同,只是将GP4配置为用作IO。谢谢您通知我!
Ali Abo Shady

Answers:


12

只是为了补充Spehro的正确答案:

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

我只是想提供一种“路线图”,以帮助解释配置的工作原理。

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

数据表引脚图

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

以下是第52页的摘录,在该页上找到了GP4:

FOSC详细数据表

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

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

提到的定义的常数INTRCCLKINTRCIOSpehro应该反映这些值。


1
非常感谢,它奏效了!我发现您的解释非常有帮助,现在我知道了它的工作原理。
阿里·阿波·谢迪

13

您已将PIC配置为使用以下命令在GP4上输出内部时钟信号

#pragma config FOSC = INTRCCLK

将INTRCCLK替换为INTRCIO。


2
非常感谢,它奏效了!!我现在知道它是如何工作的。
Ali Abo Shady

3
别客气。一个建议-尝试以最简单的程序重现该问题通常会更好。在这种情况下,将GP4复制到1进行简单循环就可以解决问题,并避免整个程序混乱。
Spehro Pefhany

2
好,知道了 下次我会做。再次感谢。
Ali Abo Shady
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.