Click here to Skip to main content
15,892,199 members
Articles / Desktop Programming / MFC

A PIC C Code Wizard

Rate me:
Please Sign up or sign in to vote.
4.94/5 (27 votes)
5 May 2003CPOL5 min read 156.2K   7.9K   46  
Creates C code templates for PIC microcontrollers. The default templates are for use with the Hi-Tech (tm) PICC compiler.
#include "pic.h"
#include "fls.h"
#include "picpc.h"
#include <math.h>

volatile unsigned char	INDF; // 0x00;
volatile unsigned char	TMR0; // 0x01;
volatile unsigned char	PCL; // 0x02;
volatile unsigned char	STATUS; // 0x03;
         unsigned char	FSR; // 0x04;
volatile unsigned char	PORTA; // 0x05;
volatile unsigned char	PORTB; // 0x06;
volatile unsigned char	PORTC; // 0x07;
#ifdef __PINS_40
volatile unsigned char	PORTD; // 0x08;
volatile unsigned char	PORTE; // 0x09;
#endif
         unsigned char	PCLATH; // 0x0A;
volatile unsigned char	INTCON; // 0x0B;
volatile unsigned char	PIR1; // 0x0C;
volatile unsigned char	PIR2; // 0x0D;
volatile unsigned char	TMR1L; // 0x0E;
volatile unsigned char	TMR1H; // 0x0F;
volatile unsigned char	T1CON; // 0x10;
volatile unsigned char	TMR2; // 0x11;
volatile unsigned char	T2CON; // 0x12;
#if !defined(_16F870) && !defined(_16F871)
volatile unsigned char	SSPBUF; // 0x13;
volatile unsigned char	SSPCON; // 0x14;
#endif
volatile unsigned char	CCPR1L; // 0x15;
volatile unsigned char	CCPR1H; // 0x16;
volatile unsigned char	CCP1CON; // 0x17;
#ifndef _16F872
volatile unsigned char	RCSTA; // 0x18;
volatile unsigned char	TXREG; // 0x19;
volatile unsigned char	RCREG; // 0x1A;
#if !defined(_16F870) && !defined(_16F871)
volatile unsigned char	CCPR2L; // 0x1B;
volatile unsigned char	CCPR2H; // 0x1C;
volatile unsigned char	CCP2CON; // 0x1D;
#endif
#endif
volatile unsigned char	ADRESH; // 0x1E;
volatile unsigned char	ADCON0; // 0x1F;

/*	bank 1 registers */
         unsigned char bank1	OPTION; // 0x81;
volatile	unsigned char bank1	TRISA; // 0x85;
volatile	unsigned char bank1	TRISB; // 0x86;
volatile	unsigned char bank1	TRISC; // 0x87;
#ifdef	__PINS_40
volatile unsigned char bank1	TRISD; // 0x88;
volatile unsigned char bank1	TRISE; // 0x89;
#endif
volatile unsigned char bank1	PIE1; // 0x8C;
volatile unsigned char bank1	PIE2; // 0x8D;
volatile unsigned char bank1	PCON; // 0x8E;
#if !defined(_16F870) && !defined(_16F871)
volatile unsigned char bank1	SSPCON2; // 0x91;
#endif
volatile unsigned char bank1	PR2; // 0x92;
#if !defined(_16F870) && !defined(_16F871)
volatile unsigned char bank1	SSPADD; // 0x93;
volatile unsigned char bank1	SSPSTAT; // 0x94;
#endif
#ifndef _16F872
volatile unsigned char bank1	TXSTA; // 0x98;
volatile unsigned char bank1	SPBRG; // 0x99;
#endif
#ifdef __A_TYPE
volatile unsigned char bank1	CMCON; // 0x9C;
volatile unsigned char bank1	CVRCON; // 0x9D;
#endif
volatile unsigned char bank1	ADRESL; // 0x9E;
volatile unsigned char bank1	ADCON1; // 0x9F;

/*	bank 2 registers */
volatile unsigned char bank2	EEDATA; // 0x10C;
volatile unsigned char bank2	EEADR; // 0x10D;
volatile unsigned char bank2	EEDATH; // 0x10E;
volatile unsigned char bank2	EEADRH; // 0x10F;

/*	bank 3 registers */
volatile unsigned char bank3	EECON1; // 0x18C;
volatile unsigned char bank3	EECON2; // 0x18D;

/*	STATUS bits	*/
volatile bit	IRP    ; // (unsigned)&STATUS*8+7;
volatile bit	RP1    ; // (unsigned)&STATUS*8+6;
volatile bit	RP0    ; // (unsigned)&STATUS*8+5;
volatile bit	TO; // (unsigned)&STATUS*8+4;
volatile bit	PD; // (unsigned)&STATUS*8+3;
volatile bit	ZERO   ; // (unsigned)&STATUS*8+2;
volatile bit	DC     ; // (unsigned)&STATUS*8+1;
volatile bit	CARRY  ; // (unsigned)&STATUS*8+0;

/*      PORTA bits      */
volatile bit	RA5; // (unsigned)&PORTA*8+5;
volatile bit	RA4; // (unsigned)&PORTA*8+4;
volatile bit	RA3; // (unsigned)&PORTA*8+3;
volatile bit	RA2; // (unsigned)&PORTA*8+2;
volatile bit	RA1; // (unsigned)&PORTA*8+1;
volatile bit	RA0; // (unsigned)&PORTA*8+0;

/*      PORTB bits      */
volatile bit	RB7; // (unsigned)&PORTB*8+7;
volatile bit	RB6; // (unsigned)&PORTB*8+6;
volatile bit	RB5; // (unsigned)&PORTB*8+5;
volatile bit	RB4; // (unsigned)&PORTB*8+4;
volatile bit	RB3; // (unsigned)&PORTB*8+3;
volatile bit	RB2; // (unsigned)&PORTB*8+2;
volatile bit	RB1; // (unsigned)&PORTB*8+1;
volatile bit	RB0; // (unsigned)&PORTB*8+0;

/*      PORTC bits      */
volatile bit	RC7; // (unsigned)&PORTC*8+7;
volatile bit	RC6; // (unsigned)&PORTC*8+6;
volatile bit	RC5; // (unsigned)&PORTC*8+5;
volatile bit	RC4; // (unsigned)&PORTC*8+4;
volatile bit	RC3; // (unsigned)&PORTC*8+3;
volatile bit	RC2; // (unsigned)&PORTC*8+2;
volatile bit	RC1; // (unsigned)&PORTC*8+1;
volatile bit	RC0; // (unsigned)&PORTC*8+0;

/*      PORTD bits      */
#ifdef	__PINS_40
volatile bit	RD7; // (unsigned)&PORTD*8+7;
volatile bit	RD6; // (unsigned)&PORTD*8+6;
volatile bit	RD5; // (unsigned)&PORTD*8+5;
volatile bit	RD4; // (unsigned)&PORTD*8+4;
volatile bit	RD3; // (unsigned)&PORTD*8+3;
volatile bit	RD2; // (unsigned)&PORTD*8+2;
volatile bit	RD1; // (unsigned)&PORTD*8+1;
volatile bit	RD0; // (unsigned)&PORTD*8+0;

/*      PORTE bits      */
volatile bit	RE2; // (unsigned)&PORTE*8+2;
volatile bit	RE1; // (unsigned)&PORTE*8+1;
volatile bit	RE0; // (unsigned)&PORTE*8+0;
#endif

/*	INTCON bits	*/
volatile bit	GIE; // (unsigned)&INTCON*8+7;
volatile bit	PEIE; // (unsigned)&INTCON*8+6;
volatile bit	T0IE; // (unsigned)&INTCON*8+5;
volatile bit	INTE; // (unsigned)&INTCON*8+4;
volatile bit	RBIE; // (unsigned)&INTCON*8+3;
volatile bit	T0IF; // (unsigned)&INTCON*8+2;
volatile bit	INTF; // (unsigned)&INTCON*8+1;
volatile bit	RBIF; // (unsigned)&INTCON*8+0;
// alternate definitions
volatile bit	TMR0IE; // (unsigned)&INTCON*8+5;
volatile bit	TMR0IF; // (unsigned)&INTCON*8+2;

/*	PIR1 bits	*/
#ifdef	__PINS_40
volatile bit	PSPIF; // (unsigned)&PIR1*8+7;
#endif
volatile bit	ADIF; // (unsigned)&PIR1*8+6;
#ifndef _16F872
volatile bit	RCIF; // (unsigned)&PIR1*8+5;
volatile bit	TXIF; // (unsigned)&PIR1*8+4;
#endif
#if !defined(_16F870) && !defined(_16F871)
volatile bit	SSPIF; // (unsigned)&PIR1*8+3;
#endif
volatile bit	CCP1IF; // (unsigned)&PIR1*8+2;
volatile bit	TMR2IF; // (unsigned)&PIR1*8+1;
volatile bit	TMR1IF; // (unsigned)&PIR1*8+0;

/*	PIR2 bits	*/
#ifdef __A_TYPE
volatile bit	CMIF; // (unsigned)&PIR2*8+6;
#endif
volatile bit	EEIF; // (unsigned)&PIR2*8+4;
#if !defined(_16F870) && !defined(_16F871)
volatile bit	BCLIF; // (unsigned)&PIR2*8+3;
#ifndef _16F872
volatile bit	CCP2IF; // (unsigned)&PIR2*8+0;
#endif
#endif

/*	T1CON bits	*/
volatile bit	T1CKPS1; // (unsigned)&T1CON*8+5;
volatile bit	T1CKPS0; // (unsigned)&T1CON*8+4;
volatile bit	T1OSCEN; // (unsigned)&T1CON*8+3;
volatile bit	T1SYNC ; // (unsigned)&T1CON*8+2;
volatile bit	TMR1CS ; // (unsigned)&T1CON*8+1;
volatile bit	TMR1ON ; // (unsigned)&T1CON*8+0;

/*	T2CON bits	*/
volatile bit	TOUTPS3; // (unsigned)&T2CON*8+6;
volatile bit	TOUTPS2; // (unsigned)&T2CON*8+5;
volatile bit	TOUTPS1; // (unsigned)&T2CON*8+4;
volatile bit	TOUTPS0; // (unsigned)&T2CON*8+3;
volatile bit	TMR2ON ; // (unsigned)&T2CON*8+2;
volatile bit	T2CKPS1; // (unsigned)&T2CON*8+1;
volatile bit	T2CKPS0; // (unsigned)&T2CON*8+0;

/*	SSPCON bits	*/
#if !defined(_16F870) && !defined(_16F871)
volatile bit	WCOL; // (unsigned)&SSPCON*8+7;
volatile bit	SSPOV; // (unsigned)&SSPCON*8+6;
volatile bit	SSPEN; // (unsigned)&SSPCON*8+5;
volatile bit	CKP; // (unsigned)&SSPCON*8+4;
volatile bit	SSPM3; // (unsigned)&SSPCON*8+3;
volatile bit	SSPM2; // (unsigned)&SSPCON*8+2;
volatile bit	SSPM1; // (unsigned)&SSPCON*8+1;
volatile bit	SSPM0; // (unsigned)&SSPCON*8+0;
#endif
/*	CCP1CON bits	*/
volatile bit	CCP1X; // (unsigned)&CCP1CON*8+5;
volatile bit	CCP1Y; // (unsigned)&CCP1CON*8+4;
volatile bit	CCP1M3; // (unsigned)&CCP1CON*8+3;
volatile bit	CCP1M2; // (unsigned)&CCP1CON*8+2;
volatile bit	CCP1M1; // (unsigned)&CCP1CON*8+1;
volatile bit	CCP1M0; // (unsigned)&CCP1CON*8+0;

/*	RCSTA bits	*/
#ifndef _16F872
volatile bit	SPEN; // (unsigned)&RCSTA*8+7;
volatile bit	RX9 ; // (unsigned)&RCSTA*8+6;
volatile bit	SREN; // (unsigned)&RCSTA*8+5;
volatile bit	CREN; // (unsigned)&RCSTA*8+4;
volatile bit	ADDEN; // (unsigned)&RCSTA*8+3;
volatile bit	FERR; // (unsigned)&RCSTA*8+2;
volatile bit	OERR; // (unsigned)&RCSTA*8+1;
volatile bit	RX9D; // (unsigned)&RCSTA*8+0;
#endif

/*	CCP2CON bits	*/
#if !defined(_16F870) && !defined(_16F871) && !defined(_16F872)
volatile bit	CCP2X; // (unsigned)&CCP2CON*8+5;
volatile bit	CCP2Y; // (unsigned)&CCP2CON*8+4;
volatile bit	CCP2M3; // (unsigned)&CCP2CON*8+3;
volatile bit	CCP2M2; // (unsigned)&CCP2CON*8+2;
volatile bit	CCP2M1; // (unsigned)&CCP2CON*8+1;
volatile bit	CCP2M0; // (unsigned)&CCP2CON*8+0;
#endif

/*	 ADCON0 bits	*/
volatile bit	ADCS1; // (unsigned)&ADCON0*8+7;
volatile bit	ADCS0 ; // (unsigned)&ADCON0*8+6;
volatile bit	CHS2; // (unsigned)&ADCON0*8+5;
volatile bit	CHS1; // (unsigned)&ADCON0*8+4;
volatile bit	CHS0; // (unsigned)&ADCON0*8+3;
volatile bit	ADGO; // (unsigned)&ADCON0*8+2;
volatile bit	ADON; // (unsigned)&ADCON0*8+0;

/* 	OPTION bits	*/
bank1 bit	RBPU; // (unsigned)&OPTION*8+7;
bank1 bit	INTEDG; // (unsigned)&OPTION*8+6;
bank1 bit	T0CS; // (unsigned)&OPTION*8+5;
bank1 bit	T0SE; // (unsigned)&OPTION*8+4;
bank1 bit	PSA; // (unsigned)&OPTION*8+3;
bank1 bit	PS2; // (unsigned)&OPTION*8+2;
bank1 bit	PS1; // (unsigned)&OPTION*8+1;
bank1 bit	PS0; // (unsigned)&OPTION*8+0;

/*      TRISA bits      */
volatile bank1 bit	TRISA5; // (unsigned)&TRISA*8+5;
volatile bank1 bit	TRISA4; // (unsigned)&TRISA*8+4;
volatile bank1 bit	TRISA3; // (unsigned)&TRISA*8+3;
volatile bank1 bit	TRISA2; // (unsigned)&TRISA*8+2;
volatile bank1 bit	TRISA1; // (unsigned)&TRISA*8+1;
volatile bank1 bit	TRISA0; // (unsigned)&TRISA*8+0;

/*      TRISB bits      */
volatile bank1 bit	TRISB7; // (unsigned)&TRISB*8+7;
volatile bank1 bit	TRISB6; // (unsigned)&TRISB*8+6;
volatile bank1 bit	TRISB5; // (unsigned)&TRISB*8+5;
volatile bank1 bit	TRISB4; // (unsigned)&TRISB*8+4;
volatile bank1 bit	TRISB3; // (unsigned)&TRISB*8+3;
volatile bank1 bit	TRISB2; // (unsigned)&TRISB*8+2;
volatile bank1 bit	TRISB1; // (unsigned)&TRISB*8+1;
volatile bank1 bit	TRISB0; // (unsigned)&TRISB*8+0;

/*      TRISC bits      */
volatile bank1 bit	TRISC7; // (unsigned)&TRISC*8+7;
volatile bank1 bit	TRISC6; // (unsigned)&TRISC*8+6;
volatile bank1 bit	TRISC5; // (unsigned)&TRISC*8+5;
volatile bank1 bit	TRISC4; // (unsigned)&TRISC*8+4;
volatile bank1 bit	TRISC3; // (unsigned)&TRISC*8+3;
volatile bank1 bit	TRISC2; // (unsigned)&TRISC*8+2;
volatile bank1 bit	TRISC1; // (unsigned)&TRISC*8+1;
volatile bank1 bit	TRISC0; // (unsigned)&TRISC*8+0;

#ifdef	__PINS_40
/*      TRISD bits      */
volatile bank1 bit	TRISD7; // (unsigned)&TRISD*8+7;
volatile bank1 bit	TRISD6; // (unsigned)&TRISD*8+6;
volatile bank1 bit	TRISD5; // (unsigned)&TRISD*8+5;
volatile bank1 bit	TRISD4; // (unsigned)&TRISD*8+4;
volatile bank1 bit	TRISD3; // (unsigned)&TRISD*8+3;
volatile bank1 bit	TRISD2; // (unsigned)&TRISD*8+2;
volatile bank1 bit	TRISD1; // (unsigned)&TRISD*8+1;
volatile bank1 bit	TRISD0; // (unsigned)&TRISD*8+0;

/*      TRISE bits      */
volatile bank1 bit	IBF; // (unsigned)&TRISE*8+7;
volatile bank1 bit	OBF; // (unsigned)&TRISE*8+6;
volatile bank1 bit	IBOV; // (unsigned)&TRISE*8+5;
volatile bank1 bit	PSPMODE; // (unsigned)&TRISE*8+4;

volatile bank1 bit	TRISE2 ; // (unsigned)&TRISE*8+2;
volatile bank1 bit	TRISE1 ; // (unsigned)&TRISE*8+1;
volatile bank1 bit	TRISE0 ; // (unsigned)&TRISE*8+0;
#endif

/*	PIE1 bits	*/
#ifdef	__PINS_40
volatile bank1 bit	PSPIE; // (unsigned)&PIE1*8+7;
#endif
volatile bank1 bit	ADIE; // (unsigned)&PIE1*8+6;
#ifndef _16F872
volatile bank1 bit	RCIE; // (unsigned)&PIE1*8+5;
volatile bank1 bit	TXIE; // (unsigned)&PIE1*8+4;
#endif
volatile bank1 bit	SSPIE; // (unsigned)&PIE1*8+3;
volatile bank1 bit	CCP1IE; // (unsigned)&PIE1*8+2;
volatile bank1 bit	TMR2IE; // (unsigned)&PIE1*8+1;
volatile bank1 bit	TMR1IE; // (unsigned)&PIE1*8+0;

/*	PIE2 bits	*/
#ifdef __A_TYPE
volatile bank1 bit	CMIE; // (unsigned)&PIE2*8+6;
#endif
volatile bank1 bit	EEIE; // (unsigned)&PIE2*8+4;
volatile bank1 bit	BCLIE; // (unsigned)&PIE2*8+3;
#ifndef _16F872
volatile bank1 bit	CCP2IE; // (unsigned)&PIE2*8+0;
#endif

/*	PCON bits	*/
volatile bank1 bit	POR; // (unsigned)&PCON*8+1;	
volatile bank1 bit	BOR; // (unsigned)&PCON*8+0;	

/*	SSPCON2 bits */
#if !defined(_16F870) && !defined(_16F871)
volatile bank1 bit	GCEN; // (unsigned)&SSPCON2*8+7;
volatile bank1 bit	ACKSTAT; // (unsigned)&SSPCON2*8+6;
volatile bank1 bit	ACKDT; // (unsigned)&SSPCON2*8+5;
volatile bank1 bit	ACKEN; // (unsigned)&SSPCON2*8+4;
volatile bank1 bit	RCEN; // (unsigned)&SSPCON2*8+3;
volatile bank1 bit	PEN; // (unsigned)&SSPCON2*8+2;
volatile bank1 bit	RSEN; // (unsigned)&SSPCON2*8+1;
volatile bank1 bit	SEN; // (unsigned)&SSPCON2*8+0;
#endif

/*      SSPSTAT bits    */
#if !defined(_16F870) && !defined(_16F871)
volatile bank1 bit	STAT_SMP; // (unsigned)&SSPSTAT*8+7;
volatile bank1 bit	STAT_CKE; // (unsigned)&SSPSTAT*8+6;
volatile bank1 bit	STAT_DA	; // (unsigned)&SSPSTAT*8+5;
volatile bank1 bit	STAT_P	; // (unsigned)&SSPSTAT*8+4;
volatile bank1 bit	STAT_S	; // (unsigned)&SSPSTAT*8+3;
volatile bank1 bit	STAT_RW	; // (unsigned)&SSPSTAT*8+2;
volatile bank1 bit	STAT_UA	; // (unsigned)&SSPSTAT*8+1;
volatile bank1 bit	STAT_BF	; // (unsigned)&SSPSTAT*8+0;
#endif

/*	TXSTA bits	*/
#ifndef _16F872
volatile bank1 bit	CSRC; // (unsigned)&TXSTA*8+7;
volatile bank1 bit	TX9; // (unsigned)&TXSTA*8+6;
volatile bank1 bit	TXEN; // (unsigned)&TXSTA*8+5;
volatile bank1 bit	SYNC; // (unsigned)&TXSTA*8+4;
volatile bank1 bit	BRGH; // (unsigned)&TXSTA*8+2;
volatile bank1 bit	TRMT; // (unsigned)&TXSTA*8+1;
volatile bank1 bit	TX9D; // (unsigned)&TXSTA*8+0;
#endif

#ifdef __A_TYPE
/*	CMCON Bits	*/
volatile bank1 bit	C2OUT; // (unsigned)&CMCON*8+7;
volatile bank1 bit	C1OUT; // (unsigned)&CMCON*8+6;
volatile bank1 bit	C2INV; // (unsigned)&CMCON*8+5;
volatile bank1 bit	C1INV; // (unsigned)&CMCON*8+4;
volatile bank1 bit	CIS; // (unsigned)&CMCON*8+3;
volatile bank1 bit	CM2; // (unsigned)&CMCON*8+2;
volatile bank1 bit	CM1; // (unsigned)&CMCON*8+1;
volatile bank1 bit	CM0; // (unsigned)&CMCON*8+0;

/*	CVRCON Bits	*/
volatile bank1 bit	CVREN; // (unsigned)&CVRCON*8+7;
volatile bank1 bit	CVROE; // (unsigned)&CVRCON*8+6;
volatile bank1 bit	CVRR; // (unsigned)&CVRCON*8+5;
volatile bank1 bit	CVR3; // (unsigned)&CVRCON*8+3;
volatile bank1 bit	CVR2; // (unsigned)&CVRCON*8+2;
volatile bank1 bit	CVR1; // (unsigned)&CVRCON*8+1;
volatile bank1 bit	CVR0; // (unsigned)&CVRCON*8+0;
#endif

/*	ADCON1 bits	*/
volatile bank1 bit	ADFM; // (unsigned)&ADCON1*8+7;
#ifdef __A_TYPE
volatile bank1 bit	ADCS2; // (unsigned)&ADCON1*8+6;
#endif
volatile bank1 bit	PCFG3; // (unsigned)&ADCON1*8+3;
volatile bank1 bit	PCFG2; // (unsigned)&ADCON1*8+2;
volatile bank1 bit	PCFG1; // (unsigned)&ADCON1*8+1;
volatile bank1 bit	PCFG0; // (unsigned)&ADCON1*8+0;

/*	EECON1 bits */
volatile bank3 bit	EEPGD; // (unsigned)&EECON1*8+7;
volatile bank3 bit	WRERR; // (unsigned)&EECON1*8+3;
volatile bank3 bit	WREN; // (unsigned)&EECON1*8+2;
volatile bank3 bit	WR; // (unsigned)&EECON1*8+1;
volatile bank3 bit	RD; // (unsigned)&EECON1*8+0;

volatile UINT16 timer1_clone;
volatile UINT16 ccpr1_clone;
volatile UINT16 ccpr2_clone;

BOOL	bCtrlHandler = FALSE;
int		c;
double	dSystemTime;
// timer 0
HANDLE	hTimer0Thread;
DWORD	dwTimer0ThreadId;
UINT32	ui32_Timer0Counts;
double	dTimer0TimeOut;
volatile BOOL bTimer0ThreadExit;
// timer 1
HANDLE	hTimer1Thread;
DWORD	dwTimer1ThreadId;
UINT32	ui32_Timer1Counts;
double	dTimer1TimeOut;
volatile BOOL bTimer1ThreadExit;
// adc
UINT16	adc_adres;
char*	adc_buf = NULL;
DWORD	dwADCPointer = 0;
DWORD dwADCFSize;

extern void SetCtrlHandler( void );

void _adc_delete_buf( void ) {
	if ( adc_buf ) {
		free( adc_buf );
		adc_buf = NULL;
	}
}

BOOL _adc_load_data( void ) {
	DWORD dwBR;
	HANDLE fadc;

	dwADCPointer = 0;
	fadc = CreateFile( "adc.txt",
		GENERIC_READ,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL );
	if ( fadc != INVALID_HANDLE_VALUE ) {
		dwADCFSize = GetFileSize( fadc, NULL );
		if ( adc_buf == NULL )
			adc_buf = malloc( dwADCFSize+1 );
		ZeroMemory( adc_buf, dwADCFSize+1 );
		ReadFile( fadc, adc_buf, dwADCFSize, &dwBR, NULL );
		CloseHandle( fadc );
		return TRUE;
	}
	else {
		return FALSE;
	}
}

void adc_init_channels( void ) {
	adc.ui8_Channel[ADC_CH0_ui16_A] = ADC_CH0;
	adc.ui8_Channel[ADC_CH1_ui16_B] = ADC_CH1;
	adc.ui8_Channel[ADC_CH2_ui16_C] = ADC_CH2;
	adc.ui8_Channel[ADC_CH0_ui16_AA] = ADC_CH0;
	adc.ui8_Channel[ADC_CH1_ui16_BB] = ADC_CH1;
	adc.ui8_Channel[ADC_CH2_ui16_CC] = ADC_CH2;
}

UBYTE adc_continue( void ) {
	if ( ++adc.ui8_Index < ADC_SIGNALS )
		adc_start( ADC_AUTO );
	else
		adc.ui8_Index = 0;
	return adc.ui8_Index;
}

UINT16 adc_get_adres( void ) {
	UINT16 _adres;
	if ( ADCON1&0x80 ) {
		LowByte(_adres) = ADRESL;
		HighByte(_adres) = ADRESH;
	}
	else {
		// Assumes that by justifying to the left
		// an ADC resolution of 8-bit is desired
		_adres = ADRESH;
	}
	return _adres;
}

void adc_start( UBYTE adc_ch ) {
	ADCON0 &= 0xC7;
	if ( ADC_AUTO == adc_ch ) {
		adc_ch = adc.ui8_Channel[adc.ui8_Index];
	}
	ADCON0 |= adc_ch;
	asm("nop");
	for ( adc_ch=0;adc_ch<5;adc_ch++ );
	asm("nop");
	ADGO = 1;
	adc_adres = 0xFFFF;
	if ( dwADCPointer < dwADCFSize ) {
		sscanf( &adc_buf[dwADCPointer], "%u", &adc_adres );
		do {
			++dwADCPointer;
		}while( adc_buf[dwADCPointer]!=0x0A && dwADCPointer<dwADCFSize );
	}
	ADGO = 0;
	ADIF = 1;
	if ( ADCON1&0x80 ) {
		ADRESH = (UBYTE)((adc_adres>>8)&0x000F);
		ADRESL = (UBYTE)(adc_adres&0x00FF);
	}
	else {
		ADRESH = (UBYTE)((adc_adres>>2)&0x00FF);
		ADRESL = (UBYTE)((adc_adres<<6)&0x00C0);
	}
	if ( ADIE )
		isr();
}

UINT16 adc_read( UBYTE adc_ch ) {
	adc_start( adc_ch );
	while ( ADGO );
	return adc_get_adres();
}

ADC_SETUP0( UBYTE _adcon0 ) {
	ADCON0 = _adcon0;
	if ( ADCON0&0x80 ) {
		_adc_load_data();
	}
}

ADC_SETUP1( UBYTE _adcon1 ) {
	ADCON1 = _adcon1;
}

CLRWDT() {
}

SET_OPTION( UBYTE _option ) {
	OPTION = _option;
	SetCtrlHandler();
}

// timer 0
DWORD WINAPI _timer0_thread( LPVOID lpParameter ) {
	LARGE_INTEGER liTi;
	LARGE_INTEGER liTi_old;
	while ( !bTimer0ThreadExit ) {
		QueryPerformanceCounter( &liTi_old );
		do {
			QueryPerformanceCounter( &liTi );
		}while ( (liTi.QuadPart-liTi_old.QuadPart)<ui32_Timer0Counts );
		++TMR0;
		if ( 0 == TMR0 ) {
			T0IF = 1;
			isr();
		}
	}
	return -41;
}

TIMER0_EVENT_ENABLE() {
	double t0int;
	LARGE_INTEGER liFreq;
	T0IE = 1;
	dTimer0TimeOut = 4.0/OSC_FREQUENCY;
	if ( (OPTION&0x08) == 0 ) {
		int r = (OPTION&0x07) + 1;
		double res = pow( 2, r );
		dTimer0TimeOut = dTimer0TimeOut*res;
	}
	else {
		dTimer0TimeOut *= 2;
	}
	QueryPerformanceFrequency( &liFreq );
	dSystemTime = 1.0/(double)liFreq.QuadPart;
	ui32_Timer0Counts = (UINT32)(dTimer0TimeOut/dSystemTime);
	t0int = 1e3*dTimer0TimeOut*(256.0-TIMER0_OFFSET);
	printf( "-----------------------------------------\n" );
	printf( "Computer time: \t\t%G us\n"
		"PIC timer0 interrupt: \t%G ms\n"
		"PIC timer0 execution: \t%G ms\n",
		dSystemTime*1e6,
		t0int,
		t0int*TIMER0_COUNTER_LIMIT );
	printf( "-----------------------------------------\n" );
	bTimer0ThreadExit = FALSE;
	hTimer0Thread = CreateThread( NULL,
					0,
					_timer0_thread,
					NULL,
					0,
					&dwTimer0ThreadId );
	if ( hTimer0Thread == NULL ) {
		printf( "timer0_setup(): thread could not be created\n" );
	}
	SetCtrlHandler();
}

TIMER0_EVENT_DISABLE() {
	T0IE = 0;
}

TIMER0_SET( UBYTE _tmr0 ) {
}

// timer 1
DWORD WINAPI _timer1_thread( LPVOID lpParameter ) {
	LARGE_INTEGER liTi;
	LARGE_INTEGER liTi_old;
	while ( !bTimer0ThreadExit ) {
		QueryPerformanceCounter( &liTi_old );
		do {
			QueryPerformanceCounter( &liTi );
		}while ( (liTi.QuadPart-liTi_old.QuadPart)<ui32_Timer1Counts );
		++timer1_clone;
		if ( 0 == timer1_clone ) {
			TMR1IF = 1;
			isr();
		}
	}
	return -42;
}

TIMER1_SETUP( UBYTE _t1con ) {
	T1CON = _t1con;
}

TIMER1_EVENT_ENABLE() {
	double t1int;
	LARGE_INTEGER liFreq;
	TMR1IE = 1;
	dTimer1TimeOut = 4.0/OSC_FREQUENCY;
	if ( T1CON&0x01 ) {
		int r = (T1CON&0x30)>>4;
		double res = pow( 2, r );
		dTimer1TimeOut *= res;
		QueryPerformanceFrequency( &liFreq );
		dSystemTime = 1.0/(double)liFreq.QuadPart;
		ui32_Timer1Counts = (UINT32)(dTimer1TimeOut/dSystemTime);
		t1int = dTimer1TimeOut*1e3*(65536-TIMER1_OFFSET);
		printf( "-----------------------------------------\n" );
		printf( "Computer time: \t\t%G us\n"
			"PIC timer1 interrupt: \t%G ms\n"
			"PIC timer1 execution: \t%G ms\n",
			dSystemTime*1e6,
			t1int,
			t1int*TIMER1_COUNTER_LIMIT );
		printf( "-----------------------------------------\n" );
		bTimer1ThreadExit = FALSE;
		hTimer1Thread = CreateThread( NULL,
						0,
						_timer1_thread,
						NULL,
						0,
						&dwTimer1ThreadId );
		if ( hTimer1Thread == NULL ) {
			printf( "timer1_setup(): thread could not be created\n" );
		}
	}
	SetCtrlHandler();
}

TIMER1_EVENT_DISABLE() {
	TMR1IE = 0;
	bTimer1ThreadExit = TRUE;
}

TIMER1_SET( UINT16 _tmr1 ) {
}

// timer 2
TIMER2_SETUP( UBYTE _tmr2 ) {
}

// ccp
PWM_FREQ_SETUP( UBYTE freq ) {
}

PWM1_DC_SETUP( UINT16 dc ) {
}

CCP1_SETUP( UBYTE _ccp1 ) {
}

CCP2_SETUP( UBYTE _ccp2 ) {
}

PWM2_DC_SETUP( UINT16 dc ) {
}

UBYTE _EEPROMRead( UBYTE addr ) {
	return 0;
}

void EEPROMRead( UBYTE addr, UBYTE size, UBYTE* data ) {
}

void _EEPROMWrite( UBYTE addr, UBYTE data ) {
}

void EEPROMWrite( UBYTE addr, UBYTE size, UBYTE* data ) {
}

BOOL WINAPI _HandlerRoutine( DWORD dwCtrlType ) {
	switch ( dwCtrlType ) {
	case CTRL_C_EVENT:
	case CTRL_BREAK_EVENT:
	case CTRL_CLOSE_EVENT:
	case CTRL_LOGOFF_EVENT:
	case CTRL_SHUTDOWN_EVENT:
		printf( "\nShutting down...\n" );
		_adc_delete_buf();
		ExitProcess( 0 );
		return TRUE;
	}
	return FALSE;
}

void SetCtrlHandler( void ) {
	if ( !bCtrlHandler ) {
		SetConsoleCtrlHandler( _HandlerRoutine, TRUE );
		bCtrlHandler = TRUE;
		printf( "\nPress <Ctrl-C> to stop program...\n" );
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Delphi
United States United States
Carlos Buelna works in the automotive industry.

Comments and Discussions