Programación del módulo de tiempo
Si es así, puede consultar la siguiente rutina: Es un programa de muestra en el CD oficial de la suite adquirido por Wei Xue Electronics. ¡No sé si puedo ayudarte! Si tienes puntos, úsalos, ¡jeje!
/*========================================== === ===================================*/
/*Proyecto : a través del zumbador del controlador del sistema de demostración STM8 Timer 2 PWM*/
/*Módulo: main.c */
/*Compilador: compilador STM8 Universe C*/
/*Fecha: Febrero de 2009*/
/* - */
/*Descripción: Demostración de firmware para STM8 Mini Kit*/
/* Reproduce una canción a través del timbre. */
/*======================================== === ======================================*/
/ *** ************************************************* **** *************************
*
*Este firmware es para referencia únicamente y está destinado a que los Clientes proporcionen
*información codificada sobre sus productos para que puedan ahorrar
* tiempo. En consecuencia, STMicroelectronics no será responsable de ningún
* daño directo, indirecto o consecuente en relación con cualquier reclamo
* el contenido de dicho firmware y/o la responsabilidad del Cliente ante
*Aquí se encuentra la información de codificación relacionada con sus productos.
*
*Copyright 2008 STMicroelectronics
************************ ************************************************** * *******
*/
/*Incluye - */
#Incluye "STM8S105C_S.h" /*Registro y mapa de memoria archivos. */
/****************************************** ************************************/
/*Definición de macro p>
/***************************************** ** ********************************/
/*Descripción musical y codificación de notas. */
#define _END_ 0xFF /*La música termina. */
#define _PAUSE_ 0xFE /*Pausa entre diferentes melodías.
*/
/*Definición de tono de nota...*/
#define _FA0 0x00 /* FA- */
#define _SOL0 0x01 /* SOL - */
#define _LA0 0x02 /* LA- */
#define _SI0 0x03 /* SI- */
#define _DO 0x04 /* DO */
#define _RE 0x05 /* RE */
#define _MI 0x06 /* MI */
#define _FA 0x07 / *FA* /
#define _SOL 0x08 /* SOL */
#define _LA 0x09 /* LA */
#define _SI 0x0A /*SI */
#define _DO2 0x0B /* DO */
#define _M 0x0C /*Mudo*/
#define _RE2 0x0D /* RE */
#define _SOL2 0x0E /* SOL */
#define _FAd 0x0F /* FA# */
/*Definición de longitud de nota.... .*/
#Definición sq 0x10 /*Media corchea. */
#Definición q 0x20 /*Corchea nota. */
#Definición qp 0x30 /* 1,5 corchea. */
#Definición c 0x40 /* Nota extraña. */
#Definición cn 0x60 /* 1.5 nota. */
#Definición m 0x80 /*Nota mínima. */
/*Aquí una nota se define por la combinación de dos partes, tono y duración.
Fácil de recuperar usando el operador binario AND: nota = longitud del tono,
longitud del amplificador de tono suma=0*/
/****************************** ** **********************************************/
/* Variables del segmento RAM*/
/****************************** ***** ********************************************** **/ p>
/*Variable global utilizada para almacenar resultados de ADC. */
Entero sin signo AD _ Valor
/*Variable global utilizada para almacenar la tecla presionada al cambiar de octava. */
Carácter sin signo Flag _ Octave _ Chg
/* Variable global utilizada como índice en la matriz de notas: la posición en la melodía. */
unsigned int current _ note = 0;
/*Variable global utilizada como índice en la matriz de notas.
*/
Carácter sin firmar c1, c 1_buf;
/*Codificación de notas musicales~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ */
/* FA0 SOL0 LA0 SI0 DO RE MI FA SOLLAS DO2 MUTE RE2 SOL2 FA# */
/* TIM2 CCR1 byte alto. */
const unsigned char Low _ Note _ h[]/*low octave*/
={0x2C, 0x27, 0x23, 0x1F, 0x1D, 0x1A, 0x17, 0x16, 0x13, 0x11, 0x0F, 0x0E, 0x00, 0x0D, 0x09, 0x 15};
const unsigned char Hi_Note_h[] /*octava alta*/
={0x16, 0x13, 0x11, 0x0F, 0x0E, 0x0D, 0x0B, 0x0B, 0x09, 0x08, 0x07, 0x07, 0x00, 0x06, 0x04, 0x0A};
/* TIM2 CCR1 byte bajo. */
const unsigned char Low _ Note _ l[]/*low octave*/
={0xA4, 0xDC, 0x82, 0xA1, 0xEE, 0xA9, 0xAC, 0x62, 0xEE, 0xC1, 0xD0, 0xF0, 0x00, 0x4F, 0xF7, 0x2C};
const unsigned char Hi_Note_l[] /*octava alta*/
={0x52, 0xEE, 0xC1 , 0xD0, 0xF7, 0x54, 0xD6, 0x31, 0xF7, 0xE0, 0xE8, 0x78, 0x00, 0xA7, 0xFB, 0x 96 };
/* Secuencia de melodía real: un conjunto de notas. */
const unsigned char tune[] =
{
_M sq, _M sq, /* Se requieren dos silenciamientos de "búfer" para una gestión fluida */
/*Comentario actual/Comparación de inicialización del comentario actual. */
/* - DO2 SI LA SOL FA MI RE DO - */
/* - DO2 SI LA SOL FA MI RE DO - */
_DO c, _RE c, _MI c, _FA c, _SOL c, _LA c, _SI c, _DO2 c, _M m, _PAUSE_,
_DO2 c, _SI c, _LA c, _SOL c, _FA c, _MI c, _RE c, _DO c, _M m, _PAUSE_,
/* - Feliz año nuevo.
_DO c, _DO c, _DO c, _M sq, _DO m, _SOL0 m, _MI c, _M sq, _MI m, _DO m, _DO c,
_MI c, _M cuadrado, _SOL m, _SOL m, _FA c, _MI c, _M cuadrado, _RE m, _M cuadrado, _RE c, _MI c,
_FA m, _M cuadrado, _FA m, _MI c, _RE c, _MI m, _DO m, _M sq, _DO c, _MI c, _RE m, _SOL0 m,
_SI0 c, _RE c, _DO m, _DO m, _PAUSE_,
/* -Dos tigres.
_DO c, _RE c, _MI c, _DO c, _DO c, _RE c, _MI c, _DO c, _MI c, _FA c, _SOL m, _MI c,
_FA c, _SOL m, _SOL qp, _LA sq, _SOL qp, _FA sq, _MI c, _DO c, _SOL qp, _LA sq,
_SOL qp, _FA sq, _MI c, _DO c, _M sq, _DO c, _SOL0 c, _DO m, _M sq, _DO c, _SOL0 c,
_DO m, _M sq, _PAUSE_,
/* - Miel dulce.
_MI m, _SOL c, _LA c, _MI m, _MI c, _DO c, _RE cn, _DO q, _RE c, _MI q, _SOL q, _MI m,
_MI m, _RE c, _RE c, _RE c, _RE q, _MI q, _RE q, _DO cn, _LA0 q, _SOL0 cn, _DO m,
_DO c, _RE c, _MI cn, _RE q, _MI q, _RE q, _SOL q, _RE m, _RE m, _RE m, _RE m,
_MI m, _SOL c, _LA c, _MI m, _MI c, _DO c, _RE cn , _DO q, _RE c, _MI q, _SOL q, _MI m,
_MI m, _RE c, _RE c, _RE c, _RE q, _MI q, _RE q, _DO cn, _LA0 q, _SOL0 cn, _DO m,
_DO c, _MI c, _RE q, _DO q, _DO c, _LA0 q, _SOL0 cn, _DO m, _DO m, _DO m, _DO m, _MI m,
_MI m, _SOL0 m, _LA0 q, _DO q, _SOL0 q, _DO m, _DO m, _DO m, _DO m, _LA0 c,
_SI0 c, _LA0 c, _SI0 c, _LA0 c, _LA0 q, _DO q, _SOL0 q, _SOL0 c, _MI m, _MI m,
_MI m, _MI m, _LA0 c, _SI0 c, _SI0 c, _LA0 c, _LA0 q , _DO q, _LA0 q, _SOL0 q,
_SOL0 c, _MI m, _MI m, _MI m, _M c, _SOL q, _SOL m, _M c, _SOL q, _LA q, _SOL m,
_M c, _SOL q, _SOL q, _SOL c, _SOL q, _SOL c, _ SOL q, _LA q, _SOL m, _SOL m,
_MI m, _SOL c ,_LA c,_MI m,_MI c,_DO c,_RE cn,_DO q,_RE c,_RE q,_SOL q,_MI m,
_MI m,_RE c,_RE c,_RE c, _RE q, _MI q, _RE q, _DO cn, _LA0 q,
_SOL0 cn, _DO m, _DO c, _MI c, _RE q, _DO q, _DO c, _LA0 q, _SOL0 cn, _DO m, _DO m,
_DO m, _DO m, _MI m, _MI m, _SOL0 m, _LA0 q, _SOL0 q, _LA0 q, _DO m, _DO m,
_DO m, _DO m, _PAUSE_,
/* - _END_ marcas hasta el final de la pieza - */
_END_
};
/************************************************ * *****************************/
/*Definición de función*/
/************************************************ **********
*********************/
/* - */
/*Nombre de la rutina: Buzz_Init */
/*Entrada/Salida: Ninguna. */
/*Descripción: Inicializa TIM2 al modo PWM para control del zumbador. */
/* - */
void Buzz_Init (void)
{
PD_DDR = 0x 10;/ *Configurar PD4 como salida (para PWM). */
PD _ Cr 1 | = 0x 10; /* Salida PD4 push-pull. */
Tim 2 _ ccmr 1 | = 0x 70 /*Modo de salida PWM2. */
Tim 2 _ ccer 1 | = 0x 03; /* La polaridad CC es baja, habilita la salida PWM */
Tim 2 _ ARR = 0 /* Registro de control de frecuencia : ARR */
Tim 2 _ CCR 1 = 0; /*Registro de control del ciclo de trabajo: CCR */
Tim 2 _ PSCR = 0x 00; fCK_PSC. */
Tim 2 _ Cr 1 | = 0x 01 /* Habilitar TIM2. */
actual _ nota = 1;
}
/* - */
/*Nombre de la rutina: Buzz_Wait * /
/*Entrada/Salida: Duración de la nota (información MSB de 4 bits)/Ninguna. */
/*Descripción: 1) Pruebe el voltaje AIN y guárdelo en AD_Value. */
/* 2) Encuesta al camarero sobre la duración del ticket (basado en un retraso de 4 ms). */
/*Duración: elige entre corchea (2), negra (4) o blanca (8). */
/* - */
void Buzz_Wait(duración del carácter sin firmar)
{
int I = 0 ; p>
Carácter sin signo UC = 0;
Entero largo sin signo
/* Voltaje AIN muestreado en modo único ADC. */
ADC _ Cr 1 | = 0x 01; /* Primero configure ADON para encender el módulo ADC. */
I = 6; /*Espere a que gt7us se asegure de que se complete el encendido del ADC. */
while(I-);
ADC _ Cr 1 | = 0x 01; /* Configure ADON nuevamente para iniciar la conversión de AD. */
Y (! (ADC _ CSR amp0x 80)); /* Espere a que se complete la conversión de AD (EOP=1).
*/
/*Almacenar el valor de ADC en AD_Value */
AD _ Value =((((unsigned int)ADC _ DRH) lt; lt2) ADC _ DRL) gt ; gt2;
if(AD_Value lt;0x01)
{ AD_Value = 0x 01;}
if(AD_Value gt;0xC0 )
{ AD _ Valor = 0xC0}
if (Flag_Octave_Chg==1)
{
temp =(((( unsigned int)Bajo _ Nota _ h[c 1 _ buf]) lt; lt8) Bajo _ Nota _ l[c 1 _ buf]);
}
Otro
p>{
temp =((((unsigned int)Hola _ Nota _ h[c 1 _ buf]) lt; lt8) Hola _ Nota _ l[c 1 _ buf]) ;
}
Temp =(Temp * AD _ Value) gt; gt9;
/*El nuevo valor del ciclo de trabajo se escribe en CCR */ p>
TIM2_CCR1H=(carácter sin firmar)(((int sin firmar)Temp amp0xff00)>gt8);
Tim 2 _ CCR 1L =(carácter sin firmar)((int sin firmar)Temp amp;0x 00 ff);
/*tiempo de retardo = duración* Y */
while(UC lt;duration)/*El siguiente bucle ejecuta tiempos de "duración". */
{
while(Ilt1200) /*Este bucle "Y" espera aproximadamente 4,3 milisegundos, */
{
i ;
}
I = 0;
uc ;
}
}
/* - */
/*Nombre de la rutina: Buzz_PlayTune */
/*Entrada/salida: Ninguna. */
/*Descripción: Reproducir partitura musical (una canción a la vez). */
/* - */
void Buzz_PlayTune (void)
{
UI sin firmar;
Temp_DCR largo sin firmar;
Temperatura de carácter sin firmar;
while(1)
{
if(tune[current_note] == _END_)
{
/*La música termina y vuelve al principio. 1 no dice nada en */
/* el comienzo de la matriz de notas; */
nota_actual = 1;
Pausa;
}
else if(melodía[nota_actual]= = _ PAUSA _)
{
/*La canción termina, guarda la posición en la canción y deja de reproducir.
*/
actual _ nota;
Pausa;
}
Otro
{
c 1 = tune[current_notes];
/*Carga las notas (o silencio) en el registro correspondiente*/
/*La información de la nota solo se compone de 4 acarreo de bits más bajo. */
c 1 _ buf = c 1 amp 0x0f
if (Flag_Octave_Chg==1)
{
temp _ DCR =((((unsigned int)Bajo _ Nota _ h[c 1 _ buf]) lt; lt8) Bajo _ Nota _ l[c 1 _ buf]);
Tim 2 _ ARRH = Baja _ Nota _ h[c 1 _ buf]
Tim 2 _ ARRL = Baja _ Nota _ l[c 1 _ buf]
}
Otro
{
temp _ DCR =((((unsigned int)Hola _ Nota _ h[c 1 _ buf]) lt; lt8) Hola _ Nota _ l[ c 1 _ buf]);
Tim 2 _ ARRH = Hola _ Nota _ h[c 1 _ buf];
Tim 2 _ ARRL = Hola _ Nota _ l[c 1_buf];
}
DCR temporal = (DCR temporal * valor publicitario) gt gt9;
/*El nuevo valor del ciclo de trabajo se escribe en DCR0. */
temp=((entero sin signo)temp_DCR amp;0xff00)>gt8;
TIM2_CCR1H=(carácter sin signo)temp
temp =((sin signo integer)temp_DCR amp; 0x 00 ff);
TIM2_CCR1L=(unsigned char)temp
/*La duración de espera de la nota. */
/*La información de duración la transportan los 4 bits más altos. */
wait(c 1 amp; 0xf 0);
/* Avanzar por la matriz de notas: tune. */
actual _ nota;
}
}
}
/* - */
/*Nombre de la rutina: GPIO_Init */
/*Entrada/salida: Ninguna. */
/*Descripción: Inicializa el GPIO del LED TLI. */
/* - */
void GPIO_Init(void)
{
/* Configuración LED IO*/ p>
/* LD3: PD3 */
/* LD2: PD1 */
/* LD1: PD0 */
PD _ DDR | = 0x0D/*salida. */
PD _ Cr 1 | = 0x0D; /*Empujar y tirar. */
PD_CR2 = 0x00/*Velocidad de salida hasta 2MHz. */
/* Interrupción externa PD7 */
EXTI _ Cr 1 = 0x 00 /*Sensibilidad de interrupción externa (TLI).
*/
EXTI_CR2 = 0x00
PD _ DDR amp= ~ 0x80/* PD7: Entrada */
PD _ CR2 = 0x80/* Habilite las interrupciones TLI. */
}
/* - */
/*Nombre de la rutina: CLK_Initialization*/
/*Entrada/salida: Ninguno. */
/*Descripción: Fuente del reloj de inicialización*/
/* - */
void CLK_Init(void)
{
/*Configurar preescalador HSI*/
CLK_CKDIVR amp;= ~ 0x 10;/* 01: fHSI= salida fHSI RC/2. */
/*Configurar el preescalador del reloj de la CPU*/
CLK _ CKDIVR = 0x 01;* 001: fCPU=fMASTER/2. */
}
/* - */
/*Nombre de rutina: ADC_Init */
/*Entrada/salida: ninguno. */
/*Descripción: Inicializa el convertidor AD. */
/* - */
void ADC_Init(void)
{
ADC _ CR2 = 0x00
ADC_Cr 1 = 0x 00;
ADC_CSR = 0x03
ADC_TDRL = 0x 20
}
/* - */
/*Nombre de rutina: TIM_Init */
/*Entrada/salida: Ninguna. */
/*Descripción: Inicializa TIM4 como base de tiempo del LED. */
/* - */
tiempo de anulación _ Init(void)
{
/* Configuración del periférico TIM4* /
/*Configuración de la base de tiempos*/
Tim 4 _ PSCR = 0x 04 /*Configurar el preescalador de TIM4. */
TIM4 _ ARR = 0xFF/*Configurar ciclo TIM4. */
/*Contador TIM4 habilitado*/
Tim 4 _ Cr 1 | = 0x 01; */
Tim 4 _ IER | = 0x 01; /* Habilitar interrupción OVR de TIM4. */
}
/* - */
/*Rutina: principal */
/*Entrada principal*/
/* - */
Administrador no válido (no válido)
{
Unsigned int j;
_ASM ("sim");/*Deshabilitar interrupciones. */
flag _ Octave _ Chg = 0;
CLK _Initialization();
GPIO _ Init(); ();
ADC_Init();
_ASM("rim"); /* Habilitar interrupciones. */
Buzz_Init(). /*Inicializa el temporizador periférico. */
mientras ( 1)
{
/*Reproduce la partitura actual.
*/
buzz _ play tune();
buzz _ Wait(0x 80); /*Espera aproximadamente un segundo. */
}
}
/* -Fin del archivo- */