我在移植我之前为 PIC10F200 撰写的程序时遇到了障碍(请参阅此related SO question)。原来需要换掉板上的另一个组件需要通过I2C进行通信,所以我正在将程序移植到 PIC12LF1552 。
这是当前程序的工作方式(至少在PIC10F200上)
T0CKI
引脚(在PIC12LF1552的情况下,RA2
)已通过外部上拉电阻上拉至VDD(~3.3V),该按钮已连接至接地和引脚,将T0CKI的信号拉向LO。TMR0
增量(据说)PORTAbits.RA2
结算的时间段之后,state
递增switch
阻止移动以打开外部LED,在先前版本的电路中,这也将激活此引脚所连接的IC。 我已经通过使用MPLAB X的模拟器重新验证了此功能,其中我将T0CKI(再次,配置为RA2,再次由模拟器确认)发送到HI,然后到LO来使用TMR0代码。 state
递增,每个人都很高兴。
当我编程使用连接到我的PICkit3的MPLAB X或附带的独立编程器MPLAB IPE时,程序无法按预期工作。我已重新启用验证了所有连接,编程端口按原样连接。按钮安装在右侧销钉上。测试LED连接到右侧引脚。目前我们没有考虑任何I2C通信,我只是想看看我的状态LED(RA4
)切换。
我知道现在我已经转换到中档PIC,我可以使用中断功能,但目前我想得到我所知道的更简单的设备上工作的当前功能。< / p>
我的问题是,为什么这个程序在编程到PIC12LF1552时不能正常工作,但是在PIC12LF1552模拟器上运行并且它以前的版本在PIC10F200上工作(编程和模拟)?
先谢谢大家!
以下是整个计划:
#if defined(__XC)
#include <xc.h> /* XC8 General Include File */
#endif
#include <stdint.h> /* For uint8_t definition */
#include <stdbool.h> /* For true/false definition */
#include <stdio.h>
#include <stdlib.h>
/******************************************************************************/
/* Defines */
/******************************************************************************/
//#define SYS_FREQ 16000000L
//#define FCY SYS_FREQ/4
#define _XTAL_FREQ 500000
__CONFIG
(
MCLRE_ON &
CP_OFF &
BOREN_OFF &
WDTE_OFF &
PWRTE_OFF &
FOSC_INTOSC
);
void main(void)
{
TRISA = 0b101111;
OPTION_REG = 0b01111111;
APFCONbits.SDSEL = 1;
unsigned char state = 0;
unsigned char count = 0;
while(1)
{
switch (state)
{
case 0: // IDLE/OFF
if (LATAbits.LATA4) LATAbits.LATA4 = 0;
break;
case 1: // ON
if (!LATAbits.LATA4) LATAbits.LATA4 = 1;
break;
case 2: // BLINK (slow)
LATAbits.LATA4 = !LATAbits.LATA4;
__delay_ms(100);
break;
case 3: // BLINK (fast)
LATAbits.LATA4 = !LATAbits.LATA4;
__delay_ms(50);
break;
case 4: // BEAT DETECT
LATAbits.LATA4 = LATAbits.LATA5;
break;
default:
state = 0;
break;
}
if (TMR0 > 0)
{
while (count < 20)
{
if (!PORTAbits.RA2) count = 0;
__delay_ms(10);
count++;
}
TMR0 = 0;
state++;
}
}
}
答案 0 :(得分:1)
某些引脚可配置为模拟输入。
从此设备的数据表
&#34;通过设置ANS3选择引脚RA4作为模拟操作 ANSEL寄存器中的位,是a之后的默认设置 上电复位&#34;。
如果未设置ANSEL
寄存器,则该引脚不能用作输出,因为它被配置为模拟输入。
这适用于所有可以作为A / D输入的引脚。
我的代码中没有看到任何配置位设置。
将ANSEL
和ANSELH
设置为0
应该可以解决问题。
根据this文档,第93页关于ANSELA
注册
&#34;复位后,ANSELA位默认为模拟模式。使用任何 引脚作为数字通用或外设输入, 用户软件必须将相应的ANSEL位初始化为“0”。&#34;
如果您不打算使用模拟输入,可以添加ANSELA=0;