Проблема с MCodeConfiguator

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
anten89
Встал на лапы
Сообщения: 87
Зарегистрирован: Ср ноя 23, 2016 09:50:36

Проблема с MCodeConfiguator

Сообщение anten89 »

Я новичок в программировании пиков, поэтому использую код конфигуратор для настройки периферии и тому подобное.
И вот например мне нужно попробовать реализовать пробуждение пика из слипа по внешнему положительному фронту на определенной ноге пика.
Сделал все в конфигураторе, и в протеусе чето не работает. Вот код который сконфигурировал конфигуратор - внешне есть ли в нем что то не так?

Код: Выделить всё

#include <xc.h>
#include "pin_manager.h"
#include "stdbool.h"

void (*IOCAF0_InterruptHandler)(void);

void PIN_MANAGER_Initialize(void)
{
    /**
    LATx registers
    */   
    LATA = 0x00;    

    /**
    TRISx registers
    */    
    TRISA = 0x0B;

    /**
    ANSELx registers
    */   
    ANSELA = 0x02;

    /**
    WPUx registers
    */ 
    WPUA = 0x0A;
    OPTION_REGbits.nWPUEN = 0;

    
    /**
    APFCONx registers
    */
    APFCON = 0x00;

    /**
    IOCx registers
    */
    // interrupt on change for group IOCAF - flag
    IOCAFbits.IOCAF0 = 0;
    // interrupt on change for group IOCAN - negative
    IOCANbits.IOCAN0 = 0;
    // interrupt on change for group IOCAP - positive
    IOCAPbits.IOCAP0 = 1;

    // register default IOC callback functions at runtime; use these methods to register a custom function
    IOCAF0_SetInterruptHandler(IOCAF0_DefaultInterruptHandler);
   
    // Enable IOCI interrupt 
    INTCONbits.IOCIE = 1; 
    
}       

void PIN_MANAGER_IOC(void)
{   
    // interrupt on change for pin IOCAF0
    if(IOCAFbits.IOCAF0 == 1)
    {
        IOCAF0_ISR();  
    }                          


}

/**
   IOCAF0 Interrupt Service Routine
*/
void IOCAF0_ISR(void) {

    // Add custom IOCAF0 code
    extern bit flag_pir;
    flag_pir = 1;
    // Call the interrupt handler for the callback registered at runtime
    if(IOCAF0_InterruptHandler)
    {
        IOCAF0_InterruptHandler();
    }
    IOCAFbits.IOCAF0 = 0;
}

/**
  Allows selecting an interrupt handler for IOCAF0 at application runtime
*/
void IOCAF0_SetInterruptHandler(void* InterruptHandler){
    IOCAF0_InterruptHandler = InterruptHandler;
}

/**
  Default interrupt handler for IOCAF0
*/
void IOCAF0_DefaultInterruptHandler(void){
    // add your IOCAF0 interrupt custom code
    // or set custom function using IOCAF0_SetInterruptHandler()
}

/**
 End of File
*/
Добавлено after 4 minutes 42 seconds:
Суть то в чем - в том что прерывание не наступает
Реклама
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Проблема с MCodeConfiguator

Сообщение Zhuk72 »

А самой программы-то и нету.
8)
Если вы надеялись, что конфигуратор выдаст вам готовую программу, то, увы.
Писать придется самому, а то, что он выдал, всего лишь настройка модулей, периферии.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Реклама
anten89
Встал на лапы
Сообщения: 87
Зарегистрирован: Ср ноя 23, 2016 09:50:36

Re: Проблема с MCodeConfiguator

Сообщение anten89 »

Программа естественно тоже есть, просто я думал может проблема в том коде что генерировал конфигуратор, то есть я так понял здесь все в порядке или как?
вот код основной программы:

Код: Выделить всё

#include "mcc_generated_files/mcc.h"

bit flag_pir;

void main(void)
{
    extern bit flag_pir;
    int pir_pin_level = 0;
    // initialize the device
    SYSTEM_Initialize();
    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();
    SLEEP ();
    INTERRUPT_GlobalInterruptDisable();
    while (1)
    {
        if (flag_pir == 1) 
        {                     
            __delay_ms (20); 
            if ((pir_pin_level = SENS_GetValue ()) == 1) 
            {
                KEY_SetHigh ();
                while (1)
                {
                    
                }
            }
        }
    }
}
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Проблема с MCodeConfiguator

Сообщение Zhuk72 »

Во-первых, какой МК?
Во-вторых, выкладывайте весь код.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Реклама
Эиком - электронные компоненты и радиодетали
anten89
Встал на лапы
Сообщения: 87
Зарегистрирован: Ср ноя 23, 2016 09:50:36

Re: Проблема с MCodeConfiguator

Сообщение anten89 »

pic12f1822

Добавлено after 1 minute 6 seconds:
вот еще
Вложения
pin_manager.h
(7.91 КБ) 231 скачивание
pin_manager.c
(3.88 КБ) 441 скачивание
mcc.h
(2.74 КБ) 436 скачиваний
mcc.c
(3.71 КБ) 474 скачивания
interrupt_manager.h
(3.19 КБ) 253 скачивания
interrupt_manager.c
(2.19 КБ) 459 скачиваний
main.c
(2.86 КБ) 451 скачивание
Реклама
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Проблема с MCodeConfiguator

Сообщение Zhuk72 »

Вы меня запутали :)
Я сперва подумал, что пик не просыпается. Теперь дошло, что он не входит в прерывание.

Код: Выделить всё

    SLEEP ();
    INTERRUPT_GlobalInterruptDisable();
Следующей командой после sleep стоит запрет прерываний. И как программа должно в прерывание попасть?
Зачем вообще его запрещать в этом месте?

Добавлено after 1 minute 41 second:
Вообще для начинающего пиковода эта МСС - очень вредная вещь.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Реклама
anten89
Встал на лапы
Сообщения: 87
Зарегистрирован: Ср ноя 23, 2016 09:50:36

Re: Проблема с MCodeConfiguator

Сообщение anten89 »

фишка в чем, то что как я понимаю происходит следующее: пик входит в сон, потом по приходу положительного фронта идет прерывание и мы идем не в файл main а в файл pin_manager.c так ведь??? и там происходит придание переменной флагу значения 1. а уж потом пик возвращается в майн файл и там сразу просходит запрет прерываний, но ведь флаг то уже стал 1. поэтому нам больше и не надо прерываца. потом идет по коду в майн файле дальше, так ведь происходит или нет? то есть после того как пик просыпается по прерыванию он же не идет сразу на функцию которая написана после слиип (), а идет сначала в обработчик прерывания так же???
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Проблема с MCodeConfiguator

Сообщение Zhuk72 »

The interrupt-on-change interrupt sequence will wake the device from Sleep mode, if the IOCIE bit is set.
If an edge is detected while in Sleep mode, the IOCAF register will be updated prior to the first instruction executed out of Sleep.
Если вы после sleep поставите nop, то скорее всего будет как вы говорите. Но насколько я понимаю, IOC пробуждает пик, выставляется флаг, а следом идет запрет GIE = 0, который, к слову, вообще там не нужен. Потому и нет захода в прерывание.
Вставьте после sleep команду asm("nop"); и проверьте.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
anten89
Встал на лапы
Сообщения: 87
Зарегистрирован: Ср ноя 23, 2016 09:50:36

Re: Проблема с MCodeConfiguator

Сообщение anten89 »

попожжу попробую, ну а так навскидку - все в коде вродь работоспособно да?
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Проблема с MCodeConfiguator

Сообщение Zhuk72 »

Я не знаю, сложно ориентироваться в таком нагромождении мусора от МСС. Просто в глазах рябит от функций, состоящих из одной строки. Пока перейдешь от одной к другой, забываешь откуда шел :)) Лучше скомпонуйте все в один файл для начала.
К тому же я с этим пиком не знаком. Надо углубляться в ДШ для уточнения, а для этого время нужно.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Проблема с MCodeConfiguator

Сообщение shindax »

Поробуйте зайти сюда:
http://catcatcat.d-lan.dp.ua/skachat/pr ... ogramm-si/
Скачайте примеры кода для Вашего МК и поизучайте, обращая особое внимание на биты конфигурации МК. Не думаю что Вам сейчас требуется проект из 100500 файлов, там будет строк 30 от силы, затем уже будете усложнять. IMHO все эти "облегчалки" типа MPLAB Code configurator может и полезны для 16-32 битных PIC, но не для PIC12F уж точно. Вот уж чего лично я стараюсь избегать, так это, например, вызова функций из прерывания, а в приведённом Вами примере кода это считается нормальным. В общем, за деревьями не видно леса.
Ответить

Вернуться в «PIC»