PIC12F675 GP4 no funciona

9

Estoy usando un PIC12F675 para un proyecto, y todo funciona bien, excepto una cosa. GP4 no funciona como IO digital. He mirado mucho las configuraciones y el código, pero no pude encontrar nada.

Config:

#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

Código:

#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;
}
Ali Abo Shady
fuente
1
¿No le #pragma config FOSC = INTRCCLKdice al PIC que muestre su reloj en GP4? ¿No hay una FOSCopción diferente que debería estar usando?
brhans
@brhans Sí, ¡me di cuenta de eso ahora! INTRCCLK hace que el microcontrolador use su reloj interno y lo conecta a GP4. Sin embargo, INTRCIO hace lo mismo excepto que configura GP4 para ser usado como IO. ¡Gracias por hacerme notar!
Ali Abo Shady

Respuestas:

12

Solo para agregar a la respuesta correcta de Spehro:

Dado que el microcontrolador que está utilizando tiene solo 8 pines, necesariamente deben compartir la funcionalidad para proporcionar las diversas funciones que el dispositivo es capaz de hacer.

Solo quería proporcionar una especie de "hoja de ruta" para ayudar a explicar cómo funciona la configuración.

Consulte el diagrama de función del pin en la hoja de datos de la página 2:

Diagrama de pin de la hoja de datos

Notarás que el pin físico 3 tiene al menos cinco funciones: GP4, AN3,! T1G, OSC2 y CLKOUT. A veces tiene que especificar en la configuración qué función debe tener el pin. Definitivamente no siempre está claro. Me resulta útil buscar referencias en la hoja de datos para la función de registro o pin con la que tengo problemas.

Aquí hay un extracto de la página 52 en el que se encontró GP4:

Hoja de datos específicos de FOSC

Los microcontroladores a menudo pueden operar utilizando un oscilador interno si tienen uno, o desde un oscilador externo como un cristal. Aún más, pueden conectar su oscilador interno a un pin para sincronizar otros dispositivos. El registro de configuración aquí tiene tres bits ( FOSC) que determinan cómo se configura esto.

Si observa los dos modos enumerados con valores 101y 100, ambos especifican el uso del oscilador interno, pero una de las opciones conecta GP4 al reloj, donde el otro mantiene su función como GPIO.

Las constantes definidas INTRCCLKy INTRCIOSpehro mencionadas deben reflejar estos valores.

JYelton
fuente
1
Muchas gracias, funcionó! Su explicación me pareció muy útil y ahora entiendo cómo funciona.
Ali Abo Shady
13

Ha configurado el PIC para emitir la señal de reloj interna en GP4 usando

#pragma config FOSC = INTRCCLK

Reemplace INTRCCLK con INTRCIO.

Spehro Pefhany
fuente
2
¡Muchas gracias, funcionó! Ahora entiendo cómo funciona.
Ali Abo Shady
3
De nada. Una sugerencia: a menudo es mejor intentar reproducir el problema en el programa más simple posible. En este caso, un simple bucle que copia GP4 a 1 habría mostrado el problema y evitado todas las distracciones en su programa completo.
Spehro Pefhany
2
Muy bien, lo tengo. Lo haré la próxima vez. Gracias de nuevo.
Ali Abo Shady