这个PIC 12F675配置缺少什么?
即使GP2没有设置为GPIO,我也无法将GP4设置为数字输出,所以可能是模拟引脚配置问题? 我应该在GP4和GP2上禁用除TRIS寄存器之外的所有功能,但看起来不是这样 这是代码,如果模拟采集是正确的,不要太在意,因为我正在研究它,我还在学习;即使是意大利语的评论也不要介意:这个PIC 12F675配置缺少什么?,c,microcontroller,pic,C,Microcontroller,Pic,即使GP2没有设置为GPIO,我也无法将GP4设置为数字输出,所以可能是模拟引脚配置问题? 我应该在GP4和GP2上禁用除TRIS寄存器之外的所有功能,但看起来不是这样 这是代码,如果模拟采集是正确的,不要太在意,因为我正在研究它,我还在学习;即使是意大利语的评论也不要介意: // PIC12F675 Configuration Bit Settings // 'C' source line config statements // #pragma config FOSC = INTRCIO
// 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;
}
我不太确定您的输出是否有任何问题,请仔细检查,它们看起来配置正确 我对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的按位AND,它总是100%保证为0,所以GP4永远不会切换,您也可以删除这段代码
我想这就是GP4不起作用的原因
还可以看一看-这是一个关于PIC和AVR微控制器以及嵌入式编程的信息资源 @Michele Giglio
您发布的代码的目的似乎是从最高有效位到最低有效位测试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);
}
}
这里缺少的一件事是缩进,它有助于提高代码的可读性。很抱歉,我从智能手机上发送的文本文件中复制了缩进,但所有缩进都丢失了。我做了一点,但在MobileLook中并不容易。现在好多了,所以我们至少可以看到发生了什么。非常感谢,但我还是设法解决了它:。起初,我用自己编写的另一个简单程序测试了Gpio,因此我发现问题在循环中。所以我修改了它,现在它可以工作了: