PIC12F675 GP4 tidak berfungsi

9

Saya menggunakan PIC12F675 untuk sebuah proyek, dan semuanya berfungsi dengan baik kecuali satu hal. GP4 tidak berfungsi sebagai IO digital. Saya telah melihat banyak konfigurasi dan kode, tetapi tidak dapat menemukan apa pun.

Konfigurasi:

#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

Kode:

#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
sumber
1
Tidak #pragma config FOSC = INTRCCLKmemberi tahu PIC untuk mengeluarkan jamnya di GP4? Apakah tidak ada FOSCopsi lain yang harus Anda gunakan?
brhans
@brhans Ya, saya perhatikan itu sekarang! INTRCCLK membuat mikrokontroler menggunakan jam internal, dan menghubungkannya ke GP4. Namun, INTRCIO melakukan hal yang sama kecuali mengonfigurasi GP4 untuk digunakan sebagai IO. Terima kasih telah membuat saya memperhatikan!
Ali Abo Shady

Jawaban:

12

Hanya untuk menambah jawaban Spehro yang benar:

Karena mikrokontroler yang Anda gunakan hanya memiliki 8 pin, mereka harus berbagi fungsionalitas untuk menyediakan berbagai fitur yang dapat dilakukan perangkat.

Saya hanya ingin memberikan semacam "peta jalan" untuk membantu menjelaskan cara kerja konfigurasi.

Lihat diagram fungsi pin pada lembar data halaman 2:

Diagram pin lembar data

Anda akan melihat bahwa pin fisik 3 memiliki setidaknya lima fungsi: GP4, AN3,! T1G, OSC2, dan CLKOUT. Kadang-kadang Anda harus menentukan dalam konfigurasi fungsi yang harus dimiliki pin. Jelas tidak selalu jelas. Saya merasa terbantu untuk mencari lembar data untuk referensi ke fungsi register atau pin yang saya alami masalah.

Berikut kutipan dari halaman 52 tempat GP4 ditemukan:

Spesifikasi lembar data FOSC

Mikrokontroler sangat sering dapat beroperasi menggunakan osilator internal jika mereka memilikinya, atau dari osilator eksternal seperti kristal. Lebih jauh lagi, mereka dapat menghubungkan osilator internal mereka ke pin untuk clocking perangkat lain. Register konfigurasi di sini memiliki tiga bit ( FOSC) yang menentukan bagaimana pengaturan ini.

Jika Anda melihat dua mode yang tercantum dengan nilai 101dan 100, keduanya menentukan untuk menggunakan osilator internal, tetapi salah satu opsi menghubungkan GP4 ke jam, di mana yang lain mempertahankan fungsinya sebagai GPIO.

Konstanta yang didefinisikan INTRCCLKdan INTRCIOSpehro yang disebutkan harus mencerminkan nilai-nilai ini.

JYelton
sumber
1
Terima kasih banyak, itu berhasil! Saya menemukan penjelasan Anda sangat membantu dan sekarang saya mengerti cara kerjanya.
Ali Abo Shady
13

Anda telah mengkonfigurasi PIC untuk mengeluarkan sinyal jam internal pada GP4 menggunakan

#pragma config FOSC = INTRCCLK

Ganti INTRCCLK dengan INTRCIO.

Spehro Pefhany
sumber
2
Terima kasih banyak, itu berhasil !! Sekarang saya mengerti cara kerjanya.
Ali Abo Shady
3
Sama-sama. Saran - sering kali lebih baik untuk mencoba mereproduksi masalah dalam program sesederhana mungkin. Dalam hal ini, penyalinan loop sederhana GP4 ke 1 akan menunjukkan masalah dan menghindari semua gangguan dalam program lengkap Anda.
Spehro Pefhany
2
Baiklah, mengerti. Saya akan melakukannya lain kali. Terima kasih lagi.
Ali Abo Shady