Anda di halaman 1dari 16

Sistemas Electrnicos Digitales

Dpto Ing. Electrnica

Prctica 5
Programacin en Ensamblador: Gestin de
procesos, interrupciones externas y libreras para
la EEPROM y LCD
1. Gestin de la memoria EEPROM (teclado+eeprom.asm) .............................................................................. 2
1.1. Librera para la memora EEPROM (EEPROM.asm) ..................................................................................... 2
1.2. Gestin de dos o ms procesos .................................................................................................................... 2
1.2.1. Proceso para la gestin del teclado (proceso0_teclado.asm, teclado.asm y teclado.h) ..................... 4
1.2.2. Proceso para la gestin de una secuencia (proceso1_secuencia.asm y eeprom.asm) ........................ 4
2. Gestin de un LCD de 2x16 (teclado+lcd.asm) .............................................................................................. 6
2.1. Librera para el LCD (LCD.asm, LCD.h) ......................................................................................................... 7
2.2. Aplicacin al teclado y display. .................................................................................................................... 7
3. Interrupciones externas (interrup.asm) ....................................................................................................... 9
3.1. Interrupcin externa INT (pin RB0) ............................................................................................................ 11
3.2. Interrupcin externa por cambio en los pines RB4:RB7 ............................................................................. 13
3.3. Ejecucin del programa con el PIC16F88 ................................................................................................... 14
5. Consideraciones sobre la prctica ...............................................................................................................16

Objetivos:
Gestin de un sistema con varios procesos
Diseo de secuencias utilizando un autmata (proceso)
Manejar las libreras para la memoria eeprom y lcd.
Entender el mecanismo de comunicacin de cualquier interrupcin con la CPU
Utilizar las interrupciones que entran por pines externos.
Concepto de ensamblado condicional. Aplicacin a la programacin de cdigo
vlido para dos microcontroladores diferentes.
Programacin de las operaciones de multiplicacin mediante bucles con
instrucciones de suma.

Profesores de prcticas:
Hinojo, Jos Mara
Janer, Carlos
Milln, Rafael
Snchez, Juan Antonio
Vzquez, Sergio

Rafael Milln

jhinojo@us.es
janer@us.es
rmillan@us.es
juansanchez@us.es
sergi@us.es

Ensamblador: variables, pila, estados y libreras

1. Gestin de la memoria EEPROM (teclado+eeprom.asm)


En este ejercicio se ver como llamar a las rutinas de la librera para gestionar la
memoria eeprom interna. En particular se escribirn determinados datos en la memoria a
travs del teclado. Tambin se introducir la tcnica de diseo que utiliza varios procesos
para la gestin de un sistema.

1.1. Librera para la memora EEPROM (EEPROM.asm)


La librera para el manejo de la memoria EEPROM no necesita fichero de cabecera
ya que no tiene definiciones para su uso en el programa principal. Esta librera solo se
utiliza en el fichero proceso1_secuencia.asm. Por tanto, se incluyen al final de este
fichero solamente.
El PIC dispone de varios registros para manejar la memoria EEPROM. Para el uso
de la librera nos interesan solo dos: EEADR y EEDATA. El primero contiene la direccin
de la memoria en la que se va a leer o escribir un byte. El segundo tiene el dato que se
va a escribir (si la orden es de escritura) o leer el dato que se est en la posicin de
memoria dada por la variable EEADR.
La librera consta solo de tres rutinas:
EEPROM_leeByte.
Lee un byte de la posicin dada por el registro EEADR (regitro del
PIC) y la almacena en el registro EEDATA. Equivaldra a la orden en
lenguaje C:
EEDATA= EEPROM_leeByte(EEADR);
EEPROM_escribeByte.
Escribe el byte almacenado en EEDATA en la posicin de la memoria
dada por EEADR. Adems, incrementa el registro EEADR para que
apunte a la siguiente posicin. Equivaldra a la orden en lenguaje C:
EEPROM_escribeByte(EEADR, EEDATA);
EEPROM_finEscritura.
Esta rutina consiste en un bucle de unos 4 ms en el que espera a
que termine el proceso de escritura.
La memoria EEPROM puede manejarse por interrupcin. De esta forma el micro
puede atender otras tareas durante los 4 ms que dura el proceso de escritura. En este
caso no se ejecutara la rutina EEPROM_finEscritura. Esos 4 ms de espera los
aprovechara la CPU para ejecutar otras instrucciones (unas 4000 instrucciones con un
reloj de 8 Mhz).

1.2. Gestin de dos o ms procesos


El primer paso en el diseo de un programa es comprobar la posibilidad de dividir
el sistema en varios procesos (de menor envergadura). Si eso es factible es mucho mejor
programar varios procesos pequeos a uno muy grande. Cada proceso tendra su propio
diagrama de estados.
El nmero de procesos depende de la posibilidad de gestionar las entradas del sistema de
forma independiente o casi indepediente -en diferentes procesos-. Las salidas no afectan
a esta decicisn. Un proceso puede separarse del autmata general del sistema si la
gestin de sus entradas no dependen de la gestin del resto de entadas del sistema.
Como norma general, cualquier entrada de tipo pulsador o interruptor requiere de
un proceso para su gestin. El motivo es que un pulsador puede pulsarse en cualquier
momento y no depende del estado de otros procesos del sistema. Dicha accin puede
afectar a otros procesos pero no a la inversa. Por tanto, puede considerarse como un
proceso independiente y se puede separar del resto. Este es el caso del teclado. Por

Prctica 5

tanto, el control de un teclado (gestiona las entradas de los 12 pulsadores que contiene)
se realizar con un diagrama de estados especfico que ser el proceso 0. Dicha gestin
se puede consultar en el fichero proceso0_teclado.asm.
Al haber 2 procesos las variables estadoAct y estadoSig deben estar duplicadas.
De forma que se tendrn las siguientes variables de 2 bytes: estadoAct0, estadoSig0,
estadoAct1 y estadoSig1.

Por ahora se sabe que, para un proceso, un estado se ejecuta en cada iteracin
del mdulo principal. Adems, la ejecucin de un estado debera ser breve. En el caso de
que haya 2 o ms procesos lo que hay que hacer es ejecutar un estado de cada proceso
en el mdulo principal de forma consecutiva. Dado que el tiempo de ejecucin de la
rutina de un estado de un determinado proceso depende del cdigo que ha de
ejecutar, resulta que el cambio de un proceso a otro no es fijo.
El mdulo del programa principal donde se ejecuta un estado de cada proceso
sera el siguiente:

Ensamblador: variables, pila, estados y libreras

La variable estadoSig se incia en la rutina iniciaRegistros al comienzo del


programa. Al haber dos procesos, estadoSig es un vector con dos elementos de dos
bytes. Cada elemento debe apuntar a la rutina de reposo de cada proceso.

Para facilitar la legibilidad del programa, cada proceso se ha escrito en un fichero


aparte. En el programa principal se incluyen los dos ficheros de los procesos para que se
ensamblen a continuacin del mdulo principal.

1.2.1. Proceso para la gestin del teclado (proceso0_teclado.asm, teclado.asm y


teclado.h)

El proceso para la gestin del teclado se conoce de la prctica anterior. La nica


diferencia que hay es que se va activar una bandera (bit 0 de la variable banderas) cada
vez que se haya pulsado una tecla nueva. Esta bandera ser clave para comunicarse con
el proceso 1 de la secuencia.
A continuacin se muestra el cdigo de la rutina p0_reposo. Dado que hay dos
procesos, se le ha aadido el prefijo p0_ para indicar que pertenece al proceso 0. Se ha
resaltado la nica lnea que se ha aadido. sta se encuentra en el if que detecta una
nueva tecla pulsada y que prepara el cambio para ir al estado p0_esperaSoltarTecla.

1.2.2. Proceso para la gestin de una secuencia (proceso1_secuencia.asm y


eeprom.asm)

Se pretende grabar datos en la memoria EEPROM interna (solo tiene 64 bytes)


siguiendo una determinada secuencia del teclado. Por ejemplo: *32#020#144. Esta
secuencia escribira el nmero 20 en la posicin 32 y el nmero 144 en la posicin 33. El
carcter * indica que el nmero que viene a continuacin es una direccin (2 dgitos
obligatoriamente). El carcter # indica que el nmero que viene a continuacin es un
dato (3 dgitos obligatoriamente).

Prctica 5

Cualquier secuencia incorrecta har que el sistema se vaya al estado de reposo.


Por ejemplo: *2#, **, #23*, #*,

If (banderas(0)==1)
{
banderas(0)=0;

Banderas(0)=0
Reposo
[RA2:RA0]=001

estadoSig[1]= ---;
}

Teclado_var_tecla=#
Teclado_var_tecla=*

Banderas(0)=0

Teclado_var_tecla=# or
Teclado_var_tecla=*

p1_asterisco
[RA2:RA0]=010
digitos[0]=
TECLADO_var_tecla
;

0<= Teclado_var_tecla <= 9

Banderas(0)=0
p1_almohadilla
[RA2:RA0]=100
digitos[0]=
TECLADO_var_tecla
;

0<= Teclado_var_tecla <= 9


Banderas(0)=0

Banderas(0)=0

p1_direcc

p1_digito1
digitos[1]=
TECLADO_var_tecla
;

0<= Teclado_var_tecla <= 9


If (0 <= TECLADO_var_tecla <=9)
{
Digitos[1]= TECLADO_var_tecla;
EEADR= digitos[0]*10+digitos[1];
}

Banderas(0)=0
p1_digito2

If (0 <= TECLADO_var_tecla <=9)


{
digitos[2]= TECLADO_var_tecla;
EEADAT= digitos[0]*100+digitos[1]*10+digitos[2];
EEPROM_escribeByte(EEADR,EEDAT);
EEPROM_finEscritura();
}

A continuacin se muestra el diagrama de estado que detecta a secuencia. El


sistema se mantiene en un estado mientras la bandera(0) tome el valor 0. Cuando
detecte que vale 1, la pone a 0 y prepara la variable estadoSig para cambiar de
estado.
Los dgitos de decenas hay que multiplicarlos por 10 y los de centenas por 100.
Estas multiplicaciones se realizan con bucles en los que se va sumando 10 y 100,
respectivamente. Se suman tantas veces como valor tenga el dgito. Por ejemplo, si las
decenas valen 6, entonces el bucle sumar el nmero 10 seis veces. No hay ms
remendio que programarlo de esta manera ya que el ensamblador solo tiene
instrucciones de suma pero no de multiplicacin.
El simulador permite ver el contenido de la memoria EEPROM en una ventana.
Toda la informacin que aparece est en formato hexadecimal; tanto direcciones como

Ensamblador: variables, pila, estados y libreras

datos. Por ejemplo, si se escribe con el teclado la secuencia: *16#032#255#015, en la


memoria se veran los siguientes datos en formato hexadecimal:

Para ver esta ventana hay que hacer una pausa en la simulacin y seleccionar la opcin
Debug PIC CPU EEPROM Memory.

2. Gestin de un LCD de 2x16 (teclado+lcd.asm)


Un LCD (Liquid Crystal Display) es un dispositivo de bajo costo que permite
visualizar mensajes de una forma fcil y econmica en sistemas microcontroladores. En
el mercado es fcil encontrar dispositivos de 1, 2, 3 y 4 lneas de 16 hasta 40 caracteres
por lnea. El ms popular de ellos es el LM016L que tiene 2 lneas de 16 caracteres cada
una. En la siguiente figura se muestra una foto y un esquema de este LCD.

Las caractersticas principales de este dispositivo son las siguientes:


1. Bajo consumo (<10mW)
2. Memoria con 40 caracteres por lnea aunque solo sean visibles 16 de ellos.
3. Representa caracteres del alfabeto latino, griego, japons y smbolos
matemticos.
4. Posibilidad de usar cursor (hacerlo visible o no).
5. Gestin del bus de datos con 8 lneas o con 4 lneas.
Descripcin de los pines del LM016L:

D0-D7 : Bus de datos


E (Enable): Si E=1 el LCD est habilitado y si E=0 est deshabilitado por lo
que el resto de patitas podran utilizarse para otras funciones mientras tanto.
R/W : Si R /W =0 la instruccin es de escritura, si es 1 es de lectura. Se
conectar a GND para ahorrar un pin del PIC. Solo se puede escribir.
RS: Si RS=0 el byte enviado es un comando, si es 1 es un carcter para
mostrar
en la pantalla del LCD.
VDD : Tensin de alimentacin (+5V).
VSS : Masa.
VEE : Tensin para regular el brillo de la pantalla.

Prctica 5

2.1. Librera para el LCD (LCD.asm, LCD.h)

El listado de rutina disponible en la librera son las siguiente:


- LCD_ini
- LCD_enviaCaracter(W)
- LCD_irLineaInf
; El cursor lo pone al principio
- LCD_irLineaSup
; El cursor lo pone al principio
- LCD_lineaEnBlanco
; Borra la lnea y sita el curso al principio de ella
- LCD_1_blanco
- LCD_2_blancos
- LCD_3_blancos
- LCD_4_blancos
---------------- LCD_enciende
- LCD_apaga
- LCD_irFilCol(W): Sita el cursor en la lnea dada por Y y la posicin dada por X
Entrada (W): b'y000xxxx'. X= nibble inferior de (W),
Ejemplo 1 w=b'10001111'. X=1111 (posicin 15),
Ejemplo 2 w=b'00000111'. X=0111 (posicin 7),
Ejemplo 3 w=b'00000000'. X=0000 (posicin 0),

Y=nibble superior de (W)


Y=1 (lnea 2, inferior)
Y=0 (lnea 1, superior)
Y=0 (lnea 1, superior)

La rutina de configuracin inicial requiere que se les de un valor inicial a ciertas


constantes para saber tanto la frecuencia del reloj como los pines a los que se debe
conectar el componente al microcontrolador.

La rutina LCD_ini configura el LCD. Se puede destacar de esta rutina lo siguiente:

Configura todos los pines del PIC que se conectan al LCD de salida

Configura el LCD para que trabaje con un bus de 4 bits. De esta


manera permite ahorrar 4 pines al PIC. El precio a pagar es que para
transmitir un byte, el sistema lo hace en dos pasos.

Configura el LCD para que muestre el cursor.

2.2. Aplicacin al teclado y display.


En este ejercicio cada tecla que se pulsa en el teclado va directamente al LCD.
Solo se necesita un proceso para gestionar el teclado. Cada vez que se pulse una tecla
(en el estado de reposo), se identifica, se enva al LCD y se prepara el cambio de estado.
Por su inters, se muestra el cdigo del estado de reposo:

Ensamblador: variables, pila, estados y libreras

En la siguiente figura se muestra el esquema del circuito. Se han compartido los


pines de salida del PIC que van a las filas del teclado y al bus del LCD. Se pueden
manejar los dos dispositivos sin crear efectos colaterales en los mismos. Cada vez que el
PIC escribe algo en esos 4 pines, la informacin llegar tanto al LCD como al teclado pero
no habr colisiones. El LCD solo echa cuenta al bus si el pin de entrada E est a 1
lgico. Cuando esos pines compartidos envan informacin al teclado, el pin E est a 0
lgico (gestionado en la librera) y el LCD no hace caso al valor que tengan dichos pines
en ese momento. De forma similar, cuando se enva un dato al bus del LCD tambin llega
a las filas del teclado. Al no estar realizando un barrido de la matriz en ese momento, el
valor que llega a las filas se ignora.

Prctica 5

3. Interrupciones externas (interrup.asm)


El PIC16F84a tiene 4 fuentes de interrupcin:
INT: interrupcin externa del pin RB0/INT.
RBI: interrupcin externa por cambio en el puerto B (pines RB4:RB7)
T0I: interrupcin del desbordamiento del registro TMR0 (timer)
EEI: interrupcin por escritura completada en la EEPROM
Cada fuente de interrupcin tiene asociada una bandera y una mscara local de
interrupcin. La bandera es un bit de un registro que se pone a 1 cada vez que ocurre el
evento que la origina. La mscara local es otro bit (configurable por el usuario) que
habilita la interrupcin cuando est a 1 y la deshabilita cuando est a 0. Si una
interrupcin est deshabilitada, la CPU no es interrumpida cuando ocurra el evento y se
levante la bandera avisando del mismo. La siguiente figura muestra la circuitera que
genera la seal de interrupcin que llega a la CPU. El sufigo F (Flag) indica que el bit es
una bandera y el sufijo E (Enable) indica que el bit es una mscara local de interrupcin.
Adems hay un bit que es una mscara global para todas las interrupciones GIE (Global
Interrupt Enable).

El registro INTCON es el que almacena todos los bits anteriores excepto el bit EEIF que
ocupa la posicin 4 del registro EECON1.

10

Ensamblador: variables, pila, estados y libreras


Cualquier interrupcin a la CPU genera la siguiente secuencia:
El bit GIE lo pone a 0 el sistema durante la ejecucin de la rutina de
atencin a la interrupcin para evitar el anidamiento de interrupciones
(evita que se desborde la pila). Es decir, se evita que una rutina de
interrupcin sea, a su vez, interrumpida por otra interrupcin.
Termina de ejecutar la instruccin actual y guarda en la pila la direccin
de la siguiente instruccin.
Carga en el registro contador de programa la direccin 0x04. Saltar a
esta direccin y ejecutar lo que encuentre en esa direccin.
La rutina de servicio de la interrupcin debe borrar la bandera que
gener la interrupcin por software (mediante una instruccin).
El sistema retorna de la rutina de interrupcin cuando ejecuta la
instruccin rtfie. Esta instruccin recupera de la pila la direccin de
retorno y la copia en el registro PC. A diferencia de la instruccin
return de una rutina normal, la instruccin rtfie pone el bit GIE a 1
lgico. Dado que la interrupcin ha terminado, se habilitan todas las
interrupciones para que pueda entrar alguna que estuviera pendiente
de atender.

Desgraciadamente el sistema no hace una foto del estado de los registros de la CPU
(W, STATUS, FSR y PCLATH) cuando ocurre la interrupcin. Se van a crear variables para
almacenar el valor de dichos registros (W_TEMP, STATUS_TEMP, FSR_TEMP y
PCLATH_TEMP) de forma temporal mientras dura la interrupcin. Tambin se van a
disear dos macros para guardar el valor de los registros en la variables temporales al
ocurrir la interrupcin (macro PUSH) y para recuperar el valor original de los registros al
terminar la interrupcin (macro PULL).

Prctica 5

11

3.1. Interrupcin externa INT (pin RB0)


La interrupcin externa se genera con un flanco activo en el pin RB0/INT. Este
flanco es configurable con el bit INTDG (OPTION_REG<6>). Si este bit se configura a 1
entonces el flanco activo es de subida y si se configura a 0 entonces es de bajada. Es
obligatorio que el pin RB0 se configure como entrada: TRISB0=1.
Cada vez que ocurra un flanco activo en el pin RB0 se activar la bandera INTF.
Si, adems, las mscaras local (INTE) y global (GIE) estn a 1, habr interrupcin a la
CPU. La rutina de interrupcin bajar la bandera con la instruccin: bcf INTCON,INTF.
Esta interrupcin est pensada para perifricos externos que desee avisar a la
CPU de forma urgente.

Los perifricos tienen salida a colector abierto para no generar cortocircuitos en la lnea
que comparten hacia el pin RB0/INT. Por tanto, pueden fijar un nivel bajo en la lnea
pero no un nivel alto. ste solo ocurre cuando los transistores de salida de todos los
perifricos estn cortados.
A continuacin se muestran con el simulador lo que ocurre cuando el perifrico 1
satura su transistor de salida (Q2) poniendo un 1 en la base. Al saturar el transistor,
fuerza la lnea bus (compartida por los perifricos) a que pase de valor 1 lgico (valor
de reposo gracias a la resistencia R5) al valor 0 lgico. Este cambio es un flanco de
bajada de dispara el mecanismo de la interrupcin a la CPU. En la siguiente figura se
muestra como est el programa justo despus de ocurrir la interrupcin. Se aprecian las
siguiente cosas:
El programa se va a la direccin 0x04
GIE se ha puesto a 0 (estaba a 1 para que pudiera entrar la interrupcin).
La bandera INTF est 1 informando del evento del flanco activo. Es la que
dispara la interrupcin a la CPU.

12

Ensamblador: variables, pila, estados y libreras

Se ha puesto otro punto de parada en el momento que se baja la bandera INTF que
fue el origen de la interrupcin. La mscara global GIE aun sigue a nivel bajo y la
bandera activa.

Se ejecuta un paso
y la instruccin actual borra la bandera INTF ponindola a
0. De esta forma el sistema puede volver a avisar por interrupcin cuando otro
perifrico genere un nuevo flanco de bajada en el pin RB0/INT.

Prctica 5

13

Avanzando hasta el final de la rutina de servicio de atencin a la interrupcin. Nos


encontramos con la siguiente ventana. Se muestra la pila para saber a que direccin se
retorna.

Se ejecuta la ltima instruccin de la interrupcin que, como ya se indic, no solo


recupera la direccin de retorno de la pila (PC=0x0028) sino que restaura la mscara
global de interrupciones para que pueda entrar una nueva interrupcin.

3.2. Interrupcin externa por cambio en los pines RB4:RB7


Los pines RB4:RB7 pueden generar interrupcin cuando cambie cualquiera de
ellos. Tanto el flanco de subida como el de bajada son flancos activos. Para que ocurra la
interrupcin se tienen que dar las siguientes condiciones:
TRISB[7:4]= 1111
RBIE=1
GIE=1
RBIF=1

Pines configurados de entrada


Mscara local de interrupcin a 1
Mscara global de interrupcin a 1
Bandera a 1 algn pin ha cambiado

14

Ensamblador: variables, pila, estados y libreras

3.3. Ejecucin del programa con el PIC16F88


El PIC16F88 es un microcontrolador de la familia de 8 bits que tiene mejores
prestaciones que el PIC16F84a. Ambos tienen el mismo encapsulado y el mismo nmero
de pines por lo que no se aprecia diferencia desde el exterior. Sin embargo, el PIC16F88
contiene los perifricos del PIC16F84a y muchos ms (3 temporizadores, pwm, puertos
serie, memorias de mayor tamao, ) Para gestionar tantos perifricos, el PIC16F88
tiene 4 bancos de registros. Por tanto, necesita los bits RP1 y RP0 del registro de estado
para seleccionar un banco determinado antes de acceder a un registro del mismo.

Prctica 5

15

Existe una macro predefinida que se llama BANKSEL. Se utiliza aadindole el


nombre de un determinado registro. Por ejemplo, BANKSEL TRISA. El ensamblador
sustituir la macro por sendas instrucciones que pongan los bits [RP1,RP0]=01. De esta
forma se selecciona el banco 1 de los registros que es donde est ubicado el registro
TRISA.
El programa diseado para el PIC16F84a es perfectamente vlido para el
PIC16F88 (tanto si se programa en C como si se programa en ensamblador). Solo hay
que tener en cuenta varias cosas que difieren y que se contemplan realizando un
programacin con ensamblado condicional: segn el micro seleccionado, ensambla unas
instrucciones u otras. Estos elementos a tener en cuenta seran:
1. Cabecera. En la siguiente figura se aprecia que se ha seleccionado el PIC16F88 y
que el PIC16F84a est como un comentario. La palabra de control tambin cambia
ya que el PIC16F88 tiene muchas ms cosas que configurar. Por ejemplo, se
puede seleccionar que trabaje con un reloj externo o interno. El PIC16F84a no
tiene reloj interno.

2. Variables globales. Ahora se tienen 4 bancos de registros. Hay ms espacio


para tener ms variables. Segn el micro se seleccionan diferentes zonas para las
variables.

3. Registro ANSEL. En la rutina iniciaRegistros hay que configurar este registro a


cero. Este registro no existe en el PIC16F84a ya que no tiene pines con funcin
analgica. En el caso del PIC16F88 se ha configurado en este ejercicio para que
todos los pines analgicos se configuren como digitales.

El resto del programa es el mismo. Se recomienda al alumno que ejecute los dos ficheros
de Proteus (uno para el PIC16F84a y otro para el PIC16F88) y que compruebe que el
comportamiento es idntico. Hay que tener presente que antes de compilar hay que
comentar la lnea de encabezado del micro que no se desea y descomentar la del micro
con la que se va a trabajar.

16

Ensamblador: variables, pila, estados y libreras

5. Consideraciones sobre la prctica


La asistencia puntuar con 5 puntos.
Para evitar problemas con el ensamblador, es conveniente trabajar en el directorio
c:\sed\p5 cuya ruta no supera los 62 caracteres.
Es conveniente leer y simular los ejercicios de la prctica antes de la clase. El
simulador es un profesor que tiene dos cualidades: est disponible en cualquier momento
y no se equivoca. Para sacar el mximo provecho del mismo hay que acostumbrarse a
ejecutar PASO a PASO. Esa posibilidad es la esencia de los simuladores.
En esta prctica el profesor responder a cualquier duda sobre la simulacin de
los ejercicios propuestos del enunciado. Este enunciado es autocontenido y explicarlo en
clase supondra una prdida de tiempo importante para hacer las modificaciones que se
propondrn.
Todas las modificaciones que se hacen en clase son representativas de las que se
pedirn en la prctica evaluada al final del curso.
Las modificaciones irn creciendo en dificultad. La primera es ms fcil y la ltima
ms difcil. Se evaluar de la siguiente manera:
Modificacin 1: 2 puntos
Modificacin 2: 2 puntos
Modificacin 3: 1 punto

(ms sencilla)
(ms difcil)