/********************************************************************
* FileName:        Problem 3.c
* Processor:       PIC18F4520
* Compiler:        MPLAB C18 v.3.06 
*
* Lab Exam Problem 3 - Winter 2008-2009
*                                                                     
*
*       Author               Date              Comment
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
// David Fisher				Jan 26, 2009

/**  Header Files **************************************************/     
#include <p18f4520.h> 


/** Configuration Bits *********************************************/     
#pragma config OSC = EC  // EC = External 4MHz Crystal for PICDEM board only
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config BOREN = OFF

/** Define Constants Here ******************************************/

/** Local Function Prototypes **************************************/
void low_isr(void);
void high_isr(void);

/** Declare Interrupt Vector Sections ****************************/
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
   _asm goto high_isr _endasm
}

#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
   _asm goto low_isr _endasm
}

/** Global Variables ***********************************************/
int buttonCount = 0;
	
/*******************************************************************
* Function:        void main(void)
********************************************************************/
#pragma code
void main (void)
{
	ADCON1 = 0x0F;
	
	TRISB = 0xFF;
	// Turn on the RB0 interrupt INT0, falling edge, always high priority
	//OpenRB0INT( PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_OFF);
	INTCONbits.INT0IE = 1;			// Same thing using the SFR directly
	//INTCONbits.INT0IE = 1;
	INTCONbits.GIEH = 1;				// Turn on High Priority interrupts
	//INTCONbits.GIE = 1;
	
	while (1)
    {
		// This area loops forever
    }
}

/*****************************************************************
* Function:        void high_isr(void)
* Possible sources of interrupt - none
* Overview:
******************************************************************/
#pragma interrupt high_isr
void high_isr(void)
{
	if(INTCONbits.INT0IF)	// Interrupt 0, RB0
	{
		INTCONbits.INT0IF = 0;		
		buttonCount++;
	}
}

/******************************************************************
* Function:        void low_isr(void)
* Possible sources of interrupt - none
* Overview:
********************************************************************/
#pragma interruptlow low_isr
void low_isr(void)
{
	// Add code here for the low priority Interrupt Service Routine (ISR)
}