PIC12F675 GP4 không hoạt động


9

Tôi đang sử dụng PIC12F675 cho một dự án và mọi thứ đều hoạt động tốt, ngoại trừ một điều. GP4 không hoạt động như IO kỹ thuật số. Tôi đã xem xét các cấu hình và mã rất nhiều, nhưng không thể tìm thấy bất cứ điều gì.

Cấu hình:

#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

Mã số:

#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
Không #pragma config FOSC = INTRCCLKbảo PIC xuất đồng hồ trên GP4 à? Không có một FOSClựa chọn khác bạn nên sử dụng?
brhans

@brhans Vâng, tôi nhận thấy điều đó ngay bây giờ! INTRCCLK làm cho vi điều khiển sử dụng đồng hồ bên trong của nó và kết nối nó với GP4. Tuy nhiên, INTRCIO thực hiện điều tương tự ngoại trừ cấu hình GP4 được sử dụng làm IO. Cảm ơn bạn đã làm tôi chú ý!
Ali Abo Shady

Câu trả lời:


12

Chỉ cần thêm vào câu trả lời đúng của Spehro:

Vì vi điều khiển bạn đang sử dụng chỉ có 8 chân, nên chúng nhất thiết phải chia sẻ chức năng để cung cấp các tính năng khác nhau mà thiết bị có khả năng.

Tôi chỉ muốn cung cấp một loại "lộ trình" để giúp giải thích cách cấu hình hoạt động.

Kiểm tra sơ đồ chức năng pin trên biểu dữ liệu trang 2:

Sơ đồ chân dữ liệu

Bạn sẽ nhận thấy rằng pin vật lý 3 có ít nhất năm chức năng: GP4, AN3 ,! T1G, OSC2 và CLKOUT. Đôi khi bạn phải xác định trong cấu hình chức năng mà pin nên có. Nó chắc chắn không phải lúc nào cũng rõ ràng. Tôi thấy hữu ích khi tìm kiếm biểu dữ liệu để tham khảo chức năng đăng ký hoặc mã pin mà tôi gặp vấn đề.

Đây là một đoạn trích từ trang 52 mà GP4 được tìm thấy:

Bảng dữ liệu cụ thể FOSC

Các bộ vi điều khiển rất thường có thể hoạt động bằng cách sử dụng bộ tạo dao động bên trong nếu chúng có hoặc từ bộ tạo dao động ngoài như tinh thể. Thậm chí xa hơn, họ có thể kết nối bộ dao động bên trong của mình với một pin để tạo xung nhịp cho các thiết bị khác. Thanh ghi cấu hình ở đây có ba bit ( FOSC) xác định cách thiết lập này.

Nếu bạn nhìn vào hai chế độ được liệt kê với các giá trị 101100cả hai đều chỉ định sử dụng bộ dao động bên trong, nhưng một trong các tùy chọn kết nối GP4 với đồng hồ, trong đó chế độ kia duy trì chức năng của nó là GPIO.

Các hằng số được xác định INTRCCLKINTRCIOSpehro được đề cập sẽ phản ánh các giá trị này.


1
Cảm ơn bạn rất nhiều, nó đã làm việc! Tôi thấy lời giải thích của bạn rất hữu ích và bây giờ tôi hiểu nó hoạt động như thế nào.
Ali Abo Shady

13

Bạn đã cấu hình PIC để xuất tín hiệu đồng hồ bên trong trên GP4 bằng cách sử dụng

#pragma config FOSC = INTRCCLK

Thay thế INTRCCLK bằng INTRCIO.


2
Cảm ơn bạn rất nhiều, nó đã làm việc !! Tôi hiểu bây giờ nó hoạt động như thế nào.
Ali Abo Shady

3
Không có gì. Một gợi ý - tốt hơn hết là cố gắng tái tạo vấn đề trong chương trình đơn giản nhất có thể. Trong trường hợp này, một vòng lặp đơn giản sao chép GP4 thành 1 sẽ cho thấy vấn đề và tránh tất cả những phiền nhiễu trong chương trình đầy đủ của bạn.
Spehro Pefhany

2
Được rồi, hiểu rồi. Lần sau tôi sẽ làm điều đó. Cảm ơn một lần nữa.
Ali Abo Shady
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.