PIC12F675 GP4 funktioniert nicht

9

Ich verwende einen PIC12F675 für ein Projekt, und bis auf eine Sache funktioniert alles einwandfrei . GP4 funktioniert nicht als digitales E / A. Ich habe mir die Konfigurationen und den Code viel angesehen, aber nichts gefunden.

Konfiguration:

#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
quelle
1
Weist #pragma config FOSC = INTRCCLKder PIC nicht an, seine Uhr auf GP4 auszugeben? Gibt es nicht eine andere FOSCOption, die Sie verwenden sollten?
Brhans
@brhans Ja, das habe ich jetzt bemerkt! INTRCCLK veranlasst den Mikrocontroller, seine interne Uhr zu verwenden, und verbindet ihn mit GP4. INTRCIO macht jedoch dasselbe, außer dass es GP4 so konfiguriert, dass es als E / A verwendet wird. Vielen Dank, dass Sie mich darauf aufmerksam gemacht haben!
Ali Abo Shady

Antworten:

12

Nur um Spehros richtige Antwort zu ergänzen:

Da der von Ihnen verwendete Mikrocontroller nur 8 Pins hat, müssen diese unbedingt die Funktionalität gemeinsam nutzen, um die verschiedenen Funktionen bereitzustellen, die das Gerät unterstützt.

Ich wollte nur eine Art "Roadmap" bereitstellen, um zu erklären, wie die Konfiguration funktioniert.

Überprüfen Sie das Pin-Funktionsdiagramm auf dem Datenblatt Seite 2:

Datenblatt Pin-Diagramm

Sie werden feststellen, dass der physische Pin 3 mindestens fünf Funktionen hat: GP4, AN3 ,! T1G, OSC2 und CLKOUT. Manchmal müssen Sie in der Konfiguration angeben, welche Funktion der Pin haben soll. Es ist definitiv nicht immer klar. Ich finde es hilfreich, das Datenblatt nach Verweisen auf das Register oder die Pin-Funktion zu durchsuchen, mit denen ich Probleme habe.

Hier ist ein Auszug aus Seite 52, auf dem GP4 gefunden wurde:

Datenblatt FOSC-Besonderheiten

Mikrocontroller können sehr oft mit einem internen Oszillator (falls vorhanden) oder mit einem externen Oszillator wie einem Kristall betrieben werden. Darüber hinaus können sie ihren internen Oszillator an einen Pin anschließen, um andere Geräte zu takten. Das Konfigurationsregister hat hier drei Bits (FOSC ), die bestimmen, wie dies eingerichtet wird.

Wenn Sie sich die beiden mit den Werten 101und aufgelisteten Modi ansehen100 , geben beide die Verwendung des internen Oszillators an, aber eine der Optionen verbindet GP4 mit der Uhr, wobei die andere ihre Funktion als GPIO beibehält.

Die genannten definierten Konstanten INTRCCLKund INTRCIOSpehro sollten diese Werte widerspiegeln.

JYelton
quelle
1
Vielen Dank, es hat funktioniert! Ich fand Ihre Erklärung sehr hilfreich und verstehe jetzt, wie es funktioniert.
Ali Abo Shady
13

Sie haben den PIC so konfiguriert, dass er das interne Taktsignal auf GP4 mit ausgibt

#pragma config FOSC = INTRCCLK

Ersetzen Sie INTRCCLK durch INTRCIO.

Spehro Pefhany
quelle
2
Vielen Dank, es hat funktioniert !! Ich verstehe jetzt, wie es funktioniert.
Ali Abo Shady
3
Bitte. Ein Vorschlag - oft ist es besser, das Problem in einem möglichst einfachen Programm zu reproduzieren. In diesem Fall hätte eine einfache Schleife, die GP4 nach 1 kopiert, das Problem gezeigt und alle Ablenkungen in Ihrem vollständigen Programm vermieden.
Spehro Pefhany
2
Okay, verstanden. Ich werde das nächste Mal tun. Danke noch einmal.
Ali Abo Shady