From 97fb8b4a447ff9bbc50768904cc05f9cc2c953bb Mon Sep 17 00:00:00 2001 From: Dragos Bogdan Date: Thu, 23 May 2013 16:12:03 +0300 Subject: [PATCH] Added the TIME driver for RL78G14. --- Communication.c | 185 ++++++++++++++++++++++++++++-------------------- Communication.h | 23 +++++- RDKRL78G14.c | 4 +- RDKRL78G14.h | 46 ++++++------ ST7579.c | 44 ++++++------ ST7579.h | 2 +- TIME.c | 167 +++++++++++++++++++++++++++++++++++++++++++ TIME.h | 65 +++++++++++++++++ 8 files changed, 411 insertions(+), 125 deletions(-) create mode 100644 TIME.c create mode 100644 TIME.h diff --git a/Communication.c b/Communication.c index 949edeb98..104e3e556 100644 --- a/Communication.c +++ b/Communication.c @@ -66,25 +66,25 @@ __interrupt static void IICA0_Interrupt(void) /***************************************************************************//** * @brief Initializes the SPI communication peripheral. * - * @param lsbFirst - Transfer format (0 or 1). - * Example: 0x0 - MSB first. - * 0x1 - LSB first. + * @param lsbFirst - Transfer format (0 or 1). + * Example: 0x0 - MSB first. + * 0x1 - LSB first. * @param clockFreq - SPI clock frequency (Hz). * Example: 1000 - SPI clock frequency is 1 kHz. - * @param clockPol - SPI clock polarity (0 or 1). - * Example: 0x0 - Idle state for clock is a low level; active - * state is a high level; - * 0x1 - Idle state for clock is a high level; active - * state is a low level. - * @param clockEdg - SPI clock edge (0 or 1). - * Example: 0x0 - Serial output data changes on transition - * from idle clock state to active clock state; - * 0x1 - Serial output data changes on transition - * from active clock state to idle clock state. + * @param clockPol - SPI clock polarity (0 or 1). + * Example: 0x0 - Idle state for clock is a low level; active + * state is a high level; + * 0x1 - Idle state for clock is a high level; active + * state is a low level. + * @param clockEdg - SPI clock edge (0 or 1). + * Example: 0x0 - Serial output data changes on transition + * from idle clock state to active clock state; + * 0x1 - Serial output data changes on transition + * from active clock state to idle clock state. * - * @return status - Result of the initialization procedure. - * Example: 1 - if initialization was successful; - * 0 - if initialization was unsuccessful. + * @return status - Result of the initialization procedure. + * Example: 0 - if initialization was successful; + * -1 - if initialization was unsuccessful. *******************************************************************************/ char SPI_Init(char lsbFirst, long clockFreq, @@ -93,6 +93,7 @@ char SPI_Init(char lsbFirst, { long mckFreq = 32000000; char sdrValue = 0; + char delay = 0; /* Configure the CS pins. */ PMOD1_CS_OUT; @@ -119,43 +120,49 @@ char SPI_Init(char lsbFirst, SMR11 = 0x0020; clockPol = 1 - clockPol; - SCR11 = (clockEdg << 13) | - (clockPol << 12) | - 0xC000 | // Operation mode: Transmission/reception. - 0x0007; // 8-bit data length. + SCR11 = (clockEdg << 13) | + (clockPol << 12) | + 0xC000 | // Operation mode: Transmission/reception. + 0x0007; // 8-bit data length. /* clockFreq = mckFreq / (sdrValue * 2 + 2) */ sdrValue = mckFreq / (2 * clockFreq) - 1; - SDR11 = sdrValue << 9; + SDR11 = sdrValue << 9; /* Set the clock and data initial level. */ clockPol = 1 - clockPol; - SO1 &= ~0x0202; - SO1 |= (clockPol << 9) | + SO1 &= ~0x0202; + SO1 |= (clockPol << 9) | (clockPol << 1); /* Enable output for serial communication operation. */ SOE1 |= 0x0002; - /* Configure SCLK and MOSI pins as output. */ - PM7 &= ~0x05; - P7 |= 0x05; - /* Configure the MISO pin as input. */ - PM7 |= 0x02; - + PM7 |= 0x02; + + /* Configure SCLK and MOSI pins as output. */ + P7 |= 0x05; + PM7 &= ~0x05; + + /* Wait for the changes to take place. */ + for(delay = 0; delay < 50; delay++) + { + NOP; + } + /* Set the SEmn bit to 1 and enter the communication wait status */ SS1 |= 0x0002; - - return 1; + + return 0; } /***************************************************************************//** * @brief Writes data to SPI. * * @param slaveDeviceId - The ID of the selected slave device. - * @param data - Data represents the write buffer. - * @param bytesNumber - Number of bytes to write. + * @param data - Data represents the write buffer. + * @param bytesNumber - Number of bytes to write. * * @return Number of written bytes. *******************************************************************************/ @@ -163,8 +170,10 @@ char SPI_Write(char slaveDeviceId, unsigned char* data, char bytesNumber) { - char byte = 0; - unsigned char read = 0; + char byte = 0; + unsigned char read = 0; + unsigned short originalSCR = 0; + unsigned short originalSO1 = 0; if(slaveDeviceId == 1) { @@ -176,6 +185,12 @@ char SPI_Write(char slaveDeviceId, } if(slaveDeviceId == 3) { + ST1 |= 0x0002; + originalSO1 = SO1; + originalSCR = SCR11; + SO1 &= ~0x0202; + SCR11 &= ~0x3000; + SS1 |= 0x0002; ST7579_CS_LOW; } for(byte = 0; byte < bytesNumber; byte++) @@ -196,6 +211,10 @@ char SPI_Write(char slaveDeviceId, if(slaveDeviceId == 3) { ST7579_CS_HIGH; + ST1 |= 0x0002; + SO1 = originalSO1; + SCR11 = originalSCR; + SS1 |= 0x0002; } return bytesNumber; @@ -205,9 +224,9 @@ char SPI_Write(char slaveDeviceId, * @brief Reads data from SPI. * * @param slaveDeviceId - The ID of the selected slave device. - * @param data - Data represents the write buffer as an input parameter and the - * read buffer as an output parameter. - * @param bytesNumber - Number of bytes to read. + * @param data - Data represents the write buffer as an input parameter + * and the read buffer as an output parameter. + * @param bytesNumber - Number of bytes to read. * * @return Number of read bytes. *******************************************************************************/ @@ -215,7 +234,9 @@ char SPI_Read(char slaveDeviceId, unsigned char* data, char bytesNumber) { - char byte = 0; + char byte = 0; + unsigned short originalSCR = 0; + unsigned short originalSO1 = 0; if(slaveDeviceId == 1) { @@ -227,6 +248,12 @@ char SPI_Read(char slaveDeviceId, } if(slaveDeviceId == 3) { + ST1 |= 0x0002; + originalSO1 = SO1; + originalSCR = SCR11; + SO1 &= ~0x0202; + SCR11 &= ~0x3000; + SS1 |= 0x0002; ST7579_CS_LOW; } for(byte = 0; byte < bytesNumber; byte++) @@ -247,6 +274,10 @@ char SPI_Read(char slaveDeviceId, if(slaveDeviceId == 3) { ST7579_CS_HIGH; + ST1 |= 0x0002; + SO1 = originalSO1; + SCR11 = originalSCR; + SS1 |= 0x0002; } return bytesNumber; @@ -257,9 +288,9 @@ char SPI_Read(char slaveDeviceId, * * @param clockFreq - I2C clock frequency (Hz). * Example: 100000 - SPI clock frequency is 100 kHz. - * @return status - Result of the initialization procedure. - * Example: 1 - if initialization was successful; - * 0 - if initialization was unsuccessful. + * @return status - Result of the initialization procedure. + * Example: 0 - if initialization was successful; + * -1 - if initialization was unsuccessful. *******************************************************************************/ char I2C_Init(long clockFreq) { @@ -279,13 +310,13 @@ char I2C_Init(long clockFreq) /* Set transfer rate. */ wlValue = (unsigned char)((0.5 * fckFreq) / clockFreq); whValue = (unsigned char)(wlValue - (fckFreq / (10 * clockFreq))); - IICWL0 = wlValue; - IICWH0 = whValue; + IICWL0 = wlValue; + IICWH0 = whValue; - STCEN0 = 1; // After operation is enabled, enable generation of a start - // condition without detecting a stop condition. - WTIM0 = 1; // Interrupt request is generated at the ninth clock’s - // falling edge. + STCEN0 = 1; // After operation is enabled, enable generation of a start + // condition without detecting a stop condition. + WTIM0 = 1; // Interrupt request is generated at the ninth clock’s + // falling edge. /* Enable I2C operation. */ IICE0 = 1; @@ -294,21 +325,21 @@ char I2C_Init(long clockFreq) P6 &= ~0x03; PM6 &= ~0x03; - return 1; + return 0; } /***************************************************************************//** * @brief Writes data to a slave device. * * @param slaveAddress - Adress of the slave device. - * @param dataBuffer - Pointer to a buffer storing the transmission data. - * @param bytesNumber - Number of bytes to write. - * @param stopBit - Stop condition control. - * Example: 0 - A stop condition will not be sent; - * 1 - A stop condition will be sent. + * @param dataBuffer - Pointer to a buffer storing the transmission data. + * @param bytesNumber - Number of bytes to write. + * @param stopBit - Stop condition control. + * Example: 0 - A stop condition will not be sent; + * 1 - A stop condition will be sent. * - * @return status - Number of read bytes or 0xFF if the slave address was not - * acknowledged by the device. + * @return status - Number of read bytes or 0xFF if the slave address was + * not acknowledged by the device. *******************************************************************************/ char I2C_Write(char slaveAddress, unsigned char* dataBuffer, @@ -318,13 +349,13 @@ char I2C_Write(char slaveAddress, char byte = 0; char status = 0; - IICAMK0 = 1; // Interrupt servicing disabled. - STT0 = 1; // Generate a start condition. - IICAMK0 = 0; // Interrupt servicing enabled. + IICAMK0 = 1; // Interrupt servicing disabled. + STT0 = 1; // Generate a start condition. + IICAMK0 = 0; // Interrupt servicing enabled. /* Send the first byte. */ IICA0_Flag = 0; - IICA0 = (slaveAddress << 1); + IICA0 = (slaveAddress << 1); while(IICA0_Flag == 0); if(ACKD0) // Acknowledge was detected. @@ -332,7 +363,7 @@ char I2C_Write(char slaveAddress, for(byte = 0; byte < bytesNumber; byte++) { IICA0_Flag = 0; - IICA0 = *dataBuffer; + IICA0 = *dataBuffer; while(IICA0_Flag == 0); dataBuffer++; } @@ -355,14 +386,14 @@ char I2C_Write(char slaveAddress, * @brief Reads data from a slave device. * * @param slaveAddress - Adress of the slave device. - * @param dataBuffer - Pointer to a buffer that will store the received data. - * @param bytesNumber - Number of bytes to read. - * @param stopBit - Stop condition control. - * Example: 0 - A stop condition will not be sent; - * 1 - A stop condition will be sent. + * @param dataBuffer - Pointer to a buffer that will store the received data. + * @param bytesNumber - Number of bytes to read. + * @param stopBit - Stop condition control. + * Example: 0 - A stop condition will not be sent; + * 1 - A stop condition will be sent. * - * @return status - Number of read bytes or 0xFF if the slave address was not - * acknowledged by the device. + * @return status - Number of read bytes or 0xFF if the slave address was + * not acknowledged by the device. *******************************************************************************/ char I2C_Read(char slaveAddress, unsigned char* dataBuffer, @@ -373,12 +404,12 @@ char I2C_Read(char slaveAddress, char status = 0; IICAMK0 = 1; // Interrupt servicing disabled. - STT0 = 1; // Generate a start condition. + STT0 = 1; // Generate a start condition. IICAMK0 = 0; // Interrupt servicing enabled. /* Send the first byte. */ IICA0_Flag = 0; - IICA0 = (slaveAddress << 1) + 1; + IICA0 = (slaveAddress << 1) + 1; while(IICA0_Flag == 0); if(ACKD0) // Acknowledge was detected. @@ -388,24 +419,24 @@ char I2C_Read(char slaveAddress, { if(byte == (bytesNumber - 1)) { - ACKE0 = 0U; // Disable acknowledgment. + ACKE0 = 0U; // Disable acknowledgment. } - WREL0 = 1U; // Cancel wait. - IICA0_Flag = 0; + WREL0 = 1U; // Cancel wait. + IICA0_Flag = 0; while(IICA0_Flag == 0); *dataBuffer = IICA0; dataBuffer++; } status = bytesNumber; } - else // Acknowledge was not detected. + else // Acknowledge was not detected. { - status = 0xFF; + status = 0xFF; } if(stopBit) { - SPT0 = 1; // Generate a stop condition. - while(IICBSY0); // Wait until the I2C bus status flag is cleared. + SPT0 = 1; // Generate a stop condition. + while(IICBSY0); // Wait until the I2C bus status flag is cleared. } return status; diff --git a/Communication.h b/Communication.h index 268e5dfed..0d563bfad 100644 --- a/Communication.h +++ b/Communication.h @@ -50,9 +50,26 @@ /******************************************************************************/ /*************************** Macros Definitions *******************************/ /******************************************************************************/ -#define CS_PIN_LOW PMOD1_CS_LOW -#define CS_PIN_HIGH PMOD1_CS_HIGH -#define MISO_PIN PMOD1_MISO +#define SPI_CS_PIN_OUT PMOD1_CS_OUT +#define SPI_CS_LOW PMOD1_CS_LOW +#define SPI_CS_HIGH PMOD1_CS_HIGH +#define SPI_MISO PMOD1_MISO + +#define GPIO1_PIN_OUT PMOD1_GPIO1_PIN_OUT +#define GPIO1_LOW PMOD1_GPIO1_LOW +#define GPIO1_HIGH PMOD1_GPIO1_HIGH + +#define GPIO2_PIN_OUT PMOD1_GPIO2_PIN_OUT +#define GPIO2_LOW PMOD1_GPIO2_LOW +#define GPIO2_HIGH PMOD1_GPIO2_HIGH + +#define GPIO3_PIN_OUT PMOD1_GPIO3_PIN_OUT +#define GPIO3_LOW PMOD1_GPIO3_LOW +#define GPIO3_HIGH PMOD1_GPIO3_HIGH + +#define GPIO4_PIN_OUT PMOD1_GPIO4_PIN_OUT +#define GPIO4_LOW PMOD1_GPIO4_LOW +#define GPIO4_HIGH PMOD1_GPIO4_HIGH /******************************************************************************/ /************************ Functions Declarations ******************************/ diff --git a/RDKRL78G14.c b/RDKRL78G14.c index 8a874fcf0..5f77dfb69 100644 --- a/RDKRL78G14.c +++ b/RDKRL78G14.c @@ -37,7 +37,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************** - * SVN Revision: 831 + * SVN Revision: $WCREV$ *******************************************************************************/ /******************************************************************************/ @@ -71,7 +71,7 @@ void RDKRL78G14_Reset(void) * * @return status - Result of the initialization procedure. * Example: 0 - if initialization was successful; - * -1 - if initialization was unsuccessful. + * -1 - if initialization was unsuccessful. *******************************************************************************/ char RDKRL78G14_Init(void) { diff --git a/RDKRL78G14.h b/RDKRL78G14.h index 1ddb011fa..c7eb230e2 100644 --- a/RDKRL78G14.h +++ b/RDKRL78G14.h @@ -37,7 +37,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************** - * SVN Revision: 831 + * SVN Revision: $WCREV$ *******************************************************************************/ #ifndef __RDKRL78G14_H__ @@ -88,7 +88,31 @@ /* PMOD1 MISO Pin */ #define PMOD1_MISO_PIN (1 << 1) -#define PMOD1_MISO ((P7 & PMOD1_MISO_PIN) >> 1) +#define PMOD1_MISO ((P7 & PMOD1_MISO_PIN) >> 1) + +/* PMOD1 GPIO1 Pin - P47 */ +#define PMOD1_GPIO1_PIN (1 << 7) +#define PMOD1_GPIO1_PIN_OUT PM4 &= ~PMOD1_GPIO1_PIN; +#define PMOD1_GPIO1_LOW P4 &= ~PMOD1_GPIO1_PIN; +#define PMOD1_GPIO1_HIGH P4 |= PMOD1_GPIO1_PIN; + +/* PMOD1 GPIO2 Pin - P46 */ +#define PMOD1_GPIO2_PIN (1 << 6) +#define PMOD1_GPIO2_PIN_OUT PM4 &= ~PMOD1_GPIO2_PIN; +#define PMOD1_GPIO2_LOW P4 &= ~PMOD1_GPIO2_PIN; +#define PMOD1_GPIO2_HIGH P4 |= PMOD1_GPIO2_PIN; + +/* PMOD1 GPIO3 Pin - P110 */ +#define PMOD1_GPIO3_PIN (1 << 0) +#define PMOD1_GPIO3_PIN_OUT PM11 &= ~PMOD1_GPIO3_PIN; +#define PMOD1_GPIO3_LOW P11 &= ~PMOD1_GPIO3_PIN; +#define PMOD1_GPIO3_HIGH P11 |= PMOD1_GPIO3_PIN; + +/* PMOD1 GPIO4 Pin - P111 */ +#define PMOD1_GPIO4_PIN (1 << 1) +#define PMOD1_GPIO4_PIN_OUT PM11 &= ~PMOD1_GPIO4_PIN; +#define PMOD1_GPIO4_LOW P11 &= ~PMOD1_GPIO4_PIN; +#define PMOD1_GPIO4_HIGH P11 |= PMOD1_GPIO4_PIN; /* PMOD2 CS Pin - P82 */ #define PMOD2_CS_PIN (1 << 2) @@ -96,24 +120,6 @@ #define PMOD2_CS_LOW P8 &= ~PMOD2_CS_PIN #define PMOD2_CS_HIGH P8 |= PMOD2_CS_PIN -/* GPIO1 Pin - P46 */ -#define GPIO1_PIN (1 << 6) -#define GPIO1_PIN_OUT PM4 &= ~GPIO1_PIN; -#define GPIO1_PIN_LOW P4 &= ~GPIO1_PIN; -#define GPIO1_PIN_HIGH P4 |= GPIO1_PIN; - -/* GPIO2 Pin - P110 */ -#define GPIO2_PIN (1 << 0) -#define GPIO2_PIN_OUT PM11 &= ~GPIO2_PIN; -#define GPIO2_PIN_LOW P11 &= ~GPIO2_PIN; -#define GPIO2_PIN_HIGH P11 |= GPIO2_PIN; - -/* GPIO3 Pin - P111 */ -#define GPIO3_PIN (1 << 1) -#define GPIO3_PIN_OUT PM11 &= ~GPIO3_PIN; -#define GPIO3_PIN_LOW P11 &= ~GPIO3_PIN; -#define GPIO3_PIN_HIGH P11 |= GPIO3_PIN; - /******************************************************************************/ /************************ Functions Declarations ******************************/ /******************************************************************************/ diff --git a/ST7579.c b/ST7579.c index f80d5f0f7..eddc94660 100644 --- a/ST7579.c +++ b/ST7579.c @@ -215,19 +215,19 @@ void ST7579_Clear(void) * @brief Initializes the ST7579 controller. * * @return status - Result of the initialization procedure. - * Example: 1 - if initialization was successful; - * 0 - if initialization was unsuccessful. + * Example: 0 - if initialization was successful; + * -1 - if initialization was unsuccessful. *******************************************************************************/ -unsigned char ST7579_Init(void) +char ST7579_Init(void) { - unsigned char status = 0; + char status = -1; unsigned short delay = 0; status = SPI_Init(0, // Transfer format. 1000000, // SPI clock frequency. 0, // SPI clock polarity. 1); // SPI clock edge. - if(status != 1) + if(status != 0) { return status; } @@ -269,7 +269,7 @@ unsigned char ST7579_Init(void) * @param yPosition - Y address of RAM. * @param xPosition - X address of RAM. * @param character - The character. - * @param bigFont - Big font selection. + * @param bigFont - Big font selection. * * @return None. *******************************************************************************/ @@ -337,8 +337,8 @@ void ST7579_Char(unsigned char yPosition, * * @param yPosition - Y address of RAM. * @param xPosition - X address of RAM. - * @param string - The string. - * @param bigFont - Big font selection. + * @param string - The string. + * @param bigFont - Big font selection. * * @return None. *******************************************************************************/ @@ -360,8 +360,8 @@ void ST7579_String(unsigned char yPosition, * * @param yPosition - Y address of RAM. * @param xPosition - X address of RAM. - * @param number - The number. - * @param bigFont - Big font selection. + * @param number - The number. + * @param bigFont - Big font selection. * * @return None. *******************************************************************************/ @@ -374,7 +374,6 @@ void ST7579_Number(unsigned char yPosition, unsigned char chNumber = 10; unsigned char chIndex = 0; - //bigFont = 0; if(number < 0) { ST7579_Char(yPosition, xPosition, '-', bigFont); @@ -409,11 +408,11 @@ void ST7579_Number(unsigned char yPosition, /***************************************************************************//** * @brief Sends a float number to ST7579 controller. * - * @param yPosition - Y address of RAM. - * @param xPosition - X address of RAM. - * @param number - The number. + * @param yPosition - Y address of RAM. + * @param xPosition - X address of RAM. + * @param number - The number. * @param resolution - Float resolution. - * @param bigFont - Big font selection. + * @param bigFont - Big font selection. * * @return None. *******************************************************************************/ @@ -439,7 +438,7 @@ void ST7579_FloatNumber(unsigned char yPosition, { ST7579_Char(yPosition, xPosition, '-', bigFont); xPosition += 6 + (bigFont * 12); - number *= -1; + display *= -1; } else { @@ -458,6 +457,7 @@ void ST7579_FloatNumber(unsigned char yPosition, ST7579_Char(yPosition, xPosition, '0', bigFont); xPosition += 6 + (bigFont * 12); } + return; } else { @@ -465,7 +465,7 @@ void ST7579_FloatNumber(unsigned char yPosition, xPosition += 6 + (bigFont * 12); } } - while(mask > display) + while((mask > display) && (chNumber > resolution)) { mask /= 10; chNumber--; @@ -493,8 +493,8 @@ void ST7579_FloatNumber(unsigned char yPosition, * * @param yPosition - Y address of RAM. * @param xPosition - X address of RAM. - * @param number - The number. - * @param bigFont - Big font selection. + * @param number - The number. + * @param bigFont - Big font selection. * * @return None. *******************************************************************************/ @@ -541,9 +541,9 @@ void ST7579_HexNumber(unsigned char yPosition, * * @param yPosition - Y address of RAM. * @param xPosition - X address of RAM. - * @param image - The image array. - * @param width - The width of the image (pixels). - * @param height - The height of the image (pixels). + * @param image - The image array. + * @param width - The width of the image (pixels). + * @param height - The height of the image (pixels). * * @return None. *******************************************************************************/ diff --git a/ST7579.h b/ST7579.h index 75d13a70b..566b40d48 100644 --- a/ST7579.h +++ b/ST7579.h @@ -57,7 +57,7 @@ void ST7579_GoTo(unsigned char yPosition, void ST7579_Clear(void); /*! Initializes the ST7579 controller. */ -unsigned char ST7579_Init(void); +char ST7579_Init(void); /*! Sends a character to ST7579 controller. */ void ST7579_Char(unsigned char yPosition, diff --git a/TIME.c b/TIME.c new file mode 100644 index 000000000..c2c4a515f --- /dev/null +++ b/TIME.c @@ -0,0 +1,167 @@ +/***************************************************************************//** + * @file TIME.c + * @brief Implementation of TIME Driver for RENESAS RL78G14 Processor. + * @author Dan Nechita +******************************************************************************** + * Copyright 2012(c) Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +******************************************************************************** + * SVN Revision: $WCREV$ +*******************************************************************************/ + +/******************************************************************************/ +/***************************** Include Files **********************************/ +/******************************************************************************/ +#include "RDKRL78G14.h" // RDKRL78G14 definitions. +#include "TIME.h" // TIME definitions. + +/*****************************************************************************/ +/************************** Macros Definitions *******************************/ +/*****************************************************************************/ +#define TIMER_CNT_INTERVAL 65536 + +/*****************************************************************************/ +/************************ Variables Declarations *****************************/ +/*****************************************************************************/ +unsigned short overflowCounter = 0; + +/******************************************************************************/ +/************************ Functions Definitions *******************************/ +/******************************************************************************/ + +/***************************************************************************//** + * @brief INTTM00 interrupt service routine. + * + * @return None. +*******************************************************************************/ +#pragma vector = INTTM00_vect +__interrupt static void Timer0InterruptHandler(void) +{ + overflowCounter++; +} + +/***************************************************************************//** + * @brief Initializes the timer used in this driver. + * + * @return status - Result of the initialization procedure. + * Example: 0 - if initialization was successful; + * -1 - if initialization was unsuccessful. +*******************************************************************************/ +char TIME_Init(void) +{ + PER0 |= 0x0001; // Enable Supply for Unit 0 that contains timers 0..7. + TT0 |= 0x0001; // Stop channel 0(Timer 0). + TPS0 = 0x0005; // CK00 = FCLK / 32. + TMR00 |= 0x0000; // CK00 input clock for channel 0. + TMMK00 = 1; // Disable INTTM00 interrupt. + TMIF00 = 0; // Clear INTM00 interrupt flag. + /* Set INTTM00 low priority */ + TMPR100 = 1; + TMPR000 = 1; + /* Configure channel 0 as a interval timer. */ + TMR00 |= 0x0000; // Interval timer mode. + TO0 &= ~0x0001; // Timer 0 output value is "0". + TOE0 &= ~0x0001; // Disable output of timer 0. + TMMK00 = 0; // Enable INTTM00 interrupt. + + return 0; +} + +/***************************************************************************//** + * @brief The timer begins to count in steps of microseconds(us) until the user + * calls a stop measurement function. + * + * @return None. +*******************************************************************************/ +void TIME_StartMeasure(void) +{ + TDR00 = 0xFFFF; + overflowCounter = 0; + TS0 |= 0x0001; // Start timer 0. + TMIF00 = 0; // Clear INTM00 interrupt flag. +} + +/***************************************************************************//** + * @brief Stops the measurement process when the functions is called. + * + * @return Time(in microseconds) elapsed since the measurement began. +*******************************************************************************/ +unsigned long TIME_StopMeasure(void) +{ + unsigned long elapsedUs = 0; + unsigned short timerCnt = 0; + + timerCnt = TCR00; + TT0 |= 0x0001; // Stop Timer 0. + TMIF00 = 0; // Clear INTM00 interrupt flag. + overflowCounter = 0; + elapsedUs = ((unsigned long)overflowCounter * TIMER_CNT_INTERVAL) + + (0xFFFF - timerCnt); + + return elapsedUs; +} + +/***************************************************************************//** + * @brief Creates a delay of microseconds. + * + * @return None. +*******************************************************************************/ +void TIME_DelayUs(unsigned short usUnits) +{ + TDR00 = usUnits; + TS0 |= 0x0001; // Start timer 0. + while(!overflowCounter) + { + ; + } + overflowCounter = 0; + TT0 |= 0x0001; // Stop Timer 0. +} + +/***************************************************************************//** + * @brief Creates a delay of milliseconds. + * + * @return None. +*******************************************************************************/ +void TIME_DelayMs(unsigned short msUnits) +{ + TDR00 = 0x3E7; // 0x3E7 = 999(decimal). Timer will count down to 0. + TS0 |= 0x0001; // Start timer 0. + while(overflowCounter < msUnits) + { + ; + } + overflowCounter = 0; + TT0 |= 0x0001; // Stop Timer 0. +} diff --git a/TIME.h b/TIME.h new file mode 100644 index 000000000..cc60f09a5 --- /dev/null +++ b/TIME.h @@ -0,0 +1,65 @@ +/***************************************************************************//** + * @file TIME.h + * @brief Header file of TIME Driver for RENESAS RL78G14 Processor. + * @author Dan Nechita +******************************************************************************** + * Copyright 2012(c) Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights + * of one or more patent holders. This license does not release you + * from the requirement that you obtain separate licenses from these + * patent holders to use this software. + * - Use of the software either in source or binary form, must be run + * on or directly connected to an Analog Devices Inc. component. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +******************************************************************************** + * SVN Revision: $WCREV$ +*******************************************************************************/ +#ifndef __TIME_H__ +#define __TIME_H__ + +/******************************************************************************/ +/************************ Functions Declarations ******************************/ +/******************************************************************************/ + +/*! Initializes the timer used in this driver. */ +char TIME_Init(void); + +/*! The timer begins to count in steps of microseconds(us) until the user calls + a stop measurement function. */ +void TIME_StartMeasure(void); + +/*! Stops the measurement process when the functions is called. */ +unsigned long TIME_StopMeasure(void); + +/*! Creates a delay of microseconds. */ +void TIME_DelayUs(unsigned short usUnits); + +/*! Creates a delay of milliseconds. */ +void TIME_DelayMs(unsigned short msUnits); + +#endif /* __TIME_H__ */