asked 190k views
0 votes
a. For the PIC18F452, what pins are assigned to INTO and INT2 b. What are the three main bits that are associated with an interrupt source and briefly explain what each one is used for. c. How do we make sure that a single interrupt is not recognized as multiple interrupts. d. Using C language, write an initialization subroutine to set up INTO as rising-edge triggered and INT2 as falling-edge triggered interrupt inputs having high priorities. Explain what happens if both INTO and INT2 are activated at the same time. Also assume that INTO is checked first in the subroutine for the interrupt vector table. e. Using C language, write the high priority interrupt subroutine (handler) that turns on the left LED (pin 3 on PORTA) when the interrupt initialized in part (C) is coming from INTO and turns on the middle LED (pin 2 on PORTA) when it comes from INT2. f. What happens if another high-priority interrupt on INT1 is activated while the PIC18 is serving one of the high-priority interrupts on INTO or INT2.

1 Answer

1 vote

a. The PIC18F452 microcontroller assigns the following pins to the INTO and INT2 interrupt sources:

- INTO: The INTO interrupt source is associated with the RB0/INT pin (pin 33) on the PIC18F452.

- INT2: The INT2 interrupt source is associated with the RB2/INT2 pin (pin 35) on the PIC18F452.

b. The three main bits associated with an interrupt source are:

- Enable bit (INTxIE): This bit enables or disables the interrupt source. When the enable bit is set, the corresponding interrupt source can trigger an interrupt. When it is cleared, the interrupt source is masked and will not cause an interrupt.

Flag bit (INTxIF): This bit indicates whether the interrupt source has caused an interrupt. When the interrupt condition is met, the flag bit is set, indicating that an interrupt request has been triggered. The flag bit must be cleared by the software in the interrupt service routine (ISR) to acknowledge and handle the interrupt.

Priority bit (INTxIP): This bit determines the priority level of the interrupt source. In the PIC18F452, interrupts can be configured as high priority (INTxIP = 1) or low priority (INTxIP = 0). The priority level determines the order in which interrupts are serviced when multiple interrupts occur simultaneously.

c. To ensure that a single interrupt is not recognized as multiple interrupts, it is important to clear the interrupt flag bit (INTxIF) in the interrupt service routine (ISR) once the interrupt has been acknowledged and handled. By clearing the interrupt flag bit, the microcontroller acknowledges that the interrupt request has been serviced, preventing it from being recognized again until the interrupt condition occurs again.

d. Here's an example initialization subroutine written in C language to set up INTO as a rising-edge triggered and INT2 as a falling-edge triggered interrupt inputs with high priorities:

```c

void initializeInterrupts() {

// Configure INTO as rising-edge triggered interrupt with high priority

INTEDG0 = 1; // Set RB0/INT to trigger on rising edge

INT0IF = 0; // Clear INT0 interrupt flag

INT0IE = 1; // Enable INT0 interrupt

INT0IP = 1; // Set INT0 interrupt as high priority

// Configure INT2 as falling-edge triggered interrupt with high priority

INTEDG2 = 0; // Set RB2/INT2 to trigger on falling edge

INT2IF = 0; // Clear INT2 interrupt flag

INT2IE = 1; // Enable INT2 interrupt

INT2IP = 1; // Set INT2 interrupt as high priority

}

```

If both INTO and INT2 are activated at the same time, and both interrupts have high priorities, the microcontroller will service the interrupt associated with INTO first since it is checked first in the interrupt vector table. The microcontroller will execute the corresponding ISR for the INTO interrupt before handling the INT2 interrupt.

e. Here's an example high-priority interrupt subroutine (handler) in C language that turns on the left LED (pin 3 on PORTA) when the interrupt initialized in part (C) is coming from INTO and turns on the middle LED (pin 2 on PORTA) when it comes from INT2:

```c

void __interrupt(high_priority) highPriorityISR(void) {

if (INT0IF) {

// INTO interrupt occurred

LATAbits.LATA3 = 1; // Turn on left LED (pin 3 on PORTA)

LATAbits.LATA2 = 0; //

"Learn more about "The PIC18F452 microcontroller assigns the following pins

"SPJ11"

answered
User Unicorn
by
7.6k points