Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Topics - empirejrz

#1
มีท่านใดใช้งาน FreeRTOS ใน Cubx mx บ้างครับ ผมอยากทราบว่า เวลาใช้งาน FreeRTOS แล้ว Systick. ต้องเปลี่ยนไปใช้ TIM. ใช่ไหมครับ
#2
File .C
/*
                             *******************
******************************* C SOURCE FILE *******************************
**                           *******************                           **
**                                                                         **
** project   : Led Patern                                         **
** filename  :                                         **
** version   : 1                                                           **
** date      : February 03, 2016                                           **
**                                                                         **
*****************************************************************************
**                                                                         **
** Copyright (c) 2016, Panupong Boonya                                     **
** All rights reserved.                                                    **
**                                                                         **
*****************************************************************************
VERSION HISTORY:
----------------
Version : 1
Date : February 03, 2016 
Revised by : Mr.Panupong Boonya
Description : 
*/
#define _LedControl_C_SRC
/****************************************************************************/
/**                                                                        **/
/**                         MODULES USED                                   **/
/**                                                                        **/
/****************************************************************************/
#include "LedControl.H"
/****************************************************************************/
/**                                                                        **/
/**                         DEFINITIONS AND MACROS                         **/
/**                                                                        **/
/****************************************************************************/
#define EVQ_LN 5
/****************************************************************************/
/**                                                                        **/
/**                         TYPEDEFS AND STRUCTURES                        **/
/**                                                                        **/
/****************************************************************************/
typedef enum
{
NoPreceed,
Switch0,
Switch1,
Switch2,
Switch3
} STATE_MACHINE_A;
/****************************************************************************/
/**                                                                        **/
/**                         PROTOTYPES OF LOCAL FUNCTIONS                  **/
/**                                                                        **/
/****************************************************************************/
static void GlobalVarInit(void);
static void HardwareInit(void);
static int8u ReadKeyPort(void);
static void DisableGlobalInterrupt(void);
static void EnableGlobalInterrupt(void);
static void SoftwareTimerInit(void);
static void EventQueueInit(void);
static void EventStructInit(void);
static void SM0_StartDelay(void);
static void SM0_StopRun(void);
static void SM0_StopDelay(void);
static void SM0_ToggleOP(void);
static void SM0_OnOP(void);
static void SM0_Switch0(void);
static void SM0_Switch1(void);
static void SM0_Switch2(void);
static void SM0_Switch3(void);

static void Timer0ISR(void);
static void Timer1ISR(void);
/****************************************************************************/
/**                                                                        **/
/**                         EXPORTED VARIABLES                             **/
/**                                                                        **/
/****************************************************************************/
volatile EVQ_STRUCT EvQA;
volatile EV_STRUCT EvQArray[EVQ_LN];
/****************************************************************************/
/**                                                                        **/
/**                         GLOBAL VARIABLES                               **/
/**                                                                        **/
/****************************************************************************/
static STATE_MACHINE_A StateMachine1;
static volatile int8u TmrScanKeyRdy;
static volatile EV_STRUCT Timer1EvStruct;
static EV_STRUCT EvStructDest;
static Q_ERR EvQErrCode;
static int16u TimerCount;
/****************************************************************************/
/**                                                                        **/
/**                         EXPORTED FUNCTIONS PROTOTYPE                   **/
/**                                                                        **/
/****************************************************************************/

/****************************************************************************/
/**                                                                        **/
/**                         LOCAL FUNCTIONS                                **/
/**                                                                        **/
/****************************************************************************/
void main(void)
{
GlobalVarInit();
HardwareInit();
EventQueueInit();
EventStructInit();
SoftwareTimerInit();
EnableGlobalInterrupt();

while(1)
{
DisableGlobalInterrupt();
EvQGet(&EvQA, &EvStructDest, &EvQErrCode);
if(EvQErrCode == EVQ_OK)
{
if(EvStructDest.evType == EV_TIMER1)
{
TmrScanKeyRdy--;
InPort = ReadKeyPort();
ScanAndDebounceSW();
EnableGlobalInterrupt();
}
else if(EvStructDest.evType == EV_SW0)
{
EnableGlobalInterrupt();
switch(StateMachine1)
{
case NoPreceed :
SM0_Switch0();
StateMachine1 = Switch0;
break;
case Switch1:
SM0_Switch0();
StateMachine1 = Switch0;
break;
case Switch2:
SM0_Switch0();
StateMachine1 = Switch0;
break;
case Switch3:
SM0_Switch0();
StateMachine1 = Switch0;
break;
default:
break;
}
}
else if(EvStructDest.evType == EV_SW1)
{
EnableGlobalInterrupt();
switch(StateMachine1)
{
case NoPreceed :
SM0_Switch1();
StateMachine1 = Switch1;
break;
case Switch0:
SM0_Switch1();
StateMachine1 = Switch1;
break;
case Switch2:
SM0_Switch1();
StateMachine1 = Switch1;
break;
case Switch3:
SM0_Switch1();
StateMachine1 = Switch1;
break;
default:
break;
}
}

else if(EvStructDest.evType == EV_SW2)
{
EnableGlobalInterrupt();
switch(StateMachine1)
{
case NoPreceed :
SM0_Switch2();
StateMachine1 = Switch2;
break;
case Switch0:
SM0_Switch2();
StateMachine1 = Switch2;
break;
case Switch1:
SM0_Switch2();
StateMachine1 = Switch2;
break;
case Switch3:
SM0_Switch2();
StateMachine1 = Switch2;
break;
default:
break;
}
}

else if(EvStructDest.evType == EV_SW3)
{
EnableGlobalInterrupt();
switch(StateMachine1)
{
case NoPreceed :
SM0_Switch3();
StateMachine1 = Switch3;
break;
case Switch0:
SM0_Switch3();
StateMachine1 = Switch3;
break;
case Switch1:
SM0_Switch3();
StateMachine1 = Switch3;
break;
case Switch2:
SM0_Switch3();
StateMachine1 = Switch3;
break;
default:
break;
}
}

else if(EvStructDest.evType == EV_STMR0)
{
EnableGlobalInterrupt();
switch(StateMachine1)
{
//case DELAY:
// SM0_ToggleOP();
// StateMachine1 = DELAY;
// break;
default:
break;
}
}
else if(EvStructDest.evType == EV_STMR1)
{
EnableGlobalInterrupt();
switch(StateMachine1)
{
// case DELAY:
// SM0_OnOP();
// StateMachine1 = RUN;
// break;
default:
break;
}
}
else
{
EnableGlobalInterrupt();
}
}
else
{
EnableGlobalInterrupt();
}
}
}

static void GlobalVarInit(void)
{
StateMachine1 = NoPreceed;
TmrScanKeyRdy = 0;
}

static void HardwareInit(void)
{
set_tris_b(0xFF); // portJ is input
set_tris_c(0xC0); // portB 4 bits low are input, 4 bits high are output
set_tris_d(0xC0);
set_tris_e(0xF0);

output_c(0x00);
output_d(0x00);
output_e(0x00);

LedSetup();

// Timer0 for software Timer (104.8 ms/1 tick)
set_timer0(6);
setup_timer_0(T0_INTERNAL | T0_DIV_128);
enable_interrupts(INT_TIMER0);

// Timer1 for scan switches (52.4 ms rate)
set_timer1(0);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
enable_interrupts(INT_TIMER1);
}

static void SoftwareTimerInit(void)
{
STmrInit(0, 5, REPEAT, EV_STMR0, NULL, &EvQA);
STmrInit(1, 50, SINGLE, EV_STMR1, NULL, &EvQA);
}

static void EventQueueInit(void)
{
EvQInit(&EvQA, EvQArray, EVQ_LN);
}

static void EventStructInit(void)
{
EvStructInit(&Timer1EvStruct, EV_TIMER1, NULL);
EvStructInit(&Sw0EvStruct, EV_SW0, NULL);
EvStructInit(&Sw1EvStruct, EV_SW1, NULL);
EvStructInit(&Sw2EvStruct, EV_SW2, NULL);
EvStructInit(&Sw3EvStruct, EV_SW3, NULL);
EvStructInit(&Sw4EvStruct, EV_SW4, NULL);
EvStructInit(&Sw5EvStruct, EV_SW5, NULL);
EvStructInit(&Sw6EvStruct, EV_SW6, NULL);
EvStructInit(&Sw7EvStruct, EV_SW7, NULL);
}

static void DisableGlobalInterrupt(void)
{
disable_interrupts(GLOBAL);
}

static void EnableGlobalInterrupt(void)
{
enable_interrupts(GLOBAL);
}

static int8u ReadKeyPort(void)
{
int8u inPort;

inPort = input_b();
return inPort;
}

static void SM0_StartDelay(void)
{
DisableGlobalInterrupt();
STmrStart(0);
STmrStart(1);
EnableGlobalInterrupt();
}

static void SM0_StopRun(void)
{
output_low(PIN_B4);
}

static void SM0_StopDelay(void)
{
DisableGlobalInterrupt();
STmrStop(0);
STmrStop(1);
EnableGlobalInterrupt();
output_low(PIN_B4);
}

static void SM0_ToggleOP(void)
{
output_toggle(PIN_B4);
}

static void SM0_OnOP(void)
{
DisableGlobalInterrupt();
STmrStop(0);
EnableGlobalInterrupt();
output_high(PIN_B4);
}

static void Hight_OP(void)
{
output_high(PIN_B4);
}

static void SM0_Switch0(void)
{
Patern1ON();
}

static void SM0_Switch1(void)
{
Patern2ON();
}

static void SM0_Switch2(void)
{
Patern3ON();
}

static void SM0_Switch3(void)
{

Patern4ON();
}

#INT_TIMER0
static void Timer0ISR(void)
{
if(TimerCount < 25)
{
TimerCount++;
}
else
{
TimerCount = 0;
SoftwareTimer();
}
}

#INT_TIMER1
static void Timer1ISR(void)
{
Q_ERR err;
EvQPut(&EvQA, Timer1EvStruct, &err);
if(err == EVQ_FULL)
{
EvQFullCount++;
}
TmrScanKeyRdy++;
}
/****************************************************************************/
/**                                                                        **/
/**                         EOF                                            **/
/**                                                                        **/
/****************************************************************************/


File .H
/*
                             *******************
******************************* C HEADER FILE *******************************
**                           *******************                           **
**                                                                         **
** project   :                                                             **
** filename  :                                 **
** version   : 1                                                           **
** date      : February 03, 2016                                           **
**                                                                         **
*****************************************************************************
**                                                                         **
** Copyright (c) 2016, Panupong Boonya                                     **
** All rights reserved.                                                    **
**                                                                         **
*****************************************************************************
VERSION HISTORY:
----------------
Version : 1
Date : February 03, 2016
Revised by : Mr.Panupong Boonya
Description :
*/
#ifndef _LedControl_INCLUDED
#define _LedControl_INCLUDED
/****************************************************************************/
/**                                                                        **/
/**                         MODULES USED                                   **/
/**                                                                        **/
/****************************************************************************/
#include "ConfigPIC16F887.H"
#include "SoftwareTimer.H"
#include "DebounceChecker.H"
#include "EvQ.H"
#include "IC74HC595.H"
#include "CCSDataType.H"
/****************************************************************************/
/**                                                                        **/
/**                         DEFINITIONS AND MACROS                         **/
/**                                                                        **/
/****************************************************************************/

/****************************************************************************/
/**                                                                        **/
/**                         TYPEDEFS AND STRUCTURES                        **/
/**                                                                        **/
/****************************************************************************/

/****************************************************************************/
/**                                                                        **/
/**                         EXPORTED VARIABLES                             **/
/**                                                                        **/
/****************************************************************************/
#ifndef _LedControl_C_SRC
extern volatile EVQ_STRUCT EvQA;
extern volatile EV_STRUCT EvQArray[];
#endif
/****************************************************************************/
/**                                                                        **/
/**                         EXPORTED FUNCTIONS PROTOTYPE                   **/
/**                                                                        **/
/****************************************************************************/
#endif
/****************************************************************************/
/**                                                                        **/
/**                         EOF                                            **/
/**                                                                        **/
/****************************************************************************/


โปรแกรมควบคุม Led โดยรับ Input จากการกดปุ่มโดยแต่ละปุ่มจะมี Patern ในการขับ Led ไม่เหมือนกันครับ
ปัญหาก็คือเวลาใน Proteus ตอนที่ Simulate มันช้ามากครับ มีวิธีทำให้เวลาเดินเร็วขึ้นไหมครับ

ผมทดลอง Simulate ใน MPLAB แล้วทำงานปกติ มีผลลัพท์ออกมาแต่อยากจะเห็นภาพว่ามันออกมาจริงๆ โดยผ่าน Proteus ขอรับ