/*****************************************************************************
* Microchip Graphics Library
* Graphics Display Designer (GDD) Template
*****************************************************************************
* FileName: Main.c
* Dependencies: Main.h
* Processor: PIC24F, PIC24H, dsPIC, PIC32
* Compiler: MPLAB C30/C32
* Linker: MPLAB LINK30, MPLAB LINK32
* Company: Microchip Technology Incorporated
*
* Software License Agreement
*
* Copyright © 2010 Microchip Technology Inc. All rights reserved.
* Microchip licenses to you the right to use, modify, copy and distribute
* Software only when embedded on a Microchip microcontroller or digital
* signal controller, which is integrated into your product or third party
* product (pursuant to the sublicense terms in the accompanying license
* agreement).
*
* You should refer to the license agreement accompanying this Software
* for additional information regarding your rights and obligations.
*
* SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY
* KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY
* OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR
* PURPOSE. IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR
* OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION,
* BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT
* DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL,
* INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA,
* COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY
* CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF),
* OR OTHER SIMILAR COSTS.
*
* Author Date Comment
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*****************************************************************************/
#include "Main.h"
#include "GDD_Screens.h"
// Configuration bits
#if defined(__dsPIC33F__) || defined(__PIC24H__)
_FOSCSEL(FNOSC_PRI);
_FOSC(FCKSM_CSECMD &OSCIOFNC_OFF &POSCMD_XT);
_FWDT(FWDTEN_OFF);
#elif defined(__PIC32MX__)
#pragma config FPLLODIV = DIV_1, FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FWDTEN = OFF, FCKSM = CSECME, FPBDIV = DIV_1
#pragma config OSCIOFNC = ON, POSCMOD = XT, FSOSCEN = ON, FNOSC = PRIPLL
#pragma config CP = OFF, BWP = OFF, PWP = OFF
#else
#if defined(__PIC24FJ256GB110__)
_CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx2)
_CONFIG2(0xF7FF & IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRIPLL & PLLDIV_DIV2 & IOL1WAY_OFF)
#endif
#if defined(__PIC24FJ256GA110__)
_CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx2)
_CONFIG2(IESO_OFF & FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRIPLL & IOL1WAY_OFF)
#endif
#if defined(__PIC24FJ128GA010__)
_CONFIG2(FNOSC_PRIPLL & POSCMOD_XT) // Primary XT OSC with PLL
_CONFIG1(JTAGEN_OFF & FWDTEN_OFF) // JTAG off, watchdog timer off
#endif
#if defined (__PIC24FJ256GB210__)
_CONFIG1( WDTPS_PS32768 & FWPSA_PR128 & ALTVREF_ALTVREDIS & WINDIS_OFF & FWDTEN_OFF & ICS_PGx2 & GWRP_OFF & GCP_OFF & JTAGEN_OFF)
_CONFIG2( POSCMOD_HS & IOL1WAY_OFF & OSCIOFNC_OFF & OSCIOFNC_OFF & FCKSM_CSDCMD & FNOSC_PRIPLL & PLL96MHZ_ON & PLLDIV_DIV2 & IESO_OFF)
_CONFIG3( WPFP_WPFP255 & SOSCSEL_SOSC & WUTSEL_LEG & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM)
#endif
#if defined (__PIC24FJ256DA210__)
_CONFIG1( WDTPS_PS32768 & FWPSA_PR128 & ALTVREF_ALTVREDIS & WINDIS_OFF & FWDTEN_OFF & ICS_PGx2 & GWRP_OFF & GCP_OFF & JTAGEN_OFF)
_CONFIG2( POSCMOD_HS & IOL1WAY_OFF & OSCIOFNC_OFF & OSCIOFNC_OFF & FCKSM_CSDCMD & FNOSC_PRIPLL & PLL96MHZ_ON & PLLDIV_DIV2 & IESO_OFF)
_CONFIG3( WPFP_WPFP255 & SOSCSEL_SOSC & WUTSEL_LEG & ALTPMP_ALTPMPEN & WPDIS_WPDIS & WPCFG_WPCFGDIS & WPEND_WPENDMEM)
#endif
#endif
/////////////////////////////////////////////////////////////////////////////
// LOCAL PROTOTYPES
/////////////////////////////////////////////////////////////////////////////
void TickInit(void); // starts tick counter
/* */
int main(void)
{
GOL_MSG msg; // GOL message structure to interact with GOL
Nop();
#if defined(PIC24FJ256DA210_DEV_BOARD)
_ANSG8 = 0; /* S1 */
_ANSE9 = 0; /* S2 */
_ANSB5 = 0; /* S3 */
#else
/////////////////////////////////////////////////////////////////////////////
// ADC Explorer 16 Development Board Errata (work around 2)
// RB15 should be output
/////////////////////////////////////////////////////////////////////////////
LATBbits.LATB15 = 0;
TRISBbits.TRISB15 = 0;
#endif
/////////////////////////////////////////////////////////////////////////////
#if defined(__dsPIC33F__) || defined(__PIC24H__)
// Configure Oscillator to operate the device at 40Mhz
// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
// Fosc= 8M*40(2*2)=80Mhz for 8M input clock
PLLFBD = 38; // M=40
CLKDIVbits.PLLPOST = 0; // N1=2
CLKDIVbits.PLLPRE = 0; // N2=2
OSCTUN = 0; // Tune FRC oscillator, if FRC is used
// Disable Watch Dog Timer
RCONbits.SWDTEN = 0;
// Clock switching to incorporate PLL
__builtin_write_OSCCONH(0x03); // Initiate Clock Switch to Primary
// Oscillator with PLL (NOSC=0b011)
__builtin_write_OSCCONL(0x01); // Start clock switching
while(OSCCONbits.COSC != 0b011);
// Wait for Clock switch to occur
// Wait for PLL to lock
while(OSCCONbits.LOCK != 1)
{ };
// Set PMD0 pin functionality to digital
AD1PCFGL = AD1PCFGL | 0x1000;
#elif defined(__PIC32MX__)
INTEnableSystemMultiVectoredInt();
SYSTEMConfigPerformance(GetSystemClock());
#ifdef MULTI_MEDIA_BOARD_DM00123
CPLDInitialize();
CPLDSetGraphicsConfiguration(GRAPHICS_HW_CONFIG);
CPLDSetSPIFlashConfiguration(SPI_FLASH_CHANNEL);
#endif
#endif
GOLInit(); // initialize graphics library &
#if defined (GFX_PICTAIL_V1) || defined (GFX_PICTAIL_V2)
EEPROMInit(); // initialize Exp.16 EEPROM SPI
BeepInit();
#else
SST25Init(); // initialize GFX3 SST25 flash SPI
#endif
TouchInit(); // initialize touch screen
// create default style scheme for GOL
TickInit(); // initialize tick counter (for random number generation)
// create default style scheme for GOL
#if defined(__dsPIC33FJ128GP804__) || defined(__PIC24HJ128GP504__)
// If S3 button on Explorer 16 board is pressed calibrate touch screen
TRISAbits.TRISA9 = 1;
if(PORTAbits.RA9 == 0)
{
TRISAbits.TRISA9 = 0;
TouchCalibration();
TouchStoreCalibration();
}
TRISAbits.TRISA9 = 0;
#elif defined(__PIC24FJ256DA210__)
// If S1 button on the PIC24FJ256DA210 Development board is pressed calibrate touch screen
if(BTN_S1 == 0)
{
TouchCalibration();
TouchStoreCalibration();
}
#else
// If S3 button on Explorer 16 board is pressed calibrate touch screen
if(BTN_S3 == 0)
{
TouchCalibration();
TouchStoreCalibration();
}
#endif
// If it's a new board (EEPROM_VERSION byte is not programed) calibrate touch screen
#if defined (GFX_PICTAIL_V1) || defined (GFX_PICTAIL_V2)
if(GRAPHICS_LIBRARY_VERSION != EEPROMReadWord(ADDRESS_VERSION))
{
TouchCalibration();
TouchStoreCalibration();
}
#else
if(GRAPHICS_LIBRARY_VERSION != SST25ReadWord(ADDRESS_VERSION))
{
TouchCalibration();
TouchStoreCalibration();
}
#endif
// Load touch screen calibration parameters from memory
TouchLoadCalibration();
GDDDemoCreateFirstScreen();
while(1)
{
if(GOLDraw()) // Draw GOL object
{
TouchGetMsg(&msg); // Get message from touch screen
#if (NUM_GDD_SCREENS > 1)
// GDD Readme:
// The following line of code allows a GDD user to touch the touchscreen
// to cycle through different static screens for viewing. This is useful as a
// quick way to view how each screen looks on the physical target hardware.
// This line of code should eventually be commented out for actual development.
// Also note that widget/object names can be found in GDD_Screens.h
if(msg.uiEvent == EVENT_RELEASE) GDDDemoNextScreen();
#endif
GOLMsg(&msg); // Process message
}
}//end while
}
/////////////////////////////////////////////////////////////////////////////
// Function: WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER* pObj, GOL_MSG* pMsg)
// Input: objMsg - translated message for the object,
// pObj - pointer to the object,
// pMsg - pointer to the non-translated, raw GOL message
// Output: if the function returns non-zero the message will be processed by default
// Overview: it's a user defined function. GOLMsg() function calls it each
// time the valid message for the object received
/////////////////////////////////////////////////////////////////////////////
WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER *pObj, GOL_MSG *pMsg)
{
WORD objectID;
objectID = GetObjID(pObj);
GDDDemoGOLMsgCallback(objMsg, pObj, pMsg);
// Add additional code here...
return (1);
}
/////////////////////////////////////////////////////////////////////////////
// Function: WORD GOLDrawCallback()
// Output: if the function returns non-zero the draw control will be passed to GOL
// Overview: it's a user defined function. GOLDraw() function calls it each
// time when GOL objects drawing is completed. User drawing should be done here.
// GOL will not change color, line type and clipping region settings while
// this function returns zero.
/////////////////////////////////////////////////////////////////////////////
WORD GOLDrawCallback(void)
{
GDDDemoGOLDrawCallback();
// Add additional code here...
return (1);
}
/////////////////////////////////////////////////////////////////////////////
// Function: Timer3 ISR
// Input: none
// Output: none
// Overview: increments tick counter. Tick is approx. 1 ms.
/////////////////////////////////////////////////////////////////////////////
#ifdef __PIC32MX__
#define __T3_ISR __ISR(_TIMER_3_VECTOR, ipl4)
#else
#define __T3_ISR __attribute__((interrupt, shadow, auto_psv))
#endif
/* */
void __T3_ISR _T3Interrupt(void)
{
// Clear flag
#ifdef __PIC32MX__
mT3ClearIntFlag();
#else
IFS0bits.T3IF = 0;
#endif
TouchProcessTouch();
}
/////////////////////////////////////////////////////////////////////////////
// Function: void TickInit(void)
// Input: none
// Output: none
// Overview: Initilizes the tick timer.
/////////////////////////////////////////////////////////////////////////////
/*********************************************************************
* Section: Tick Delay
*********************************************************************/
#define SAMPLE_PERIOD 500 // us
#define TICK_PERIOD (GetPeripheralClock() * SAMPLE_PERIOD) / 4000000
/* */
void TickInit(void)
{
// Initialize Timer4
#ifdef __PIC32MX__
OpenTimer3(T3_ON | T3_PS_1_8, TICK_PERIOD);
ConfigIntTimer3(T3_INT_ON | T3_INT_PRIOR_4);
#else
TMR3 = 0;
PR3 = TICK_PERIOD;
IFS0bits.T3IF = 0; //Clear flag
IEC0bits.T3IE = 1; //Enable interrupt
T3CONbits.TON = 1; //Run timer
#endif
}
|