You are on page 1of 18

ESCUELA SUPERIOR POLITCNICA DEL

LITORAL

FIEC


Laboratorio de Microcontroladores

Prctica #7

Interrupciones y Temporizadores en Lenguaje C

Alumnos:

Jonathan Arias
Wilson Pereira Espinoza


Paralelo: # 11

Grupo: # 3


Fecha de presentacin:
31-Julio-2012


2012 I TRMINO

1.- Enunciado del Proyecto
Los leds me indicaran las salidas estos estn colocados en el puerto B y en el puerto D,
en el puerto D se leer el numero binario mientras que en el puerto B guardara cada
registro cuando se accione la botonera, se utilizara el pic que hemos venido trabajando el
PIC16F887
Mientras que en la segunda parte de la prctica realizaremos un programa que me
mostrara ya sea en un display de ctodo comn o anodo comn la cuanta de los nmeros
de dos dgitos desde 00 hasta 99 para lo cual se utilizara el PIC16F887, se simula en
Proteus como se ha venido haciendo.

2.- Diagrama de bloques
EJERCICIO 1: USO DE LA MEMORIA EEPROM INTERNA








Ejercicio 2: contador de dos dgitos








PIC 16F887
ENTRADAS
BOTONERAS
S
SALIDAS PUERTO
B Y D (LEDS)
PIC 16F887
ENTRADAS
SALIDAS
DISPLAY
3.- Diagramas de flujo
Ejercicio 1.1
























Configuracin de Puertos
PORTB PORTB ++
PORTB 0x0
PORTA.F2
= 1?
No
Si
EEPROM(5) PORTB
PORTD EEPROM(5)
Delay 100 msg.
Start
EJERCICIO 1.2

























Configuracin de Puertos
PORTB PORTB ++
PORTB 0x0
PORTA.F2
= 1?
No
Si
EEPROM(EEA) PORTB
PORTD EEPROM(EEA)
Delay 20 msg.
Start
Creo la variable EEA
EEA EEA ++
EEA 0xFF
EJERCICIO 2.1

























Configuracin de Puertos
Digit i % 10 u
PORTA 0x00
PORTB 0x00
TIMER0 0X00
i <= 99
No
Si
Digit mask(digit)
Start
Delay 1000 msg
Digit10 mask(digit)
5.- Descripcin del algoritmo o estrategia utilizada
EJERCICIO 1.1
1. Comenzamos configurando las entradas como analgicos digitales
2. Despus procedemos a configurar los pines del PORTB y PORTD como
salidas de nuestro sistema, as como los pines del PORTA como entradas
en nuestro circuito
3. Incrementamos de forma automticas PORTB + 1
4. Esperamos hasta que el usuario ingrese un uno en nuestros sistema
(PORTA)
5. Configuramos PORTB como escritura y PORTD como lectura
6. Esperamos a que el usuario presione un cero para salir de nuestro lazo y
de esta manera terminar nuestro programa
EJERCICIO 1.2
1. Comenzamos configurando las entradas como analgicos digitales
2. Inmediatamente procedemos a inicializar una variable partculas que le
podremos de nombre EEA
3. Despus procedemos a configurar los pines del PORTB y PORTD como
salidas de nuestro sistema, as como los pines del PORTA como entradas
en nuestro circuito
4. Incrementamos automaticamente PORTB ++ y la variable EEA EEA +1
5. Esperamos hasta que el usuario ingrese un uno en nuestros sistema
(PORTA)
6. Configuramos PORTB como escritura y PORTD como lectura
7. Esperamos a que el usuario presione un cero para salir de nuestro lazo y
de esta manera terminar nuestro programa
EJERCICIO 2:
Principal
1. Comenzamos creando una nueva librera dentro de nuestro proyecto la cual
llamaremos a nuestro proyecto mask.c
2. Se activa el TMR0 y se le asigna al TMR0 el valor de 0.
3. Se define las variables digit_no, digit10, digit1, digit, i.
4. Se configura el PORTA y PORTD como salida.
5. Inmediatamente asignamos a i el valor de 1.
6. Se incrementa en uno i hasta que sea mayor a 99, si es mayor a 99 salta al
paso 11.
7. Se le asigna a digit el residuo dividido para 10 y al valor digit1 se le asigna
el cdigo de transformacin para representarlo en el display.
8. Se le asigna a digit el valor de la divisin para 10 y al valor digit10 se le
asigna el cdigo de transformacin para representarlo en el display.
9. Se produce un retardo de 1 seg. Salta al paso 7.
Interrupcion
1. Si digit_no = 0, apague el PORTA, muestre en PORTD el valor de digit1,
encienda el PORTA, asigne a digit_no el valor de 1.
2. Sino, apague el PORTA, muestre en PORTD el valor de digit10, asigne a
PORTA el valor de 2, asigne a digit_no el valor de 0.
3. Resetee el contador TMR0 y encere la bandera de interrupcin del TMR0.



6.- Listado del programa fuente en lenguaje ensamblador con comentarios en las
lneas de cdigo que considere fundamentales.
EJERCICIO 1.1
* Description:
(Explicacin del ejercicio)
* Test configuration:
MCU: PIC16F887
Oscillator: HS, 08.0000 MHz
SW: mikroC PRO for PIC

* NOTES:
Cada vez que el TMR0 se desborda ocurre una interrupcin
void main() {
ANSEL = 0; // All I/O pins are configured as digital
ANSELH = 0;
PORTB = 0; // Port B initial value
TRISB = 0; // All port B pins are configured as outputs
PORTD = 0; // Port B initial value
TRISD = 0; // All port D pins are configured as outputs
TRISA = 0xFF; // All port A pins are configured as inputs
do {
PORTB=PORTB++; // Increment port B by 1
Delay_ms(100); // 100mS delay
if (PORTA.F2){
EEPROM_Write(5,PORTB); // If MEMO is pressed, save PORTB
PORTD = EEPROM_Read(5); // Read written data
do;
while (PORTA.F2); // Remain in this loop as long as the button is
// pressed } }
while(1); }//

Ejercicio 1.2
void main() {
int EEA=0;
ANSEL = 0; // All I/O pins are configured as digital
ANSELH = 0;
PORTB = 0; // Port B initial value
PORTC = 0;
TRISB = 0; // All port B pins are configured as outputs
TRISC= 0;
PORTD = 0; // Port B initial value
TRISD = 0; // All port D pins are configured as outputs
TRISA = 0xFF; // All port A pins are configured as inputs
do {
//PORTB=PORTB++; // Increment port B by 1
//Delay_ms(100); // 100mS delay
if (PORTA.F2){
EEPROM_Write(EEA,PORTB); // If MEMO is pressed, save PORTB
Delay_ms(20);
PORTD = EEPROM_Read(EEA); // Read written data
PORTB=PORTB++;
Delay_ms(100);
while (PORTA.F2); // Remain in this loop as long as the button is
while (-PORTA.F2);
EEA++; } }
while (EEA<=0xFF);
PORTC.F0=1;
while(1); }
Ejercicio 2.1
/*Header******************************************************/
#include "mask.c"
unsigned short mask(unsigned short num);
unsigned short digit_no, digit10, digit1, digit, i;
void interrupt() {
if (digit_no==0) {
PORTA = 0; // Turn off both displays
PORTD = digit1; // Set mask for displaying ones on PORTD
PORTA = 1; // Turn on display for ones (LSD)
digit_no = 1;
} else {
PORTA = 0; // Turn off both displays
PORTD = digit10; // Set mask for displaying tens on PORTD
PORTA = 2; // Turn on display for tens (MSD)
digit_no = 0;
}
TMR0 = 0; // Reset counter TMRO
INTCON = 0x20; }
void main() {
OPTION_REG = 0x80; // Set timer TMR0
TMR0 = 0;
INTCON = 0xA0; // Disable interrupt PEIE,INTE,RBIE,T0IE
PORTA = 0; // Turn off both displays
TRISA = 0; // All port A pins are configured as outputs
PORTD = 0; // Turn off all display segments
TRISD = 0; // All port D pins are configured as outputs
do {
for (i = 0; i<=99; i++) { // Count from 0 to 99
digit = i % 10u;
digit1 = mask(digit); // Prepare mask for displaying ones
digit = (char)(i / 10u) % 10u;
digit10 = mask(digit); // Prepare mask for displaying tens
Delay_ms(1000); }
} while (1); // Endless loop
}
mask.c file:
unsigned short mask(unsigned shortnum) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;}}

7.- Copia impresa del circuito armado en PROTEUS para la simulacin en el
momento de su ejecucin.
Ejercicio 1.1











Ejercicio 1.2











Ejercicio 2.1












Ejercicio 2.2











8.- Conclusiones
Mediante la presente practica podemos concluir que hemos mejorado
considerablemente el manejo de la memoria Eprom de nuestro pic la misma que
nos permite almacenar datos que deben mantenerse cuando la alimentacin se
desconecte, para lo cual Existe un comando que nos permite leer los datos
almacenados en la memoria nicamente indicando la direccin que queremos
extraer
Mediante las operaciones de divisin y residuo podemos dividir un nmero binario
en su valor equivalente de decenas y unidades, de esta manera, podremos
obtener los 2 dgitos para mostrar en el display de nuestro programa y mediante
una lnea que hace la funcin de seleccin mostrar alternadamente el valor de las
decenas o unidades y hasta centenas y asi lo necesitamos
Se pueden crear funciones propias y personalizadas mediante la declaracin de
un archivo .c y luego mediante la directiva include invocar a ese fichero. Esto nos
permite crear nuestras propias libreras y luego invocarlas en otros programas.
Para el compilador todo lo que est escrito en el archivo .c es como si estuviera
escrito donde est la sentencia include al principio de nuestro programa
9.- Recomendaciones
Se recomienda utilizar la tcnica de multiplexacin para ahorrar recursos. Ya que
al momento de la implementacin va a ser mucho ms fcil debido a que
reduciremos significativamente la lneas de conexin, tal como se experiment en
la prctica, mediante el mismo puerto se puede mostrar el valor de un nmero de
dos dgitos utilizando adicionalmente una lnea de seleccin
Se recomienda no olvidar incluir la directiva include en la parte 2 de la prctica
puesto que esta nos permite invocar al archivo mask y las funciones declaradas en
l. Sin esta directiva el programa no compilara debido a que nos aparecer un
error ya que no sabr de que comando utilizar al momento de invocar el archivo
mask.c en el digito de nuestro archivo
Se recomienda utilizar la memoria EEPROM interna del PIC cuando se deseen
guardar datos an cuando se desconecte la alimentacin. Adicionalmente no
olvidar que la memoria EEPROM tiene un tamao de 256 Bytes. Esto quiere decir
que puede manejar un mximo de ocho cifras significativas en nuestro programa




Anexo de la prctica #7
Parte 1
RESPONDER:
1) Analice cada una de las instrucciones del programa coloque luego en
la cabecera la descripcin correspondiente.
Comenzamos configurando las entradas como analgicos digitales
Despus procedemos a configurar los pines del PORTB y PORTD como salidas
de nuestro sistema, as como los pines del PORTA como entradas en nuestro
circuito
Incrementamos de forma automticas PORTB + 1
Esperamos hasta que el usuario ingrese un uno en nuestros sistema (PORTA)
Configuramos PORTB como escritura y PORTD como lectura
Esperamos a que el usuario presione un cero para salir de nuestro lazo y de esta
manera terminar nuestro programa
2) Cada vez que graba la memoria EEPROM en que valor se carga en la
memoria EEPROM
La memoria EEPROM siempre va a grabar el valor en que se encuentra PORTB
por ejemplo el valor de inicio siempre va a ser cero y se va a ir incrementando a
razn de uno
3) Modifique el ejercicio para que cada vez que apriete el botn se
incremente en uno el nmero grabado en la direccin 5 de la memoria
EEPROM, empezando desde cero. Es decir al apretar el pulsador por
primera vez se guarda 0 de EEPROM posicin 5, al presionarse de
nuevo se guarda 1 y as sucesivamente. Muestre su cdigo
* Test configuration:
MCU: PIC16F887
Oscillator: HS, 08.0000 MHz
SW: mikroC PRO for PIC

* NOTES:
Cada vez que el TMR0 se desborda ocurre una interrupcin
*/
/*Header******************************************************/

void main() {
ANSEL = 0; // All I/O pins are configured as digital
ANSELH = 0;

PORTB = 0; // Port B initial value
TRISB = 0; // All port B pins are configured as outputs
PORTD = 0; // Port B initial value
TRISD = 0; // All port D pins are configured as outputs
TRISA = 0xFF; // All port A pins are configured as inputs
PORTD = EEPROM_Read(5); // Read EEPROM memory at address 5

do {

Delay_ms(100); // 100mS delay
if (PORTA.F2){
EEPROM_Write(5,PORTB); // If MEMO is pressed, save PORTB
PORTD = EEPROM_Read(5)+1; // Read written data
do;
while (PORTA.F2); // Remain in this loop as long as the button is
// pressed
}
PORTB=PORTB++; // Increment port B by 1
}
while(1); // Endless loop

4) Modifique el programa para que grabe todas las localidades de la
memoria EEPROM con el nmero correspondiente a su direccin al
presionar el pulsador. Es decir la posicin cero con el valor cero, la
uno con el valor uno y as sucesivamente hasta el fin de la memoria.
Muestre su cdigo
void main() {
int EEA=0;
ANSEL = 0; // All I/O pins are configured as digital
ANSELH = 0;

PORTB = 0; // Port B initial value
PORTC = 0;
TRISB = 0; // All port B pins are configured as outputs
TRISC= 0;
PORTD = 0; // Port B initial value
TRISD = 0; // All port D pins are configured as outputs
TRISA = 0xFF; // All port A pins are configured as inputs
do {
//PORTB=PORTB++; // Increment port B by 1
//Delay_ms(100); // 100mS delay
if (PORTA.F2){
EEPROM_Write(EEA,PORTB); // If MEMO is pressed, save PORTB
Delay_ms(20);
PORTD = EEPROM_Read(EEA); // Read written data
PORTB=PORTB++;
Delay_ms(100);
while (PORTA.F2); // Remain in this loop as long as the button is
while (-PORTA.F2);
EEA++; } }
while (EEA<=0xFF);
PORTC.F0=1;
while(1); // Endless loop




Parte 2
RESPONDER:
1) Analice cada una de las instrucciones del programa coloque luego en la
cabecera la descripcin correspondiente.
Comenzamos creando una nueva librera dentro de nuestro proyecto la cual
llamaremos a nuestro proyecto mask.c
Se activa el TMR0 y se le asigna al TMR0 el valor de 0.
Se define las variables digit_no, digit10, digit1, digit, i.
Se configura el PORTA y PORTD como salida.
Inmediatamente asignamos a i el valor de 1.
Se incrementa en uno i hasta que sea mayor a 99, si es mayor a 99 salta al paso
11.
Se le asigna a digit el residuo dividido para 10 y al valor digit1 se le asigna el
cdigo de transformacin para representarlo en el display.
Se le asigna a digit el valor de la divisin para 10 y al valor digit10 se le asigna el
cdigo de transformacin para representarlo en el display.
Se produce un retardo de 1 seg. Salta al paso 7.

You might also like