PIC12F675 GP4 ne fonctionne pas

9

J'utilise un PIC12F675 pour un projet, et tout fonctionne bien sauf une chose. GP4 ne fonctionne pas comme E / S numérique. J'ai beaucoup regardé les configs et le code, mais je n'ai rien trouvé.

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

Code:

#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
la source
1
Ne #pragma config FOSC = INTRCCLKdit pas au PIC de sortir son horloge sur GP4? N'y a-t-il pas une FOSCoption différente que vous devriez utiliser?
brhans
@brhans Oui, je l'ai remarqué maintenant! INTRCCLK oblige le microcontrôleur à utiliser son horloge interne et le connecte à GP4. Cependant, INTRCIO fait la même chose, sauf qu'il configure GP4 pour être utilisé comme E / S. Merci de m'avoir fait remarquer!
Ali Abo Shady

Réponses:

12

Juste pour ajouter à la bonne réponse de Spehro:

Étant donné que le microcontrôleur que vous utilisez n'a que 8 broches, ils doivent nécessairement partager des fonctionnalités pour fournir les différentes fonctionnalités dont l'appareil est capable.

Je voulais juste fournir une sorte de "feuille de route" pour aider à expliquer comment fonctionne la configuration.

Consultez le diagramme de fonction des broches sur la page 2 de la fiche technique :

Diagramme des broches de la fiche technique

Vous remarquerez que la broche physique 3 a au moins cinq fonctions: GP4, AN3,! T1G, OSC2 et CLKOUT. Parfois, vous devez spécifier dans la configuration quelle fonction la broche doit avoir. Ce n'est certainement pas toujours clair. Je trouve utile de rechercher dans la fiche technique des références à la fonction de registre ou de broche avec laquelle j'ai des problèmes.

Voici un extrait de la page 52 sur lequel GP4 a été trouvé:

Fiche technique FOSC

Les microcontrôleurs peuvent très souvent fonctionner à l'aide d'un oscillateur interne s'ils en ont un, ou à partir d'un oscillateur externe tel qu'un cristal. Encore plus, ils peuvent connecter leur oscillateur interne à une broche pour cadencer d'autres appareils. Le registre de configuration a ici trois bits ( FOSC) qui déterminent comment cela est mis en place.

Si vous regardez les deux modes répertoriés avec les valeurs 101et 100, ils spécifient tous deux d'utiliser l'oscillateur interne, mais l'une des options connecte GP4 à l'horloge, où l'autre conserve sa fonction de GPIO.

Les constantes définies INTRCCLKet INTRCIOSpehro mentionnées doivent refléter ces valeurs.

JYelton
la source
1
Merci beaucoup, ça a marché! J'ai trouvé votre explication très utile et je comprends maintenant comment cela fonctionne.
Ali Abo Shady
13

Vous avez configuré le PIC pour émettre le signal d'horloge interne sur GP4 en utilisant

#pragma config FOSC = INTRCCLK

Remplacez INTRCCLK par INTRCIO.

Spehro Pefhany
la source
2
Merci beaucoup, ça a fonctionné !! Je comprends maintenant comment cela fonctionne.
Ali Abo Shady
3
Je vous en prie. Une suggestion - il est souvent préférable d'essayer de reproduire le problème dans le programme le plus simple possible. Dans ce cas, une simple boucle copiant GP4 vers 1 aurait montré le problème et évité toutes les distractions dans votre programme complet.
Spehro Pefhany
2
D'accord, j'ai compris. Je le ferai la prochaine fois. Merci encore.
Ali Abo Shady