我无法设法将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;
}
答案 0 :(得分: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微控制器以及一般嵌入式编程的信息的绝佳资源。
答案 1 :(得分:0)
@Michele Giglio,
您发布的代码的意图似乎从最高有效位到最低有效位都经过ADC结果测试。每一位为1,脉冲在GP5上输出,每一位为零,脉冲在GP4上输出。
这是您的while循环,修改后可以执行,如下所述:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<SourceBase, TargetBase>().ConvertUsing(s => s.A == null ? (TargetBase)Mapper.Map<SourceBase, TargetB>(s) : Mapper.Map<SourceBase, TargetA>(s));
cfg.CreateMap<SourceBase, TargetA>().ForMember(d => d.ValueA, o => o.MapFrom(s => s.A.ValueA));
cfg.CreateMap<SourceBase, TargetB>().ForMember(d => d.ValueB, o => o.MapFrom(s => s.B.ValueB));
});