Está en la página 1de 7

ELECTRÓNICA DIGITAL

Grados en Ingeniería Electrónica Industrial y Automática


Examen PARCIAL. Curso 2018-2019
5 diciembre de 2018

APELLIDOS Y NOMBRE_____________________________________________________________

CUESTIÓN 1 (1 Punto)

Un compilador de lenguaje C para el PIC 18f2525 , asigna dos registros con direcciones
consecutivas (16 bits), para las variables de tipo int, el registro de menor dirección para la parte baja
del valor y el siguiente para almacenar la parte alta.

Obtener el código en ensamblador que se genera al compilar la instrucción:

DATO = DATO + DATO1;

La variable DATO ha sido declarada de tipo int y las posiciones asignadas son la 0x600 y siguiente.

La variable DATO1 ha sido declarada de tipo int y las posiciones asignadas son la 0x602 y siguiente.

MOVLB 0x06 ; BANCO 6

MOVF 0x02 ,0,1 ; W <= (0x602)

ADDWF 0x00 ,1,1 ; (0x600) <= (W) + (0x600)

MOVF 0x03 ,0,1 ; W <= (0x603)

ADDWFC 0x01 ,1,1 ; (0x601) <= (W) + (0x601) + C

http://dte.uc3m.es

ELECTRÓNICA DIGITAL. Control II 1


Problema 1 (3 puntos)

Un microprocesador PIC 18F2525 está ejecutando el siguiente código:

#INCLUDE <P18F2525.INC>
CONFIG OSC=HS
CONFIG WDT = OFF

#define CONT 0x00


#define NUM 0x0A

ORG 0x00
BRA INICIO

ORG 0X100
INICIO: LFSR FSR0, 0X200
LFSR FSR1, 0X300
MOVLW NUM
MOVWF CONT
BUCLE: DECFSZ CONT
BRA SEGUIR
BRA FIN
SEGUIR: MOVF INDF0,0,0
RRCF WREG
BTFSC STATUS,C
BRA SALTO
MOVF INDF0,0,0
MOVWF INDF1
INCF FSR1L
SALTO: INCF FSR0L
BRA BUCLE
FIN:
END

Los valores que hay en las posiciones de memoria antes de ejecutar el programa son :

POSICIÓN VALOR POSICIÓN VALOR


0x200 0x10 0x206 0x16
0x201 0x11 0x207 0x17
0x202 0x12 0x208 0x18
0x203 0x13 0x209 0x19
0x204 0x14 0x20A 0x1A
0x205 0x15 0x20B 0x1B
ELECTRÓNICA DIGITAL
Grados en Ingeniería Electrónica Industrial y Automática
Examen PARCIAL. Curso 2018-2019
5 diciembre de 2018

APELLIDOS Y NOMBRE_____________________________________________________________

Se pide:
a) Valor de los registros utilizados al llegar a la posición bucle. (0,5 Puntos)

FSR0 - 0x200
FSR1 - 0x300
WREG – 0x0A
CONT (0X00) – 0x0A

b) Valor de los siguientes registros al llegar por primera vez a la instrucción: BRA BUCLE
(0,6 Puntos)
WREG CONT FSR0 FSR1 0x200 0x300
0x10 0x09 0x201 0x301 0X10 0X10

c) Número de veces que se ejecuta el bucle. (Justificar la respuesta) (0,5 Puntos)

0x0A = 10 => el bucle se ejecuta 10-1 = 9 Veces

d) Indique el valor final de las siguientes posiciones después de ejecutarse el programa.

POSICIÓN VALOR VALOR POSICIÓN VALOR VALOR


INICIAL FINAL INICIAL FINAL
0x300 0xFF 0x10 0x306 0xFF 0xFF
0x301 0xFF 0x12 0x307 0xFF 0xFF
0x302 0xFF 0x14 0x308 0xFF 0xFF
0x303 0xFF 0x16 0x309 0xFF 0xFF
0x304 0xFF 0x18 0x30A 0xFF 0xFF
0x305 0xFF 0xFF 0x30B 0xFF 0xFF

(1,4 Puntos)

http://dte.uc3m.es

ELECTRÓNICA DIGITAL. Control II 3


Problema 2 (6 Puntos)

Se desea realizar un control de velocidad para vehículos utilizando un PIC 18f25252.

Para ello se coloca en una rueda, un sensor, que genera un flanco de subida cada vez que la rueda da
una vuelta.

El sistema de control medirá continuamente el tiempo entre dos pulsos consecutivos.

(La rueda tiene una longitud de 1,25 metros).

El sistema de control tiene que cumplir las siguientes especificaciones:

El TIMER0 genera una interrupción cada milisegundo, La rutina de atención incrementa una
variable global denominada CONTADOR (tipo unsigned char), esta variable se utiliza para
medir el tiempo que tarda la rueda en dar una vuelta. Si el contador llega a su valor máximo
mantendrá este valor, (NO es cíclico).

El sensor de la rueda, está conectado a la INT0, genera una interrupción cada flanco de
subida.

La rutina de atención a la INT0:

Guarda en una variable global denominada TIEMPO el valor de CONTADOR.

Saca por el puerto C el valor de CONTADOR.

Pone a cero el CONTADOR.

El bit 0 del puerto A, se activará cuando la velocidad sea menor de 20 Km/hora

El bit 1 del puerto A, se activará cuando la velocidad sea mayor de 150 Km/hora

Escribir el programa en lenguaje C.

Se pide:

1.- Código de configuración de los puertos utilizados. (Configurar como entrada los bits no utilizados)

(0,5 Puntos).

CMCON=0x07; (Comparadores deshabilitados)

ADCON1=0x0F; (Conversor A/D entradas digitales)

LATA=0;

LATB=0;

LATC=0;

TRISA=0xFC; Bit 0 y Bit 1 salidas, resto estradas

TRISB=0xFF; Todos los bits del puerto B entrada

TRISC=0x00; Todos los bits del puerto C de salida


ELECTRÓNICA DIGITAL
Grados en Ingeniería Electrónica Industrial y Automática
Examen PARCIAL. Curso 2018-2019
5 diciembre de 2018

APELLIDOS Y NOMBRE_____________________________________________________________

2.- Valor de la carga del Timer0 y del pre-escalado para que genere una interrupción cada
milisegundo. (Programado en MODO 8 bits, Reloj interno de 8 MHz) . (0,5 Puntos).

1ms/(k·0.5μs)<28

K>7,81 => k=8

CUENTA = 1ms/(8·0,5μs) =250

CARGA TIMER = 256-250 = 6

3.- Código de configuración del TIMER0 y de las interrupciones: INT0 y TMRO, para las
especificaciones deseadas.

(Interrupción de baja prioridad para el TIMER0) (1 Punto).

T0CON=0XC2; Timer On, reloj interno, 8 bits, preescala 8

TMR0L=0X06; Carga timer 0

RCONbits.IPEN=1; Con prioridades

INTCONbits.GIEL=1; Habilita Int de baja prioridad

INTCONbits.GIEH=1; Habilita Int de alta prioridad

INTCONbits.TMR0IF=0; Limpia flag timer 0

INTCONbits.TMR0IE=1; Habilita Int de TIMER 0

INTCON2bits.TMR0IP=0; TIMER0 de baja prioridad

INTCONbits.INT0IF=0; Limpia flag INT0

INTCONbits.INT0IE=1; Habilita Interrupciones de INT0

INTCON2bits.INTEDG0=1; Flanco de subida

4.- Programa de atención a las interrupciones de TIMER0. (0,5 Puntos).

INTCONbits.TMR0IF=0;

TMR0L=0x06;

if(CONTADOR<255)

CONTADOR++;

http://dte.uc3m.es

ELECTRÓNICA DIGITAL. Control II 5


5.- Escribir la rutina de atención a la interrupción de INT0. (0,5 Puntos).

INTCONbits.INT0IF=0;

TIEMPO=CONTADOR;

PORTC=CONTADOR;

CONTADOR=0;

6.- Programa Principal.

Realizar un bucle que en función del valor de la variable TIEMPO, active los bits 0 y 1 del puerto A,
según las especificaciones. (2 Puntos).

V=20 Km/h= 20 Km/h · 1000m/1Km · 1h/3600seg = 20/3,6 (m/seg)

V=150 Km/h= 150 Km/h · 1000m/1Km · 1h/3600seg = 150/3,6 (m/seg)

Tiempo(20 Km/h) =e/v = 1,25/20/3,6= 0,225 s =225 ms

Tiempo(150 Km/h) =e/v = 1,25/150/3,6= 0,03 s =30 ms

while(1)

if(TIEMPO>225)

{PORTAbits.RA0=1;}

else

{PORTAbits.RA0=0;}

if(TIEMPO<30)

{PORTAbits.RA1=1;}

else

{PORTAbits.RA1=0;}

}
ELECTRÓNICA DIGITAL
Grados en Ingeniería Electrónica Industrial y Automática
Examen PARCIAL. Curso 2018-2019
5 diciembre de 2018

APELLIDOS Y NOMBRE_____________________________________________________________

7.- Si modificamos el programa y la variable CONTADOR al incrementarse pasa de 0xFF a 0x00,


(Contador cíclico).

¿Qué especificación podría fallar? Razonar.

¿Indique una posible forma de resolver el problema? (No hace falta escribir el nuevo código)

(1 Punto).

Si CONTADOR pasa de 0xFF a 0x00, falla la detección de velocidad menor de 20 Km/h.

Una posible solución sería añadir una variable con valor inicial cero que se ponga a uno cuando se
produzca desbordamiento.

El programa principal la consulta para determinar si la velocidad ha sido menor que 20Km/h y la
pone a cero.

http://dte.uc3m.es

ELECTRÓNICA DIGITAL. Control II 7

También podría gustarte