Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с прекъсване от PortB 16f1938
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=13362
Страница 1 от 1

Автор:  Worvax [ Сря Ное 19, 2014 11:39 pm ]
Заглавие:  Проблем с прекъсване от PortB 16f1938

Здравейте,
Опитвам се да направя нещо, което да реагира при промяна на portB. Независимо от пина който ползвам, когато вляза в програмата за обслужване при прекъсване няма излизане от там - цикли само вътре и не се връща в main. Опитах всички възможни примери, които намерих в интернет и резултата е еднакъв. Някой борил ли се е с това?

Код:
#INT_RB

void detect_rb_change() {
    int8 changes, port_b; // local variables
    port_b = input_b(); // read portB (input or output)
    changes = previous_b ^ port_b; // locate pins changed level (old xor new)
    previous_b = port_b; // take a current reading and save it fornext RB int
    printf("portBint = %u\r\n" interrupt_active(int_rb));
    delay_ms(100);
    return;
}
//main

void main() {
    //int vars
    int temp_val; //temp value for test

    //setup
    setup_oscillator(OSC_8MHZ);

    PORT_B_PULLUPS(0b11111111);
    delay_ms(10);
    old_portb = INPUT_B();
    clear_interrupt(INT_RB);

    //enable_interrupts
    enable_interrupts(INT_RB); //razre6avane na prekysvane (INT_RB handler)
    enable_interrupts(GLOBAL);

    while (1) {
        printf("active int = %u\r\n", interrupt_active(int_rb));
    }
}


резултата е active int = 0 и след като подам ниско ниво на някой пин от PortB се започва "portBint = 1" до безкрай.

Автор:  Cino [ Чет Ное 20, 2014 1:03 am ]
Заглавие:  Re: Проблем с прекъсване от PortB 16f1938

ако това ти е прекъсването detect_rb_change()
по-добре махни последните 3 реда и сложи
едно изчистване на IOCBFx, по-голям шанс има да тръгне

Автор:  amdatlon [ Чет Ное 20, 2014 1:16 am ]
Заглавие:  Re: Проблем с прекъсване от PortB 16f1938

Код:
#INT_RB


void detect_rb_change() {
    int8 changes, port_b; // local variables
 
disable_interrupts(INT_RB);
clear_interrupt(INT_RB);


  port_b = input_b(); // read portB (input or output)
    changes = previous_b ^ port_b; // locate pins changed level (old xor new)
    previous_b = port_b; // take a current reading and save it fornext RB int


  enable_interrupts(INT_RB);
}
//main


Автор:  Stoimen [ Чет Ное 20, 2014 1:22 am ]
Заглавие:  Re: Проблем с прекъсване от PortB 16f1938

Мисля, че както е упоменал cino, трябва да се чисти и IOCBFx.
CCS автоматично генерира код за изчистване на IOCIE флага преди да се излезе от int. както и забранява глобално прекъсванията когато "влезе" в такова.

Автор:  Worvax [ Чет Ное 20, 2014 1:53 am ]
Заглавие:  Re: Проблем с прекъсване от PortB 16f1938

Стана!!
Горе в дефинициите добавих "#byte IOCBF = 0x396", а на излизане от "detect_rb_change()", последният ред е IOCBF = 0;. Незнам дали това е правилният начин, но поне сеега работи както трябва! Благодаря, че ме насочихте! :partyman:

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/