2016-11-20 50 views
0

Я написал код, простую программу, чтобы попытаться увеличить счетчик во время прерывания на . Программа строит без ошибок, однако предупреждение существует, что:Процедура прерывания MPLAB XC8 не вызвана для симулятора IOC (pic 16f877a)

:: предупреждение: (1273) всеведущий генерации кода не доступны в свободном режиме main.c: 32: предупреждение: (520) функция «_Interrupt» никогда называется

#define _XTAL_FREQ 8000000 

#include <pic16f887.h> 
#include <xc.h> 

char counter = 0; 
char dummy = 0; 

void main(void) 
{ 
    TRISB = 0x80;   //Configure PORTB pin 7 to input 
    TRISC = 0xOO;   //Configure PORTC to output 

    INTCONbits.RBIF = 0; //clear interrupt on change flag 
    INTCONbits.GIE = 1; //enable global interrupts 
    INTCONbits.RBIE = 1; //enable port change interrupt 

    while(1) 
    { 
     PORTC = counter; //update PORTC with value of counter 
    } 
    return; 
} 

void Interrupt (void) 
{ 
    INTCONbits.RBIF = 0; //clear Interrupt on change flag 
    dummy = PORTB;  //do a dummy read to clear IOC flag 
    counter++;   //increment counter 
} 

на тех фрагментах кода, которую я видел, люди, как правило, тестирование их прерывания на оборудовании. Однако у меня пока нет аппаратного обеспечения, поэтому я пытаюсь сделать некоторые симуляции и проверить материал в регистрах адресов и т. Д.

Я сделал предположение, что я смог бы проверить процедуру прерывания только с программным обеспечением (см. Прилагаемое захват экрана). File RegistersCounter Variable Address

Так что, если кто-нибудь может указать на мое упущение или привести меня в правильном направлении, это было бы очень признательно.

+0

Как вы думаете, что «Прерывание» когда-либо будет называться? – Olaf

+0

Мои извинения, я забыл упомянуть, что я могу переключать PORTBbits.7 в симуляторе. Поэтому я ожидал, что как только я это сделаю, рутина будет вызвана. – misterjase

+0

Привет, Олаф, ссылались ли вы на то, что в определении прерывания я отсутствовал [тег: ISR]? Хорошо, что это не то, о чем вы говорили, я включил его, и теперь у меня есть чистая сборка, однако я до сих пор не могу получить доступ к процедуре обслуживания прерываний. больше намеков? – misterjase

ответ

0

Вам необходимо добавить квалификатор функции interrupt к определению вашей процедуры обслуживания прерываний, поэтому компилятор знает, что это процедура обслуживания прерываний, а не регулярная функция, и, возможно, переименовать эту функцию, так что имя и определитель четко разделены :

void interrupt ISR (void) //Added 'interrupt' qualifier and renamed function to 'ISR' for clarity. 
{ 
    INTCONbits.RBIF = 0; //clear Interrupt on change flag 
    dummy = PORTB;  //do a dummy read to clear IOC flag 
    counter++;   //increment counter 
} 
+0

В учебнике я читал, что это не обязательно делать, поэтому я не пробовал. Сделает эту настройку и посмотрит, что произойдет. – misterjase

+0

Спасибо. что исправил один вопрос. – misterjase

+0

Я добавил ваше изменение в свой код, и у меня нет никаких ошибок или предупреждений о сборке, однако теперь я пытаюсь понять, почему я не могу попасть в точку прерывания в ISR. – misterjase