Initial commit

This commit is contained in:
Rémi Heredero 2023-05-30 11:36:39 +02:00
parent e040a55846
commit 38bfd12b25
27 changed files with 2670 additions and 0 deletions

29
03-software/.gitignore vendored Normal file
View File

@ -0,0 +1,29 @@
# .gitignore file
# MPLAB X IDE (Netbeans) specific
~*.*
build/
debug/
dist/
disassembly/
nbproject/private/
nbproject/*.mk
nbproject/*.bash
nbproject/Makefile-genesis.properties
# Object files
*.o
*.ko
*.obj
*.elf
# Executables
*.exe
# KDE specific
.directory
# Misc
.svn
*.bak

View File

@ -0,0 +1,18 @@
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/opt/microchip/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-x64",
"configurationProvider": "ms-vscode.makefile-tools"
}
],
"version": 4
}

113
03-software/Makefile Normal file
View File

@ -0,0 +1,113 @@
#
# There exist several targets which are by default empty and which can be
# used for execution of your targets. These targets are usually executed
# before and after some main targets. They are:
#
# .build-pre: called before 'build' target
# .build-post: called after 'build' target
# .clean-pre: called before 'clean' target
# .clean-post: called after 'clean' target
# .clobber-pre: called before 'clobber' target
# .clobber-post: called after 'clobber' target
# .all-pre: called before 'all' target
# .all-post: called after 'all' target
# .help-pre: called before 'help' target
# .help-post: called after 'help' target
#
# Targets beginning with '.' are not intended to be called on their own.
#
# Main targets can be executed directly, and they are:
#
# build build a specific configuration
# clean remove built files from a configuration
# clobber remove all built files
# all build all configurations
# help print help mesage
#
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
# .help-impl are implemented in nbproject/makefile-impl.mk.
#
# Available make variables:
#
# CND_BASEDIR base directory for relative paths
# CND_DISTDIR default top distribution directory (build artifacts)
# CND_BUILDDIR default top build directory (object files, ...)
# CONF name of current configuration
# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
#
# NOCDDL
# Environment
MKDIR=mkdir
CP=cp
CCADMIN=CCadmin
RANLIB=ranlib
# build
build: .build-post
.build-pre:
# Add your pre 'build' code here...
.build-post: .build-impl
# Add your post 'build' code here...
# clean
clean: .clean-post
.clean-pre:
# Add your pre 'clean' code here...
# WARNING: the IDE does not call this target since it takes a long time to
# simply run make. Instead, the IDE removes the configuration directories
# under build and dist directly without calling make.
# This target is left here so people can do a clean when running a clean
# outside the IDE.
.clean-post: .clean-impl
# Add your post 'clean' code here...
# clobber
clobber: .clobber-post
.clobber-pre:
# Add your pre 'clobber' code here...
.clobber-post: .clobber-impl
# Add your post 'clobber' code here...
# all
all: .all-post
.all-pre:
# Add your pre 'all' code here...
.all-post: .all-impl
# Add your post 'all' code here...
# help
help: .help-post
.help-pre:
# Add your pre 'help' code here...
.help-post: .help-impl
# Add your post 'help' code here...
# include project implementation makefile
include nbproject/Makefile-impl.mk
# include project make variables
include nbproject/Makefile-variables.mk

View File

@ -0,0 +1,44 @@
#include "factory.h"
//the factory object containing all objects of our system
static Factory theFactory;
//all the getters
LED* l()
{
return &theFactory.l_;
}
LED* l2(){
return &theFactory.l2_;
}
LEDBlinker* lb() {
return &theFactory.lb_;
}
LEDBlinker* lb2() {
return &theFactory.lb2_;
}
//initialize all objects
void Factory_init()
{
LED_init(l(),LID);
LED_init(l2(),2);
LED_initHW(l());
LED_initHW(l2());
}
//connect objects if required
void Factory_build()
{
}
//start all state machines
void Factory_start() {
LEDBlinker_startBehaviour(lb());
LEDBlinker_startBehaviour(lb2());
}

View File

@ -0,0 +1,36 @@
/* this is the Factory class */
#ifndef FACTORY_ONCE
#define FACTORY_ONCE
#include <stdint.h>
#include <stdbool.h>
#include "../../board/led/led.h"
#include "../ledblinker.h"
#define LID 5
struct Factory_
{
LED l_;
LED l2_;
LEDBlinker lb_;
LEDBlinker lb2_;
};
typedef struct Factory_ Factory;
void Factory_init();
void Factory_build();
void Factory_start();
//these are global getters for our objects
LED* l();
LED* l2();
LEDBlinker* lb();
LEDBlinker* lb2();
#endif

View File

@ -0,0 +1,68 @@
#include "ledblinker.h"
#include "factory/factory.h"
#include "../board/led/led.h"
void LEDBlinker_init(LEDBlinker* me)
{
me->state = ST_LBINIT;
}
void LEDBlinker_startBehaviour(LEDBlinker* me)
{
POST(me, &LEDBlinker_processEvent, evLBInit,0,0);
}
bool LEDBlinker_processEvent(Event* ev)
{
bool processed = false;
LEDBlinker* me = (LEDBlinker*)Event_getTarget(ev);
LBSTATES oldState = me->state;
evIDT evid = Event_getId(ev);
switch (me->state)
{
case ST_LBINIT:
if (evid == evLBInit)
{
me->state = ST_LBOFF;
}
break;
case ST_LBOFF:
if (evid == evLBTMOn)
{
me->state = ST_LBON;
}
break;
case ST_LBON:
if (evid == evLBTMOff)
{
me->state = ST_LBOFF;
}
break;
default:
break;
}
if (oldState != me->state)
{
switch (me->state)
{
case ST_LBINIT:
break;
case ST_LBOFF:
LED_off(l());
LED_off(l2());
POST(me, &LEDBlinker_processEvent, evLBTMOn,TMOFF,0);
break;
case ST_LBON:
LED_on(l());
LED_on(l2());
POST(me, &LEDBlinker_processEvent, evLBTMOff,TMON,0);
break;
default:
break;
}
processed = true;
}
return processed;
}

View File

@ -0,0 +1,42 @@
/*
* File: ledblinker.h
* Author: rim
*
* Created on May 14, 2023, 9:58 AM
*/
#ifndef LEDBLINKER_H
#define LEDBLINKER_H
#ifdef __cplusplus
extern "C" {
#endif
#include "../xf/xf.h"
enum LBSTATES_ {ST_LBINIT, ST_LBOFF, ST_LBON};
enum LBEVENTS_ {evLBInit=100, evLBTMOff, evLBTMOn};
typedef enum LBSTATES_ LBSTATES;
typedef enum LBEVENTS_ LBEVENTS;
struct LEDBlinker_ {
LBSTATES state;
};
typedef struct LEDBlinker_ LEDBlinker;
#define TMON 500
#define TMOFF 1000
void LEDBlinker_init(LEDBlinker* me);
void LEDBlinker_startBehaviour(LEDBlinker* me);
bool LEDBlinker_processEvent(Event* ev);
#ifdef __cplusplus
}
#endif
#endif /* LEDBLINKER_H */

View File

@ -0,0 +1,47 @@
#include "../mcc_generated_files/mcc.h"
#include "../board/led/led.h"
#include "../app/factory/factory.h"
#include "../xf/xf.h"
bool test(Event* ev);
bool test(Event* ev) {
static bool on = true;
if (on == true){
LED_on(l());
on = false;
} else {
LED_off(l());
on = true;
}
POST(NULL,test, 2, 500, 0);
return true;
}
void main(void)
{
// Initialize the device
SYSTEM_Initialize();
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
//INTERRUPT_GlobalInterruptDisable();
//INTERRUPT_PeripheralInterruptEnable();
//INTERRUPT_PeripheralInterruptDisable();
XF_init();
Factory_init();
Factory_build();
Factory_start();
TMR0_SetInterruptHandler(XF_decrementAndQueueTimers);
while (1)
{
XF_executeOnce();
}
}

View File

@ -0,0 +1,92 @@
#include "led.h"
#include "../../mcc_generated_files/pin_manager.h"
void LED_init(LED* me, uint8_t id)
{
me->id = id;
}
/**
* @brief Initialize the Driver
*
*/
void LED_initHW(LED* me)
{
LED_off(me);
}
void LED_on(LED* me)
{
switch (me->id)
{
case 1:
OUTPUT1_SetHigh();
break;
case 2:
OUTPUT2_SetHigh();
break;
case 3:
OUTPUT3_SetHigh();
break;
case 4:
OUTPUT4_SetHigh();
break;
case 5:
OUTPUT5_SetHigh();
break;
case 6:
OUTPUT6_SetHigh();
break;
case 7:
OUTPUT7_SetHigh();
break;
case 8:
OUTPUT8_SetHigh();
break;
case 9:
OUTPUT9_SetHigh();
break;
case 10:
OUTPUT10_SetHigh();
break;
}
}
void LED_off(LED* me)
{
switch (me->id)
{
case 1:
OUTPUT1_SetLow();
break;
case 2:
OUTPUT2_SetLow();
break;
case 3:
OUTPUT3_SetLow();
break;
case 4:
OUTPUT4_SetLow();
break;
case 5:
OUTPUT5_SetLow();
break;
case 6:
OUTPUT6_SetLow();
break;
case 7:
OUTPUT7_SetLow();
break;
case 8:
OUTPUT8_SetLow();
break;
case 9:
OUTPUT9_SetLow();
break;
case 10:
OUTPUT10_SetLow();
break;
}
}

View File

@ -0,0 +1,26 @@
/*
* File: led.h
* Author: rim
*
* Created on May 15, 2023, 7:56 AM
*/
#ifndef LED_H
#define LED_H
#include <stdint.h>
struct LED_
{
uint8_t id;
};
typedef struct LED_ LED;
void LED_init(LED* me, uint8_t id);
void LED_initHW(LED* me);
void LED_on(LED* me);
void LED_off(LED* me);
#endif /* LED_H */

View File

@ -0,0 +1,117 @@
/**
@Generated PIC10 / PIC12 / PIC16 / PIC18 MCUs Source File
@Company:
Microchip Technology Inc.
@File Name:
mcc.c
@Summary:
This is the device_config.c file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
@Description:
This header file provides implementations for driver APIs for all modules selected in the GUI.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.00
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above or later
MPLAB : MPLAB X 6.00
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
// Configuration bits: selected in the GUI
// CONFIG1L
#pragma config RETEN = ON // VREG Sleep Enable bit->Enabled
#pragma config INTOSCSEL = HIGH // LF-INTOSC Low-power Enable bit->LF-INTOSC in High-power mode during Sleep
#pragma config SOSCSEL = DIG // SOSC Power Selection and mode Configuration bits->Digital (SCLKI) mode
#pragma config XINST = OFF // Extended Instruction Set->Disabled
// CONFIG1H
#pragma config FOSC = INTIO2 // Oscillator->Internal RC oscillator
#pragma config PLLCFG = OFF // PLL x4 Enable bit->Disabled
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor->Disabled
#pragma config IESO = OFF // Internal External Oscillator Switch Over Mode->Disabled
// CONFIG2L
#pragma config PWRTEN = OFF // Power Up Timer->Disabled
#pragma config BOREN = SBORDIS // Brown Out Detect->Enabled in hardware, SBOREN disabled
#pragma config BORV = 3 // Brown-out Reset Voltage bits->1.8V
#pragma config BORPWR = ZPBORMV // BORMV Power level->ZPBORMV instead of BORMV is selected
// CONFIG2H
#pragma config WDTEN = OFF // Watchdog Timer->WDT disabled in hardware; SWDTEN bit disabled
#pragma config WDTPS = 1048576 // Watchdog Postscaler->1:1048576
// CONFIG3L
#pragma config RTCOSC = SOSCREF // RTCC Clock Select->RTCC uses SOSC
#pragma config EASHFT = ON // External Address Shift bit->Address shifting enabled
#pragma config ABW = MM // Address Bus Width Select bits->8-bit address bus
#pragma config BW = 16 // Data Bus Width->16-bit external bus mode
#pragma config WAIT = OFF // External Bus Wait->Disabled
// CONFIG3H
#pragma config CCP2MX = PORTC // CCP2 Mux->RC1
#pragma config ECCPMX = PORTE // ECCP Mux->Enhanced CCP1/3 [P1B/P1C/P3B/P3C] muxed with RE6/RE5/RE4/RE3
#pragma config MSSPMSK = MSK7 // MSSP address masking->7 Bit address masking mode
#pragma config MCLRE = ON // Master Clear Enable->MCLR Enabled, RG5 Disabled
// CONFIG4L
#pragma config STVREN = ON // Stack Overflow Reset->Enabled
#pragma config BBSIZ = BB2K // Boot Block Size->2K word Boot Block size
#pragma config DEBUG = OFF // Background Debug->Disabled
// CONFIG5L
#pragma config CP0 = OFF // Code Protect 00800-03FFF->Disabled
#pragma config CP1 = OFF // Code Protect 04000-07FFF->Disabled
#pragma config CP2 = OFF // Code Protect 08000-0BFFF->Disabled
#pragma config CP3 = OFF // Code Protect 0C000-0FFFF->Disabled
// CONFIG5H
#pragma config CPB = OFF // Code Protect Boot->Disabled
#pragma config CPD = OFF // Data EE Read Protect->Disabled
// CONFIG6L
#pragma config WRT0 = OFF // Table Write Protect 00800-03FFF->Disabled
#pragma config WRT1 = OFF // Table Write Protect 04000-07FFF->Disabled
#pragma config WRT2 = OFF // Table Write Protect 08000-0BFFF->Disabled
#pragma config WRT3 = OFF // Table Write Protect 0C000-0FFFF->Disabled
// CONFIG6H
#pragma config WRTC = OFF // Config. Write Protect->Disabled
#pragma config WRTB = OFF // Table Write Protect Boot->Disabled
#pragma config WRTD = OFF // Data EE Write Protect->Disabled
// CONFIG7L
#pragma config EBRT0 = OFF // Table Read Protect 00800-03FFF->Disabled
#pragma config EBRT1 = OFF // Table Read Protect 04000-07FFF->Disabled
#pragma config EBRT2 = OFF // Table Read Protect 08000-0BFFF->Disabled
#pragma config EBRT3 = OFF // Table Read Protect 0C000-0FFFF->Disabled
// CONFIG7H
#pragma config EBRTB = OFF // Table Read Protect Boot->Disabled

View File

@ -0,0 +1,55 @@
/**
@Generated PIC10 / PIC12 / PIC16 / PIC18 MCUs Header File
@Company:
Microchip Technology Inc.
@File Name:
mcc.c
@Summary:
This is the device_config.h file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
@Description:
This header file provides implementations for driver APIs for all modules selected in the GUI.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.00
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above or later
MPLAB : MPLAB X 6.00
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
#ifndef DEVICE_CONFIG_H
#define DEVICE_CONFIG_H
#define _XTAL_FREQ 64000000
#endif /* DEVICE_CONFIG_H */
/**
End of File
*/

View File

@ -0,0 +1,72 @@
/**
Generated Interrupt Manager Source File
@Company:
Microchip Technology Inc.
@File Name:
interrupt_manager.c
@Summary:
This is the Interrupt Manager file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
@Description:
This header file provides implementations for global interrupt handling.
For individual peripheral handlers please see the peripheral driver for
all modules selected in the GUI.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.04
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above or later
MPLAB : MPLAB X 6.00
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
#include "interrupt_manager.h"
#include "mcc.h"
void INTERRUPT_Initialize (void)
{
// Disable Interrupt Priority Vectors (16CXXX Compatibility Mode)
RCONbits.IPEN = 0;
}
void __interrupt() INTERRUPT_InterruptManager (void)
{
// interrupt handler
if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
{
TMR0_ISR();
}
else
{
//Unhandled Interrupt
}
}
/**
End of File
*/

View File

@ -0,0 +1,115 @@
/**
Generated Interrupt Manager Header File
@Company:
Microchip Technology Inc.
@File Name:
interrupt_manager.h
@Summary:
This is the Interrupt Manager file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
@Description:
This header file provides implementations for global interrupt handling.
For individual peripheral handlers please see the peripheral driver for
all modules selected in the GUI.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.03
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above or later
MPLAB : MPLAB X 6.00
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
#ifndef INTERRUPT_MANAGER_H
#define INTERRUPT_MANAGER_H
/**
* @Param
none
* @Returns
none
* @Description
This macro will enable global interrupts.
* @Example
INTERRUPT_GlobalInterruptEnable();
*/
#define INTERRUPT_GlobalInterruptEnable() (INTCONbits.GIE = 1)
/**
* @Param
none
* @Returns
none
* @Description
This macro will disable global interrupts.
* @Example
INTERRUPT_GlobalInterruptDisable();
*/
#define INTERRUPT_GlobalInterruptDisable() (INTCONbits.GIE = 0)
/**
* @Param
none
* @Returns
none
* @Description
This macro will enable peripheral interrupts.
* @Example
INTERRUPT_PeripheralInterruptEnable();
*/
#define INTERRUPT_PeripheralInterruptEnable() (INTCONbits.PEIE = 1)
/**
* @Param
none
* @Returns
none
* @Description
This macro will disable peripheral interrupts.
* @Example
INTERRUPT_PeripheralInterruptDisable();
*/
#define INTERRUPT_PeripheralInterruptDisable() (INTCONbits.PEIE = 0)
/**
* @Param
none
* @Returns
none
* @Description
Initializes PIC18 peripheral interrupt priorities; enables/disables priority vectors
* @Example
INTERRUPT_Initialize();
*/
void INTERRUPT_Initialize (void);
#endif // INTERRUPT_MANAGER_H
/**
End of File
*/

View File

@ -0,0 +1,74 @@
/**
@Generated PIC10 / PIC12 / PIC16 / PIC18 MCUs Source File
@Company:
Microchip Technology Inc.
@File Name:
mcc.c
@Summary:
This is the mcc.c file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
@Description:
This header file provides implementations for driver APIs for all modules selected in the GUI.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.00
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above or later
MPLAB : MPLAB X 6.00
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
#include "mcc.h"
void SYSTEM_Initialize(void)
{
INTERRUPT_Initialize();
PIN_MANAGER_Initialize();
OSCILLATOR_Initialize();
TMR0_Initialize();
}
void OSCILLATOR_Initialize(void)
{
// SCS FOSC; IDLEN disabled; IRCF 16MHz_HF;
OSCCON = 0x70;
// SOSCGO disabled; MFIOSEL disabled;
OSCCON2 = 0x00;
// INTSRC INTRC; PLLEN enabled; TUN 0;
OSCTUNE = 0x40;
// ROSEL System Clock(FOSC); ROON disabled; ROSSLP Disabled in Sleep mode; RODIV Fosc;
REFOCON = 0x00;
}
/**
End of File
*/

View File

@ -0,0 +1,89 @@
/**
@Generated PIC10 / PIC12 / PIC16 / PIC18 MCUs Header File
@Company:
Microchip Technology Inc.
@File Name:
mcc.h
@Summary:
This is the mcc.h file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
@Description:
This header file provides implementations for driver APIs for all modules selected in the GUI.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.00
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above or later
MPLAB : MPLAB X 6.00
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
#ifndef MCC_H
#define MCC_H
#include <xc.h>
#include "device_config.h"
#include "pin_manager.h"
#include <stdint.h>
#include <stdbool.h>
#include <conio.h>
#include "interrupt_manager.h"
#include "tmr0.h"
/**
* @Param
none
* @Returns
none
* @Description
Initializes the device to the default states configured in the
* MCC GUI
* @Example
SYSTEM_Initialize(void);
*/
void SYSTEM_Initialize(void);
/**
* @Param
none
* @Returns
none
* @Description
Initializes the oscillator to the default states configured in the
* MCC GUI
* @Example
OSCILLATOR_Initialize(void);
*/
void OSCILLATOR_Initialize(void);
#endif /* MCC_H */
/**
End of File
*/

View File

@ -0,0 +1,109 @@
/**
Generated Pin Manager File
Company:
Microchip Technology Inc.
File Name:
pin_manager.c
Summary:
This is the Pin Manager file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
Description:
This header file provides implementations for pin APIs for all pins selected in the GUI.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.11
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above
MPLAB : MPLAB X 6.00
Copyright (c) 2013 - 2015 released Microchip Technology Inc. All rights reserved.
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
#include "pin_manager.h"
void PIN_MANAGER_Initialize(void)
{
/**
LATx registers
*/
LATE = 0x00;
LATD = 0x00;
LATA = 0x00;
LATF = 0x00;
LATB = 0x00;
LATG = 0x00;
LATC = 0x00;
LATH = 0x00;
/**
TRISx registers
*/
TRISE = 0xFF;
TRISF = 0xFE;
TRISA = 0xFF;
TRISG = 0x07;
TRISB = 0xFF;
TRISH = 0x00;
TRISC = 0xFF;
TRISD = 0xFF;
/**
ANSELx registers
*/
ANCON0 = 0xFF;
ANCON1 = 0x0F;
ANCON2 = 0x0C;
/**
WPUx registers
*/
}
void PIN_MANAGER_IOC(void)
{
// Clear global Interrupt-On-Change flag
INTCONbits.RBIF = 0;
}
/**
End of File
*/

View File

@ -0,0 +1,270 @@
/**
@Generated Pin Manager Header File
@Company:
Microchip Technology Inc.
@File Name:
pin_manager.h
@Summary:
This is the Pin Manager file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
@Description
This header file provides APIs for driver for .
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.11
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above
MPLAB : MPLAB X 6.00
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
#ifndef PIN_MANAGER_H
#define PIN_MANAGER_H
/**
Section: Included Files
*/
#include <xc.h>
#define INPUT 1
#define OUTPUT 0
#define HIGH 1
#define LOW 0
#define ANALOG 1
#define DIGITAL 0
#define PULL_UP_ENABLED 1
#define PULL_UP_DISABLED 0
// get/set INPUT1 aliases
#define INPUT1_TRIS TRISBbits.TRISB0
#define INPUT1_LAT LATBbits.LATB0
#define INPUT1_PORT PORTBbits.RB0
#define INPUT1_SetHigh() do { LATBbits.LATB0 = 1; } while(0)
#define INPUT1_SetLow() do { LATBbits.LATB0 = 0; } while(0)
#define INPUT1_Toggle() do { LATBbits.LATB0 = ~LATBbits.LATB0; } while(0)
#define INPUT1_GetValue() PORTBbits.RB0
#define INPUT1_SetDigitalInput() do { TRISBbits.TRISB0 = 1; } while(0)
#define INPUT1_SetDigitalOutput() do { TRISBbits.TRISB0 = 0; } while(0)
// get/set INPUT2 aliases
#define INPUT2_TRIS TRISBbits.TRISB1
#define INPUT2_LAT LATBbits.LATB1
#define INPUT2_PORT PORTBbits.RB1
#define INPUT2_SetHigh() do { LATBbits.LATB1 = 1; } while(0)
#define INPUT2_SetLow() do { LATBbits.LATB1 = 0; } while(0)
#define INPUT2_Toggle() do { LATBbits.LATB1 = ~LATBbits.LATB1; } while(0)
#define INPUT2_GetValue() PORTBbits.RB1
#define INPUT2_SetDigitalInput() do { TRISBbits.TRISB1 = 1; } while(0)
#define INPUT2_SetDigitalOutput() do { TRISBbits.TRISB1 = 0; } while(0)
// get/set INPUT3 aliases
#define INPUT3_TRIS TRISBbits.TRISB4
#define INPUT3_LAT LATBbits.LATB4
#define INPUT3_PORT PORTBbits.RB4
#define INPUT3_SetHigh() do { LATBbits.LATB4 = 1; } while(0)
#define INPUT3_SetLow() do { LATBbits.LATB4 = 0; } while(0)
#define INPUT3_Toggle() do { LATBbits.LATB4 = ~LATBbits.LATB4; } while(0)
#define INPUT3_GetValue() PORTBbits.RB4
#define INPUT3_SetDigitalInput() do { TRISBbits.TRISB4 = 1; } while(0)
#define INPUT3_SetDigitalOutput() do { TRISBbits.TRISB4 = 0; } while(0)
// get/set OUTPUT9 aliases
#define OUTPUT9_TRIS TRISGbits.TRISG3
#define OUTPUT9_LAT LATGbits.LATG3
#define OUTPUT9_PORT PORTGbits.RG3
#define OUTPUT9_ANS ANCON2bits.ANSEL17
#define OUTPUT9_SetHigh() do { LATGbits.LATG3 = 1; } while(0)
#define OUTPUT9_SetLow() do { LATGbits.LATG3 = 0; } while(0)
#define OUTPUT9_Toggle() do { LATGbits.LATG3 = ~LATGbits.LATG3; } while(0)
#define OUTPUT9_GetValue() PORTGbits.RG3
#define OUTPUT9_SetDigitalInput() do { TRISGbits.TRISG3 = 1; } while(0)
#define OUTPUT9_SetDigitalOutput() do { TRISGbits.TRISG3 = 0; } while(0)
#define OUTPUT9_SetAnalogMode() do { ANCON2bits.ANSEL17 = 1; } while(0)
#define OUTPUT9_SetDigitalMode() do { ANCON2bits.ANSEL17 = 0; } while(0)
// get/set OUTPUT10 aliases
#define OUTPUT10_TRIS TRISGbits.TRISG4
#define OUTPUT10_LAT LATGbits.LATG4
#define OUTPUT10_PORT PORTGbits.RG4
#define OUTPUT10_ANS ANCON2bits.ANSEL16
#define OUTPUT10_SetHigh() do { LATGbits.LATG4 = 1; } while(0)
#define OUTPUT10_SetLow() do { LATGbits.LATG4 = 0; } while(0)
#define OUTPUT10_Toggle() do { LATGbits.LATG4 = ~LATGbits.LATG4; } while(0)
#define OUTPUT10_GetValue() PORTGbits.RG4
#define OUTPUT10_SetDigitalInput() do { TRISGbits.TRISG4 = 1; } while(0)
#define OUTPUT10_SetDigitalOutput() do { TRISGbits.TRISG4 = 0; } while(0)
#define OUTPUT10_SetAnalogMode() do { ANCON2bits.ANSEL16 = 1; } while(0)
#define OUTPUT10_SetDigitalMode() do { ANCON2bits.ANSEL16 = 0; } while(0)
// get/set OUTPUT1 aliases
#define OUTPUT1_TRIS TRISHbits.TRISH0
#define OUTPUT1_LAT LATHbits.LATH0
#define OUTPUT1_PORT PORTHbits.RH0
#define OUTPUT1_ANS ANCON2bits.ANSEL23
#define OUTPUT1_SetHigh() do { LATHbits.LATH0 = 1; } while(0)
#define OUTPUT1_SetLow() do { LATHbits.LATH0 = 0; } while(0)
#define OUTPUT1_Toggle() do { LATHbits.LATH0 = ~LATHbits.LATH0; } while(0)
#define OUTPUT1_GetValue() PORTHbits.RH0
#define OUTPUT1_SetDigitalInput() do { TRISHbits.TRISH0 = 1; } while(0)
#define OUTPUT1_SetDigitalOutput() do { TRISHbits.TRISH0 = 0; } while(0)
#define OUTPUT1_SetAnalogMode() do { ANCON2bits.ANSEL23 = 1; } while(0)
#define OUTPUT1_SetDigitalMode() do { ANCON2bits.ANSEL23 = 0; } while(0)
// get/set OUTPUT2 aliases
#define OUTPUT2_TRIS TRISHbits.TRISH1
#define OUTPUT2_LAT LATHbits.LATH1
#define OUTPUT2_PORT PORTHbits.RH1
#define OUTPUT2_ANS ANCON2bits.ANSEL22
#define OUTPUT2_SetHigh() do { LATHbits.LATH1 = 1; } while(0)
#define OUTPUT2_SetLow() do { LATHbits.LATH1 = 0; } while(0)
#define OUTPUT2_Toggle() do { LATHbits.LATH1 = ~LATHbits.LATH1; } while(0)
#define OUTPUT2_GetValue() PORTHbits.RH1
#define OUTPUT2_SetDigitalInput() do { TRISHbits.TRISH1 = 1; } while(0)
#define OUTPUT2_SetDigitalOutput() do { TRISHbits.TRISH1 = 0; } while(0)
#define OUTPUT2_SetAnalogMode() do { ANCON2bits.ANSEL22 = 1; } while(0)
#define OUTPUT2_SetDigitalMode() do { ANCON2bits.ANSEL22 = 0; } while(0)
// get/set OUTPUT3 aliases
#define OUTPUT3_TRIS TRISHbits.TRISH2
#define OUTPUT3_LAT LATHbits.LATH2
#define OUTPUT3_PORT PORTHbits.RH2
#define OUTPUT3_ANS ANCON2bits.ANSEL21
#define OUTPUT3_SetHigh() do { LATHbits.LATH2 = 1; } while(0)
#define OUTPUT3_SetLow() do { LATHbits.LATH2 = 0; } while(0)
#define OUTPUT3_Toggle() do { LATHbits.LATH2 = ~LATHbits.LATH2; } while(0)
#define OUTPUT3_GetValue() PORTHbits.RH2
#define OUTPUT3_SetDigitalInput() do { TRISHbits.TRISH2 = 1; } while(0)
#define OUTPUT3_SetDigitalOutput() do { TRISHbits.TRISH2 = 0; } while(0)
#define OUTPUT3_SetAnalogMode() do { ANCON2bits.ANSEL21 = 1; } while(0)
#define OUTPUT3_SetDigitalMode() do { ANCON2bits.ANSEL21 = 0; } while(0)
// get/set OUTPUT4 aliases
#define OUTPUT4_TRIS TRISHbits.TRISH3
#define OUTPUT4_LAT LATHbits.LATH3
#define OUTPUT4_PORT PORTHbits.RH3
#define OUTPUT4_ANS ANCON2bits.ANSEL20
#define OUTPUT4_SetHigh() do { LATHbits.LATH3 = 1; } while(0)
#define OUTPUT4_SetLow() do { LATHbits.LATH3 = 0; } while(0)
#define OUTPUT4_Toggle() do { LATHbits.LATH3 = ~LATHbits.LATH3; } while(0)
#define OUTPUT4_GetValue() PORTHbits.RH3
#define OUTPUT4_SetDigitalInput() do { TRISHbits.TRISH3 = 1; } while(0)
#define OUTPUT4_SetDigitalOutput() do { TRISHbits.TRISH3 = 0; } while(0)
#define OUTPUT4_SetAnalogMode() do { ANCON2bits.ANSEL20 = 1; } while(0)
#define OUTPUT4_SetDigitalMode() do { ANCON2bits.ANSEL20 = 0; } while(0)
// get/set OUTPUT5 aliases
#define OUTPUT5_TRIS TRISHbits.TRISH4
#define OUTPUT5_LAT LATHbits.LATH4
#define OUTPUT5_PORT PORTHbits.RH4
#define OUTPUT5_ANS ANCON1bits.ANSEL12
#define OUTPUT5_SetHigh() do { LATHbits.LATH4 = 1; } while(0)
#define OUTPUT5_SetLow() do { LATHbits.LATH4 = 0; } while(0)
#define OUTPUT5_Toggle() do { LATHbits.LATH4 = ~LATHbits.LATH4; } while(0)
#define OUTPUT5_GetValue() PORTHbits.RH4
#define OUTPUT5_SetDigitalInput() do { TRISHbits.TRISH4 = 1; } while(0)
#define OUTPUT5_SetDigitalOutput() do { TRISHbits.TRISH4 = 0; } while(0)
#define OUTPUT5_SetAnalogMode() do { ANCON1bits.ANSEL12 = 1; } while(0)
#define OUTPUT5_SetDigitalMode() do { ANCON1bits.ANSEL12 = 0; } while(0)
// get/set OUTPUT6 aliases
#define OUTPUT6_TRIS TRISHbits.TRISH5
#define OUTPUT6_LAT LATHbits.LATH5
#define OUTPUT6_PORT PORTHbits.RH5
#define OUTPUT6_ANS ANCON1bits.ANSEL13
#define OUTPUT6_SetHigh() do { LATHbits.LATH5 = 1; } while(0)
#define OUTPUT6_SetLow() do { LATHbits.LATH5 = 0; } while(0)
#define OUTPUT6_Toggle() do { LATHbits.LATH5 = ~LATHbits.LATH5; } while(0)
#define OUTPUT6_GetValue() PORTHbits.RH5
#define OUTPUT6_SetDigitalInput() do { TRISHbits.TRISH5 = 1; } while(0)
#define OUTPUT6_SetDigitalOutput() do { TRISHbits.TRISH5 = 0; } while(0)
#define OUTPUT6_SetAnalogMode() do { ANCON1bits.ANSEL13 = 1; } while(0)
#define OUTPUT6_SetDigitalMode() do { ANCON1bits.ANSEL13 = 0; } while(0)
// get/set OUTPUT7 aliases
#define OUTPUT7_TRIS TRISHbits.TRISH6
#define OUTPUT7_LAT LATHbits.LATH6
#define OUTPUT7_PORT PORTHbits.RH6
#define OUTPUT7_ANS ANCON1bits.ANSEL14
#define OUTPUT7_SetHigh() do { LATHbits.LATH6 = 1; } while(0)
#define OUTPUT7_SetLow() do { LATHbits.LATH6 = 0; } while(0)
#define OUTPUT7_Toggle() do { LATHbits.LATH6 = ~LATHbits.LATH6; } while(0)
#define OUTPUT7_GetValue() PORTHbits.RH6
#define OUTPUT7_SetDigitalInput() do { TRISHbits.TRISH6 = 1; } while(0)
#define OUTPUT7_SetDigitalOutput() do { TRISHbits.TRISH6 = 0; } while(0)
#define OUTPUT7_SetAnalogMode() do { ANCON1bits.ANSEL14 = 1; } while(0)
#define OUTPUT7_SetDigitalMode() do { ANCON1bits.ANSEL14 = 0; } while(0)
// get/set OUTPUT8 aliases
#define OUTPUT8_TRIS TRISHbits.TRISH7
#define OUTPUT8_LAT LATHbits.LATH7
#define OUTPUT8_PORT PORTHbits.RH7
#define OUTPUT8_ANS ANCON1bits.ANSEL15
#define OUTPUT8_SetHigh() do { LATHbits.LATH7 = 1; } while(0)
#define OUTPUT8_SetLow() do { LATHbits.LATH7 = 0; } while(0)
#define OUTPUT8_Toggle() do { LATHbits.LATH7 = ~LATHbits.LATH7; } while(0)
#define OUTPUT8_GetValue() PORTHbits.RH7
#define OUTPUT8_SetDigitalInput() do { TRISHbits.TRISH7 = 1; } while(0)
#define OUTPUT8_SetDigitalOutput() do { TRISHbits.TRISH7 = 0; } while(0)
#define OUTPUT8_SetAnalogMode() do { ANCON1bits.ANSEL15 = 1; } while(0)
#define OUTPUT8_SetDigitalMode() do { ANCON1bits.ANSEL15 = 0; } while(0)
/**
@Param
none
@Returns
none
@Description
GPIO and peripheral I/O initialization
@Example
PIN_MANAGER_Initialize();
*/
void PIN_MANAGER_Initialize (void);
/**
* @Param
none
* @Returns
none
* @Description
Interrupt on Change Handling routine
* @Example
PIN_MANAGER_IOC();
*/
void PIN_MANAGER_IOC(void);
#endif // PIN_MANAGER_H
/**
End of File
*/

View File

@ -0,0 +1,167 @@
/**
TMR0 Generated Driver File
@Company
Microchip Technology Inc.
@File Name
tmr0.c
@Summary
This is the generated driver implementation file for the TMR0 driver using PIC10 / PIC12 / PIC16 / PIC18 MCUs
@Description
This source file provides APIs for TMR0.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.01
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above
MPLAB : MPLAB X 6.00
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
/**
Section: Included Files
*/
#include <xc.h>
#include "tmr0.h"
/**
Section: Global Variables Definitions
*/
void (*TMR0_InterruptHandler)(void);
volatile uint16_t timer0ReloadVal;
/**
Section: TMR0 APIs
*/
void TMR0_Initialize(void)
{
// Set TMR0 to the options selected in the User Interface
//Enable 16bit timer mode before assigning value to TMR0H
T0CONbits.T08BIT = 0;
// TMR0H 99;
TMR0H = 0x63;
// TMR0L 191;
TMR0L = 0xBF;
// Load TMR0 value to the 16-bit reload variable
timer0ReloadVal = (uint16_t)((TMR0H << 8) | TMR0L);
// Clear Interrupt flag before enabling the interrupt
INTCONbits.TMR0IF = 0;
// Enabling TMR0 interrupt.
INTCONbits.TMR0IE = 1;
// Set Default Interrupt Handler
TMR0_SetInterruptHandler(TMR0_DefaultInterruptHandler);
// T0PS 1:4; T08BIT 16-bit; T0SE Increment_hi_lo; T0CS FOSC/4; TMR0ON enabled; PSA assigned;
T0CON = 0x91;
}
void TMR0_StartTimer(void)
{
// Start the Timer by writing to TMR0ON bit
T0CONbits.TMR0ON = 1;
}
void TMR0_StopTimer(void)
{
// Stop the Timer by writing to TMR0ON bit
T0CONbits.TMR0ON = 0;
}
uint16_t TMR0_ReadTimer(void)
{
uint16_t readVal;
uint8_t readValLow;
uint8_t readValHigh;
readValLow = TMR0L;
readValHigh = TMR0H;
readVal = ((uint16_t)readValHigh << 8) + readValLow;
return readVal;
}
void TMR0_WriteTimer(uint16_t timerVal)
{
// Write to the Timer0 register
TMR0H = timerVal >> 8;
TMR0L = (uint8_t) timerVal;
}
void TMR0_Reload(void)
{
// Write to the Timer0 register
TMR0H = timer0ReloadVal >> 8;
TMR0L = (uint8_t) timer0ReloadVal;
}
void TMR0_ISR(void)
{
// clear the TMR0 interrupt flag
INTCONbits.TMR0IF = 0;
// reload TMR0
// Write to the Timer0 register
TMR0H = timer0ReloadVal >> 8;
TMR0L = (uint8_t) timer0ReloadVal;
if(TMR0_InterruptHandler)
{
TMR0_InterruptHandler();
}
// add your TMR0 interrupt custom code
}
void TMR0_SetInterruptHandler(void (* InterruptHandler)(void)){
TMR0_InterruptHandler = InterruptHandler;
}
void TMR0_DefaultInterruptHandler(void){
// add your TMR0 interrupt custom code
// or set custom function using TMR0_SetInterruptHandler()
}
/**
End of File
*/

View File

@ -0,0 +1,356 @@
/**
TMR0 Generated Driver API Header File
@Company
Microchip Technology Inc.
@File Name
tmr0.h
@Summary
This is the generated header file for the TMR0 driver using PIC10 / PIC12 / PIC16 / PIC18 MCUs
@Description
This header file provides APIs for TMR0.
Generation Information :
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
Device : PIC18F86K22
Driver Version : 2.01
The generated drivers are tested against the following:
Compiler : XC8 2.36 and above
MPLAB : MPLAB X 6.00
*/
/*
(c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and any
derivatives exclusively with Microchip products. It is your responsibility to comply with third party
license terms applicable to your use of third party software (including open source software) that
may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
SOFTWARE.
*/
#ifndef TMR0_H
#define TMR0_H
/**
Section: Included Files
*/
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus // Provide C++ Compatibility
extern "C" {
#endif
/**
Section: TMR0 APIs
*/
/**
@Summary
Initializes the TMR0.
@Description
This function initializes the TMR0 Registers.
This function must be called before any other TMR0 function is called.
@Preconditions
None
@Param
None
@Returns
None
@Comment
@Example
<code>
main()
{
// Initialize TMR0 module
TMR0_Initialize();
// Do something else...
}
</code>
*/
void TMR0_Initialize(void);
/**
@Summary
This function starts the TMR0.
@Description
This function starts the TMR0 operation.
This function must be called after the initialization of TMR0.
@Preconditions
Initialize the TMR0 before calling this function.
@Param
None
@Returns
None
@Example
<code>
// Initialize TMR0 module
// Start TMR0
TMR0_StartTimer();
// Do something else...
</code>
*/
void TMR0_StartTimer(void);
/**
@Summary
This function stops the TMR0.
@Description
This function stops the TMR0 operation.
This function must be called after the start of TMR0.
@Preconditions
Initialize the TMR0 before calling this function.
@Param
None
@Returns
None
@Example
<code>
// Initialize TMR0 module
// Start TMR0
TMR0_StartTimer();
// Do something else...
// Stop TMR0;
TMR0_StopTimer();
</code>
*/
void TMR0_StopTimer(void);
/**
@Summary
Reads the 16 bits TMR0 register value.
@Description
This function reads the 16 bits TMR0 register value and return it.
@Preconditions
Initialize the TMR0 before calling this function.
@Param
None
@Returns
This function returns the 16 bits value of TMR0 register.
@Example
<code>
// Initialize TMR0 module
// Start TMR0
TMR0_StartTimer();
// Read the current value of TMR0
if(0 == TMR0_ReadTimer())
{
// Do something else...
// Reload the TMR value
TMR0_Reload();
}
</code>
*/
uint16_t TMR0_ReadTimer(void);
/**
@Summary
Writes the 16 bits value to TMR0 register.
@Description
This function writes the 16 bits value to TMR0 register.
This function must be called after the initialization of TMR0.
@Preconditions
Initialize the TMR0 before calling this function.
@Param
timerVal - Value to write into TMR0 register.
@Returns
None
@Example
<code>
#define PERIOD 0x8000
#define ZERO 0x0000
while(1)
{
//Read the TMR0 register
if(ZERO == TMR0_ReadTimer())
{
// Do something else...
// Write the TMR0 register
TMR0_WriteTimer(PERIOD);
}
// Do something else...
}
</code>
*/
void TMR0_WriteTimer(uint16_t timerVal);
/**
@Summary
Reload the 16 bits value to TMR0 register.
@Description
This function reloads the 16 bit value to TMR0 register.
This function must be called to write initial value into TMR0 register.
@Preconditions
Initialize the TMR0 before calling this function.
@Param
None
@Returns
None
@Example
<code>
while(1)
{
if(TMR0IF)
{
// Do something else...
// clear the TMR0 interrupt flag
TMR0IF = 0;
// Reload the initial value of TMR0
TMR0_Reload();
}
}
</code>
*/
void TMR0_Reload(void);
/**
@Summary
Timer Interrupt Service Routine
@Description
Timer Interrupt Service Routine is called by the Interrupt Manager.
@Preconditions
Initialize the TMR0 module with interrupt before calling this isr.
@Param
None
@Returns
None
*/
void TMR0_ISR(void);
/**
@Summary
Set Timer Interrupt Handler
@Description
This sets the function to be called during the ISR
@Preconditions
Initialize the TMR0 module with interrupt before calling this.
@Param
Address of function to be set
@Returns
None
*/
void TMR0_SetInterruptHandler(void (* InterruptHandler)(void));
/**
@Summary
Timer Interrupt Handler
@Description
This is a function pointer to the function that will be called during the ISR
@Preconditions
Initialize the TMR0 module with interrupt before calling this isr.
@Param
None
@Returns
None
*/
extern void (*TMR0_InterruptHandler)(void);
/**
@Summary
Default Timer Interrupt Handler
@Description
This is the default Interrupt Handler function
@Preconditions
Initialize the TMR0 module with interrupt before calling this isr.
@Param
None
@Returns
None
*/
void TMR0_DefaultInterruptHandler(void);
#ifdef __cplusplus // Provide C++ Compatibility
}
#endif
#endif // TMR0_H
/**
End of File
*/

View File

@ -0,0 +1,61 @@
#include "event.h"
#define NULL ((void*)(0))
void Event_init(struct Event_* me)
{
me->id = NULLEVENT;
me->delay = 0;
me->target = NULL;
me->data = 0x0;
me->processEvent = NULL;
}
void Event_setData(Event* me, int64_t data)
{
me->data = data;
}
int64_t Event_getData(Event* me)
{
return me->data;
}
void Event_setPE(Event* me, processEventT processEvent)
{
me->processEvent = processEvent;
}
void Event_setTarget(Event* me, void* target)
{
me->target = target;
}
processEventT Event_getPE(Event* me)
{
return me->processEvent;
}
void* Event_getTarget(Event* me)
{
return me->target;
}
void Event_setId(Event* me, evIDT eventID)
{
me->id = eventID;
}
evIDT Event_getId(Event* me)
{
return me->id;
}
void Event_setDelay(Event* me, uint16_t delay)
{
me->delay = delay;
}
uint16_t Event_getDelay(Event* me)
{
return me->delay;
}

View File

@ -0,0 +1,35 @@
#include <stdint.h>
#include <stdbool.h>
#include "ireactive.h"
#ifndef EVENT_ONCE
#define EVENT_ONCE
typedef uint8_t evIDT;
#define NULLEVENT 0 // no event
struct Event_
{
evIDT id;
processEventT processEvent;
void* target;
uint16_t delay;
int64_t data;
};
typedef struct Event_ Event;
//public methods
void Event_init(Event* me);
void Event_setTarget(Event* me, void* target);
void Event_setPE(Event* me, processEventT processEvent);
void* Event_getTarget(Event* me);
processEventT Event_getPE(Event* me);
void Event_setId(Event* me, evIDT eventID);
evIDT Event_getId(Event* me);
void Event_setDelay(Event* me, uint16_t delay);
uint16_t Event_getDelay(Event* me);
void Event_setData(Event* me, int64_t data);
int64_t Event_getData(Event* me);
#endif

View File

@ -0,0 +1,8 @@
#ifndef IREACTIVE_ONCE
#define IREACTIVE_ONCE
struct Event_;
typedef bool (*processEventT)(struct Event_* ev);
#endif

View File

@ -0,0 +1,292 @@
/******************************************************************************/
/* FILENAME : xf.h */
/*----------------------------------------------------------------------------*/
/* GOAL : Offers the femto XF functions (for PIC CPU) */
/*----------------------------------------------------------------------------*/
/* AUTHOR : Medard Rieder / Pascal Sartoretti */
/*----------------------------------------------------------------------------*/
/* DATE: : original (Medard Rieder 08.2011) */
/* corrections & simplified (Pascal Sartoretti 06.2016) */
/******************************************************************************/
#include "xf.h"
#include "../mcc_generated_files/mcc.h"
/*
* private methods of the XF
*/
/******************************************************************************/
/* FUNCTION : Push an event on the events queue */
/* INPUT : ev - the event number (not 0) */
/* inISR - (true if called in an ISR, else false) */
/* OUTPUT : return false if the queue was full, else true */
/* COMMENTS : - */
/******************************************************************************/
bool XF_pushEvent(Event ev, bool inISR, TimerID* tmid);
/******************************************************************************/
/* FUNCTION : Pop an event on the events queue */
/* INPUT : inISR - (true if called in an ISR, else false) */
/* OUTPUT : return the next waiting event if any, else 0 */
/* COMMENTS : - */
/******************************************************************************/
Event XF_popEvent(bool inISR);
/******************************************************************************/
/* FUNCTION : Post a timer in timers queue */
/* INPUT : tm - time before event arrives */
/* ev - event to post */
/* inISR - (true if called in an ISR, else false) */
/* OUTPUT : return the timer Id used */
/* COMMENTS : - */
/******************************************************************************/
TimerID XF_scheduleTimer(Time tm, Event ev, bool inISR);
/******************************************************************************/
/* FUNCTION : Switch of the interrupts */
/* INPUT : inISR - (true if called in an ISR, else f */
/* OUTPUT : none */
/* COMMENTS : - */
/******************************************************************************/
static void ENTERCRITICAL(bool inISR);
/******************************************************************************/
/* FUNCTION : Switch on the interrupts */
/* INPUT : inISR - (true if called in an ISR, else f */
/* OUTPUT : none */
/* COMMENTS : - */
/******************************************************************************/
static void LEAVECRITICAL(bool inISR);
/*
* the XF instance
*/
XF theXF; // really the XF
/******************************************************************************/
/* FUNCTION : Init the XF structure */
/* INPUT : - */
/* OUTPUT : - */
/* COMMENTS : Have to be called once */
/******************************************************************************/
void XF_init()
{
int i;
for (i=0; i<MAXEVENT; i++)
{
Event_init(&(theXF.eventQueue[i]));
}
for (i=0; i<MAXTIMER; i++)
{
theXF.timerList[i].tm = NULLTIMER;
Event_init(&(theXF.timerList[i].ev));
}
theXF.in = 0;
theXF.out = 0;
}
/******************************************************************************/
/* FUNCTION : Push an event on the events queue */
/* INPUT : ev - the event number (not 0) */
/* inISR - (true if called in an ISR, else false) */
/* OUTPUT : return false if the queue was full, else true */
/* COMMENTS : - */
/******************************************************************************/
bool XF_pushEvent(Event ev, bool inISR, TimerID* tmid)
{
uint8_t temp;
Time tm;
tm = Event_getDelay(&ev);
if ( tm > 0)
{
Event_setDelay(&ev,0);
*tmid = XF_scheduleTimer(tm, ev, inISR);
}
else
{
ENTERCRITICAL(inISR);
temp = (theXF.in+1) % (uint8_t)(sizeof(theXF.eventQueue) / sizeof(Event));
if(temp == theXF.out)
{
LEAVECRITICAL(inISR);
return false;
}
theXF.eventQueue[theXF.in] = ev;
theXF.in = temp;
LEAVECRITICAL(inISR);
}
return true;
}
/******************************************************************************/
/* FUNCTION : Pop an event on the events queue */
/* INPUT : inISR - (true if called in an ISR, else false) */
/* OUTPUT : return the next waiting event if any, else 0 */
/* COMMENTS : - */
/******************************************************************************/
Event XF_popEvent(bool inISR)
{
Event ev;
ev.id = NULLEVENT;
ev.target = NULL;
ev.processEvent = NULL;
ENTERCRITICAL(inISR);
if(theXF.in == theXF.out)
{
LEAVECRITICAL(inISR);
return ev;
}
ev = theXF.eventQueue[theXF.out];
theXF.out = (theXF.out + 1)%(uint8_t)(sizeof(theXF.eventQueue) / sizeof(Event));
LEAVECRITICAL(inISR);
return ev;
}
/******************************************************************************/
/* FUNCTION : Post a timer in timers queue */
/* INPUT : tm - time before event arrives */
/* ev - event to post */
/* inISR - (true if called in an ISR, else false) */
/* OUTPUT : return the timer Id used */
/* COMMENTS : - */
/******************************************************************************/
TimerID XF_scheduleTimer(Time tm, Event ev, bool inISR)
{
uint8_t i;
ENTERCRITICAL(inISR);
for (i=0; i<MAXTIMER; i++)
{
if (theXF.timerList[i].ev.id == NULLEVENT)
{
theXF.timerList[i].tm = tm;
theXF.timerList[i].ev = ev;
break;
}
}
//here you could react
//if timerlist is full
LEAVECRITICAL(inISR);
return i;
}
/******************************************************************************/
/* FUNCTION : Remove a timer in timers queue */
/* INPUT : id - the timer id to remove */
/* inISR - (true if called in an ISR, else false) */
/* OUTPUT : - */
/* COMMENTS : - */
/******************************************************************************/
void XF_unscheduleTimer(TimerID id, bool inISR)
{
ENTERCRITICAL(inISR);
theXF.timerList[id].tm = NULLTIMER;
Event_init(&(theXF.timerList[id].ev));
LEAVECRITICAL(inISR);
}
/******************************************************************************/
/* FUNCTION : Decrement timers to post events if time elapsed */
/* INPUT : - */
/* OUTPUT : - */
/* COMMENTS : This function has to be called from the timer ISR */
/******************************************************************************/
void XF_decrementAndQueueTimers()
{
uint8_t i;
for (i=0; i<MAXTIMER; i++)
{
if (theXF.timerList[i].ev.id != NULLEVENT)
{
theXF.timerList[i].tm-=TICKINTERVAL;
if (theXF.timerList[i].tm ==0)
{
TimerID dummy;
if (XF_pushEvent(theXF.timerList[i].ev, true, &dummy) == true)
{
XF_unscheduleTimer(i, true);
}
else
{
theXF.timerList[i].tm=1;
}
}
}
}
//here you could use done to react
//if timerID was not found (done == 0)
}
/******************************************************************************/
/* FUNCTION : Lock interrupts if not in ISR */
/* INPUT : - */
/* OUTPUT : - */
/* COMMENTS : - */
/******************************************************************************/
static void ENTERCRITICAL(bool inISR)
{
if (inISR == false)
{
//GIE = 0;
INTERRUPT_GlobalInterruptDisable();
}
}
/******************************************************************************/
/* FUNCTION : Unlock interrupts if not in ISR */
/* INPUT : - */
/* OUTPUT : - */
/* COMMENTS : - */
/******************************************************************************/
static void LEAVECRITICAL(bool inISR)
{
if (inISR == false)
{
//GIE = 1;
INTERRUPT_GlobalInterruptEnable();
}
}
TimerID POST(void* target, processEventT processEvent, uint8_t id, Time delay , int64_t data)
{
TimerID tmid = MAXTIMER; //this is to say that no timer has been scheduled
//is a timer has been scheduled, the ID will be
//from 0 to MAXTIMER-1
Event ev;
Event_init(&ev);
Event_setTarget(&ev,target);
Event_setPE(&ev,processEvent);
Event_setId(&ev,id);
Event_setDelay(&ev,delay);
Event_setData(&ev,data);
XF_pushEvent(ev,false,&tmid);
return tmid;
}
void XF_executeOnce()
{
Event ev = XF_popEvent(false);
//if this event is valid
if (ev.id != NULLEVENT)
{
//if this event has a valid target
//if (ev.target != NULL)
//{
//if this event has a valid state machine
//function pointer
if (ev.processEvent != NULL)
{
//call the state machine method function
//and pass the event as parameter
ev.processEvent(&ev);
}
//}
}
}

View File

@ -0,0 +1,84 @@
/******************************************************************************/
/* FILENAME : xf.h */
/*----------------------------------------------------------------------------*/
/* GOAL : Offers the femto XF functions */
/*----------------------------------------------------------------------------*/
/* AUTHOR : Medard Rieder / Pascal Sartoretti */
/*----------------------------------------------------------------------------*/
/* DATE: : original (Medard Rieder 08.2011) */
/* corrections & simplified (Pascal Sartoretti 06.2016) */
/******************************************************************************/
#ifndef XF_DEF
#define XF_DEF
#include <stdint.h> // usage of standard types
#include <stdbool.h> // usage of boolean types
#include "../mcc_generated_files/mcc.h"
#include "event.h"
#define Time uint16_t // time type
#define TimerID uint8_t // identifier of timer (position in buffer)
typedef struct Timer_ // timer structure
{
Time tm; // time
Event ev; // event to post
} Timer;
/*----------------------------------------------------------------------------*/
/* depending on usage, change MAXTIMER and MAXEVENT */
/*----------------------------------------------------------------------------*/
#define MAXTIMER 8 // number of timers in our system
#define MAXEVENT 12 // number of events in our system
#define NULLTIMER 0 // no value for time
#define TICKINTERVAL 10 // this is the ticktimers duration
/*----------------------------------------------------------------------------*/
typedef struct XF // the XF structure
{
Timer timerList[MAXTIMER]; // the timers
Event eventQueue[MAXEVENT]; // the events
uint8_t in; // the events in pointer
uint8_t out; // the events out pointer
} XF;
/******************************************************************************/
/* FUNCTION : Init the XF structure */
/* INPUT : - */
/* OUTPUT : - */
/* COMMENTS : Have to be called once */
/******************************************************************************/
void XF_init();
/******************************************************************************/
/* FUNCTION : Remove a timer in timers queue */
/* INPUT : id - the timer id to remove */
/* inISR - (true if called in an ISR, else false) */
/* OUTPUT : - */
/* COMMENTS : - */
/******************************************************************************/
void XF_unscheduleTimer(TimerID id, bool inISR);
/******************************************************************************/
/* FUNCTION : Decrement timers to post events if time elapsed */
/* INPUT : - */
/* OUTPUT : - */
/* COMMENTS : This function has to be called from the timer ISR */
/******************************************************************************/
void XF_decrementAndQueueTimers();
/********************************************************************************/
/* FUNCTION : POST an Event */
/* INPUT : target - the address of the object with the state machine */
/* processEvent - function pointer of the state machine function */
/* id - the id of the event */
/* delay - the delay if the event is a timeout event */
/* data - user data */
/* OUTPUT : TimerId - the id of the timeout if the event is a timeout */
/* COMMENTS : */
/********************************************************************************/
TimerID POST(void* target, processEventT processEvent, uint8_t id, Time delay, int64_t data);
void XF_executeOnce();
#endif

View File

@ -0,0 +1,226 @@
<?xml version="1.0" encoding="UTF-8"?>
<configurationDescriptor version="65">
<logicalFolder name="root" displayName="root" projectFiles="true">
<logicalFolder name="HeaderFiles"
displayName="Header Files"
projectFiles="true">
<logicalFolder name="app" displayName="app" projectFiles="true">
<logicalFolder name="factory" displayName="factory" projectFiles="true">
<itemPath>ch/kb28/blinkerProject/app/factory/factory.h</itemPath>
</logicalFolder>
<itemPath>ch/kb28/blinkerProject/app/ledblinker.h</itemPath>
</logicalFolder>
<logicalFolder name="board" displayName="board" projectFiles="true">
<logicalFolder name="led" displayName="led" projectFiles="true">
<itemPath>ch/kb28/blinkerProject/board/led/led.h</itemPath>
</logicalFolder>
</logicalFolder>
<logicalFolder name="mcc_generated_files"
displayName="mcc_generated_files"
projectFiles="true">
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/tmr0.h</itemPath>
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/pin_manager.h</itemPath>
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/mcc.h</itemPath>
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/interrupt_manager.h</itemPath>
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/device_config.h</itemPath>
</logicalFolder>
<logicalFolder name="middleware" displayName="middleware" projectFiles="true">
</logicalFolder>
<logicalFolder name="xf" displayName="xf" projectFiles="true">
<itemPath>ch/kb28/blinkerProject/xf/ireactive.h</itemPath>
<itemPath>ch/kb28/blinkerProject/xf/event.h</itemPath>
<itemPath>ch/kb28/blinkerProject/xf/xf.h</itemPath>
</logicalFolder>
</logicalFolder>
<logicalFolder name="LinkerScript"
displayName="Linker Files"
projectFiles="true">
</logicalFolder>
<logicalFolder name="SourceFiles"
displayName="Source Files"
projectFiles="true">
<logicalFolder name="app" displayName="app" projectFiles="true">
<logicalFolder name="factory" displayName="factory" projectFiles="true">
<itemPath>ch/kb28/blinkerProject/app/factory/factory.c</itemPath>
</logicalFolder>
<itemPath>ch/kb28/blinkerProject/app/lebblinker.c</itemPath>
<itemPath>ch/kb28/blinkerProject/app/main.c</itemPath>
</logicalFolder>
<logicalFolder name="board" displayName="board" projectFiles="true">
<logicalFolder name="led" displayName="led" projectFiles="true">
<itemPath>ch/kb28/blinkerProject/board/led/led.c</itemPath>
</logicalFolder>
</logicalFolder>
<logicalFolder name="mcc_generated_files"
displayName="mcc_generated_files"
projectFiles="true">
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/mcc.c</itemPath>
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/interrupt_manager.c</itemPath>
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/device_config.c</itemPath>
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/pin_manager.c</itemPath>
<itemPath>ch/kb28/blinkerProject/mcc_generated_files/tmr0.c</itemPath>
</logicalFolder>
<logicalFolder name="middleware" displayName="middleware" projectFiles="true">
</logicalFolder>
<logicalFolder name="xf" displayName="xf" projectFiles="true">
<itemPath>ch/kb28/blinkerProject/xf/xf.c</itemPath>
<itemPath>ch/kb28/blinkerProject/xf/event.c</itemPath>
</logicalFolder>
</logicalFolder>
<logicalFolder name="ExternalFiles"
displayName="Important Files"
projectFiles="false">
<itemPath>Makefile</itemPath>
</logicalFolder>
</logicalFolder>
<sourceRootList>
<Elem>.</Elem>
</sourceRootList>
<projectmakefile>Makefile</projectmakefile>
<confs>
<conf name="default" type="2">
<toolsSet>
<developmentServer>localhost</developmentServer>
<targetDevice>PIC18F87K22</targetDevice>
<targetHeader></targetHeader>
<targetPluginBoard></targetPluginBoard>
<platformTool>noID</platformTool>
<languageToolchain>XC8</languageToolchain>
<languageToolchainVersion>2.41</languageToolchainVersion>
<platform>2</platform>
</toolsSet>
<packs>
<pack name="PIC18F-K_DFP" vendor="Microchip" version="1.7.134"/>
</packs>
<ScriptingSettings>
</ScriptingSettings>
<compileType>
<linkerTool>
<linkerLibItems>
</linkerLibItems>
</linkerTool>
<archiverTool>
</archiverTool>
<loading>
<useAlternateLoadableFile>false</useAlternateLoadableFile>
<parseOnProdLoad>false</parseOnProdLoad>
<alternateLoadableFile></alternateLoadableFile>
</loading>
<subordinates>
</subordinates>
</compileType>
<makeCustomizationType>
<makeCustomizationPreStepEnabled>false</makeCustomizationPreStepEnabled>
<makeUseCleanTarget>false</makeUseCleanTarget>
<makeCustomizationPreStep></makeCustomizationPreStep>
<makeCustomizationPostStepEnabled>false</makeCustomizationPostStepEnabled>
<makeCustomizationPostStep></makeCustomizationPostStep>
<makeCustomizationPutChecksumInUserID>false</makeCustomizationPutChecksumInUserID>
<makeCustomizationEnableLongLines>false</makeCustomizationEnableLongLines>
<makeCustomizationNormalizeHexFile>false</makeCustomizationNormalizeHexFile>
</makeCustomizationType>
<HI-TECH-COMP>
<property key="additional-warnings" value="true"/>
<property key="asmlist" value="true"/>
<property key="call-prologues" value="false"/>
<property key="default-bitfield-type" value="true"/>
<property key="default-char-type" value="true"/>
<property key="define-macros" value=""/>
<property key="disable-optimizations" value="true"/>
<property key="extra-include-directories" value=""/>
<property key="favor-optimization-for" value="-speed,+space"/>
<property key="garbage-collect-data" value="true"/>
<property key="garbage-collect-functions" value="true"/>
<property key="identifier-length" value="255"/>
<property key="local-generation" value="false"/>
<property key="operation-mode" value="free"/>
<property key="opt-xc8-compiler-strict_ansi" value="false"/>
<property key="optimization-assembler" value="true"/>
<property key="optimization-assembler-files" value="true"/>
<property key="optimization-debug" value="false"/>
<property key="optimization-invariant-enable" value="false"/>
<property key="optimization-invariant-value" value="16"/>
<property key="optimization-level" value="-O0"/>
<property key="optimization-speed" value="false"/>
<property key="optimization-stable-enable" value="false"/>
<property key="preprocess-assembler" value="true"/>
<property key="short-enums" value="true"/>
<property key="tentative-definitions" value="-fno-common"/>
<property key="undefine-macros" value=""/>
<property key="use-cci" value="false"/>
<property key="use-iar" value="false"/>
<property key="verbose" value="false"/>
<property key="warning-level" value="-3"/>
<property key="what-to-do" value="ignore"/>
</HI-TECH-COMP>
<HI-TECH-LINK>
<property key="additional-options-checksum" value=""/>
<property key="additional-options-code-offset" value=""/>
<property key="additional-options-command-line" value=""/>
<property key="additional-options-errata" value=""/>
<property key="additional-options-extend-address" value="false"/>
<property key="additional-options-trace-type" value=""/>
<property key="additional-options-use-response-files" value="false"/>
<property key="backup-reset-condition-flags" value="false"/>
<property key="calibrate-oscillator" value="false"/>
<property key="calibrate-oscillator-value" value="0x3400"/>
<property key="clear-bss" value="true"/>
<property key="code-model-external" value="wordwrite"/>
<property key="code-model-rom" value=""/>
<property key="create-html-files" value="false"/>
<property key="data-model-ram" value=""/>
<property key="data-model-size-of-double" value="32"/>
<property key="data-model-size-of-double-gcc" value="no-short-double"/>
<property key="data-model-size-of-float" value="32"/>
<property key="data-model-size-of-float-gcc" value="no-short-float"/>
<property key="display-class-usage" value="false"/>
<property key="display-hex-usage" value="false"/>
<property key="display-overall-usage" value="true"/>
<property key="display-psect-usage" value="false"/>
<property key="extra-lib-directories" value=""/>
<property key="fill-flash-options-addr" value=""/>
<property key="fill-flash-options-const" value=""/>
<property key="fill-flash-options-how" value="0"/>
<property key="fill-flash-options-inc-const" value="1"/>
<property key="fill-flash-options-increment" value=""/>
<property key="fill-flash-options-seq" value=""/>
<property key="fill-flash-options-what" value="0"/>
<property key="format-hex-file-for-download" value="false"/>
<property key="initialize-data" value="true"/>
<property key="input-libraries" value="libm"/>
<property key="keep-generated-startup.as" value="false"/>
<property key="link-in-c-library" value="true"/>
<property key="link-in-c-library-gcc" value=""/>
<property key="link-in-peripheral-library" value="false"/>
<property key="managed-stack" value="false"/>
<property key="opt-xc8-linker-file" value="false"/>
<property key="opt-xc8-linker-link_startup" value="false"/>
<property key="opt-xc8-linker-serial" value=""/>
<property key="program-the-device-with-default-config-words" value="true"/>
<property key="remove-unused-sections" value="true"/>
</HI-TECH-LINK>
<XC8-CO>
<property key="coverage-enable" value=""/>
<property key="stack-guidance" value="false"/>
</XC8-CO>
<XC8-config-global>
<property key="advanced-elf" value="true"/>
<property key="constdata-progmem" value="true"/>
<property key="gcc-opt-driver-new" value="true"/>
<property key="gcc-opt-std" value="-std=c99"/>
<property key="gcc-output-file-format" value="dwarf-3"/>
<property key="mapped-progmem" value="false"/>
<property key="omit-pack-options" value="false"/>
<property key="omit-pack-options-new" value="1"/>
<property key="output-file-format" value="-mcof,+elf"/>
<property key="smart-io-format" value=""/>
<property key="stack-size-high" value="auto"/>
<property key="stack-size-low" value="auto"/>
<property key="stack-size-main" value="auto"/>
<property key="stack-type" value="compiled"/>
<property key="user-pack-device-support" value=""/>
<property key="wpo-lto" value="false"/>
</XC8-config-global>
</conf>
</confs>
</configurationDescriptor>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>com.microchip.mplab.nbide.embedded.makeproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/make-project/1">
<name>blinkerProject</name>
<creation-uuid>e6abf760-f690-474e-bd73-664708ab92c9</creation-uuid>
<make-project-type>0</make-project-type>
<sourceEncoding>ISO-8859-1</sourceEncoding>
<make-dep-projects/>
<sourceRootList>
<sourceRootElem>.</sourceRootElem>
</sourceRootList>
<confList>
<confElem>
<name>default</name>
<type>2</type>
</confElem>
</confList>
<formatting>
<project-formatting-style>false</project-formatting-style>
</formatting>
</data>
</configuration>
</project>