<?xml version='1.0' encoding='iso-8859-1'?>
<pic_def id='16F877a'>
	<part_number>16F877A</part_number>
	<datasheet></datasheet>
	<image filename='16f877a.png'></image>
	<file_info>		
		<author display_name='Author'>B. Dring</author>
		<email display_name='Email'>bdring@eng-serve.com</email>
		<revision display_name='Revision'>0.3</revision>
		<date display_name='Date'>2007:08:07</date>
        <copyright display_name='Copyright'>(2007) B. Dring</copyright>
		<comments display_name='Comments'>Prelimianry version...use with caution</comments>
	</file_info>
	
	<digital_io>
		<port value='PORTA' register='TRISA' availability='00111111' selected='0xFF'>PORTA</port>
		<port value='PORTB' register='TRISB' availability='11111111' selected='0xFF'>PORTB</port>
		<port value='PORTC' register='TRISC' availability='11111111' selected='0xFF'>PORTC</port>
		<port value='PORTD' register='TRISD' availability='11111111' selected='0xFF'>PORTD</port>
		<port value='PORTE' register='TRISE' availability='00000111' selected='0xFF'>PORTE</port>
		<options>	
			<option>
				<item name='PortBPullups' value='0x00' register='OPTION_REG' selected='true'>PORTB pull-ups are enabled by individual port latch values</item>
				<item name='PortBPullups' value='0x80' register='OPTION_REG' selected='false'>PORTB pull-ups are disabled</item>
			</option>
			<option>
				<item name='IntEdge' value='0x00' register='OPTION_REG' selected='true'>External Interrupt on falling edge</item>
				<item name='IntEdge' value='0x40' register='OPTION_REG' selected='false'>External Interrupt on rising edge</item>
			</option>
		</options>
		
	</digital_io>
	<adc type='channels_and_refs'>
		<port_configurations register='ADCON1' type='channels_and_refs'>
			<configuration value='0x00' register='ADCON1' vrefH='Vdd' vrefL='Vss' selected='true'>A0,AN1,AN2,AN3,AN4,AN5,AN6,AN7</configuration>
			<configuration value='0x01' register='ADCON1' vrefH='AN3' vrefL='Vss' selected='false'>A0,AN1,AN2,AN4,AN5,AN6,AN7</configuration>
			<configuration value='0x02' register='ADCON1' vrefH='Vdd' vrefL='Vss' selected='false'>A0,AN1,AN2,AN3,AN4</configuration>
			<configuration value='0x03' register='ADCON1' vrefH='AN3' vrefL='Vss' selected='false'>A0,AN1,AN2,AN3,AN4,AN5,AN6,AN7</configuration>
			<configuration value='0x04' register='ADCON1' vrefH='Vdd' vrefL='Vss' selected='false'>A0,AN1,AN2,A4</configuration>
			<configuration value='0x05' register='ADCON1' vrefH='AN3' vrefL='Vss' selected='false'>A0,AN1,AN3</configuration>
			<configuration value='0x06' register='ADCON1' vrefH=' - ' vrefL=' - ' selected='false'>A0,AN1</configuration>
			<configuration value='0x08' register='ADCON1' vrefH='AN3' vrefL='AN2' selected='false'>None</configuration>
			<configuration value='0x09' register='ADCON1' vrefH='Vdd' vrefL='Vss' selected='false'>A0,AN1,AN2,AN3,AN4,AN5</configuration>
			<configuration value='0x0A' register='ADCON1' vrefH='AN3' vrefL='Vss' selected='false'>A0,AN1,AN2,AN4,AN5</configuration>
			<configuration value='0x0B' register='ADCON1' vrefH='AN3' vrefL='AN2' selected='false'>A0,AN1,AN4,AN5</configuration>
			<configuration value='0x0C' register='ADCON1' vrefH='AN3' vrefL='AN2' selected='false'>A0,AN1,AN4</configuration>
			<configuration value='0x0D' register='ADCON1' vrefH='AN3' vrefL='AN2' selected='false'>A0,AN1</configuration>
			<configuration value='0x0E' register='ADCON1' vrefH='Vdd' vrefL='Vss' selected='false'>A0</configuration>
			<configuration value='0x0F' register='ADCON1' vrefH='AN3' vrefL='AN2' selected='false'>A0</configuration>
		</port_configurations>
		<adc_conversion_clocks>
			<adc_conversion_clock value='0x00,0x00' register='ADCON0,ADCON1' selected='true'>Fosc/2</adc_conversion_clock>
			<adc_conversion_clock value='0x40,0x00' register='ADCON0,ADCON1'>Fosc/8</adc_conversion_clock>
			<adc_conversion_clock value='0x80,0x00' register='ADCON0,ADCON1'>Fosc/32</adc_conversion_clock>
			<adc_conversion_clock value='0xC0,0x00' register='ADCON0,ADCON1'>FRC (clock derived from the internal A/D RC oscillator)</adc_conversion_clock>
			<adc_conversion_clock value='0x00,0x40' register='ADCON0,ADCON1'>Fosc/4</adc_conversion_clock>
			<adc_conversion_clock value='0x40,0x40' register='ADCON0,ADCON1'>Fosc/16</adc_conversion_clock>
			<adc_conversion_clock value='0x80,0x40' register='ADCON0,ADCON1'>Fosc/64</adc_conversion_clock>
			<adc_conversion_clock value='0xC0,0x40' register='ADCON0,ADCON1'>FRC (clock derived from the internal A/D RC oscillator)</adc_conversion_clock>
		</adc_conversion_clocks>
		<adc_formats>
			<adc_format register='ADCON1' value='0x80' selected='true'>Right justified. Six (6) Most Significant bits of ADRESH are read as 0</adc_format>
			<adc_format register='ADCON1' value='0x00' selected='false'>Left justified. Six (6) Least Significant bits of ADRESL are read as 0</adc_format>
		</adc_formats>
		<adc_enable value ='0x01' register='ADCON0' selected='false'>Enable ADC</adc_enable>
	</adc>
	
	<timers>
		<timer name='TMR0' value='TMR0' selected='true'>Timer 0<options>
				<option>
					<item name='TMR0PrescaleAssign' value='0x00' register='OPTION_REG' selected='false'>Prescaler is assigned to the WDT</item>
					<item name='TMR0PrescaleAssign' value='0x08' register='OPTION_REG' selected='true'>Prescaler is assigned to TMR0</item>
				</option>				
				<option>
					<item name='TMR0Prescale' value='0x00' register='OPTION_REG' selected='true'>TMR0 Rate: 1:2 WDT Rate 1:1</item>
					<item name='TMR0Prescale' value='0x01' register='OPTION_REG' selected='false'>TMR0 Rate: 1:4 WDT Rate 1:2</item>
					<item name='TMR0Prescale' value='0x02' register='OPTION_REG' selected='false'>TMR0 Rate: 1:8 WDT Rate 1:4</item>
					<item name='TMR0Prescale' value='0x03' register='OPTION_REG' selected='false'>TMR0 Rate: 1:16 WDT Rate 1:8</item>
					<item name='TMR0Prescale' value='0x04' register='OPTION_REG' selected='false'>TMR0 Rate: 1:32 WDT Rate 1:16</item>
					<item name='TMR0Prescale' value='0x05' register='OPTION_REG' selected='false'>TMR0 Rate: 1:64 WDT Rate 1:32</item>
					<item name='TMR0Prescale' value='0x06' register='OPTION_REG' selected='false'>TMR0 Rate: 1:128 WDT Rate 1:64</item>
					<item name='TMR0Prescale' value='0x07' register='OPTION_REG' selected='false'>TMR0 Rate: 1:256 WDT Rate 1:128</item>
				</option>				
			</options>				
		</timer>

		<timer name='TMR1' value='TMR1' selected='true'>Timer 1<options>
				<option>		
					<item name='TMR1On' value='0x01' register='T1CON' selected='false'>Timer On</item>
					<item name='TMR1On' value='0x00' register='T1CON' selected='true'>Timer Off</item>
				</option>
				<option>
					<item name='TMR1Prescale' value='0x18' register='T1CON' selected='false'>1:8 Prescale</item>
					<item name='TMR1Prescale' value='0x10' register='T1CON' selected='false'>1:4 Prescale</item>
					<item name='TMR1Prescale' value='0x08' register='T1CON' selected='false'>1:2 Prescale</item>
					<item name='TMR1Prescale' value='0x00' register='T1CON' selected='true'>1:1 Prescale</item>
				</option>
			</options>
		</timer>
		
		<timer name='TMR2' value='TMR2' selected='true'>Timer 2<options>
				<option>		
					<item name='TMR2On' value='0x04' register='T2CON' selected='false'>Timer On</item>
					<item name='TMR2On' value='0x00' register='T2CON' selected='true'>Timer Off</item>
				</option>
				<option>
					<item name='TMR2Prescale' value='0x00' register='T2CON' selected='true'>1:1 Prescale</item>
					<item name='TMR2Prescale' value='0x01' register='T2CON' selected='false'>1:4 Prescale</item>
					<item name='TMR2Prescale' value='0x02' register='T2CON' selected='false'>1:16 Prescale</item>
				</option>
				<option>
					<item name='TMR2Postscale' value='0x00' register='T2CON' selected='true'>1:1 Postscale</item>
					<item name='TMR2Postscale' value='0x08' register='T2CON' selected='false'>1:2 Postscale</item>
					<item name='TMR2Postscale' value='0x10' register='T2CON' selected='false'>1:3 Postscale</item>
					<item name='TMR2Postscale' value='0x18' register='T2CON' selected='false'>1:4 Postscale</item>
					<item name='TMR2Postscale' value='0x20' register='T2CON' selected='false'>1:5 Postscale</item>
					<item name='TMR2Postscale' value='0x28' register='T2CON' selected='false'>1:6 Postscale</item>
					<item name='TMR2Postscale' value='0x30' register='T2CON' selected='false'>1:7 Postscale</item>
					<item name='TMR2Postscale' value='0x38' register='T2CON' selected='false'>1:8 Postscale</item>
					<item name='TMR2Postscale' value='0x40' register='T2CON' selected='false'>1:9 Postscale</item>
					<item name='TMR2Postscale' value='0x48' register='T2CON' selected='false'>1:10 Postscale</item>
					<item name='TMR2Postscale' value='0x50' register='T2CON' selected='false'>1:11 Postscale</item>
					<item name='TMR2Postscale' value='0x58' register='T2CON' selected='false'>1:12 Postscale</item>
					<item name='TMR2Postscale' value='0x60' register='T2CON' selected='false'>1:13 Postscale</item>
					<item name='TMR2Postscale' value='0x68' register='T2CON' selected='false'>1:14 Postscale</item>
					<item name='TMR2Postscale' value='0x70' register='T2CON' selected='false'>1:15 Postscale</item>
					<item name='TMR2Postscale' value='0x78' register='T2CON' selected='false'>1:16 Postscale</item>
				</option>
			</options>
		</timer>
		
	</timers>
	<ccps>
		<ccp name='CCP1' value='CCP1' selected='false'>CCP1<options>
		<option>
			<item name='CCP1Mode' value='0x00' register='CCP1CON' selected='true'>CCP1 Disabled</item>
			<item name='CCP1Mode' value='0x04' register='CCP1CON' selected='false'>Capture mode every falling edge</item>
			<item name='CCP1Mode' value='0x05' register='CCP1CON' selected='false'>Capture mode every rising edge</item>
			<item name='CCP1Mode' value='0x06' register='CCP1CON' selected='false'>Capture mode every 4th rising edge</item>
			<item name='CCP1Mode' value='0x07' register='CCP1CON' selected='false'>Capture mode every 16th rising edge</item>
			<item name='CCP1Mode' value='0x08' register='CCP1CON' selected='false'>Compare mode, set output on match </item>
			<item name='CCP1Mode' value='0x09' register='CCP1CON' selected='false'>Compare mode clear output on match</item>
			<item name='CCP1Mode' value='0x0A' register='CCP1CON' selected='false'>Compare mode, generate interrupt on match </item>
			<item name='CCP1Mode' value='0x0B' register='CCP1CON' selected='false'>Compare mode, trigger special event</item>
			<item name='CCP1Mode' value='0x0C' register='CCP1CON' selected='false'>PWM Mode</item>
		</option>
		</options>
		</ccp>
		<ccp name='CCP2' value='CCP2' selected='false'>CCP2<options>
		<option>
			<item name='CCP2Mode' value='0x00' register='CCP2CON' selected='true'>CCP2 Disabled</item>
			<item name='CCP2Mode' value='0x04' register='CCP2CON' selected='false'>Capture mode every falling edge</item>
			<item name='CCP2Mode' value='0x05' register='CCP2CON' selected='false'>Capture mode every rising edge</item>
			<item name='CCP2Mode' value='0x06' register='CCP2CON' selected='false'>Capture mode every 4th rising edge</item>
			<item name='CCP2Mode' value='0x07' register='CCP2CON' selected='false'>Capture mode every 16th rising edge</item>
			<item name='CCP2Mode' value='0x08' register='CCP2CON' selected='false'>Compare mode, set output on match </item>
			<item name='CCP2Mode' value='0x09' register='CCP2CON' selected='false'>Compare mode clear output on match</item>
			<item name='CCP2Mode' value='0x0A' register='CCP2CON' selected='false'>Compare mode, generate interrupt on match </item>
			<item name='CCP2Mode' value='0x0B' register='CCP2CON' selected='false'>Compare mode, trigger special event</item>
			<item name='CCP2Mode' value='0x0C' register='CCP2CON' selected='false'>PWM Mode</item>
		</option>
		</options>
		</ccp>
	</ccps>
	
	<interrupts>
		<interrupt value='TMR0IF' enable='TMR0IE' register='INTCON' selected='false'>TMR0 Overflow Interrupt<int_code><![CDATA[  if (INTCON.TMR0IF) // Timer 0\n  {\n    INTCON.TMR0IE=1;\n    INTCON.TMR0IF=0;\n  }\n\n]]></int_code></interrupt>
		<interrupt value='INTIF' enable='INTE' register='INTCON' selected='false'>RB0/INT External Interrupt<int_code><![CDATA[  if(INTCON.INTF) // RB0/INT External\n  {\n    INTCON.INTF=0;\n  }\n\n]]></int_code></interrupt>
		<interrupt value='RBIF' enable='RBIE' register='INTCON' selected='false'>RB Port Change Interrupt<int_code><![CDATA[  if(INTCON.RBIF) // PortB Change\n  {\n    x=PORTB; // Read to clear\n    INTCON.RBIF =0;\n  }\n\n]]></int_code></interrupt>
		<interrupt value='PSPIF' enable='PSPIE' register='PIE1' selected='false'>Parallel Slave Port Read/Write Interrupt<int_code><![CDATA[  if(PIR1.PSPIF)  // PSP Read/Write Occured\n  {\n    PIR1.PSPIF = 0;\n  }\n]]></int_code></interrupt>
		<interrupt value='ADIF' enable='ADIE' register='PIE1' selected='false'>A/D Converter Interrupt<int_code><![CDATA[  if(PIR1.ADIF)  // ADC Complete\n  {\n    PIR1.ADIF = 0;\n  }\n]]></int_code></interrupt>
		<interrupt value='RCIF' enable='RCIE' register='PIE1' selected='false'>USART Receive Interrupt<int_code><![CDATA[  if (PIR1.RCIF) //UART Receive\n  {\n    rxChar = RCREG; //reading clears the flag\n  }\n]]></int_code></interrupt>
		<interrupt value='TXIF' enable='TXIE' register='PIE1' selected='false'>USART Transmit Interrupt<int_code><![CDATA[  if(PIR1.TXIF) // USART Transmit\n  {\n    PIR1.TXIF =0;\n  }\n]]></int_code></interrupt>
		<interrupt value='SSPIF' enable='SSPIE' register='PIE1' selected='false'>Synchronous Serial Port (SSP) Interrupt<int_code><![CDATA[  if(PIR1.SSPIF) // Synchronous Serial Port\n  {\n    PIR1.SSPIF =0;\n  }\n]]></int_code></interrupt>
		<interrupt value='CCP1IF' enable='CCP1IE' register='PIE1' selected='false'>CCP1 Interrupt<int_code><![CDATA[  if(PIR1.CCP1IF) // CCP1\n  {\n    PIR2.CCP1IF=0;\n  }\n]]></int_code></interrupt>
		<interrupt value='TMR2IF' enable='TMR2IE' register='PIE1' selected='false'>TMR2 to PR2 Match Interrupt<int_code><![CDATA[  if (PIR1.TMR2IF) // Timer 2\n  {\n    PIR1.TMR2IF=0;\n    PIE1.TMR2IE=1;   // reenable interrupt\n  }\n]]></int_code></interrupt>
		<interrupt value='TMR1IF' enable='TMR1IE' register='PIE1' selected='false'>TMR1 Overflow Interrupt<int_code><![CDATA[  if (PIR1.TMR1IF) // Timer 1\n  {\n    PIR1.TMR1IF=0;\n    PIE1.TMR1IE=1;  // reenable interrupt\n  }\n]]></int_code></interrupt>
		<interrupt value='CMIF' enable='CMIE' register='PIE2' selected='false'>Comparator Interrupt<int_code><![CDATA[  if (PIR2.CMIF) // Comparator Interrupt\n  {\n    PIR2.CMIF=0;\n  }\n]]></int_code></interrupt>
		<interrupt value='EEIF' enable='EEIE' register='PIE2' selected='false'>EEPROM Write Operation Interrupt<int_code><![CDATA[  if (PIR2.EEIF) // EEPROM Write\n  {\n    PIR2.EEIF=0;\n  }\n\n]]></int_code></interrupt>
		<interrupt value='BCLIF' enable='BCLIE' register='PIE2' selected='false'>Bus Collision Interrupt<int_code><![CDATA[  if (PIR2.EEIF) // EEPROM Write\n  {\n    PIR2.EEIF=0;\n  }\n\n]]></int_code></interrupt>
		<interrupt value='CCP2IF' enable='CCP2IE' register='PIE2' selected='false'>CCP2 Interrupt<int_code><![CDATA[  if(PIR1.CCP2IF) // CCP2\n  {\n    PIR2.CCP2IF=0;\n  }\n]]></int_code></interrupt>				
	</interrupts>
</pic_def>
