Старт пика
Старт пика
Всем привет!
Есть такой вот вопрос: как ведут себя порты общего назначения PIC-микроконтроллера PIC24FJ64GB004 в момент подачи питания?
Дело в том, что у меня контроллер выдаёт два коротких импульса с нулевым уровнем на одном своём выводе, спустя пару миллисекунд после установления питания на уровне 3,3 В:
¯¯¯¯¯¯|_|¯|_|¯¯¯¯¯¯¯
В программе этот вывод конфигурируется как выход с общим стоком и выставляется в "1" в первой же строке программы (после процесса конфигурации). Никаких дополнительных переходов 1->0->1->0->1 в коде нет! На выводе стоит внешняя подтяжка к 3,3 В.
Пытался сам изучить вопрос, но чёткого представления пока не получил. Читал вот эти документы:
1) PIC24F Family Reference Manual, Sect. 12 I/O Ports with Peripheral Pin Select
2) PIC24F Family Reference Manual, Sect. 07 Reset
Из документа №2 понял, что при подаче питания (после ресета) контроллер имеет фиксированную задержку, перед тем, как начинает выполняться программный код. Эта задержка зависит от нескольких параметров: источник питания проца, осциллятор... Всё это ясно, и для меня не критично.
В документе №1 сказано, что все порты контроллера конфигурируются после старта (ресета) по умолчанию как входы. Но не понятно, как ведут себя порты до полноценного старта (т.е. до того, как пройдут все стартовые задержки POR и начнёт выполняться код)?
Буду благодарен за любую помощь!
Есть такой вот вопрос: как ведут себя порты общего назначения PIC-микроконтроллера PIC24FJ64GB004 в момент подачи питания?
Дело в том, что у меня контроллер выдаёт два коротких импульса с нулевым уровнем на одном своём выводе, спустя пару миллисекунд после установления питания на уровне 3,3 В:
¯¯¯¯¯¯|_|¯|_|¯¯¯¯¯¯¯
В программе этот вывод конфигурируется как выход с общим стоком и выставляется в "1" в первой же строке программы (после процесса конфигурации). Никаких дополнительных переходов 1->0->1->0->1 в коде нет! На выводе стоит внешняя подтяжка к 3,3 В.
Пытался сам изучить вопрос, но чёткого представления пока не получил. Читал вот эти документы:
1) PIC24F Family Reference Manual, Sect. 12 I/O Ports with Peripheral Pin Select
2) PIC24F Family Reference Manual, Sect. 07 Reset
Из документа №2 понял, что при подаче питания (после ресета) контроллер имеет фиксированную задержку, перед тем, как начинает выполняться программный код. Эта задержка зависит от нескольких параметров: источник питания проца, осциллятор... Всё это ясно, и для меня не критично.
В документе №1 сказано, что все порты контроллера конфигурируются после старта (ресета) по умолчанию как входы. Но не понятно, как ведут себя порты до полноценного старта (т.е. до того, как пройдут все стартовые задержки POR и начнёт выполняться код)?
Буду благодарен за любую помощь!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Старт пика
После сброса, все порты настроены на вход до того, как Вы их сконфигурируете на выход.
Возможно, Вы сначала настраиваете регистр направления (TRIS), а затем уже регистр защёлки (LAT), по этому, если в защёлке находится "0", может проскакивать кратковременный импульс. Настраивайте сначала защёлку а затем направление.
Тяжело судить, не видя куска кода с инициализацией.
Возможно, Вы сначала настраиваете регистр направления (TRIS), а затем уже регистр защёлки (LAT), по этому, если в защёлке находится "0", может проскакивать кратковременный импульс. Настраивайте сначала защёлку а затем направление.
Тяжело судить, не видя куска кода с инициализацией.
Re: Старт пика
Аlex писал(а):Тяжело судить, не видя куска кода с инициализацией.
Вот код. Он состоит из 3-х файлов. Сигнал, который глючит, называется EN_HI:
1. Определение пользовательских сигналов.
Код: Выделить всё
/*======================*/
/* configpin.h */
/* Module contains procedures for working with */
/* */
/*======================*/
#ifndef __CONFIGPIN_H
#define __CONFIGPIN_H
#define ON 0
#define OFF 1
#define LED1 PORTAbits.RA9
#define LED2 PORTCbits.RC2
#define DAC_DATA PORTAbits.RA7
#define DAC_CLK PORTBbits.RB11
#define DAC_CS PORTBbits.RB10
#define DP1A PORTCbits.RC4
#define DP1B PORTCbits.RC3
#define DP2A PORTBbits.RB4 //|*/PORTAbits.RA0
#define DP2B PORTAbits.RA4 //|*/PORTAbits.RA1
#define INT1 PORTCbits.RC1
#define INT2 PORTAbits.RA0
#define EN_LO PORTAbits.RA8
#define EN_HI PORTCbits.RC5
#define FREQ PORTBbits.RB9
#define FAN PORTAbits.RA10
#define TEMP 5
#define TEMP2 2
#define TEMP3 3
#define VOLTAGE 4
#define CURRENT 11
#define AINPUTS 0xF7C3
//******************************************************************************
void config_Pins(void);
//******************************************************************************
#endif //__CONFIGPIN_H
//========================
// End of file.
//========================
2. Инициализация портов
Код: Выделить всё
/**
* @file configpins.c
*
* Module to configures I/O ports
*
* @todo
* - Configures I/O ports.
*/
#include "p24FJ64GB004.h"
#include "configpins.h"
//========================
/**
* Function to configure the I/O ports
*/
void config_Pins(void)
{
AD1PCFG = AINPUTS;
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISAbits.TRISA0 = 1;
TRISAbits.TRISA1 = 1;
TRISAbits.TRISA4 = 1;
TRISBbits.TRISB0 = 1;
TRISBbits.TRISB1 = 1;
TRISBbits.TRISB2 = 1;
TRISBbits.TRISB3 = 1;
TRISBbits.TRISB4 = 1;
TRISBbits.TRISB9 = 1;
TRISBbits.TRISB13 = 1;
TRISBbits.TRISB15 = 1;
TRISCbits.TRISC3 = 1;
TRISCbits.TRISC4 = 1;
TRISCbits.TRISC1 = 1;
TRISAbits.TRISA7 = 0;
TRISAbits.TRISA8 = 0;
TRISAbits.TRISA9 = 0;
TRISAbits.TRISA10 = 0;
TRISBbits.TRISB5 = 0;
TRISBbits.TRISB7 = 0;
TRISBbits.TRISB8 = 0;
TRISBbits.TRISB10 = 0;
TRISBbits.TRISB11 = 0;
TRISBbits.TRISB14 = 0;
TRISCbits.TRISC0 = 0;
TRISCbits.TRISC2 = 0;
TRISCbits.TRISC5 = 0;
TRISCbits.TRISC6 = 0;
TRISCbits.TRISC7 = 0;
TRISCbits.TRISC8 = 0;
TRISCbits.TRISC9 = 0;
ODCAbits.ODA7 = 1;
ODCAbits.ODA8 = 1;
ODCBbits.ODB5 = 1;
ODCBbits.ODB7 = 1;
ODCBbits.ODB8 = 1;
ODCBbits.ODB10 = 1;
ODCBbits.ODB11 = 1;
ODCCbits.ODC5 = 1;
ODCCbits.ODC6 = 1;
ODCCbits.ODC7 = 1;
ODCCbits.ODC8 = 1;
ODCCbits.ODC9 = 1;
RPINR7bits.IC1R = 9; //IC1 -> RP9
RPINR18bits.U1RXR = 15; //RX -> RP15
RPOR7bits.RP14R = 3; //TX -> RP14
}
/*======================*/
/* End of file */
/*======================*/
3. Установка значений в порты
Код: Выделить всё
/**
* @file configmcu.c
*
* Module to configures MCU
*
* @todo
* - Configures MCU.
*/
#include "p24FJ64GB004.h"
#include "adc.h"
#include "configpins.h"
#include "currentlimit.h"
#include "delay.h"
#include "frequency.h"
#include "lcd.h"
#include "serial.h"
//========================
/**
* Function to configure the MCU
*/
void config_Mcu(void)
{
config_Pins();
EN_LO |= OFF;
EN_HI |= OFF;
config_Interrupts();
init_OutInterrupt();
init_UART();
init_delay();
init_ADC(AINPUTS);
init_Frequency();
init_LCD();
}
/*======================*/
/* End of file */
/*======================*/
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Старт пика
2. Инициализация портов
А зачем Вы сначала настраиваете на выход, затем на вход, потом снова на выход ? К чему такие манипуляции, причём побитные ? Скорее всего проблема именно в этом.
И где настройка защёлок (т.е. то, что нужно вывести в порт изначально) ?
Пример:
Код: Выделить всё
LATAbits.LATA0=0; // Сначала в защёлку начальное значение
TRISAbits.TRISA0=0; // Затем пин на вЫход
Re: Старт пика
ОК, спасибо! Щас будем разбираться!
Re: Старт пика
Поменяли инициализацию портов - см. код. Теперь сначала записываются значения в защёлки LAT, потом настраиваются Open drain, а потом задаётся направление портов ввода-вывода посредством регистров TRIS. Между этими операциями введена задержка.
Теперь проблема с двумя короткими импульсами при старте МК пропала. Но иногда (очень редко - примерно 1 запуск из 20-ти) проскакивает короткий импульс с нулевым уровнем, схематично выглядит он вот так:

Ещё хочу добавить немного про саму схему. Вывод МК RC5 настраивается как вЫход с общим стоком, на котором есть внешний пуллап на 5 В. Этот вывод подключён к управляющему входу OE логического буфера SN74AHC125 с активным низким уровнем. Вот упрощённая схемка:

Не знаем, что делать. К тому же проблема приобрела ещё и несистематический характер!
Код: Выделить всё
/**
* @file configpins.c
*
* Module to configures I/O ports
*
* @todo
* - Configures I/O ports.
*/
#include "p24FJ64GB004.h"
#include "configpins.h"
#include "delay.h"
//========================
/**
* Function to configure the I/O ports
*/
void config_Pins(void)
{
unsigned int i = 0;
AD1PCFG = AINPUTS;
LATA = 0x0100;
LATB = 0x0000;
LATC = 0x0020;
for(i = 0; i > 3; i++);
ODCA = 0x0180;
ODCB = 0x0DA0;
ODCC = 0x03E0;
for(i = 0; i > 3; i++);
TRISA = 0xF87F;
TRISB = 0xB25F;
TRISC = 0xFC1A;
for(i = 0; i > 3; i++);
RPINR7bits.IC1R = 9; //IC1 -> RP9
RPINR18bits.U1RXR = 15; //RX -> RP15
RPOR7bits.RP14R = 3; //TX -> RP14
}
/*======================*/
/* End of file */
/*======================*/
Теперь проблема с двумя короткими импульсами при старте МК пропала. Но иногда (очень редко - примерно 1 запуск из 20-ти) проскакивает короткий импульс с нулевым уровнем, схематично выглядит он вот так:
Ещё хочу добавить немного про саму схему. Вывод МК RC5 настраивается как вЫход с общим стоком, на котором есть внешний пуллап на 5 В. Этот вывод подключён к управляющему входу OE логического буфера SN74AHC125 с активным низким уровнем. Вот упрощённая схемка:
Не знаем, что делать. К тому же проблема приобрела ещё и несистематический характер!
- Вложения
-
- schema.png
- (13.58 КБ) 4222 скачивания
-
- imp.png
- (6.93 КБ) 4189 скачиваний
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Старт пика
Проблема всяко не в инициализации, а в дальнейшем коде. Ищите по коду что может этот ПИН так дёргать.
К сожалению, в слепую будет трудно Вам что-либо подсказать...
ПыСы:
А эт что такое ? 
К сожалению, в слепую будет трудно Вам что-либо подсказать...
ПыСы:
А эт что такое
Код: Выделить всё
for(i = 0; i > 3; i++);Re: Старт пика
Я могу выложить и оставшийся код, конечно. Только там ничего больше нет относительно этого пина RC5. Он может стать равным нулю только при нажатии на кнопку, которая подключена к одному из портов через функцию Change Notification и внутреннюю подтяжку. При следующем нажатии на кнопку пин RC5 возвращается в единицу.Аlex писал(а):Проблема всяко не в инициализации, а в дальнейшем коде. Ищите по коду что может этот ПИН так дёргать.
К сожалению, в слепую будет трудно Вам что-либо подсказать...
Это цикл задержки. А что вам не понравилось тут?
Какие могут быть ещё причины для несистематичного сброса пина в ноль? Есть у кого-нибудь догадки?
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: Старт пика
Мне кажется, нужно написать примитивнейший код, и на нём изучить пуск пика, что как и в какой последовательности происходит.
и исходя из полученных результатов писать программу которая вам нужна.
и исходя из полученных результатов писать программу которая вам нужна.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Re: Старт пика
Нашли вроде бы, в чём дело было. По крайней мере после внесённых изменений пока больше ни разу ни одного импульса не проскачило... А реагировал МК на кнопку, подключённую на пин с Change Notification, про которую я ранее писал. Отключили прерывание модуля CN, и после этого трабл исчез. Теперь разрешаем это прерывание в другом месте, и всё пока ОК!