Está en la página 1de 8

Sistemas Digitales II

Práctica N° 1: Programación de interrupciones por hardware

Nombre del equipo:

Integrantes:

Fecha:

1. Introducción

Se aplica la conversión digital-analógica a una señal producto del sonido originado por un grillo,
editado con el programa CoolEdit, usando el DAC (digital-analogic converter) incluido en el
PIC16F1788, haciendo uso de una programación enfocada a la aplicación de interrupciones por hardware
definidas a partir de los registros TIMER, trabajando como temporizadores; para escuchar con una bocina
conectada al PIC el sonido fiel de un grillo.

2. Objetivos.
- Convertir una señal digital en una señal analógica para reproducir el sonido natural de un grillo
- Programar interrupciones por hardware en el microcontrolador PIC16F1788 para familiarizarse más
con su funcionamiento y aplicación
- Utilizar el convertidor digital-analógico (DAC) integrado en el PIC
- Armar un circuito electrónico que permita escuchar el sonido obtenido, por medio de una bocina
conectada al PIC

3. Material
- Una bocina de 8 Ω - Un transistor bipolar 2N222
- 1 resistencia 1 kΩ - Una laptop
- 1 resistencia 2.2 kΩ - Un microcontrolador PIC16F1788
- Osciloscopio - Protoboard
- Un programador Pickit3 - Jumpers (cables para conexión)
4. Introducción

El uso de microcontroladores se ha extendido durante los últimos años, ahora para aplicaciones
donde se necesita cumplir con tareas específicas (sistemas embebidos), no falla el uso de un PIC. Sea
para la automatización en una fábrica, para la presentación de un proyecto que involucra sensores,
acelerómetros, etc., para el funcionamiento de un coche de juguete controlado por motores, o para usos
más grandes y especializados; hay un gran campo de aplicación donde tener un PIC nos ayuda a cumplir
con la tarea asignada. Y entre todos los usos que se le puede dar a un microcontrolador (en nuestro caso
al PIC16F1788) también existe la posibilidad de usarlo como un convertidor digital-analógico. Es común
utilizarlos para esta tarea pues hay situaciones donde queremos tener una señal analógica a partir de una
señal digital muestreada, cuantificada, codificada, etc. A veces resulta más conveniente manera una señal
de voltaje que otra donde hay ceros y unos

Se programó el PIC16F1788 para que funcionara como un DAC (utilizando también los registros
TIMER y los registros que involucran habilitación de periféricos o banderas que señalizan cuando se ha
producido un hecho) y manejando interrupciones por hardware que son activadas después de un cierto
número de pulsos con un periodo definido; se obtuvo el sonido de un grillo con tiempos de silencio
aleatorio (sonido previamente analizado y seleccionado con la herramienta CoolEdit), como señal
analógica, reproduciéndose por una bocina conectada a un transistor bipolar NPN (para su
amplificación).

5. Desarrollo

El trabajo comenzó seleccionando el sonido del grillo que queríamos tener a la salida del PIC
después de pasar por el DAC, para ello usamos el software CoolEdit donde pudimos conocer las
características de muestras que contenía la señal de audio que queríamos reproducir. Después se hizo
toda la programación necesaria para tener un código que cumpliera con la tarea a realizar: selección de
registros, ajustes de TIMERs, etc. Todo el procedimiento seguido en cada etapa de la práctica se muestra
y aclara en su sección.

5.1 CoolEdit

Con este software fue posible conocer las características que más nos importaban de la señal
digital: la frecuencia de muestreo, el número de bits utilizados para la cuantificación y el canal de salida
(mono). En la figura 1 se puede apreciar cómo es la señal que seleccionamos. Podemos apreciar que tiene
varios lóbulos donde se presenta ese sonido característico que emiten los grillos, sin embargo, a nosotros
nos basta con tomar sólo una cantidad de muestras y no todas (esto debido a la capacidad de memoria
del PIC en cuestión).

Se tomaron 704 muestras del sonido original. Con ellas buscamos reconstruir la señal digital,
pero ahora como una señal analógica. Cuando ya se tenían las muestras, lo siguiente fue obtener un
archivo de texto con todos los valores (de 0 a 255) de los niveles de cuantificación. Estos datos van a ser
los que se van a suministrar al DAC para que se haga la conversión digital-analógica.

2
Figura 1. Señal de audio del sonido de un grillo, reproducida en el programa CoolEdit

5.3 Programación del PIC16F1788

Después de hacer el proceso necesario para poder programar nuestro PIC usando MikroC y
MPLAB, pasamos a la programación en sí. Para llevar a cabo esta tarea lo primero fue definir los registros
en los que se iba a trabajar, éstos fueron los que involucraban el uso de los TIMERs, las interrupciones,
las banderas de estado y los puertos I/O. Por un lado se usó el registro TIMER1 para programar el valor
necesario de nuestro periodo y el número que se pondría en la cuenta antes de que se desbordara el
registro y activara su respectiva bandera.

A continuación se muestra el código utilizado para la realización de la práctica:

#define TMR1HDEF 0xFF /*Valor en el que va a iniciar la cuenta del contador*/


#define TMR1LDEF 0xA4
#define PIC

#ifdefine PIC
typedef signed char int8_t;
typedef unsigned short uint16_t;
#endif

void init_pic(void);
void init_tmr1(void);
void init_int(void);
void init_dac(void);

uint16_t i = 0, j = 0, ndatos = 704, nsilencio = 1300,


grillo[704]={81,175,102,113,174,69,166,128,85,190,76,141,160,64,190,97,111,186,56,175,128,80,201,65,149,160,58,201,
88,113,190,50,183,122,81,204,59,154,155,59,203,82,121,183,51,190,111,90,200,54,166,143,65,205,71,134,174,51,198,98,
99,197,49,175,134,69,209,64,141,171,47,202,96,99,199,48,174,138,67,207,68,135,175,49,196,105,94,200,53,165,148,60,2
3
06,80,118,186,49,182,127,75,204,66,138,172,52,191,108,88,201,58,152,161,53,199,97,97,201,52,161,154,53,206,89,101,2
02,45,170,151,50,213,81,105,206,37,176,151,45,220,78,102,214,33,176,156,38,224,80,96,220,31,171,164,33,222,89,84,22
5,35,157,178,31,209,111,70,218,62,127,188,49,172,140,69,185,102,104,173,89,132,148,97,142,129,113,135,125,124,125,1
33,120,122,142,109,132,140,103,145,127,108,152,113,122,147,107,137,134,111,143,121,123,138,116,135,128,122,137,11
8,133,131,117,139,121,125,138,116,133,131,118,138,122,125,137,120,132,131,120,136,126,126,135,122,131,131,122,134,
127,125,133,124,127,131,124,129,129,124,129,128,125,129,128,125,129,126,125,129,126,126,131,126,128,128,125,130,1
27,127,129,126,129,128,127,129,126,129,128,127,129,127,129,128,127,128,127,129,128,127,129,126,130,129,126,130,12
8,127,130,126,130,130,127,131,127,129,131,126,131,129,125,134,127,127,134,123,131,132,123,134,127,125,135,123,128,
133,123,133,128,125,133,124,129,131,124,131,127,128,129,126,129,127,128,129,127,129,127,127,130,124,131,128,123,1
33,124,127,132,122,131,127,124,134,123,129,130,123,133,127,126,132,125,129,131,124,131,128,126,131,124,130,129,12
5,132,126,128,130,124,131,127,126,130,125,128,128,126,130,126,128,129,124,130,126,126,129,126,128,128,126,127,127,
125,128,127,125,128,126,124,129,124,126,128,123,128,126,124,128,125,125,127,125,125,128,124,125,129,123,127,127,1
23,130,123,129,126,123,131,119,132,124,119,140,110,134,132,104,153,108,122,153,86,155,123,95,174,83,139,152,71,181
,97,107,180,60,166,129,76,195,68,138,162,56,193,92,106,188,49,176,124,76,202,58,150,155,55,203,77,120,183,44,192,10
6,89,202,48,169,138,64,207,63,141,164,50,204,84,114,189,43,193,109,85,208,45,171,143,58,216,61,139,176,42,210,88,10
5,202,37,191,121,73,218,46,161,158,48,219,70,126,190,37,206,102,89,215,36,181,140,55,226,55,142,182,34,217,90,97,21
4,34,186,137,59,224,56,142,181,38,211,95,95,210,40,179,144,57,221,68,129,191,38,198,117,78,216,55,151,170,47,206,99,
97,206,50,166,156,55,209,89,105,203,47,172,151,53,214,85,105,207,42,173,155,48,217,85,102,212,38,174,158,41,223,84,
94,221,31,171,166,31,226,89,85,228,32,160,176,28,219,103,74,226,45,144,185,34,198,123,67,213,72,119,189,54,164,147,
70,183,110,100,175,92,125,156,95,138,139,104,139,134,110,136,135,108,137,135,103,146,129,101,157,116,109,161,101,1
25,154,92,143,139,97,152,121,112,128,128};
int8_t edo = 1;

void main()
{
init_pic(); /* Configura puertos y oscilador */
init_tmr1(); /* Configuramos tren de pulsos con un periodo de 91 us */
init_int(); /* Activamos interrupciones por tmr1 */
init_dac(); /* Activamos el DAC y opamp (am) */

while(1);
{
/*Ciclo infinito*/
}
}

void init_pic(void)
{
/* Puertos como entrada, únicamente bit 0 del puerto B y bit 2 del puerto A como salida */

TRISA = 0xFF;
TRISA.B2 = 0; /* Configuramos bit 2 del puerto A como salida */
TRISB = 0xFE;
TRISC = 0xFF;

PORTB.B0 = 0; /* Inicializamos primer bit del puerto B en 0 */

OSCCON.B3 = 1; /* Configuración de reloj a 32 MHz */


OSCCON.B4 = 1;
OSCCON.B5 = 1;
OSCCON.B6 = 1;
}

void init_tmr1(void)
{
TMR1H = TMR1HDEF; /* Cargamos valores para el timer 1 */
TMR1L = TMR1LDEF;

4
T1CON = 0b00110101; /* FOSC/4, Prescaler 8, T1OSCEN deshabilitado, sincronizador desactivador, TMR1ON */
}

void init_int(void)
{
INTCON.B7 = 1; /* GIE Enable */
INTCON.B6 = 1; /* PEIE Enable */
PIE1.B0 = 1; /* TMR1IE Enable */
}

void init_dac(void)
{
DAC1CON0 = 0b10101000; /* DAC1EN, DAC1OE1, FVR Buffer2 output, VSS */
DAC1CON1 = 0x00; /* Inicializamos el DAC en 0 */

OPA1CON = 0b11000100; /* Activamos amplificador operacional */

FVRCON = 0b10001100; /* FVREN, DAV voltage reference 4 V */


}

void interrupt (void)


{
if(PIR1.B0 == 1) /* Verificamos la bandera de interrupción */
{

DAC1CON1 = grillo[i]; /* Sacamos los valores del arreglo */


if(i == ndatos) /* Cuando acabamos de mandar el sonido del grillo pasamos a la parte de silencio */
{

DAC1CON1 = 128; /* Mandamos un valor intermedio para ubicarnos en el cero de la señal*/


if(j == nsilencio) /* Cuando acabamos de mandar la señal de silencio pasamos a la parte de audio */
{

nsilencio = rand()%(2000)+700; /* Damos un valor aleatorio del silencio entre 700 a 2000*/
j = 0; /* Restauramos el valor de j para que vuelva a contar silencios */
i = 0; /* Restauramos el valor de i para que vuelva a mandar el audio */
}

else
{
j++; /* Incrementamos j para que mande el siguiente silencio */
}
}

else
{
i++; /* Incrementamos i para que mande el siguiente valor al arreglo del grillo */
}

TMR1H = TMR1HDEF; /* Cargamos el valor del timer 1 */


TMR1L = TMR1LDEF;
PIR1.B0 = 0; /* Restauramos el valor de la bandera */

}
}

5
6. Resultados

El sonido (señal) de grillo que seleccionamos para que pasara por el DAC del PIC, primero fue
visualizado en un osciloscopio para verificar que se tenía un periodo definido: 93 µs. Esta señal, con un
periodo de aproximadamente 92 µs, que en realidad es sólo un tren de pulsos, se puede ver en la figura
2.

Figura 2. Señal de pulsos con un periodo de 92 us

Ya que se tenía el periodo necesario para reconstruir a la señal, lo siguiente fue añadir los
valores/números de las muestras obtenidas. Para nuestro caso se usaron 704 muestras, todas ellas
introducidas a mano a un arreglo usado en el código mostrado más atrás. Todas las muestras utilizadas
se pueden corroborar en la parte donde mostramos el código: grillo[704]=…

Con la configuración necesaria en todos los puertos, registros y bits de configuración usados en
el PIC, la señal de audio que se obtuvo fue la siguiente:

Figura 3. Señal a la salida de nuestro circuito

Al hacer la comparación de la señal obtenida con la señal original visualizada en el programa CoolEdit
(figura 1), podemos apreciar que son muy similares ambas. Con eso se logró que el sonido fuera lo más
6
real posible ya que también se añadían silencios aleatorios para simular el canto de un grillo, y no hacer
que el sonido sonara robótico.

En la figura siguiente podemos ver el esquemático de nuestro circuito armado:

Figura 4. Esquema del circuito que se armó para la realización de la práctica

El circuito armado que nos dio el sonido que nosotros buscábamos se puede ver en la figura 5. Es
posible ver que está conectada la bocina de 8 omhs, el transistor y un jumper que nos conecta la salida
del amplificador operacional interno del microcontrolador con la entrada inversora del operacional, para
usarlo como acoplador de impedancias. También se encuentran algunas resistencias y el PIC16F1788.
Además del programador Pickit3.

Figura 4. Circuito armado para la práctica

7
7. Conclusión
La programación de los microcontroladores nos otorga la posibilidad de desempeñar tareas
específicas sin necesidad de recurrir a otros dispositivos más complejos para que hagan dicha labor. En
el caso del convertidor digital-analógico, resultó ser una gran herramienta para el propósito que teníamos.
Se pudo conseguir tener un sonido natural de un grillo, solamente usando el PIC16F1788. Claro que esto
fue posible después de crear un código para manejar registros, banderas, interrupciones y demás
características que son necesarias para tener un funcionamiento correcto en nuestro circuito electrónico.
Además, con el uso del programador Pickit 3 y los compiladores como MPLAB y MikroC, el trabajo se
puede llevar a buen término ya que podemos tener la programación en nuestro PIC cada vez que se quiera
probar con un nuevo código, otra alternativa o simplemente para seguir haciendo pruebas en la búsqueda
de nuestro objetivo.
Para lograr el sonido con una amplificación mayor, se usó un transistor que nos brindó la corriente
necesaria para incrementar el sonido reproducido por la bocina, además del uso del amplificador
operacional interno del microcontrolador en una configurador seguidor de voltaje, para usarlo como
acoplador de impedancias. El circuito electrónico fue posible con algunas resistencias y realizando las
conexiones necesarias; los detalles de armado fueron resueltos al verificar en cada ocasión posible el
datasheet del PIC. El microcontrolador cumplió con el funcionamiento esperado para la práctica

8. Bibliografía

Curso en línea programación de microcontroladores PIC en lenguaje C. Dignal


Antonio Tabernero Galán, Curso PIC. Informática Industrial (2012).
Usategui, José, et al., Microcontroladores PIC Diseño práctico de aplicaciones 2a parte PIC16F87X y
PIC18FXXX. México, Mc Graw-Hill. 2da Edición. 2006.

También podría gustarte