Микрочип PIC16F1829 глубокий сон

#c #embedded #microcontroller #pic #microchip

#c #встроенный #Микроконтроллер #рис #микросхема

Вопрос:

Я изо всех сил пытаюсь перевести PIC16F1829 в спящий режим. Устройство потребляет около 18 мА, в то время как в техническом паспорте указано 20 мА в режиме глубокого сна. Кто-нибудь может помочь?

В соответствии с таблицей данных я должен выполнить следующее: «WDT, BOR, FVR и T1OSC отключены, все периферийные устройства неактивны», что, я думаю, делается, как показано ниже?

     #include <pic16Lf1829.h>
    #include <plib/adc.h>
    #include <plib/pconfig.h>
    #include <plib/usart.h>


    // Use project enums instead of #define for ON and OFF.

    // CONFIG1
    #pragma config FOSC = ECL    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
    #pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
    #pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
    #pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
    #pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
    #pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
    #pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
    #pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
    #pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
    #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

    // CONFIG2
    #pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
    #pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
    #pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
    #pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
    #pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)


int main(int argc, char** argv) {
/*******************OSCILATOR CONFIGURATION*************/
    OSCCON = 0b01101000; // OSCILATOR CONTROL REGISTER 1MHz
    BORCON = 0x00;
    WDTCON    = 0x00; // Enable watchdog timer
/*******************************************************************************/


/**********************PORT A,B,C SETUP*************************************/

    ANSELB  =   0b00000000; /* Enable Digital input = 0 or Analogue = 1*/
    WPUB     =  0b00000000; /* Enable PULL UP 1 = yes 0 - NO*/
    TRISB   =   0b00000000; /* Tri-state PIN*/
    PORTB   =   0b00000000; /* Set PORTB Logic */

    WPUC =      0b00000000;
    ANSELC  =   0b00000000; /* Enable Digital input = 0 or Analogue = 1*/
    TRISC   =   0b00000000; /* Tri-state PIN*/
    PORTC =     0b00000000; /* Set PORTB Logic */

    WPUA =      0b00000000;
    ANSELA  =   0b00000000; /* Enable Digital input = 0 or Analogue = 1*/
    TRISA   =   0b00000000; /* Tri-state PIN*/
    PORTA   =   0b00000000; /* Set PORTB Logic */


    IOCBP   = 0b00100000;  /* INTERRUPT-ON-CHANGE PORTB POSITIVE EDGE REGISTER*/
    IOCBN   = 0b00000000;  /* INTERRUPT-ON-CHANGE PORTB NEGATIVE EDGE REGISTER*/
    INTCON  = 0b01011000;  /* Enable int on PIN Change*/
 /*******************************************************************************/

    bit_set(INTCON,7); /*ENABLE GLOBAL INTERUPTS*/

    ADCON0 = 0x00;
    ADCON1 = 0x00;

    T1CON  = 0x00;
    T2CON  = 0x00;
    FVRCON = 0x00; //FIXED VOLTAGE REFERENCE CONTROL REGISTER
    CM1CON0 = 0x00;
    CM1CON1 = 0x00;
    CM2CON1 = 0x00;
    CM2CON0 = 0x00;
    PWM1CON = 0x00;
    PWM2CON = 0x00;
    DACCON0 = 0X00;
    DACCON1 = 0X00;
    T1CON =   0X00;


    /********** MAIN LOOP START*******************/
        for(;;) {

    SLEEP();


           }
  

Комментарии:

1. Вы уверены, что 18 мА потребляется чипом, а не какой-либо другой частью вашей схемы?

2. Да, я уверен, что это не внешняя схема, у меня была такая же схема, которая использовалась для PIC16F1509. Это рисовало 20nA в глубоком сне. Я просто переключил чипы.

3. @Clifford да, у меня была эта проблема, и после получаса размышлений я понял, что на плате все еще горит светодиод 🙂

4. С каким источником вы синхронизируете процессор? Обычно в сверхнизких режимах сна для выполнения работы используется вторичный низкочастотный генератор (или внешний чип). Если каким-то образом вы используете высокочастотный источник по ошибке, это значительно увеличит потребление.

5. Вы можете попробовать задать вопрос здесь: electronics.stackexchange.com как хорошо. Вы уверены 1829 , что у него тот же вывод, 1509 что и у? 18 мА кажется довольно высоким для PIC даже при нормальных рабочих условиях, так что это может быть случай несовпадения выводов и короткого замыкания.

Ответ №1:

Это может быть результатом отсутствия обработки исключений. Вы включаете прерывания, но у вас нет функции для их перехвата. Если по какой-либо причине будет установлен флаг прерывания, его нечем очистить, и ваш pic перейдет к вектору прерывания, поскольку установлен GIE (даже если он находится в спящем режиме). Поскольку вы не указали функцию прерывания, вы можете (в зависимости от вашего компилятора) оказаться в незапрограммированной области памяти, выполняющей произвольные инструкции на полной скорости.

Попробуйте тот же код с :

 ---  INTCON  = 0b01011000;  /* Enable int on PIN Change*/
     INTCON  = 0b00000000;  /* Disable all int */
  

Ответ №2:

Согласно спецификации, 18 мА слишком велико для этого микроконтроллера (~ 5 мА при частоте 32 МГц).

  • Убедитесь, что контакты mcu не закорочены.
  • Убедитесь, что выходное напряжение настроено правильно.(например, контакты i2c должны быть «высокими» и т. Д.)
  • Убедитесь, что ваш VCC не подает питание на другие модули.