⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 always.h

📁 Clock+data serial protocol for PIC16/18F processors. Contains an example application for Zoom/Focus/
💻 H
字号:
/*

Servo PIC

Designed by Shane Tolmie, Andrew Dixon and Shane Buckham Jan 99.
Common header file for servo control for the Airborne Control Systems (ACS) flight stabilisation system.

Compiled with Hitech-C v7.82

Usage: #include in all ".c" files in project along with "pic.h"

*/

//warning about #if statements: if any of the arguments are spelled wrong or
//unrecognised by the compiler, it will not generate a warning, but not include code

#ifndef ALWAYS_H
#define ALWAYS_H

#define us_to_ticks(x)	(x*(PIC_CLK/4)/(TMR1_PRESCALE))		//converting microseconds to tmr1 clock ticks
#define ticks_to_us(x)	((x*4/PIC_CLK)*(TMR1_PRESCALE))		//converting tmr1 clock ticks to microseconds

#define hibyte(x) ((unsigned char)(x>>8))
#define lobyte(x) ((unsigned char)(x&0xff))


/*
given variable of any type (char, uchar, int, uint, long) it modifies
	the unsigned char residing at that memory location
	for ints, byte1 is msb, byte0 is lsb
	for longs	byte3 is msb, byte0 is lsb
	
	ie: sample C code
	
	unsigned int myint=0x4321;
	long mylong=0x87654321;
	
	//for myint 	byte1(myint)=0x43; (msb) and byte0(myint)=0x21; (lsb)
	//for mylong	byte3(mylong)=0x87; (msb), byte2(mylong)=0x65;
								byte2(mylong)=0x43; and byte0(mylong)=0x21; (lsb)

	note:	to avoid fixup overflow errors add bankX if the target variable
				resides in banks 1, 2 or 3
*/

//#define byte0(x)		(unsigned char)(*(((unsigned char *)&x)+0))
//#define byte1(x)		(unsigned char)(*(((unsigned char *)&x)+1))
//#define byte2(x)		(unsigned char)(*(((unsigned char *)&x)+2))
//#define byte3(x)		(unsigned char)(*(((unsigned char *)&x)+3))

#define byte0_atbank1(x)		(unsigned char)(*(((bank1 unsigned char *)&x)+0))
#define byte1_atbank1(x)		(unsigned char)(*(((bank1 unsigned char *)&x)+1))
#define byte2_atbank1(x)		(unsigned char)(*(((bank1 unsigned char *)&x)+2))
#define byte3_atbank1(x)		(unsigned char)(*(((bank1 unsigned char *)&x)+3))

#define byte0_atbank2(x)		(unsigned char)(*(((bank2 unsigned char *)&x)+0))
#define byte1_atbank2(x)		(unsigned char)(*(((bank2 unsigned char *)&x)+1))
#define byte2_atbank2(x)		(unsigned char)(*(((bank2 unsigned char *)&x)+2))
#define byte3_atbank2(x)		(unsigned char)(*(((bank2 unsigned char *)&x)+3))

#define byte0_atbank3(x)		(unsigned char)(*(((bank3 unsigned char *)&x)+0))
#define byte1_atbank3(x)		(unsigned char)(*(((bank3 unsigned char *)&x)+1))
#define byte2_atbank3(x)		(unsigned char)(*(((bank3 unsigned char *)&x)+2))
#define byte3_atbank3(x)		(unsigned char)(*(((bank3 unsigned char *)&x)+3))

/*
given variable of any type (char, uchar, int, uint, long) it modifies
	the int residing at that memory location
	ie: sample C code
	
	unsigned char array[4];
	unsigned int test;
	
	uint_atbyteaddr(&array[0])=0x4321;			//now array[0->3]={0x21,0x43,0,0};
	uint_atbyteaddr(&array[0+2])=0x8765;		//now array[0->3]={0x21,0x43,0x65,0x87};
	test=uint_atbyteaddr(&array[0+2])				//now test=0x8765
	
	note: do NOT use &(array[0]+1) to reference the int stored at array[1] as it will 
				reference the int after array[0] in pointer arithmetic.  This will 
				result with the int at array[2]
				instead use &array[0+1] to reference the int at array[1]
	      
	note:	to avoid fixup overflow errors add bankX if the target variable
				resides in banks 1, 2 or 3
*/

#define	uint_atbyteaddr(x)					(unsigned int)(*(((unsigned int *)x)))
#define	uint_atbank1byteaddr(x)			(unsigned int)(*(((bank1 unsigned int *)x)))
#define	uint_atbank2byteaddr(x)			(unsigned int)(*(((bank2 unsigned int *)x)))
#define	uint_atbank3byteaddr(x)			(unsigned int)(*(((bank3 unsigned int *)x)))

#define THE_BEER_IS_PLENTIFUL_AND_THE_PARTY_SWINGING TRUE

/*
these two structures allow access to 2 byte word, high and low bytes of variable
declaration:	union wordtype x;
usage:	x.word=0xABCD; x.byte.high=0xAB; x.byte.low=0xCD;
				x.part.bit15=1; (msb), x.part.bit0=1; (lsb) 
declaration:	union chartype x;
usage:	x.byte=0xAB;
				x.part.bit7=1; (msb), x.part.bit0=1; (lsb) 
*/

struct sixteen_bits
{
	unsigned char bit0	:1;
	unsigned char bit1	:1;
	unsigned char bit2	:1;
	unsigned char bit3	:1;
	unsigned char bit4	:1;
	unsigned char bit5	:1;
	unsigned char bit6	:1;
	unsigned char bit7	:1;
	unsigned char bit8	:1;
	unsigned char bit9	:1;
	unsigned char bit10	:1;
	unsigned char bit11	:1;
	unsigned char bit12	:1;
	unsigned char bit13	:1;
	unsigned char bit14	:1;
	unsigned char bit15	:1;
};

struct eight_bits
{
	unsigned char bit0	:1;
	unsigned char bit1	:1;
	unsigned char bit2	:1;
	unsigned char bit3	:1;
	unsigned char bit4	:1;
	unsigned char bit5	:1;
	unsigned char bit6	:1;
	unsigned char bit7	:1;
};

struct two_bytes
{
	unsigned char low;
	unsigned char high;
};

union wordtype
{
	unsigned int word;
	struct two_bytes byte;
	struct sixteen_bits part;
};

union chartype
{
	unsigned char byte;
	struct eight_bits part;
};

//defines
#define INPUT 1		//port directions
#define OUTPUT 0
#define TRUE 1
#define FALSE 0
#define	HIGH 1
#define	LOW 0
#define	hi 1
#define	lo 0

#define b asm("nop")		//convenient point for breakpoint (debugging)
#define l while(1)			//loop for ever (debugging)

//see AM576.  If interrupt occurs just when gie gets set to zero, it won't be cleared

#define	gie_on		GIE=1
#define gie_off		while(GIE==1) GIE=0

#endif


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -