Showing posts with label header. Show all posts
Showing posts with label header. Show all posts

Wednesday, 11 April 2018

Build Number for PSoC Creator Projects - Post Build

Summary
Recently during development of a PSoC based project there was a requirement to use an automatic incrementing build number. This blog provides an example project with incrementing build number using command line scripting.

The use of a build number may be considered trivial by some and certainly with the use of revision control software such as Veracity, SourceGear's Vault or Fossil this is most likely the case. There are however situations where applying revision control consumes more time and resources than necessary. Providing a programming file, which can be identifiable, can remain a suitable solution for a software developer.

Test Hardware
In order to test the incrementing build number using PSoC Creator, hardware was not compulsory. For demonstration an example project was based around the Cypress PSoC development kit CY8CKIT-042.

CY8CKIT-042
CY8CKIT-042 - Courtesy Cypress Semiconductor

Script
While searching online for a suitable script, I came across a thread on Stack Overflow from user ansgar-wiechers. The example script he listed, which can be seen on StackOverflow, served as a basis for the PSoC Creator script.

So what does this script do.... firstly it looks for a file called buildnumber.h in the PSoC Creator project path. Next, the contents of the header file is searched until the string BuildNumber= is found. Then the integer following the equals sign is incremented by one. The original file, with an updated build number, is then saved back to the original buildnumber.h file.

As can be seen in the script below, there are no checks, no limits, so programmer beware!

Set fso = CreateObject("Scripting.FileSystemObject")

Set re  = New RegExp

re.Global = True


Function IncMaint(m, g1, g2, pos, src)

  IncMaint = g1 & (CInt(g2)+1)

End Function


ProjectMainFolder=fso.GetAbsolutePathName(".")

WScript.Echo ("Build number: Incrementing the build number located at:" & ProjectMainFolder)

rcfile = ProjectMainFolder & "\buildnumber.h"

WScript.Echo(rcfile)

rctext = fso.OpenTextFile(rcfile).ReadAll

re.Pattern = "((?:BuildNumber) )(\d+)"

rctext = re.Replace(rctext, GetRef("IncMaint"))

re.Pattern = "((?:BuildNumber)= )(\d+)"

rctext = re.Replace(rctext, GetRef("IncMaint"))

fso.OpenTextFile(rcfile, 2).Write rctext

Build Number Header File
In the file containing the build number the project major and minor revisions were also included.

/****************************************************************************
* buildnumber.h
*
* Example header file to show usage of BuildNumber keyword and equals signal
*
* The text BuildNumber= can be anywhere in this file
*
*****************************************************************************/
#include "project.h"
const uint8_t MajorRev= 1;
const uint8_t MinorRev= 1;
const uint8_t BuildNumber= 1;

PSoC Creator - Post Build Command
A call is made to the external VBS file under the PSoC Creator menu, Project, Build Settings using User Commands. It should be noted that for the example shown the script was contained in its own folder Scripts and not attached to the PSoC Creator project.


PSoC Creator Post Build Script - Increment Build Number
PSoC Creator Post Build Script - Increment Build Number
Shown in the capture below is the the Post Build command to call the VBScriptcscript ${ProjectDir}\Scripts\buildnumber.vbs


PSoC Creator Post Build CScript Call
PSoC Creator Post Build CScript Call
For this example project the Post Build was used. Depending on the requirement Pre Build may be needed.

PSoC - Build Number Usage
For the PSoC Creator project, the header file containing the build number is accessed in the usual manner using #include "buildnumber.h". For the example project the include was in main.c and the revision and build numbers were written to the serial port.

/****************************************************************************
* Build Number Example
*
* Uses a Visual Basic Script to find an increment 
* the integer associated with the variable BuildNumber

* The script is called as a post-compiler command in
* the Project -> Build Settings menu
*
* Code implementation is a skeleton to illustrate usage of the script, error checking should be implemented

* Credit to https://stackoverflow.com/users/1630171/ansgar-wiechers
* for ideas on the implementaion as mentioned on the following
* blog https://stackoverflow.com/questions/19891195/how-to-increment-values-in-resourse-file-by-using-vbscript
*
******************************************************/

#include "project.h"
#include "stdio.h"
#include "buildnumber.h"
char Version_Char[8];
int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */
    UART_Start();
    sprintf(Version_Char, "Version %d.%02d build %03d\r\n", MajorRev, MinorRev, BuildNumber);
    UART_UartPutString(Version_Char);
    for(;;)
    {
    }
/* [] END OF FILE */

Compiling PSoC Creator
When compiling a project, with the script below added to the Post Build command, a message is echoed from the script to indicate that the Build Number is being incremented.

cscript .\Scripts\buildnumber.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
Build number: Incrementing just the build located at:C:\...\UART_Example\UART_BuildNumber.cyds

UART Debug
Compiling the example project under PSoC Creator with the major, minor, build number set to 1.1.0, then programming the PSoC development board yields the screen capture below from TeraTerm.


Auto Incrementing Build Number Tera Term Debug
Auto Incrementing Build Number Tera Term Debug
Compiling the project again and programming the development board yields the capture below showing the increment in build number.


Auto Incrementing Build Number Tera Term Debug
Auto Incrementing Build Number Tera Term Debug

Example PSoC Creator Project
The example PSoC Creator 4.1 project and VBScript are available to download below. For comments or bugs leave a comment below, enjoy!


Increment Build Number Example Application PSoC Creator 4.1
Increment Build Number Example Application PSoC Creator 4.1


Increment Build Number Example VB Script
Increment Build Number Example Script

Wednesday, 15 February 2017

MCP23S17 IO Port Expander Header File / Register

Summary
For a recent project the 16bit IO Expander, MCP23S17, from Microchip was enlisted for low voltage input scanning. 

Searching online, at the time of writing this blog, there were no projects using this part with sample code. 

Below is the header file that may be of use.


MCP23S17 Microchip IO Expander QFN Package
Microchip IO Expander QFN Package


Downloads


mcp23s17.h

Code


/******************************
* mcp23s17.h
******************************/

#ifndef mcp23s17_h
#define mcp23s17_h

typedef unsigned char   uint8;
    
#define MCP_READ   0x41     /* Read */
#define MCP_WRITE   0x40     /* Write */
#define Mode_8Bit     1         /* Addressing 8/16bit */
#define Mode_16bit    0

#ifdef Mode_16Bit
    /******************************
    * Control register for BANK=0
    ******************************/
    #define IODIRA        0x00      /* Data Direction Register for PORTA */
    #define IODIRB        0x01      /* Data Direction Register for PORTB */ 
    #define IPOLA         0x02      /* Input Polarity Register for PORTA */ 
    #define IPOLB         0x03      /* Input Polarity Register for PORTB */ 
    #define GPINTENA      0x04      /* Interrupt-on-change enable Register for PORTA */ 
    #define GPINTENB      0x05      /* Interrupt-on-change enable Register for PORTB */ 
    #define DEFVALA       0x06      /* Default Value Register for PORTA */    
    #define DEFVALB       0x07      /* Default Value Register for PORTB */      
    #define INTCONA       0x08      /* Interrupt-on-change control Register for PORTA */  
    #define INTCONB       0x09      /* Interrupt-on-change control Register for PORTB */      
    #define IOCON         0x0A      /* Configuration register for device */                      
    #define GPPUA         0x0C      /* 100kOhm pullup resistor register for PORTA (sets pin to input when set) */    
    #define GPPUB         0x0D      /* 100kOhm pullup resistor register for PORTB (sets pin to input when set) */      
    #define INTFA         0x0E      /* Interrupt flag Register for PORTA */        
    #define INTFB         0x0F      /* Interrupt flag Register for PORTB */    
    #define INTCAPA       0x10      /* Interrupt captured value Register for PORTA */  
    #define INTCAPB       0x11      /* Interrupt captured value Register for PORTB */    
    #define GPIOA         0x12      /* General purpose I/O Register for PORTA */  
    #define GPIOB         0x13      /* General purpose I/O Register for PORTB */ 
    #define OLATA         0x14      /* Output latch Register for PORTA */ 
    #define OLATB         0x15      /* Output latch Register for PORTB */
#endif

#ifdef Mode_8Bit
    /******************************
    * Control register for BANK=1
    ******************************/
    #define IODIRA        0x00      /* Data Direction Register for PORTA */
    #define IPOLA         0x01      /* Input Polarity Register for PORTA */  
    #define GPINTENA      0x02      /* Interrupt-on-change enable Register for PORTA */     
    #define DEFVALA       0x03      /* Default Value Register for PORTA */    
    #define INTCONA       0x04      /* Interrupt-on-change control Register for PORTA */     
    #define IOCONA        0x05      /* Configuration register for device */          
    #define GPPUA         0x06      /* 100kOhm pullup resistor register for PORTA (sets pin to input when set) */     
    #define INTFA         0x07      /* Interrupt flag Register for PORTA */
    #define INTCAPA       0x08      /* Interrupt captured value Register for PORTA */
    #define GPIOA         0x09      /* General purpose I/O Register for PORTA */  
    #define OLATA         0x0A      /* Output latch Register for PORTA */ 
    #define IODIRB        0x10      /* Data Direction Register for PORTB */ 
    #define IPOLB         0x11      /* Input Polarity Register for PORTB */ 
    #define GPINTENB      0x12      /* Interrupt-on-change enable Register for PORTB */
    #define DEFVALB       0x13      /* Default Value Register for PORTB */      
    #define INTCONB       0x14      /* Interrupt-on-change control Register for PORTB */
    #define IOCONB        0x15      /* Configuration register for device */  
    #define GPPUB         0x16      /* 100kOhm pullup resistor register for PORTB (sets pin to input when set) */        
    #define INTFB         0x17      /* Interrupt flag Register for PORTB */    
    #define INTCAPB       0x18      /* Interrupt captured value Register for PORTB */    
    #define GPIOB         0x19      /* General purpose I/O Register for PORTB */ 
    #define OLATB         0x1A      /* Output latch Register for PORTB */
#endif
    
/* Config bits - IOCON */
#define BANK  0x80
#define MIRROR  0x40
#define SEQOP  0x20
#define DISSLW  0x10
#define HAEN  0x08
#define ODR      0x04
#define INTPOL  0x02

/******************************
* Prototypes
******************************/
void MCP23S17_init();
void MCP23S17_write(uint8 address, uint8 value);
uint8 MCP23S17_read(uint8 address);
uint8 MCP23S17_verify(uint8 address, uint8 verify_data);
    
#endif
/* END */



Change Summary

Version 1.00 (10 February 2017)

  • Created register mapping for MCP23S17, 8 and 16 bit modes