Files
Cnomicon/src/libPIC/delay.h
2021-01-22 10:16:20 -05:00

226 lines
5.2 KiB
C

/*****************************************************************************
* Copyright (C) 2008
* ProbeStar Telematics, LLC
* All Rights Reserved. Proprietary and Confidential.
*============================================================================
* Delay functions for PIC-16/18 at 20/40 Mhz
*----------------------------------------------------------------------------
* Make sure this code is compiled with optimization -O -Zg4
*
* Note accuracy issues below XTAL=16 MHz.
* At or above this the loop is exactly 1 micro-second per iteration.
* The 20MHz version is correct down to 2 micro-seconds.
*
* Sample delay routines from HI-TECH were pretty sucky
*****************************************************************************/
/* prevent multiple inclusions */
#ifndef _DELAY_H_
#define _DELAY_H_
/*****************************************************************************
* includes
*****************************************************************************/
#include "system.h"
#ifdef __linux__
#include <unistd.h>
#endif
/*****************************************************************************
* defines
*****************************************************************************/
#ifdef __linux__
//-----------------------------------------------------------------------------
// Delays mapped to sleep functions
//-----------------------------------------------------------------------------
#define DelayInit()
#define DelayUsec(C) usleep(C)
#define DelayMsec(C) usleep((C)*1000)
#define DelaySec(C) sleep(C)
#else
//-----------------------------------------------------------------------------
// Microsecond delay routine
//-----------------------------------------------------------------------------
#if XTAL == 20
// PIC-18 20Mhz
#define DelayUs(x) { \
_dcnt = x; \
while(--_dcnt) { \
asm("nop"); \
asm("nop"); \
asm("nop"); \
} \
}
#elif XTAL == 40
// PIC-18 40Mhz
#define DelayUs(x) { \
_dcnt = x; \
while(--_dcnt) { \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
} \
}
#endif
#endif
/*****************************************************************************
* macros
*****************************************************************************/
#ifndef __linux__
//-----------------------------------------------------------------------------
// Fixed Delays
//-----------------------------------------------------------------------------
#ifdef XTAL == 20
// 20Mhz PIC-16 or PIC-18
#define DelayNs0100() { \
asm("nop"); \
}
#define DelayNs0200() { \
asm("nop"); \
}
#define DelayNs0300() { \
asm("nop"); \
asm("nop"); \
}
#define DelayNs0400() { \
asm("nop"); \
asm("nop"); \
}
#define DelayNs0500() { \
asm("nop"); \
asm("nop"); \
asm("nop"); \
}
#define DelayNs1000() { \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
}
#elif XTAL == 40
// PIC-18 40Mhz
#define DelayNs0100() { \
asm("nop"); \
}
#define DelayNs0200() { \
asm("nop"); \
asm("nop"); \
}
#define DelayNs0300() { \
asm("nop"); \
asm("nop"); \
asm("nop"); \
}
#define DelayNs0400() { \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
}
#define DelayNs0500() { \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
}
#define DelayNs1000() { \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
asm("nop"); \
}
#endif
// Nanosecond delays
#define DelayNs1500() { \
DelayNs0500(); \
DelayNs1000(); \
}
#define DelayNs2000() { \
DelayNs1000(); \
DelayNs1000(); \
}
#define DelayNs3000() { \
DelayNs2000(); \
DelayNs1000(); \
}
#define DelayNs4000() { \
DelayNs2000(); \
DelayNs2000(); \
}
#define DelayNs5000() { \
DelayNs2000(); \
DelayNs2000(); \
DelayNs1000(); \
}
// Microsecond delays
#define DelayUs1() DelayNs1000()
#define DelayUs2() DelayNs2000()
#define DelayUs3() DelayNs3000()
#define DelayUs4() DelayNs4000()
#define DelayUs5() DelayNs5000()
#define DelayUs10() { \
DelayUs5(); \
DelayUs5(); \
}
#endif
/*****************************************************************************
* structs & typedefs
*****************************************************************************/
/*****************************************************************************
* global constants
*****************************************************************************/
/*****************************************************************************
* global variables
*****************************************************************************/
#ifndef __linux__
extern LIBBANK volatile BYTE _dcnt;
#endif
/*****************************************************************************
* C function prototypes
*****************************************************************************/
/* export C functions to C++ */
#ifdef __cplusplus
extern "C" {
#endif
#ifndef __linux__
extern void DelayInit( void ); // Timer #0 init
// library delay routines
extern void DelayUsec( BYTE byCount ); // short delays up to 50usec
extern void DelayUsecW( WORD wCount ); // longer delays over 5usec
extern void DelayMsec( WORD wCount );
extern void DelaySec( WORD wCount );
#endif
#ifdef __cpluscplus
}
#endif
#endif