那我这个PIC 12F675配置不见了?

问题描述 投票:0回答:2

我不能设法得到如GP4数字输出(甚至GP2没有设置为GPIO,所以可能它是一个模拟引脚配置问题?)我应该禁用所有功能,但TRIS寄存器,在GP4和GP2的,但它似乎不那么...

这是代码(不要太介意,如果模拟量采集是对的,因为我的工作就可以了,我还在学习,不介意的话,即使是在意大利的评论):

// PIC12F675 Configuration Bit Settings // 'C' source line config statements // 

#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN) 
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) 
#pragma config PWRTE = OFF // Power-Up Timer Enable bit (PWRT disabled) 
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is GP3) 
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) 
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) 

#define _XTAL_FREQ 4000000 
#include <xc.h> 

/* ADCON serve, tra l'altro a selezionare il canale analogico da convertire in digitale * e, quindi, se si hanno piu' canali in un ciclo, da convertire, bisogna agire sempre * su questo registro */

int i = 0;
int j = 0;
unsigned short int A = 0;

void main(void) { 
    OSCCAL= 0x80; 
    CMCON = 0b00000111; 
    T1CON = 0b00000100; 
    OPTION_REG = 0b11000000; 

    // TRISIO = 0b001011;
    TRISIObits.TRISIO0 = 1;
    TRISIObits.TRISIO1 = 1;
    TRISIObits.TRISIO2 = 0;
    TRISIObits.TRISIO3 = 1;
    TRISIObits.TRISIO4 = 0;
    TRISIObits.TRISIO5 = 0; 

    ADCON0 = 0x00; 
    ANSEL = 0b00000011; // analog and digital channel selection 

    while(1) { 

        ADCON0 = 0b10000011; // select channel and start AD conversion cycle 
        __delay_ms(10); 

        A = ((ADRESH <<8)+ ADRESL);

        for(i=10;i>=0;i--) { // controlla i singoli bit 

            j = A >> i; 
            if (j & 1) { // se = 1, manda un segnale sul canale GP5
                GPIObits.GP5 = 1; 
                __delay_ms(250);
                GPIObits.GP5 = 0; 
                __delay_ms(250); 
            } 

            if (j & 0) { // se = 1, manda un segnale sul canale GP4
                GPIObits.GP4 = 1; __delay_ms(250);
                GPIObits.GP4 = 0; __delay_ms(250);
            }

            __delay_ms(1000); 

        } 
    }

    return; 
}
c microcontroller pic
2个回答
1
投票

我不是很确定你有什么问题与您的输出,双重检查,他们看起来是正确配置。

我用if语句百思不得其解了一点:

if (j & 0) { // se = 1, manda un segnale sul canale GP4
                GPIObits.GP4 = 1; __delay_ms(250);
                GPIObits.GP4 = 0; __delay_ms(250);
            }

这个if语句是做位与0和J,这始终是100%保证是0,因此GP4永远不会切换,你可能只是以及删除此代码。

我想这就是为什么GP4不工作


也看看https://www.microforum.cc/ - 对PIC和AVR微控制器和一般信息嵌入式编程一个很好的资源。


0
投票

@Michele吉廖,

代码的您发布的意图似乎是一个在ADC结果从最显著位测试,以最低显著位。对于是一个各比特的脉冲是在GP5输出,因为这是一个零的脉冲是在GP4输出每一位。

这是修改,以描述执行while循环:

while(1) { 

    ADCON0 = 0b10000011; // select channel and start AD conversion cycle 
    __delay_ms(10); 

    A = ((ADRESH <<8)+ ADRESL);

    for(i=(1<<9);i!=0;i>>=1) { // controlla i singoli bit 

        if ((j & i) == 1) { // se = 1, manda un segnale sul canale GP5
            GPIObits.GP5 = 1; 
            __delay_ms(250);
            GPIObits.GP5 = 0; 
            __delay_ms(250); 
        } 

        if ((j & i) == 0) { // se = 1, manda un segnale sul canale GP4
            GPIObits.GP4 = 1;
            __delay_ms(250);
            GPIObits.GP4 = 0;
            __delay_ms(250);
        }

        __delay_ms(1000); 

    } 
}
© www.soinside.com 2019 - 2024. All rights reserved.