Отговори на тема  [ 5 мнения ] 
Проблем с прекъсване от PortB 16f1938 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Мар 20, 2007 1:18 am
Мнения: 22
Мнение Проблем с прекъсване от 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" до безкрай.

_________________
От космоса духа вакуум!!!


Сря Ное 19, 2014 11:39 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 02, 2008 10:24 pm
Мнения: 105
Мнение Re: Проблем с прекъсване от PortB 16f1938
ако това ти е прекъсването detect_rb_change()
по-добре махни последните 3 реда и сложи
едно изчистване на IOCBFx, по-голям шанс има да тръгне


Чет Ное 20, 2014 1:03 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Чет Мар 19, 2009 8:33 pm
Мнения: 804
Мнение 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



Чет Ное 20, 2014 1:16 am
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Юни 25, 2010 3:18 pm
Мнения: 363
Местоположение: Varna
Мнение Re: Проблем с прекъсване от PortB 16f1938
Мисля, че както е упоменал cino, трябва да се чисти и IOCBFx.
CCS автоматично генерира код за изчистване на IOCIE флага преди да се излезе от int. както и забранява глобално прекъсванията когато "влезе" в такова.


Чет Ное 20, 2014 1:22 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Мар 20, 2007 1:18 am
Мнения: 22
Мнение Re: Проблем с прекъсване от PortB 16f1938
Стана!!
Горе в дефинициите добавих "#byte IOCBF = 0x396", а на излизане от "detect_rb_change()", последният ред е IOCBF = 0;. Незнам дали това е правилният начин, но поне сеега работи както трябва! Благодаря, че ме насочихте! :partyman:

_________________
От космоса духа вакуум!!!


Чет Ное 20, 2014 1:53 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 5 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни