Código del
programa en la sección Processor Expert
/**
###################################################################
** Filename : ProcessorExpert.c
** Project : ProcessorExpert
** Processor : MKL25Z128VLK4
** Version : Driver 01.01
** Compiler : GNU C Compiler
** Date/Time : 2013-04-03, 18:11, # CodeGen: 0
** Abstract :
** Main module.
** This module contains user's
application code.
** Settings :
** Contents :
** No public methods
**
**
###################################################################*/
/* MODULE
ProcessorExpert */
/* Including needed
modules to compile this module/procedure */
#include "Cpu.h"
#include "Events.h"
#include "TU1.h"
#include "TI1.h"
#include "TU2.h"
#include "AS1.h"
#include "ASerialLdd1.h"
#include "LED_ROJO.h"
#include "BitIoLdd1.h"
/* Including
shared modules, which are used for whole project */
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "IO_Map.h"
#include "notas.h"
#include "Alfabeto_Morse.h"
void f_inicio(void);
extern AS1_TComData Letra_ing;
extern int Enter_ing;
byte Entrada[]="\n\r Introduce una letra y presiona
Enter \n\r";
byte *ap_men;
Letra_Morse *ap_letra_sele,*ap_reset;
/* User includes
(#include below this line is not maintained by Processor Expert) */
/*lint -save -e970 Disable MISRA rule (6.3) checking. */
int main(void)
{
/*lint -restore
Enable MISRA rule (6.3) checking. */
/* Write
your local variable definition here */
/***
Processor Expert internal initialization. DON'T REMOVE THIS CODE!!!
***/
PE_low_level_init();
/*** End
of Processor Expert internal initialization. ***/
/* Write your
code here */
f_inicio();
for(;;)
{
// ------------------ Para
saber qué letra se seleccionó ------------------
if(Enter_ing==1)
{
switch (Letra_ing)
{
case 'A': case 'a':
ap_letra_sele=ltr_A;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'B': case 'b':
ap_letra_sele=ltr_B;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'C': case 'c':
ap_letra_sele=ltr_C;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'D': case 'd':
ap_letra_sele=ltr_D;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'E': case 'e':
ap_letra_sele=ltr_E;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'F': case 'f':
ap_letra_sele=ltr_F;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'G': case 'g':
ap_letra_sele=ltr_G;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'H': case 'h':
ap_letra_sele=ltr_H;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'I': case 'i':
ap_letra_sele=ltr_I;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'J': case 'j':
ap_letra_sele=ltr_J;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'K': case 'k':
ap_letra_sele=ltr_K;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'L': case 'l':
ap_letra_sele=ltr_L;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'M': case 'm':
ap_letra_sele=ltr_M;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'N': case 'n':
ap_letra_sele=ltr_N;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'O': case 'o':
ap_letra_sele=ltr_O;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'P': case 'p':
ap_letra_sele=ltr_P;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'Q': case 'q':
ap_letra_sele=ltr_Q;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'R': case 'r':
ap_letra_sele=ltr_R;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'S': case 's':
ap_letra_sele=ltr_S;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'T': case 't':
ap_letra_sele=ltr_T;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'U': case 'u':
ap_letra_sele=ltr_U;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'V': case 'v':
ap_letra_sele=ltr_V;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'W': case 'w':
ap_letra_sele=ltr_W;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'X': case 'x':
ap_letra_sele=ltr_X;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'Y': case 'y':
ap_letra_sele=ltr_Y;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case 'Z': case 'z':
ap_letra_sele=ltr_Z;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
case ';': case '*':
ap_letra_sele=EXTRA;
toca_nota(ap_letra_sele);
Enter_ing=0; break;
default:
ap_men=Entrada;
AS1_SendChar(*ap_men);
Enter_ing=0;
} //<- Cierra Switch
} //<- Cierra
If
} //<- Cierra For
/*** Don't write any code pass this line, or it will be deleted during
code generation. ***/
/*** RTOS
startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T
MODIFY THIS CODE!!! ***/
#ifdef PEX_RTOS_START
PEX_RTOS_START();
/*
Startup of the selected RTOS. Macro is defined by the RTOS component. */
#endif
/*** End
of RTOS startup code. ***/
/***
Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
for(;;){}
/***
Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!!
***/
/* END
ProcessorExpert */
/*
**
###################################################################
**
** This file was created by Processor
Expert 10.0 [05.03]
** for the Freescale Kinetis
series of microcontrollers.
**
** ###################################################################
*/
void f_inicio(void)
{
gen_per_notasTicks();
//
Genera los periodos en TICKS de las
notas.
ap_men=Entrada; // Apuntador
de mensaje posicionado en mensaje de
entrada.
AS1_SendChar(*ap_men); // Manda a
la pantalla el mensaje de entrada
ap_letra_sele=Inicio;
//
Apunta a los sonidos de inicio del programa.
toca_nota(ap_letra_sele); // Toca la primera nota
ap_reset=Sil; // Apuntador de Reset en
Silencio
}
|
Código del
programa en la sección Events.c.
/**
###################################################################
** Filename : Events.c
** Project : ProcessorExpert
** Processor : MKL25Z128VLK4
** Component : Events
** Version : Driver 01.00
** Compiler : GNU C Compiler
** Date/Time : 2013-04-03, 18:11, # CodeGen: 0
** Abstract :
** This is user's event module.
** Put your event handler code here.
** Settings :
** Contents :
** Cpu_OnNMIINT - void
Cpu_OnNMIINT(void);
**
**
###################################################################*/
/* MODULE Events
*/
#include "Cpu.h"
#include "Events.h"
#include "notas.h"
#define RANGO 41
#define TIEMPO 5
extern uint32_t escalas[RANGO];
extern Letra_Morse *ap_letra_sele, *ap_reset;
byte tempo;
AS1_TComData Letra_ing;
int Enter_ing; //De inicio
era: AS1_TComData
extern byte*ap_men;
/* User includes
(#include below this line is not maintained by Processor Expert) */
/*
**
===================================================================
** Event :
Cpu_OnNMIINT (module Events)
**
** Component : Cpu
[MKL25Z128LK4]
** Description :
** This event is called when the Non maskable
interrupt had
** occurred. This event is
automatically enabled when the <NMI
** interrrupt> property is
set to 'Enabled'.
** Parameters : None
** Returns : Nothing
**
===================================================================
*/
void Cpu_OnNMIINT(void)
{
/* Write
your code here ... */
}
/*
**
===================================================================
** Event :
TI1_OnInterrupt (module Events)
**
** Component :
TI1 [TimerInt_LDD]
** Description :
** Called if periodic event occur.
Component and OnInterrupt
** event must be enabled. See
<SetEventMask> and <GetEventMask>
** methods. This event is available
only if a <Interrupt
** service/event> is enabled.
** Parameters :
** NAME - DESCRIPTION
** * UserDataPtr - Pointer to the user or
** RTOS specific
data. The pointer passed as
** the parameter of Init
method.
** Returns : Nothing
**
===================================================================
*/
void TI1_OnInterrupt(LDD_TUserData *UserDataPtr)
{
/* Write
your code here ... */
tempo--;
if(ap_letra_sele->nota!=SILENCIO)
LED_ROJO_ClrVal();
else LED_ROJO_SetVal();
if(tempo==0)
{
ap_letra_sele++;
if(ap_letra_sele->nota==0&&ap_letra_sele->tempo==0)
ap_letra_sele=ap_reset;
toca_nota(ap_letra_sele);
}
}
/*
**
===================================================================
** Event
: AS1_OnError (module Events)
**
** Component :
AS1 [AsynchroSerial]
** Description :
** This event is called when a channel
error (not the error
** returned by a given method) occurs.
The errors can be read
** using <GetError> method.
** The event is available only when the
<Interrupt
** service/event> property is
enabled.
** Parameters : None
** Returns : Nothing
**
===================================================================
*/
void AS1_OnError(void)
{
/* Write
your code here ... */
}
/*
**
===================================================================
** Event :
AS1_OnRxChar (module Events)
**
** Component :
AS1 [AsynchroSerial]
** Description :
** This event is called after a correct
character is received.
** The event is available only when the
<Interrupt
** service/event> property is
enabled and either the <Receiver>
** property is enabled or the <SCI
output mode> property (if
** supported) is set to Single-wire
mode.
** Parameters : None
** Returns : Nothing
**
===================================================================
*/
void AS1_OnRxChar(void)
{
AS1_TComData ch; //
TComData type is defined in the AS1.h header file
if(AS1_RecvChar(&ch) == ERR_OK) //Rutina que
lee el caracter ingresado y lo muestra, si
no se detecta un error
AS1_SendChar(ch);
if(ch=='\r')
Enter_ing=1;
else
{
Letra_ing=ch;
Enter_ing=0;
}
}
/*
**
===================================================================
** Event :
AS1_OnTxChar (module Events)
**
** Component :
AS1 [AsynchroSerial]
** Description :
** This event is called after a
character is transmitted.
** Parameters : None
** Returns : Nothing
**
===================================================================
*/
void AS1_OnTxChar(void)
{
/* Write
your code here ... */
++ ap_men;
if(*ap_men)
AS1_SendChar(*ap_men);
}
/* END Events */
|
Código del
programa en la sección Alfabeto_Morse.h.
/*
* Alfabeto_Morse.h
*
*
Created on: Apr 10, 2013
*
Author: JUAN
*/
#ifndef ALFABETO_MORSE_H_
#define ALFABETO_MORSE_H_
#include "notas.h"
Letra_Morse Inicio[]={ {DO5,NEGRA},
{RE5,NEGRA},
{MI5,NEGRA},
{FA5,NEGRA},
{SOL5,NEGRA},
{LA5,NEGRA},
{SI5,NEGRA},
{DO6,BLANCA},
{0,0}};
Letra_Morse Sil[]={{SILENCIO,SFUSA},{0,0}};
Letra_Morse ltr_A[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_B[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_C[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_D[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_E[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_F[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_G[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_H[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_I[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_J[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_K[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_L[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_M[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_N[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_O[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_P[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_Q[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_R[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_S[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_T[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_U[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_V[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_W[]={ {LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_X[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_Y[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse ltr_Z[]={ {LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,RAYA},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{LA3,PUNTO},
{SILENCIO,PUNTO},
{0,0}};
Letra_Morse EXTRA[]={ {DO3,1.5*NEGRA},
{FA3,SCORCHEA},
{FA3,NEGRA},
{MI3,NEGRA},
{FA3,CORCHEA},
{SOL3,CORCHEA},
{SOL3,NEGRA},
{FA3,NEGRA},
{SOL3,CORCHEA},
{LA3,CORCHEA},
{LA3,NEGRA},
{SI3,CORCHEA},
{LA3,CORCHEA},
{LA3,SCORCHEA},
{RE3,1.5*CORCHEA},
{RE3,FUSA},
{SOL3,1.5*SCORCHEA},
{SOL3,SCORCHEA},
{SOL3,1.5*CORCHEA},
{FA3,1.5*NEGRA},
{FA3,CORCHEA},
{FA3,NEGRA},
{FA3,NEGRA},
{RE3,NEGRA},
{MI3,CORCHEA},
{FA3,CORCHEA},
{FA3,NEGRA},
{FA3,CORCHEA},
{FA3,CORCHEA},
{0,0}};
#endif /*
ALFABETO_MORSE_ */
|
Código del programa
en la sección notas.c.
/*
* notas.c
*
*
Created on: Sep 11, 2013
*
Author: JUAN
*/
#include "notas.h"
#include "TU1.h"
#include "TI1.h"
#include "TU2.h"
extern byte tempo;
uint32_t escalas[RANGO];
/*
Con la nota más baja (DO3) se programó
el timer, como comparador(F=261hZ,T=3.83ms)
cuando la cuenta se desborda se pone
en cero la salida, cuando el comparador
iguala
la cuenta del contador del timer, se
pone en uno la salida del pin PTA12
Nota: Para que sea una señal cuadrada
el comparador tiene que tener la mitad
de
la cuenta máxima del contador.
Las demás cuentas se generan como
fracciones Q15 del periodo, arreglo factores[]
y se calcularon en Excell con
la siguiente fórmula factores[i]= 2^15/
1.059465^RANGO-i
Siendo en este caso RANGO=40;
*/
void gen_per_notasTicks(void)
{
unsigned char i;
uint32_t Ticks;
uint32_t
factores[]={3444,3649,3866,4096,4340,4598,4871,5161,5468,5793,6137,6502,6889,7298,7732,8192,8679,9195,9742,10321,10935,11585,12274,13004,13777,14596,15464,16384,17358,18390,19484,20643,21870,23171,24548,26008,27555,29193,30929,32768,1};
TU1_GetPeriodTicks(TU1_DeviceData,&Ticks);
//lee periodo
base
for(i=0;i<RANGO;i++)
{
escalas[i]=(factores[i]*Ticks)>>15;
}
}
void toca_nota(Letra_Morse *ap_letra_sele)
{
TU1_SetPeriodTicks(TU1_DeviceData,escalas[ap_letra_sele->nota]);
TU1_SetOffsetTicks(TU1_DeviceData,0,(escalas[ap_letra_sele->nota])/2);
tempo=ap_letra_sele->tempo*TEMPO;
}
Código del
programa en la sección notas.h.
/*
* notas.h
*
*
Created on: Apr 3, 2013
*
Author: JUAN
*/
#ifndef NOTAS_H_
#define NOTAS_H_
#include "PE_Types.h"
#define RANGO 41 //Numero de notas
#define TEMPO 1
#define FREC_BASE 261.626 //Frecuencia equivalente a la
nota mas baja deseada (DO3)
#define NUM_GEN 1.059465
typedef enum
{
REs6,
RE6,
DOs6,
DO6,
SI5,
LAs5,
LA5,
SOLs5,
SOL5,
FAs5,
FA5,
MI5,
REs5,
RE5,
DOs5,
DO5,
SI4,
LAs4,
LA4,
SOLs4,
SOL4,
FAs4,
FA4,
MI4,
REs4,
RE4,
DOs4,
DO4,
SI3,
LAs3,
LA3,
SOLs3,
SOL3,
FAs3,
FA3,
MI3,
REs3,
RE3,
DOs3,
DO3,
SILENCIO
} notas; //Son 41 (RANGO) notas
typedef struct { byte nota; byte tempo;} Letra_Morse;
typedef enum
{
SFUSA =1,
FUSA =2,
SCORCHEA =4,
CORCHEA
=8,
NEGRA =16,
BLANCA =32,
REDONDA =64,
PUNTO =8,
RAYA =3*PUNTO
}dura; // tiempos
en duracion de multiplos de 25ms
void gen_per_notasTicks(void);
void toca_nota(Letra_Morse *ap_letra_sele);
#endif /* NOTAS_H_ */
|
No hay comentarios:
Publicar un comentario