Subversion Repositories Code-Repo

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
155 Kevin 1
#include <xc.h>
2
#include "defines.h"
3
#include "interrupts.h"
4
#include "uart.h"
5
#include "i2c.h"
6
#include "timers.h"
7
 
8
//----------------------------------------------------------------------------
9
// Note: This code for processing interrupts is configured to allow for high and
10
//       low priority interrupts.  The high priority interrupt can interrupt the
11
//       the processing of a low priority interrupt.  However, only one of each type
12
//       can be processed at the same time.  It is possible to enable nesting of low
13
//       priority interrupts, but this code is not setup for that and this nesting 
14
//       is not enabled.
15
 
16
void Interrupt_Init() {
17
    // Peripheral interrupts can have their priority set to high or low
18
    // Decide on the priority of the enabled peripheral interrupts (0 is low, 1 is high)
19
 
20
    // High priority interrupts
21
    IPR1bits.RC1IP = 1;     // USART1 RX interrupt
22
    IPR1bits.TX1IP = 1;     // USART1 TX interrupt
23
//    IPR3bits.RC2IP = 1;     // USART2 RX interrupt
24
    IPR1bits.SSPIP = 1;     // I2C interrupt
25
//    IPR3bits.SSP2IP = 1;    // MSSP2 (SPI2) interrupt
26
 
27
    // Low priority interrupts
28
//    INTCON2bits.TMR0IP = 0; // Timer0 interrupt
29
    IPR1bits.TMR1IP = 0;    // Timer1 interrupt
30
//    IPR2bits.TMR3IP = 0; // Timer 3 interrupt
31
//    IPR1bits.ADIP = 0;      // ADC interupt
32
//    INTCON2bits.RBIP = 0;   // Port B interrupt
33
//    INTCON3bits.INT1IP = 0; // INT1 interrupt
34
 
35
    // Enable Port B interrupt
36
//    INTCONbits.RBIE = 1;
37
    // Enable interrupt for INT1
38
//    INTCON3bits.INT1IE = 1;
39
}
40
 
41
void Interrupt_Enable() {
42
    // Peripheral interrupts can have their priority set to high or low.
43
    // Enable both high-priority interrupts and low-priority interrupts
44
    RCONbits.IPEN = 1;
45
    INTCONbits.GIEH = 1;
46
    INTCONbits.GIEL = 1;
47
}
48
 
49
void Interrupt_Disable() {
50
    RCONbits.IPEN = 0;
51
    INTCONbits.GIEH = 0;
52
    INTCONbits.GIEL = 0;
53
}
54
 
55
void interrupt InterruptHandlerHigh(void) {
56
    // We need to check the interrupt flag of each enabled high-priority interrupt to
57
    //  see which device generated this interrupt.  Then we can call the correct handler.
58
 
59
//    // Check to see if we have an SPI2 interrupt
60
//    if (PIR3bits.SSP2IF) {
61
//        // Call the handler
62
//        SPI2_Recv_Interrupt_Handler();
63
//
64
//        // Clear the interrupt flag
65
//        PIR3bits.SSP2IF = 0;
66
//
67
//        return;
68
//    }
69
 
70
    // Check to see if we have an I2C interrupt
71
    if (PIR1bits.SSPIF) {
72
 
73
        // Call the handler
74
        I2C_Interrupt_Handler();
75
 
76
        // Clear the interrupt flag
77
        PIR1bits.SSPIF = 0;
78
 
79
        return;
80
    }
81
 
82
    // Check to see if we have an interrupt on USART1 RX
83
    if (PIR1bits.RC1IF) {
84
        // Call the interrupt handler
85
        UART1_Recv_Interrupt_Handler();
86
 
87
        // Clear the interrupt flag
88
        PIR1bits.RC1IF = 0;
89
 
90
        return;
91
    }
92
 
93
#ifndef _DEBUG  // Disable UART1 TX interrupt for debug mode (using printf)
94
    // Check to see if we have an interrupt on USART1 TX
95
    if (PIR1bits.TX1IF) {
96
        // Call the interrupt handler
97
        UART1_Send_Interrupt_Handler();
98
 
99
        // Clear the interrupt flag
100
        PIR1bits.TX1IF = 0;
101
 
102
        return;
103
    }
104
#endif
105
 
106
//    // Check to see if we have an interrupt on USART2 RX
107
//    if (PIR3bits.RC2IF) {
108
//        DBG_PRINT_INT("INT: UART2 RX\r\n");
109
//        // Call the interrupt handler
110
//        uart_2_recv_interrupt_handler();
111
//
112
//        // Clear the interrupt flag
113
//        PIR3bits.RC2IF = 0;
114
//    }
115
}
116
 
117
void interrupt low_priority InterruptHandlerLow() {
118
//    // Check to see if we have an interrupt on INT1
119
//    if (INTCON3bits.INT1IF) {
120
//        DBG_PRINT_INT("INT: INT1\r\n");
121
//        int1_interrupt_handler();
122
//
123
//        INTCON3bits.INT1IF = 0;
124
//    }
125
 
126
//    // Check to see if we have an interrupt on any port B inputs <4:7>
127
//    if (INTCONbits.RBIF) {
128
//        DBG_PRINT_INT("INT: Port B\r\n");
129
//        port_b_int_interrupt_handler();
130
//
131
//        INTCONbits.RBIF = 0;
132
//    }
133
 
134
//    // Check to see if we have an interrupt on timer 0
135
//    if (INTCONbits.TMR0IF) {
136
//        DBG_PRINT_INT("INT: Timer 0\r\n");
137
//        // Call the handler
138
//        timer0_interrupt_handler();
139
//
140
//        // Clear this interrupt flag
141
//        INTCONbits.TMR0IF = 0;
142
//    }
143
 
144
    // Check to see if we have an interrupt on timer 1
145
    if (PIR1bits.TMR1IF) {
146
        // Call the interrupt handler
147
        Timer1_Interrupt_Handler();
148
 
149
        // Clear the interrupt flag
150
        PIR1bits.TMR1IF = 0;
151
    }
152
 
153
//    // Check to see if we have an interrupt on timer 3
154
//    if (PIR2bits.TMR3IF) {
155
//        DBG_PRINT_INT("INT: Timer 3\r\n");
156
//        timer3_interrupt_handler();
157
//
158
//        PIR2bits.TMR3IF = 0;
159
//    }
160
 
161
//    // Check to see if we have an interrupt on ADC
162
//    if (PIR1bits.ADIF) {
163
//        // Call the interrupt handler
164
//        ADC_Interrupt_Handler();
165
//
166
//        // Clear the interrupt flag
167
//        PIR1bits.ADIF = 0;
168
//    }
169
}