这个 PIC 12F675 配置我缺少啥?

Posted

技术标签:

【中文标题】这个 PIC 12F675 配置我缺少啥?【英文标题】:What am I missing with this PIC 12F675 configuration?这个 PIC 12F675 配置我缺少什么? 【发布时间】:2019-01-30 18:30:18 【问题描述】:

我无法将 GP4 作为数字输出(即使 GP2 也没有设置为 GPIO,所以可能是模拟引脚配置问题?) 我应该在 GP4 和 GP2 上禁用除 TRIS 寄存器之外的所有功能,但似乎并非如此......

这是代码(如果模拟采集是正确的,请不要太介意,因为我正在研究它并且我仍在学习;即使是意大利文的 cmets 也不介意):

// 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; 

【问题讨论】:

这里缺少的一点是缩进,以帮助使这段代码更具可读性。 对不起,我从智能手机上发送的文本文件中复制了它,所有缩进都丢失了。 我稍微管理了一下,但在手机上并不容易 现在看起来好多了,所以我们至少可以看到发生了什么。 【参考方案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 微控制器以及一般嵌入式编程的信息。

【讨论】:

【参考方案2】:

@Michele Giglio,

您发布的代码的意图似乎是从最高有效位到最低有效位测试 ADC 结果。对于每个为 1 的位,在 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); 

     

【讨论】:

非常感谢,但我设法解决了它:)。起初我用我制作的另一个简单程序测试了 Gpio,所以我知道问题出在循环中。所以我修改了它,现在它可以工作了:)

以上是关于这个 PIC 12F675 配置我缺少啥?的主要内容,如果未能解决你的问题,请参考以下文章

这个 WMD 示例缺少啥?

BigQuery 错误消息帮助,我是初学者。表名缺少数据集??我可以尝试啥来解决这个问题?

对于桥接的 Objective-C 方法,这个 Swift 名称宏中缺少啥?

YouTube Data API Insert 方法缺少啥参数

我的远程 RMI 呼叫缺少啥?

我对 boost::mpi::request 缺少啥?测试似乎改变了状态