#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 не подает питание на другие модули.