miércoles, 6 de julio de 2016

1920Hz UTILIZANDO PDB CON FRDMK64 y SDK 2.0

Interrupción por pdb

Objetivo: Generar una interrupción vía PDB, de tal manera que la frecuencia de interrupción sea de 1920 Hz.

PDB (programmable Delay Block, siendo PDB un contador a una frecuencia de operación base a la frecuencia del cristal. Para tener modificar el valor de la frecuencia de en le PDB se tiene que emplear el Preescalador y el Divisor.

Como punto de aclaración se requiere que sea a una frecuencia de 1920 Hz, para que sea 32 veces la frecuencia de 60 Hz.

El siguiente diagrama describe como se habilita PDB como interrupción:

En la siguiente figura se muestra el comportamiento de una corrida del programa tomando muestras enpromedio cada segundo, se puede apreciar que la diferencia de las muestras del contador se muy semejante a 1920 muestras por segundo:

Código de programa principal

/*******************************************************************************

* ESTE ES UN PROGRAMA, EJEMPLIFICA UN RETARDO DE INTERRRUPCION POR PDB

******************************************************************************/

#include "fsl_debug_console.h"

#include "board.h"

#include "fsl_pdb.h"

#include "pin_mux.h"

#include "clock_config.h"

/*******************************************************************************

* Definitiones

******************************************************************************/

#define DEMO_PDB_BASE PDB0

#define DEMO_PDB_IRQ_ID PDB0_IRQn

#define DEMO_PDB_IRQ_HANDLER PDB0_IRQHandler

/*******************************************************************************

* Prototypes

******************************************************************************/

/*******************************************************************************

* DECLARACIÓN DE VARIABLES

******************************************************************************/

volatile uint32_t g_PdbDelayInterruptCounter;

volatile bool g_PdbDelayInterruptFlag;

uint32_t Bus_Clk;

uint32_t Modulo_PDB;

/*******************************************************************************

* CODIGO

******************************************************************************/

/*******************************************************************************

* DECLARACIÓN DE INTERRUPCIÓN POR PDB

******************************************************************************/

void DEMO_PDB_IRQ_HANDLER(void)

{

PDB_ClearStatusFlags(DEMO_PDB_BASE, kPDB_DelayEventFlag);

g_PdbDelayInterruptCounter++;

g_PdbDelayInterruptFlag = true;

}

/*******************************************************************************

* CODIGO DE PROGRAMA PRINCIPAL

******************************************************************************/

int main(void)

{

//***********************Inicialización_de_funciones****************************

pdb_config_t pdbConfigStruct;

BOARD_InitPins();

BOARD_BootClockRUN();

BOARD_InitDebugConsole();

EnableIRQ(DEMO_PDB_IRQ_ID);

//******************Desplega_en_pantalla_una_noticicación***********************

PRINTF("\r\nPDB Delay Interrupt Example.\r\n");

//***********************Configuración_de_contador_PDB**************************

PDB_GetDefaultConfig(&pdbConfigStruct);

pdbConfigStruct.prescalerDivider = kPDB_PrescalerDivider128;

pdbConfigStruct.dividerMultiplicationFactor = kPDB_DividerMultiplicationFactor40;

pdbConfigStruct.enableContinuousMode=true;

PDB_Init(DEMO_PDB_BASE, &pdbConfigStruct);               //Configuración por Default.

/* Configure the PDB counter.

* pdbConfigStruct.loadValueMode = kPDB_LoadValueImmediately;

* pdbConfigStruct.prescalerDivider = kPDB_PrescalerDivider1;

* pdbConfigStruct.dividerMultiplicationFactor = kPDB_DividerMultiplicationFactor1;

* pdbConfigStruct.triggerInputSource = kPDB_TriggerSoftware;

* pdbConfigStruct.enableContinuousMode = false;

*/

//*********************Definición_de_reloj_&_Modulo_PDB************************

Bus_Clk = CLOCK_GetFreq(kCLOCK_BusClk);

Modulo_PDB = 1*(1969<<pdbConfigStruct.prescalerDivider)*40;

Modulo_PDB = Bus_Clk/Modulo_PDB; //

//******************Configure_the_delay_interrupt******************************

PDB_SetModulusValue(DEMO_PDB_BASE,Modulo_PDB); // Se ajusta el valor del modulo.

//*******Habilita_valor_retardo_menor_o_mayor_que_el_valor_del_modulo**********

PDB_SetCounterDelayValue(DEMO_PDB_BASE,Modulo_PDB/2); //Se ajusta el valor del contador

PDB_EnableInterrupts(DEMO_PDB_BASE, kPDB_DelayInterruptEnable);// Se habilita la interrupción

PDB_DoLoadValues(DEMO_PDB_BASE); // Se carga el valor

PDB_DoSoftwareTrigger(DEMO_PDB_BASE); // Se establece disparo por

software

PRINTF("\r\nType any key into terminal to trigger the PDB counter ...\r\n");//

//***********Programa_principal_espera_interrupción_De_pdb*********************

while (1)

{

g_PdbDelayInterruptFlag = false; // Limpia bandera

while (!g_PdbDelayInterruptFlag) // Espera hasta que exista un cambio en la bandera

{

}

PRINTF("PDB Delay Interrupt Counter: %d\r\n", g_PdbDelayInterruptCounter); //Muestra el contador de

pdb.

}

}

/*******************************************************************************

* FIN DE CODIGO DE PROGRAMA PRINCIPAL.

******************************************************************************/

GETCHAR();

No hay comentarios:

Publicar un comentario