Страница 1 из 1

Проблема с MCodeConfiguator

Добавлено: Ср ноя 23, 2016 10:21:54
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:
Суть то в чем - в том что прерывание не наступает

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

Добавлено: Ср ноя 23, 2016 11:20:45
Zhuk72
А самой программы-то и нету.
8)
Если вы надеялись, что конфигуратор выдаст вам готовую программу, то, увы.
Писать придется самому, а то, что он выдал, всего лишь настройка модулей, периферии.

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

Добавлено: Ср ноя 23, 2016 12:47:34
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)
                {
                    
                }
            }
        }
    }
}

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

Добавлено: Ср ноя 23, 2016 13:15:19
Zhuk72
Во-первых, какой МК?
Во-вторых, выкладывайте весь код.

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

Добавлено: Ср ноя 23, 2016 13:45:20
anten89
pic12f1822

Добавлено after 1 minute 6 seconds:
вот еще

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

Добавлено: Ср ноя 23, 2016 14:07:06
Zhuk72
Вы меня запутали :)
Я сперва подумал, что пик не просыпается. Теперь дошло, что он не входит в прерывание.

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

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

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

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

Добавлено: Ср ноя 23, 2016 14:57:17
anten89
фишка в чем, то что как я понимаю происходит следующее: пик входит в сон, потом по приходу положительного фронта идет прерывание и мы идем не в файл main а в файл pin_manager.c так ведь??? и там происходит придание переменной флагу значения 1. а уж потом пик возвращается в майн файл и там сразу просходит запрет прерываний, но ведь флаг то уже стал 1. поэтому нам больше и не надо прерываца. потом идет по коду в майн файле дальше, так ведь происходит или нет? то есть после того как пик просыпается по прерыванию он же не идет сразу на функцию которая написана после слиип (), а идет сначала в обработчик прерывания так же???

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

Добавлено: Ср ноя 23, 2016 15:17:23
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"); и проверьте.

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

Добавлено: Ср ноя 23, 2016 15:26:37
anten89
попожжу попробую, ну а так навскидку - все в коде вродь работоспособно да?

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

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

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

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