PIC12F675 GP4 не работает

9

Я использую PIC12F675 для проекта, и все работает отлично, кроме одной вещи. GP4 не работает как цифровой IO. Я много смотрел на конфиги и код, но ничего не смог найти.

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

Код:

#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
не #pragma config FOSC = INTRCCLK говорит PIC выводить свои часы на GP4? Нет ли другого FOSCварианта, который вы должны использовать?
brhans
@brhans Да, я заметил это сейчас! INTRCCLK заставляет микроконтроллер использовать свои внутренние часы и подключает его к GP4. Однако INTRCIO делает то же самое, за исключением того, что настраивает GP4 для использования в качестве IO. Спасибо, что заставили меня заметить!
Али Або Шейди

Ответы:

12

Просто чтобы добавить к правильному ответу Спехро:

Поскольку используемый вами микроконтроллер имеет только 8 выводов, они обязательно должны иметь общие функции, чтобы обеспечить различные функции, которые устройство может использовать.

Я просто хотел предоставить своего рода «дорожную карту», ​​чтобы помочь объяснить, как работает конфигурация.

Посмотрите функциональную диаграмму контактов на странице технических данных 2:

Таблица выводов

Вы заметите, что физический вывод 3 имеет как минимум пять функций: GP4, AN3,! T1G, OSC2 и CLKOUT. Иногда в конфигурации необходимо указать, какую функцию должен иметь пин-код. Это точно не всегда понятно. Я считаю полезным поискать в таблице данных ссылки на регистр или функцию вывода, с которыми у меня возникают проблемы.

Вот выдержка из страницы 52, на которой был найден GP4:

Спецификация FOSC специфика

Микроконтроллеры очень часто могут работать с использованием внутреннего генератора, если он у него есть, или от внешнего генератора, такого как кристалл. Более того, они могут подключить свой внутренний генератор к контакту для синхронизации других устройств. Регистр конфигурации здесь имеет три бита ( FOSC), которые определяют, как это будет настроено.

Если вы посмотрите на два режима, перечисленных со значениями 101и 100, они оба указывают на использование внутреннего генератора, но один из вариантов соединяет GP4 с часами, где другой поддерживает свою функцию как GPIO.

Определенные константы INTRCCLKи INTRCIOупомянутые Spehro должны отражать эти значения.

JYelton
источник
1
Большое спасибо, это сработало! Я нашел ваше объяснение очень полезным, и теперь я понимаю, как оно работает.
Али Або Шейди
13

Вы настроили PIC для вывода внутреннего тактового сигнала на GP4, используя

#pragma config FOSC = INTRCCLK

Заменить INTRCCLK на INTRCIO.

Спехро Пефхани
источник
2
Большое спасибо, это сработало !! Теперь я понимаю, как это работает.
Али Або Шейди
3
Пожалуйста. Предложение - часто лучше попытаться воспроизвести проблему в самой простой программе. В этом случае простой цикл копирования GP4 в 1 показал бы проблему и позволил бы избежать всех отвлекающих факторов в вашей полной программе.
Спехро Пефхани
2
Хорошо, понял. Я сделаю это в следующий раз. Еще раз спасибо.
Али Або Шейди