You are on page 1of 24

ESCUELA SUPERIOR POLITECNICA DEL LITORAL

FACULTAD INGENIERIA ELECTRICA

DE Y

COMPUTACION

TEMA:
EEPROM Y CONTADORES DE DOS DIGITOS

NOMBRE: Marlon Quinto y Byron Narvaez PARALELO: 1 MATERIA: Laboratorio de Microcontroladores PROFESOR: Carlos Enrique Valdivieso Armendariz

PRACTICA 7

1. Enunciado del Proyecto


OBJETIVOS: Familiarizarse con el manejo de la memoria EEPROM interna y contadores de dos dgitos en Lenguaje C
La prctica consta de dos partes:

Cada vez que presiona el botn MEMO, se graba el ltimo valor que se encuentra en PORTB, en la memoria EEPROM y se muestra lo grabado en el PORTD. Cada vez que se vuelve a simular, se carga la memoria con el ltimo valor que estuvo guardado. En portb cada 100 mSeg, se incrementa en 1.

Contador de 0 99. Utiliza interrupciones por desbordamiento del TMR0.

Muestra en un display doble de 7 segmentos de ctodo comn. Se utiliza multiplexacin para mostrar los dgitos.

2.
/ Entrada

Diagrama de Bloques

CPU

DISPLAY

3. Diagrama de flujo funcional del programa principal


Ejercicio1

Inicio

Configuracion de Puertos

Inicializacin de Variables

PORTD

PORTBPORTB+1

Delay(100)ms

0
RA2=0 RA2=0

1
Eeprom_Write(5,PORTB)

PORTD

RA2=0 RA2=0

Ejercicio 1-3

Inicio

Configuracion de Puertos

Inicializacin de Variables

PORTB 0x00 Delay (100)ms

0
RA2=0 RA2=0

1
Eeprom_Write(5,PORTB)

PORTD

PORTB PORTB+1

Ejercicio 1-4
Inicio

Configuracion de Puertos

Inicializacin de Variables

PORTB 0x00 Delay (100)ms

0
RA2=0 RA2=0

1
Eeprom_Write(5,PORTB)

PORTD

PORTB PORTB+1

Ejercicio 2

Inicio

Configuracion de Puertos

PORTA 0X00

PORTD 0x00 i=0; i<=99; i++

DIGIT= 1%10u

DIGIT1=MASK(DIGIT)

DIGIT CHAR(i/10u)

DIGIT10=MASK(DIGIT)

DELAY(1000)ms

4. Diagrama de flujo de Subrutinas.


Ejercicio2
Interrupcin

DIGIT_NO DIGIT_NO =0 =0

1
PORTA0x00 PORTA0x00

PORTD<--DIGIT10

PORTD<--DIGIT1

PORTAd2

PORTAd1

DIGIT_NO d0

DIGIT_NO d1

TMRO 0

INTCON 0x20

Return

5. Descripcin del Algoritmo.


Ejercicio1 Main Configuracin de puertos: B y D como salidas, A como entrada. PORTD va a tomar el valor de la EEPROM y lo muestra. Entra a un lazo, el cual primero incrementa el valor de PORTB en 1 Ocurre un retraso de 20 milisegundos. Luego escribe en la EEPROM el valor de PORTB. Este valor en la EEPROM pasa al PORTD, y se muestra. EL lazo termina cuando se deja de presionar PORTA,2 Vuelve a entrar al lazo, pero no se cambia el valor de la EEPROM. Ejercicio1-3 Main Configuracin de puertos: B y D como salidas, A como entrada. Se crea un lazo y se genera un retardo de 100m sedundos. Si RA2 es 1 entonces se guarda el valor de PortB en la direccin 5 de la Eeprom, y se muestra en el PuertoD. Se incrementa PortB en 1 y se repite el lazo.

Ejercicio1-4 Main Configuracin de puertos: B y D como salidas, A como entrada. Se crea un lazo y se genera un retardo de 100m sedundos. Si RA2 es 1 entonces se guarda el valor de PortB en la direccin correspondiente de la Eeprom, es decir se guarda en la direccin del valor del PuertoB, y se muestra en el PuertoD. Se incrementa PortB en 1 y se repite el lazo.

Ejercicio 2 Main Configuramos el Registro Option, para el TMRO. Configuramos el registro INTCON, para deshabilitar las interrupciones por PORTB.

Enceramos los puertos A y D, y los configuramos como salida. Luego entra a un lazo, el cual va a dar el valor de las decenas y centenas de la varible i y va a hacer un retraso de 1000ms. El valor de i, se va a incrementar si se produce una interrupcin o desborde del TMRO, el cual al entrar a esta subrutina, va a elegir como configura los valores de la habilitacin del 14 segmentos. Luego se encera el valor del TMRO, y se configura de nuevo el registro INTCON, para encerar la bandera. El lazo del programa principal cuenta de 0 hasta 99, y se muestra en el PORTD, con el retraso antes mencionado.

6. Cdigo Fuente.
USO DE LA MEMORIA EEPROM INTERNA
/* * Nombre del Proyecto: P7a_eeprom.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: se guardar y se leer en la memoria EEPROM del PIC primero se guardar a partir de la posicion 0x80 con los valores de 0 a 32. luego se guardar el valor de 0xAA en la posicion 0x02 despues se guardar el valor de 0x55 en la posicion 0x50 despues se leer las posicionoes de memoria antes escritas mostrando en el PORTD los valores escritos. direccion de memoria 0x80 0 0x81 1 0x82 2 . . . . . . 0xA0 31 0x02 0x50 0xAA 0x55 valor

* Test configuration: MCU: PIC16F887 Oscillator: HS, 08.0000 MHz SW: mikroC PRO for PIC */

/*Header******************************************************/ char ii; void main(){ ANSEL = 0; ANSELH = 0; C1ON_bit = 0; C2ON_bit = 0; PORTB = 0; PORTC = 0; PORTD = 0; TRISB = 0; TRISC = 0; TRISD = 0; for(ii = 0; ii < 32; ii++) EEPROM_Write(0x80+ii, ii); EEPROM_Write(0x02,0xAA); EEPROM_Write(0x50,0x55); Delay_ms(1000); PORTB = 0xFF; PORTC = 0xFF; Delay_ms(1000); PORTB = 0x00; PORTC = 0x00; Delay_ms(1000); PORTB = EEPROM_Read(0x02); PORTB PORTC = EEPROM_Read(0x50); on PORTC Delay_ms(1000); for(ii = 0; ii < 32; ii++) { PORTD = EEPROM_Read(0x80+ii); Delay_ms(250); } } // Read 32 bytes block from address 0x80 // and display data on PORTD // Fill data buffer // Write data to address 0x80+ii // Write some data at address 2 // Write some data at address 0150 // Blink PORTB and PORTC LEDs // to indicate reading start // loop variable // Configure AN pins as digital I/O // Disable comparators

// Read data from address 2 and display it on // Read data from address 0x50 and display it

7. Simulaciones

RESPONDER: 1) Analice cada una de las instrucciones del programa coloque luego en la cabecera la descripcin correspondiente. Se guardar y se leer en la memoria EEPROM del PIC primero se guardar a partir de la posicion 0x80 con los valores de 0 a 32. luego se guardar el valor de 0xAA en la posicion 0x02 despues se guardar el valor de 0x55 en la posicion 0x50 despues se leer las posicionoes de memoria antes escritas mostrando en el PORTD los valores escritos. 2) Qu direcciones de la memoria EEPROM son grabados y con qu valores.

3) Modifique el ejercicio para que se graben todas las posiciones de memoria EEPROM en incrementos de a dos. Empezando con cero en la direccin cero, dos en la direccin uno, cuatro en la direccin dos y as sucesivamente.
* Nombre del Proyecto: P7a_eeprom.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: se guardar y se leer en la memoria EEPROM del PIC primero se guardar a partir de la posicion 0x80 con los valores de 0 a 32. luego se guardar el valor de 0xAA en la posicion 0x02 despues se guardar el valor de 0x55 en la posicion 0x50 despues se leer las posicionoes de memoria antes escritas mostrando en el PORTD los valores escritos. direccion de memoria 0x80 0 0x81 1 0x82 2 . . . . . . 0xA0 31 0x02 0x50 0xAA 0x55 valor

* Test configuration: MCU: PIC16F887 Oscillator: HS, 08.0000 MHz SW: mikroC PRO for PIC */ unsigned int ii; void main(){ int j; ANSEL = 0; ANSELH = 0; C1ON_bit = 0; C2ON_bit = 0; // loop variable

// Configure AN pins as digital I/O // Disable comparators

PORTB = 0; PORTC = 0; PORTD = 0; TRISB = 0; TRISC = 0; TRISD = 0; j=0; for(ii = 0x00; ii < 0xFF; ii++) { EEPROM_Write(ii, ii*2); j++; } EEPROM_Write(0x02,0xAA); EEPROM_Write(0x50,0x55); Delay_ms(1000); PORTB = 0xFF; PORTC = 0xFF; Delay_ms(1000); PORTB = 0x00; PORTC = 0x00; Delay_ms(1000);

// Fill data buffer // Write data to address 0x80+ii // Write some data at address 2 // Write some data at address 0150 // Blink PORTB and PORTC LEDs // to indicate reading start

PORTB = EEPROM_Read(0x02); display it on PORTB PORTC = EEPROM_Read(0x50); display it on PORTC Delay_ms(1000);

// Read data from address 2 and // Read data from address 0x50 and

for(ii = 0; ii < 32; ii++) { // Read 32 bytes block from address 0x80 PORTD = EEPROM_Read(0x80+ii); // and display data on PORTD Delay_ms(250); } }

4) Modifique el programa para que grabe las localidades A0 hasta AF de la memoria EEPROM con el nmero correspondiente a su direccin.
/* * Nombre del Proyecto: P7a_eeprom.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: se guardar y se leer en la memoria EEPROM del PIC primero se guardar a partir de la posicion 0x80 con los valores de 0 a 32. luego se guardar el valor de 0xAA en la posicion 0x02 despues se guardar el valor de 0x55 en la posicion 0x50 despues se leer las posicionoes de memoria antes escritas mostrando en el PORTD los valores escritos. direccion de memoria 0x80 0 0x81 1 0x82 2 . . . . . . 0xA0 31 0x02 0x50 0xAA 0x55 valor

* Test configuration: MCU: PIC16F887 Oscillator: HS, 08.0000 MHz

SW: */ unsigned int ii; void main(){ int j; ANSEL = 0; ANSELH = 0; C1ON_bit = 0; C2ON_bit = 0; PORTB = 0; PORTC = 0; PORTD = 0;

mikroC PRO for PIC

// loop variable

// Configure AN pins as digital I/O // Disable comparators

TRISB = 0; TRISC = 0; TRISD = 0; j=0; for(ii = 0xA0; ii < 0xAF; ii++) // Fill data buffer { EEPROM_Write(ii, ii); // Write data to address 0x80+ii j++; } EEPROM_Write(0x02,0xAA); // Write some data at address 2 EEPROM_Write(0x50,0x55); // Write some data at address 0150 Delay_ms(1000); PORTB = 0xFF; PORTC = 0xFF; Delay_ms(1000); PORTB = 0x00; PORTC = 0x00; Delay_ms(1000); // Blink PORTB and PORTC LEDs // to indicate reading start

PORTB = EEPROM_Read(0x02); display it on PORTB PORTC = EEPROM_Read(0x50); display it on PORTC Delay_ms(1000);

// Read data from address 2 and // Read data from address 0x50 and

for(ii = 0; ii < 32; ii++) { // Read 32 bytes block from address 0x80 PORTD = EEPROM_Read(0x80+ii); // and display data on PORTD Delay_ms(250); } }

CONTADOR BCD DE DOS DIGITOS


/* * Nombre del Proyecto: P7b_2d_cnt.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: (Explicacin del ejercicio) * Test configuration: MCU: PIC16F887 Oscillator: HS, 08.0000 MHz SW: mikroC PRO for PIC * NOTES: Para que el ejemplo trabaje correctamente se deber incluir el archivo mask.c en el programa principal, de la siguiente manera: #include mask,c */

CONEXIN PARA IMPLEMENTACIN PRCTICA

CONEXIN PARA SIMULACIN

/*Header******************************************************/ unsigned short mask(unsigned short num); unsigned short digit_no, digit10, digit1, digit, i; void interrupt() { if (digit_no==0) { PORTA = 0; PORTC = digit1; PORTA = 1; digit_no = 1; } else { PORTA = 0; PORTC = digit10; PORTA = 2; digit_no = 0; } TMR0 = 0; INTCON = 0x20; } void main() { OPTION_REG = 0x80; TMR0 = 0; INTCON = 0xA0; PORTA = 0; TRISA = 0; PORTC = 0; TRISC = 0; do {

// Turn off both displays // Set mask for displaying ones on PORTD // Turn on display for ones (LSD) // Turn off both displays // Set mask for displaying tens on PORTD // Turn on display for tens (MSD) // Reset counter TMRO // Bit T0IF=0, T0IE=1

// Set timer TMR0 // // // // // Disable interrupt PEIE,INTE,RBIE,T0IE Turn off both displays All port A pins are configured as outputs Turn off all display segments All port D pins are configured as outputs Count from 0 to 99 Prepare mask for displaying ones 10u; Prepare mask for displaying tens Endless loop

for (i = 0; i<=99; i++) { // digit = i % 10u; digit1 = mask(digit); // digit = (char)(i / 10u) % digit10 = mask(digit); // Delay_ms(1000); } } while (1); // }

mask.c file: /*Header******************************************************/ unsigned short mask(unsigned short num) { 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; } }

RESPONDER:

1) Analice cada una de las instrucciones del programa coloque luego en la cabecera la descripcin correspondiente.
Se realizar un contador de segundos, en el menu principal habra una variables del 0 al 99, cada segundo se convertira esa variable de binario a BCD para que en la interrupcion sea mostrado directamente esos valores en BCD en cada display conectados en el PORTC y multiplexado por los bits 0 y 1 del PORTA

2) Realice el mismo ejercicio para DISPLAYS de ANODO COMUN


/* * Nombre del Proyecto: P7b_2d_cnt.c * Nombre del Autor: (c) Mikroelektronika, 2009. * Description: Se realizar un contador de segundos, en el menu principal habra una variables del 0 al 99, cada segundo se convertira esa variable de binario a BCD para que en la interrupcion sea mostrado directamente esos valores en BCD en cada display conectados en el PORTC y multiplexado por los bits 0 y 1 del PORTA

* Test configuration: MCU: PIC16F887

Oscillator: HS, 08.0000 MHz SW: mikroC PRO for PIC * NOTES: Para que el ejemplo trabaje correctamente se deber incluir el archivo mask.c en el programa principal, de la siguiente manera: #include "mask,c" */

/*Header******************************************************/ 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 PORTC = ~digit1; // Set mask for displaying ones on PORTD PORTA = 2; // Turn on display for ones (LSD) digit_no = 1; } else { PORTA = 0; // Turn off both displays PORTC = ~digit10; // Set mask for displaying tens on PORTD PORTA = 1; // Turn on display for tens (MSD) digit_no = 0; } TMR0 = 0; // Reset counter TMRO INTCON = 0x20; // Bit T0IF=0, T0IE=1 } 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 PORTC = 0; // Turn off all display segments TRISC = 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); asm clrwdt } } while (1); // Endless loop } /*Header******************************************************/ unsigned short mask(unsigned short num) { 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; } }

8. Conclusiones.
En esta prctica hemos utilizado la memoria Eeprom para mostrar el dato guardado en el Puerto B , la cual se van mostrando los datos, los datos arrojados por el PuertoB y los datos que estan guardados en la direccin 5 de la memoria Eeprom que se muestra por el PuertoD , la cual podemos usar la memoria Eeprom para ir almacenando datos en las diferentes direcciones, e irlos leyendo para mostrarlos despes de un cierto tiempo o despes de realizar alguna accin.

La progracin en MikroC es basicamente parecido a la programacion en otros programas, ya que tiene las mismas instrucciones como el for utilizado en el ejercicio 2, los do y do while, que usamos para generar lazos infinitos para que ocurra una interrupcin, ahora la programacin es ms fcil

ya que no nos preocupamos mucho por los cambios de banco que se debia hacer cuando programabamos en Mplab. Se aprendi el uso de las funciones predefinidas en lenguaje C, una de las ms importantes porque nos ayud a generar retardos es la funcin Delay_ms(x), donde x es la cantidad en milisegundos que se quiere generar, con esto fue ms fcil implementar un retardo.

9.

Recomendaciones Se recomienda que el estudiante estudie un poco ms las

funciones que trae el lenguaje C para Pics ya que esto ayudara a que se desarrollen ms rpido las posteriores prcticas. Revisar la hoja de especificaciones y el help del programa, esto ser beneficioso al momento de presentarse alguna duda.

You might also like