PIC12F675 GP4 non funziona


9

Sto usando un PIC12F675 per un progetto e tutto funziona bene tranne una cosa. GP4 non funziona come IO digitale. Ho esaminato molto le configurazioni e il codice, ma non sono riuscito a trovare nulla.

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

Codice:

#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
Non #pragma config FOSC = INTRCCLKdice al PIC di produrre il suo clock su GP4? Non c'è FOSCun'opzione diversa che dovresti usare?
brhans,

@brhans Sì, l'ho notato ora! INTRCCLK fa in modo che il microcontrollore utilizzi il suo orologio interno e lo collega a GP4. Tuttavia, INTRCIO fa la stessa cosa tranne che configura GP4 per essere usato come IO. Grazie per avermelo fatto notare!
Ali Abo Shady,

Risposte:


12

Solo per aggiungere alla risposta corretta di Spehro:

Poiché il microcontrollore che stai utilizzando ha solo 8 pin, devono necessariamente condividere funzionalità per fornire le varie funzionalità di cui il dispositivo è in grado.

Volevo solo fornire una sorta di "roadmap" per aiutare a spiegare come funziona la configurazione.

Consulta il diagramma delle funzioni dei pin nella scheda tecnica pagina 2:

Schema dei pin della scheda tecnica

Noterai che il pin fisico 3 ha almeno cinque funzioni: GP4, AN3,! T1G, OSC2 e CLKOUT. A volte è necessario specificare nella configurazione quale funzione dovrebbe avere il pin. Non è sicuramente sempre chiaro. Trovo utile cercare nel foglio dati riferimenti al registro o alla funzione pin con cui ho riscontrato problemi.

Ecco un estratto da pagina 52 in cui è stata trovata GP4:

Scheda tecnica specifiche FOSC

I microcontrollori molto spesso possono funzionare utilizzando un oscillatore interno se ne hanno uno o da un oscillatore esterno come un cristallo. Inoltre, possono collegare il loro oscillatore interno a un pin per il clock di altri dispositivi. Il registro di configurazione qui ha tre bit ( FOSC) che determinano come questo viene impostato.

Se osservi le due modalità elencate con valori 101e 100, entrambe specificano di utilizzare l'oscillatore interno, ma una delle opzioni collega GP4 al clock, mentre l'altra mantiene la sua funzione di GPIO.

Le costanti definite INTRCCLKe INTRCIOSpehro menzionate dovrebbero riflettere questi valori.


1
Grazie mille, ha funzionato! Ho trovato la tua spiegazione molto utile e ora capisco come funziona.
Ali Abo Shady,

13

Hai configurato il PIC per emettere il segnale di clock interno su GP4 usando

#pragma config FOSC = INTRCCLK

Sostituire INTRCCLK con INTRCIO.


2
Grazie mille, ha funzionato !! Ora capisco come funziona.
Ali Abo Shady,

3
Prego. Un suggerimento: spesso è meglio provare a riprodurre il problema nel programma più semplice possibile. In questo caso un semplice ciclo che copia GP4 su 1 avrebbe mostrato il problema ed evitato tutte le distrazioni nel tuo programma completo.
Spehro Pefhany,

2
Va bene, capito. Lo farò la prossima volta. Grazie ancora.
Ali Abo Shady,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.