9 votos

PIC12F675 GP4 no funciona

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

Configurar:

#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;
}

1 votos

No lo hace #pragma config FOSC = INTRCCLK ¿dirle al PIC que emita su reloj en la GP4? ¿No hay una FOSC opción que debería utilizar?

0 votos

@brhans ¡Sí, ya me he dado cuenta! INTRCCLK hace que el microcontrolador utilice su reloj interno, y lo conecta a GP4. Sin embargo, INTRCIO hace lo mismo excepto que configura la GP4 para ser usada como IO. ¡Gracias por hacerme notar!

13voto

Spehro Pefhany Puntos 90994

Has configurado el PIC para que emita la señal de reloj interno en GP4 mediante

#pragma config FOSC = INTRCCLK

Sustituye INTRCCLK por INTRCIO.

2 votos

¡¡Muchas gracias, ha funcionado!! Ahora entiendo cómo funciona.

3 votos

De nada. Una sugerencia: a menudo es mejor intentar reproducir el problema en el programa más sencillo posible. En este caso un simple bucle copiando GP4 a 1 habría mostrado el problema y habría evitado todas las distracciones de tu programa completo.

2 votos

De acuerdo, lo tengo. Lo haré la próxima vez. Gracias de nuevo.

12voto

Anders Hansson Puntos 179

Sólo para añadir a la respuesta correcta de Spehro:

Dado que el microcontrolador que está utilizando sólo tiene 8 pines, necesariamente deben compartir la funcionalidad para proporcionar las diversas características que el dispositivo es capaz de hacer.

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

Consulte el diagrama de funciones de las clavijas en la hoja de datos página 2:

Datasheet pin diagram

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

Este es un extracto de la página 52 en la que se encontró el GP4:

Datasheet FOSC specifics

Los microcontroladores suelen funcionar con un oscilador interno, si lo tienen, o con un oscilador externo, como un cristal. Ademá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 se observan los dos modos enumerados con valores 101 y 100 , ambas especifican utilizar el oscilador interno, pero una de las opciones conecta GP4 al reloj, mientras que la otra mantiene su función como GPIO.

Las constantes definidas INTRCCLK y INTRCIO El Spehro mencionado debe reflejar estos valores.

1 votos

Muchas gracias, ¡ha funcionado! Me ha resultado muy útil tu explicación y ahora entiendo cómo funciona.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X