Professional Documents
Culture Documents
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
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.
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
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
0
RA2=0 RA2=0
1
Eeprom_Write(5,PORTB)
PORTD
PORTB PORTB+1
Ejercicio 1-4
Inicio
Configuracion de Puertos
Inicializacin de Variables
0
RA2=0 RA2=0
1
Eeprom_Write(5,PORTB)
PORTD
PORTB PORTB+1
Ejercicio 2
Inicio
Configuracion de Puertos
PORTA 0X00
DIGIT= 1%10u
DIGIT1=MASK(DIGIT)
DIGIT CHAR(i/10u)
DIGIT10=MASK(DIGIT)
DELAY(1000)ms
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
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
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
// 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
SW: */ unsigned int ii; void main(){ int j; ANSEL = 0; ANSELH = 0; C1ON_bit = 0; C2ON_bit = 0; PORTB = 0; PORTC = 0; PORTD = 0;
// loop variable
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
// 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); } }
/*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
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.
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.