PIC12F675 GP4 não funciona

9

Estou usando um PIC12F675 para um projeto e tudo funciona bem, exceto uma coisa. GP4 não funciona como E / S digital. Eu olhei muito as configurações e o código, mas não consegui 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
fonte
1
Não #pragma config FOSC = INTRCCLKdiz ao PIC para emitir seu relógio no GP4? Não existe uma FOSCopção diferente que você deva usar?
21919 brhans
@ brhans Sim, eu notei isso agora! O INTRCCLK faz o microcontrolador usar seu relógio interno e o conecta ao GP4. No entanto, o INTRCIO faz a mesma coisa, exceto que configura o GP4 para ser usado como E / S. Obrigado por me fazer notar!
Ali Abo Shady

Respostas:

12

Apenas para adicionar à resposta correta de Spehro:

Como o microcontrolador que você está usando possui apenas 8 pinos, eles necessariamente precisam compartilhar a funcionalidade para fornecer os vários recursos de que o dispositivo é capaz.

Eu só queria fornecer uma espécie de "roteiro" para ajudar a explicar como a configuração funciona.

Confira o diagrama de funções dos pinos na página 2 da folha de dados :

Diagrama de pinos da folha de dados

Você notará que o pino físico 3 tem pelo menos cinco funções: GP4, AN3,! T1G, OSC2 e CLKOUT. Às vezes, você precisa especificar na configuração qual função o pino deve ter. Definitivamente, nem sempre é claro. Acho útil pesquisar na folha de dados por referências ao registro ou à função de pinos com os quais estou tendo problemas.

Aqui está um trecho da página 52, no qual o GP4 foi encontrado:

Especificações técnicas do FOSC

Os microcontroladores muitas vezes podem operar usando um oscilador interno, se houver, ou a partir de um oscilador externo, como um cristal. Ainda mais, eles podem conectar seu oscilador interno a um pino para sincronizar outros dispositivos. O registro de configuração aqui possui três bits ( FOSC) que determinam como isso é configurado.

Se você observar os dois modos listados com valores 101e 100, ambos especificam o uso do oscilador interno, mas uma das opções conecta o GP4 ao relógio, onde o outro mantém sua função como GPIO.

As constantes definidas INTRCCLKe INTRCIOSpehro mencionadas devem refletir esses valores.

JYelton
fonte
1
Muito obrigado, funcionou! Achei sua explicação muito útil e agora entendo como ela funciona.
Ali Abo Shady
13

Você configurou o PIC para emitir o sinal do relógio interno no GP4 usando

#pragma config FOSC = INTRCCLK

Substitua INTRCCLK por INTRCIO.

Spehro Pefhany
fonte
2
Muito obrigado, funcionou !! Eu entendo agora como isso funciona.
Ali Abo Shady
3
De nada. Uma sugestão - geralmente é melhor tentar reproduzir o problema no programa mais simples possível. Nesse caso, um simples loop de cópia do GP4 para 1 teria mostrado o problema e evitado todas as distrações em seu programa completo.
Spehro Pefhany 12/07/19
2
Tudo bem, entendi. Eu farei isso na próxima vez. Obrigado novamente.
Ali Abo Shady