程序在旧设备和新设备的模拟器上工作但不在新设备上工作

时间:2014-07-17 02:22:43

标签: c microcontroller pic mplab

我在移植我之前为 PIC10F200 撰写的程序时遇到了障碍(请参阅此related SO question)。原来需要换掉板上的另一个组件需要通过I2C进行通信,所以我正在将程序移植到 PIC12LF1552

这是当前程序的工作方式(至少在PIC10F200上)

  1. 程序从IDLE开始(没有亮灯)
  2. 按下按钮,T0CKI引脚(在PIC12LF1552的情况下,RA2)已通过外部上拉电阻上拉至VDD(~3.3V),该按钮已连接至接地和引脚,将T0CKI的信号拉向LO。
  3. TMR0增量(据说)
  4. PORTAbits.RA2结算的时间段之后,state递增
  5. switch阻止移动以打开外部LED,在先前版本的电路中,这也将激活此引脚所连接的IC。
  6. 为其他3个州冲洗重复。
  7. 我已经通过使用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++;
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

某些引脚可配置为模拟输入。

从此设备的数据表

  

&#34;通过设置ANS3选择引脚RA4作为模拟操作   ANSEL寄存器中的位,是a之后的默认设置   上电复位&#34;。

如果未设置ANSEL寄存器,则该引脚不能用作输出,因为它被配置为模拟输入。

这适用于所有可以作为A / D输入的引脚。

我的代码中没有看到任何配置位设置。

ANSELANSELH设置为0应该可以解决问题。

根据this文档,第93页关于ANSELA注册

  

&#34;复位后,ANSELA位默认为模拟模式。使用任何   引脚作为数字通用或外设输入,   用户软件必须将相应的ANSEL位初始化为“0”。&#34;

如果您不打算使用模拟输入,可以添加ANSELA=0;

之类的内容