24
Boletín de problemas del tema 4 Problema 1.- Determine qué instrucciones permiten leer y escribir datos en la zona de registros de entrada/salida. Solución propueta: Atendiendo, exclusivamente, a las instrucciones de transferencia o movimiento de datos, se tienen: a) Instrucción MOV. Permite leer y copiar el contenido de un registro del banco de registros de propósito general, hacia otro registro del banco. b) Instrucción LDI. Escribe un dato inmediato de tamaño byte en cualquiera de los registros r16..r31 del banco. c) Instrucciones LD y ST, que utilizan modos de direccionamiento indirectos en cualquiera de sus modalidades (indirecto, con postincremento y con predecremento). Las primeras, instrucciones LD, cargan un dato en cualquiera de los 32 registros, mientras que las segundas, leen cualquiera de ellos. Además, dependiendo de la dirección referenciada por el registro X,Y o Z que se utilice, la instrucción LD podrá leer un registro del banco, mientras que la ST, además, podrá escribir el dato en algún registro. d)Instrucciones LDD y STD, que utilizan el modo de direccionamiento indirecto con desplazamiento. Véase apartado c). e) Instrucciones IN y OUT. Intercambia bytes entre el banco de registros de propósito general y el banco de registros de entrada salida. f) Instrucciones LDS y STS, que utilizan el modo de direccionamiento directo. Uno de los operandos de ambas instrucciones es un registro del banco, mientras que el otro, una dirección absoluta, puede hacer referencia, también, dependiendo del valor de dirección, a otro registro del banco. g) Instrucciones PUSH y POP. Intercambia bytes entre la PILA y algún registro del banco. Problema 2.- Se desea diseñar una subrutina que permita sumar 20 bytes (positivos) almacenados a partir de la dirección $60 de la SRAM y almacenar el resultado en el registro R0( supóngase que no existe desbordamiento). Solución propuesta: Se inicializará el registro Z apuntando a la dirección $60 de RAM, donde comienzan los 20 bytes que han de sumarse. .DEF Cont=R16 .DEF Zlow=R30 .DEF Zhigh=R31 LDI Zhigh,0 LDI Zlow,$60 ;Puntero o registro Z = $0060 LDI Cont,0 ;Cont=0 Microprocesadores 19/12/06 1

PROBLEMAS DE MICROPROCESADORES - dte.us.es · Boletín de problemas del tema 4 Problema 1.-Determine qué instrucciones permiten leer y escribir datos en la zona de registros de entrada/salida

Embed Size (px)

Citation preview

Boletín de problemas del tema 4

Problema 1.- Determine qué instrucciones permiten leer y escribir datos en la zona de registros de entrada/salida.

Solución propueta:

Atendiendo, exclusivamente, a las instrucciones de transferencia o movimiento de datos, se tienen:a) Instrucción MOV. Permite leer y copiar el contenido de un registro del banco de registros de propósito general, hacia otro registro del banco.

b) Instrucción LDI. Escribe un dato inmediato de tamaño byte en cualquiera de los registros r16..r31 del banco.

c) Instrucciones LD y ST, que utilizan modos de direccionamiento indirectos en cualquiera de sus modalidades (indirecto, con postincremento y con predecremento). Las primeras, instrucciones LD, cargan un dato en cualquiera de los 32 registros, mientras que las segundas, leen cualquiera de ellos. Además, dependiendo de la dirección referenciada por el registro X,Y o Z que se utilice, la instrucción LD podrá leer un registro del banco, mientras que la ST, además, podrá escribir el dato en algún registro.

d)Instrucciones LDD y STD, que utilizan el modo de direccionamiento indirecto con desplazamiento. Véase apartado c).

e) Instrucciones IN y OUT. Intercambia bytes entre el banco de registros de propósito general y el banco de registros de entrada salida.

f) Instrucciones LDS y STS, que utilizan el modo de direccionamiento directo. Uno de los operandos de ambas instrucciones es un registro del banco, mientras que el otro, una dirección absoluta, puede hacer referencia, también, dependiendo del valor de dirección, a otro registro del banco.

g) Instrucciones PUSH y POP. Intercambia bytes entre la PILA y algún registro del banco.

Problema 2.- Se desea diseñar una subrutina que permita sumar 20 bytes (positivos) almacenados a partir de la dirección $60 de la SRAM y almacenar el resultado en el registro R0( supóngase que no existe desbordamiento).

Solución propuesta:

Se inicializará el registro Z apuntando a la dirección $60 de RAM, donde comienzan los 20 bytes que han de sumarse.

.DEF Cont=R16

.DEF Zlow=R30

.DEF Zhigh=R31

LDI Zhigh,0

LDI Zlow,$60 ;Puntero o registro Z = $0060

LDI Cont,0 ;Cont=0

Microprocesadores 19/12/06 1

Boletín de problemas del tema 4

CLR R0 ;R0=0

Bucle: LD R1,Z+

ADD R0,R1

INC Cont

CPI Cont,20

BRNE Bucle

RET

Problema 3.- Repita el apartado anterior para el caso de que exista desbordamiento. (El resultado se almacena en las dirección $80 y $81).

Solución propuesta:El resultado, temporalmente, se almacena en los registros r0 (parte más significativa) y r1 (la menos significativa).

.DEF Zlow=R30

.DEF Zhigh=R31

.DEF ResH=R0

.DEF ResL=R1

.DEF Zero=R3

LDI Zlow,$60

LDI Zhigh,$0 ;Puntero o registro Z = $0060

LDI Cont,0 ;Cont=0

CLR ResH ;Res=0

CLR ResL

CLR Zero ;Zero=0

Bucle: LD R2,Z+

ADD ResL,R2

ADC ResH,Zero ;Res =Res + Dato

INC Cont

CPI Cont,20

BRNE Bucle

STS $80,ResH

STS $81,ResL

RET

Problema 4.- Se desea diseñar un programa para el microcontrolador AT90S2313 que permita multiplicar dos números almacenados en los registros r1 y r2 y almacenar el resultado correcto a partir de la dirección de memoria $60 de la SRAM. Se requiere un diagrama de flujo y la definición de las variables usadas.

Solución propuesta:

Se aplicará el método de sumas sucesivas, sumando r2 tantas veces como indique el registro r1.

Microprocesadores 19/12/06 2

Boletín de problemas del tema 4

.DEF A=R2

.DEF B=R1

.DEF Zero=R0

.DEF MULH=R16

.DEF MULL=R17

.ORG 0x0

CLR Zero ;Pone a cero la variable Zero que se utilizará, después, para comparar con B

CLR MULH

CLR MULL ;Resultado temporal de la multiplicación MUL=0

Bucle: CP B,Zero

BREQ Salto

ADD MULL,A

ADC MULH,Zero

DEC B

RJMP Bucle

Salto: STS $60,MULH

STS $61,MULL

Fin: RJMP Fin

Problema 5.- A partir de la dirección $60 se han almacenado, consecutivamente, 16 bytes de datos. Se pide la realización de un programa que obtenga el número de bits a 1 lógico que se encuentran en dichos 16 bytes, y lo almacene en el registro R16. Como paso previo a la realización del programa, se debe realizar una subrutina que permita obtener el número de bits a 1 existentes en el registro R1, y almacenar el resultado en el registro R2. El programa principal debe usar, obligatoriamente, dicha subrutina.

Solución propuesta:

Se utilizará el puntero Z para acceder, consecutivamente, a los 16 bytes de datos. Por otro lado, el resultado, RES, será de tamaño byte porque, en el peor de los casos, se obtendría 16*8=128 < 255.

.DEF Zlow=R30

.DEF Zhigh=R31

.DEF InRutina=R1

.DEF OutRutina=R2

.DEF Cont=r16

.DEF Res=r17

.DEF ContRutina=R18

.DEF TEMP=R20

.ORG 0x0

LDI TEMP,$DF

OUT SPL,TEMP

CLR Zhigh

Microprocesadores 19/12/06 3

Boletín de problemas del tema 4

LDI Zlow,$60 ;Registro Z=$0060

CLR Cont ;Cont=0

CLR Res ;Res=0

Bucle: LD InRutina,Z+

RCALL Rutina

ADD Res,OutRutina ;Res+=OutRutina

INC Cont

CPI Cont, 16

BRNE Bucle

Fin: RJMP Fin

Rutina: CLR ContRutina ;ContRutina = 0

CLR OutRutina ;OutRutina = 0

BucleRutina: LSR InRutina

BRCC Salto

INC OutRutina

Salto: INC ContRutina

CPI ContRutina,8

BRNE BucleRutina

RET

Problema 6.- Configure el AT90S2313 para que genere interrupciones cada 5ms aproximadamente, sabiendo que este microcontrolador dispone de un oscilador de cuarzo de 1Mhz.

Solución propuesta:El intervalo de generación de interrupciones, Tint, se obtiene combinando el periodo de reloj, Tclk, que según el enunciado es de 1μs, el valor del prescaler, y el contenido del propio registro TCNT0.

Tint = Tclk x PRESCALER x TCNT0

Se han de tener presentes las límitaciones del PRESCALER y el registro TCNT0. El primero sólo introduce factores multiplicativos de 1, 8 ,64, 256 y 1024, mientras que, el segundo, puede tener cualquier valor inferior a 256, por ser un contador de 8 bits. En la siguiente tabla se muestran todos los valores posibles de TCNT0, atendiendo a los diferentes escalas del PRESCALER y junto con el error que se comete en cada caso.

TCNT0 = 5ms/( 1μs x PRESCALER)

PRESCALER= TCNT0 (Exacto)= TCNT0= Error1 5000 >255 ---

8 625 >255 ---

64 78,125 78 8 μs

256 19,53 20 120 μs

1024 4,88 5 120 μs

Microprocesadores 19/12/06 4

Boletín de problemas del tema 4

Como puede observase en la tabla anterior, el valor real con el que deberá cargarse el contador TCNT0 procede de un redondeo del valor exacto. A partir de dicho valor redondeado, se procede a determinar la temporización real conseguida. Su diferencia con la enunciada en el problema determina el error que se muestra en la última columna de la tabla.

De todas las opciones posibles que permiten generar interrupciones cada 5ms, la mejor será aquella que cometa un menor error y que, según lo mostrado en la tabla, se corresponde con la que tiene un prescaler de 64 . Obsérvese que el TCNT0 para dicha opción, es de 78, pero que el valor que hay que cargar, en realidad, en el TCNT0 es igual a 256 - 78, ya que las interrupciones se generan cuando el timer se desborda, es decir, cuando él pasa de 255 a 0. Así mismo, para conseguir mantener la periodicidad en la generación de interrupciones, la rutina de interrupción debe recargar este valor en el TCNT0.

.INCLUDE “2313DEF.INC” ;Incluye el fichero de definiciones de los registros del microcontrolador.

.DEF TEMP=R16

.ORG 0x0

RJMP main

.ORG 0x6

RJMP int

Main: LDI TEMP,$3

OUT TCCR0,TEMP ;Configura el prescaler = 64

LDI TEMP,$DF

OUT SPL,TEMP ;Inicializa el puntero de PILA

LDI TEMP,256-78

OUT TCNT0,TEMP ;Carga 256 – 39 en el registro TCNT0.

LDI TEMP,0x2

OUT TIMSK, TEMP ; Habilita la generación de interrupciones por TOV0

SEI ;Habilitación de interrupciones en el SREG.

.......

Int: IN TEMP, SREG

PUSH TEMP

LDI TEMP,256-78

OUT TCNT0,TEMP ;Carga 256 – 39 en el registro TCNT0.

....

POP TEMP

OUT SREG,TEMP

RETI

Problema 7.- El sistema digital de la figura está construido con un microcontrolador AT90S2313, dos registros de 8 bits (74573) y 2 visualizadores de siete segmentos. Se desea obtener un conjunto de subrutinas que permitan la representación de cualquier número entre 0 y 99 en los displays de 7

Microprocesadores 19/12/06 5

Boletín de problemas del tema 4

segmentos. Además se pide definir las interconexiones entre el microcontrolador y los latches y entre estos últimos y los displays de siete segmentos.

Solución propuesta:

Como se observa en la figura del enunciado, se utilizará un puerto, por ejemplo el PORTB, como bus que interconecta ambos latches con el microcontrolador. La conexión se lleva a cabo utilizando los pines D de cada latch. Además, para que estos registros capturen los datos que el microcontrolador sitúa en el bus, o puerto B, se deberán activar sendas señales, LE, manejadas por dos pines del puerto D del microcontrolador. Los terminales OE de cada registro deberán ponerse a tierra, para que estos estén continuamente activando los leds de los displays de 7 segmentos, que son del tipo cátodo común. La siguiente tabla resume una posible solución de interconexión.

Microcontrolador LatchesInput Output

Display de 7 segmentos

PB0 1D 1Q Segmento a

PB1 2D 2Q Segmento b

........

PB6 7D 7Q Segmento g

PB7 8D 8Q Segmento h

PD0 LE1

PD1 LE2

La tabla con los códigos 7 segmentos se hará residente en la memoria de programa. Se accederá a un elemento de la tabla, utilizando la instrucción LPM. Se recuerda que esta instrucción requiere que el registro Z apunte a la zona de la memoria de programa donde se encuentra la tabla y, según si el contenido de Z es par o impar, se accederá al byte bajo o alto, respectivamente. Dicho byte se deposita en el registro R0.

Microprocesadores 19/12/06 6

a

b

c

d

e

f

g

h

LATCH[8]

74573

a

b

c

d

e

f

g

h

LATCH[8]

74573

AT902313

Boletín de problemas del tema 4

Supondremos que la rutina a diseñar recibe el número que tiene que representar en los displays en el formato BCD:

Número 0 .. 9 0 .. 9 La rutina recibe el número N en un registro. Cada dígito del mismo, se utilizará para obtener, junto con el registro Z, el código 7 segmentos correspondiente, el cual se sitúa en el puerto B y se genera el pulso en el pin PD para proceder a su carga. Se repite el procedimiento con el otro dígito.

.INCLUDE “2313DEF.INC” ;Incluye el fichero de definiciones de los registros del microcontrolador.

.DEF TEMP=R16

.DEF N=R17

.CSEG

Tabla7seg: .DW 0x063F, 0x4F5B, ..... ; Tabla con códigos 7 segmentos

....

Rutina: LDI ZLOW, low(2*tabla7seg)

LDI ZHIGH,high(2*tabla7seg) ;Z apuntando al inicio de la tabla

MOV TEMP,N

CLR ZERO

ANDI TEMP,$0F ;Quita el dígito más significativo

ADD ZLOW,TEMP ;Modifica Z para que apunte al código 7 segmentos del dígito LSB a representar.

ADC ZHIGH,R1

Microprocesadores 19/12/06 7

Boletín de problemas del tema 4

LPM

OUT PORTB, R0 ;Coloca el código 7 segmentos en el puerto

SBI PORTD, 0 ;Activa el pin LE1

NOP

CBI PORTD,0 ;Desactiva el pin LE1, el dato ya está cargado en el latch 1

LDI ZLOW, low(2*tabla7seg)

LDI ZHIGH,high(2*tabla7seg) ;Z apuntando al inicio de la tabla

MOV TEMP,N

LSR TEMP

LSR TEMP

LSR TEMP

LSR TEMP

ANDI TEMP,$0F ;Quita el dígito más significativo

CLR R1

ADD ZLOW,TEMP ;Modifica Z para que apunte al código 7 segmentos del dígito LSB a representar.

ADC ZHIGH,R1

LPM

OUT PORTB, R0 ;Coloca el código 7 segmentos en el puerto

SBI PORTD,1 ;Activa el pin LE2

NOP

CBI PORTD,1 ;Desactiva el pin LE2, el dato ya está cargado en el latch 2

RET

NOTA: La rutina requiere la configuración de los pines del puerto B y los pines PD1 y PD0, como salidas.

conf_pines: LDI R16,0XFF

OUT DDRB,R16

LDI R16,3

OUT DDRD,R16

RET

Problema 8.- Repita el ejercicio anterior para las siguiente estructura en la que se ha eliminado los latches. Además la alimentación de los displays dispone de unos transistores conectados, a través de resistencias, con salidas del microcontrolador. Esto implica que cuando la salida del microcontrolador está a 1, el transistor se activa permitiendo el flujo de corriente hacia el display correspondiente, mientras que si la salida está a 0 el transistor se desactiva provocando el corte de suministro al display, por lo que sus diodos se apagan.

Microprocesadores 19/12/06 8

Boletín de problemas del tema 4

Solución propuesta:

En este caso, se procederá a diseñar una rutina de interrupción que genere la secuencia de refresco y represente cada dígito a partir del número N (también BCD, ver problema anterior), almacenado en un registro determinado. Obsérvese que, ahora, los displays son del tipo ánodo común, por tanto, el código 7 segmentos de cada dígito BCD es la versión complementada del problema anterior (si se asume que las conexiones entre cada segmento a...h y los bits del puerto B, son las mismas). Dos pines del puerto D, PD1, y PD0, portarán la secuencia de refresco que tendrá una periodicidad de 100Hz (T = 10ms), con objeto de reducir molestos parpadeos.

La interrupción del timer0 debe ser programada y con un periodo de 5ms (suponemos que la frecuencia de reloj es de 1MHz). Cada vez que se ejecute, se procederá a activar un nuevo dígito y a colocar su código 7 segmentos en el puerto B.

.INCLUDE “2313DEF.INC” ;Incluye el fichero de definiciones de los registros del microcontrolador.

.DEF TEMP=R16

.DEF N=R17

.DEF SEC=R18 ;Secuencia de refresco

.ORG 0x0

RJMP main

.ORG 0x6

RJMP int

Main: LDI TEMP,$3

OUT TCCR0,TEMP ;Configura el prescaler = 64

LDI TEMP,$DF

OUT SPL,TEMP ;Inicializa el puntero de PILA

LDI TEMP,256-78

OUT TCNT0,TEMP ;Carga 256 – 78 en el registro TCNT0.

Microprocesadores 19/12/06 9

1MHZ

a

b

c

d

e

f

g

h

a

b

c

d

e

f

g

h

AT902313

VCCVCC

Boletín de problemas del tema 4

LDI TEMP,0x2

OUT TOIE0, TEMP ; Habilita la generación de interrupciones por TOV0

SEI ;Habilitación de interrupciones en el SREG.

LDI TEMP,3

OUT DDRD,TEMP ;Configura PD1,PD0 como salidas

LDI TEMP,$FF

OUT DDRB,TEMP ;Configura el puerto B como salida

LDI SEC,0 ;Contiene el dígito que se activará (0=LSB, 1=MSB)

....

Int: IN TEMP, SREG

PUSH TEMP

LDI TEMP,256-78

OUT TCNT0,TEMP ;Carga 256 – 39 en el registro TCNT0.

CPI SEC,0

BREQ MostrarMSB

MostrarLSB: CLR SEC

MOV TEMP,1

OUT PORTD,TEMP ;Activa el pin PD0 y desactiva el pin PD1

MOV TEMP,N

ANDI TEMP,$F

RJMP Mostrar7seg

MostrarMSB: LDI SEC,1

MOV TEMP,2

OUT PORTD,TEMP ;Activa el pin PD1 y desactiva el pin PD0

MOV TEMP,N

LSR TEMP

LSR TEMP

LSR TEMP

LSR TEMP

ANDI TEMP,$F

Mostrar7seg: LDI ZLOW, low(2*tabla7seg)

LDI ZHIGH,high(2*tabla7seg) ;Z apuntando al inicio de la tabla

ADD ZLOW, TEMP

LPM

OUT PORTB,R0

POP TEMP

OUT SREG,TEMP

RETI

Tabla7seg: .DW $7940, $3024 .... ;Tabla de códigos 7 segmentos.

Problema 9.- Se desea diseñar un programa para el microcontrolador AT90S2313 que permita el contaje del número de veces que se pulsa una tecla conectada al puerto PB0 (tecla pulsada = 0, tecla sin pulsar =1), y muestre el valor de cuenta en un display de siete segmentos, tal como muestra la siguiente figura. (Se entiende que sólo es posible mostrar del 0 al 9 y por tanto se supone que no se

Microprocesadores 19/12/06 10

Boletín de problemas del tema 4

generan más de esas pulsaciones). Se requiere el diagrama de flujo del programa, así como la definición de las posiciones ocupadas por cada variable.

Solución propuesta:

Aunque el enunciado del problema indica claramente que no se esperan recibir más de nueve pulsaciones, la solución que se muestra a continuación permite presentar el dígito menos significativo del número de pulsaciones realizadas.

El puerto D se configura como salida y se utiliza para mostrar los códigos 7 segmentos del dígito LSB del número a representar. El pin 0 del puerto B se configura como entrada. Un 0 indica pulsación, mientras que un 1, liberación.

.INCLUDE “2313DEF.INC” ;Incluye el fichero de definiciones de los registros del microcontrolador.

.DEF TEMP=R16

.DEF N=R17

.ORG 0

Main: LDI TEMP,$DF

OUT SPL,TEMP ; Inicia el puntero de PILA

LDI TEMP,$7F

OUT DDRD,TEMP ;Configura el puerto D como salida

CBI DDRB,0 ;Configura el pin PB0 como entrada

CLR N ;N=0

Pulsacion: SBIC PINB,0

RJMP Pulsacion ;Espera hasta que se presione la tecla

INC N

CPI N,10

BRCC Salto ;Si N>=10, entonces N=0

CLR N

Salto: RCALL Presenta

Microprocesadores 19/12/06 11

1MHZAT902313

5v

PB0

a

b

c

d

e

f

g

h

Boletín de problemas del tema 4

Liberacion: SBIS PINB,0

RJMP Liberacion ;Espera hasta que la tecla se libere nuevamente.

RJMP Pulsacion

Presenta: LDI ZLOW, low(2*tabla7seg)

LDI ZHIGH,high(2*tabla7seg) ;Z apuntando al inicio de la tabla

CLR R1

ADD ZLOW,N ;Suma el número de pulsaciones (N=0..9)

ADC ZHIGH,R1

LPM

OUT PORTD,R0 ;Coloca el código 7 segmentos en el puerto D

RET

Tabla7seg: .DW 0x063F, 0x4F5B, ..... ; Tabla con códigos 7 segmentos

Problema 10.- Se desea diseñar un sistema que permita regular un cruce mediante semáforos tal y como se representa en la siguiente figura

Los semáforos constan de luces de aviso a peatones, por lo que cada uno de ellos consta de 5 luces diferentes. El semáforo 1 y 3 se comportan de idéntica forma, y lo mismo ocurre con el 2 y 4. Es evidente que cuando los semáforos 1 y 3 permiten el tráfico por sus correspondientes vías, los 2 y 4 deben prohibirlo y a la inversa. El modo de funcionamiento de cada semáforo debe ser:

• La luz roja se mantiene encendida durante 30 segundos• La luz verde durante 25 segundos• La luz ámbar durante 5 segundos

Microprocesadores 19/12/06 12

1

23

4

Boletín de problemas del tema 4

• Cuando la luz verde se encuentra encendida, la bombilla roja que prohibe el paso de peatones debe estar activada.

• Cuando la luz roja se encuentra encendida, la bombilla verde del paso de peatones debe estar activada, salvo en los 10 últimos segundos en el que esta debe parpadear con un periodo de 1 segundo.

Se supone que la frecuencia de reloj es de 1Mhz.

Solución propuesta:

El funcionamiento del cruce semafórico se resume en la siguiente tabla para los semáforos 1 y 2.

S0 S1 S2 S3 S4 S5Segundos= 0-19 20-24 25-29 30-49 50-54 55-59

Sem

áfor

o 1

Luz Roja

Luz Ámbar

Luz Verde

Luz RojaP ☻ ☻ ☻

Luz VerdeP ☻ ☻☺☻☺☻ ☺☻☺☻☺

Sem

áfor

o 2

Luz Roja

Luz Ámbar

Luz Verde

Luz RojaP ☻ ☻ ☻

Luz VerdeP ☻ ☻☺☻☺☻ ☺☻☺☻☺

La variable segundos (acotada entre 0 y 59) y que se incrementa periódicamente, determina el funcionamiento del cruce. Si el contenido de la variable es inferior a 20, se deben activar la luz roja y la verde de peatón del semáforo 1 y la luz verde y roja de peatón del semáforo 2. Si el contenido de esa variable está comprendido entre 20 y 24 (ambos extremos incluidos), la luz verde de peatón del semáforo 1 debe empezar a parpadear cada segundo (obsérvese que si la variable segundos es impar, la luz debe estar apagada y si es par, encendida), y así sucesivamente, según lo descrito en la tabla, siguiendo una secuencia de seis estados (columnas en la tabla) repetitiva.

Para controlar el cruce se necesitan 10 salidas o pines del microcontrolador, según se recoge en la siguiente tabla.

Luz Roja Luz Ámbar Luz Verde Luz RojaP Luz VerdePSemáforos 1 y 3 PB0 PB1 PB2 PB3 PB4

Semáforos 2 y 4 PD0 PD1 PD2 PD3 PD4

Para cada uno de los estados (S0-S5) por los que debe pasar el automatismo del cruce, las salidas del microcontrolador deben ser (usando las dos tablas anteriores):

Microprocesadores 19/12/06 13

Boletín de problemas del tema 4

S0 S1 S2 S3 S4 S5PORTB 0x11 0x11 o 0x01 0x11 o 0x01 0xC 0xC 0xA

PORTD 0xC 0xC 0xA 0x11 0x11 o 0x01 0x11 o 0x01

También se deberá configurar el TIMER0 para que genere interrupciones de forma periódica, e incremente la variable Segundos de forma autónoma al programa principal. Según la frecuencia de reloj del microcontrolador, 1Mhz, se puede establecer interrupciones periódicas cada 10ms aproximadamente, si el prescaler está configurado a 256, y el timer0 genera desbordamientos cada 39 ciclos (Tint = 39 x 1024 x 1μs = 9,984ms). Cada vez que se ejecute la rutina de interrupción, se incrementará la variable Aux, que permitirá incrementar, a su vez, la variable Segundos, cuando aquella alcance el valor de 100.

.INCLUDE “2313DEF.INC” ;Incluye el fichero de definiciones de los registros del microcontrolador.

.DEF TEMP=R16

.DEF Segundos=R17

.DEF AUX=R18

.ORG 0x0

RJMP main “vector” del RESET

.ORG 0x6

RJMP int “vector” del TIMER0

Main: LDI TEMP,$34

OUT TCCR0,TEMP ;Configura el prescaler = 256

LDI TEMP,$DF

OUT SPL,TEMP ;Inicializa el puntero de pila

LDI TEMP,256-39

OUT TCNT0,TEMP ;Carga 256 – 39 en el registro TCNT0.

LDI TEMP,0x2

OUT TOIE0, TEMP ; Habilita la generación de interrupciones por TOV0

SEI ;Habilitación de interrupciones en el SREG.

CLR Segundos

CLR AUX

LDI TEMP,$1F

OUT DDRB,TEMP :Configura los pines del puerto B como salidas que activan las luces de los semáforos 1 y 3

OUT DDRD,TEMP :Configura los pines del puerto D como salidas que activan las luces de los semáforos 2 y 4

S0: LDI TEMP, $11

OUT PORTB,TEMP ;Activa luces del semáforo 1 según el estado S0

LDI TEMP, $0C

OUT PORTD,TEMP ;Activa luces del semáforo 2 según el estado S0

EsperaS0: CPI Segundos,20

BRCS EsperaS0

Microprocesadores 19/12/06 14

Boletín de problemas del tema 4

S1: SBRS Segundos,0 ;Comprueba si el bit 0 de la variable segundos es 0 o 1. Dependiendo de su valor, se activa, o no, la luz verde de peatón.

RJMP saltoS1

CBI PORTB,4 ;Apaga verde de peatón

RJMP EsperaS1

saltoS1 SBI PORTB,4 ;Activa verde de peatón

EsperaS1: CPI Segundos,25

BRCS S1

S2: OUT PORTD,$A ;Activa luz ámbar y apaga la luz roja del semáforo 2.

BucleS2 SBRS Segundos,0 ;Comprueba si el bit 0 de la variable segundos es 0 o 1. Dependiendo de su valor, se activa, o no, la luz verde de peatón.

RJMP saltoS2

CBI PORTB,4 ;Apaga verde de peatón

RJMP EsperaS2

saltoS2 SBI PORTB,4 ;Activa verde de peatón

EsperaS2: CPI Segundos,30

BRCS BucleS2

S3: LDI TEMP, $0c

OUT PORTB,TEMP ;Activa luces del semáforo 1 según el estado S3

LDI TEMP, $11

OUT PORTD,TEMP ;Activa luces del semáforo 2 según el estado S3

EsperaS3: CPI Segundos,50

BRCS EsperaS3

S4: SBRS Segundos,0 ;Comprueba si el bit 0 de la variable segundos es 0 o 1. Dependiendo de su valor, se activa, o no, la luz verde de peatón.

RJMP saltoS4

CBI PORTD,4 ;Apaga verde de peatón

RJMP EsperaS4

SaltoS4: SBI PORTD,4 ;Activa verde de peatón

EsperaS4: CPI Segundos,55

BRCS S4

S5: OUT PORTB,$A ;Activa luz ámbar y apaga la luz roja del semáforo 1.

BucleS5 SBRS Segundos,0 ;Comprueba si el bit 0 de la variable segundos es 0 o 1. Dependiendo de su valor, se activa, o no, la luz verde de peatón.

RJMP saltoS5

CBI PORTD,4 ;Apaga verde de peatón

RJMP EsperaS5

saltoS5 SBI PORTD,4 ;Activa verde de peatón

EsperaS5: CPI Segundos,60

BRCS BucleS5

CLR Segundos ;Borra la variable segundos, para iniciar un nuevo ciclo

RJMP S0 ;Vuelve al estado S0.

Int: PUSH TEMP

IN TEMP, SREG

PUSH TEMP

LDI TEMP,256-39

Microprocesadores 19/12/06 15

Boletín de problemas del tema 4

OUT TCNT0,TEMP ;Carga 256 – 39 en el registro TCNT0.

INC AUX

CPI AUX,100

BRNE Fin_int

INC Segundos

CLR AUX

POP TEMP

OUT SREG,TEMP

POP TEMP

Fin_int RETI

Problema 11.- Se desea comunicar un sistema basado en el AT90S2313 con un PC a través de un puerto serie usando un enlace full-dúplex a 9600bps, 8 bits de datos, 1 bit de stop y sin paridad. Diseñe la rutina que permita configurar la UART para tal efecto suponiendo que la frecuencia de reloj es de 4Mhz.

Config_UART: LDI R16,$18 ;Configura recepción y transmisión sin generación de intrrupciones. Transmisión con ;8 bits de datos y sin posibilidad de transmitir un noveno bit. Sólo se puede configurar ;un único bit de stop.

OUT UCR,R16

LDI R16,25 ;Se aplica la relación BAUD= Fclk/(16*(UBRR+1)). UBRR=25

OUT UBRR,R16

RET

Problema 12.- Diseñe una rutina que permita transmitir un conjunto de N bytes almacenados a partir de la dirección Buffer_tx de la memoria de datos.

.EQU N=.....

.DEF CONT=R16

..

rutina_tx: LDI CONT,,N ;Inicializa el contador con el número de bytes a transmitir

LDI ZL,lowBUFFER_TX)

LDI ZH,high(BUFFER_TX) ;Inicializa el registro Z

Espera: SBIS USR,UDRE ;Espera a que el buffer de transmisión esté vacío

RJMP Espera

LD R0,Z+

OUT UDR,R0 ;Transmite el dato

DEC CONT

CPI CONT,0

BRNE Espera

RET

...

.DSEG

BUFFER_TX: .BYTE N

Microprocesadores 19/12/06 16

Boletín de problemas del tema 4

Problema 13.- Repita el problema anterior siguiendo una configuración por interrupciones.

.EQU N=.....

.DEF CONT=R16

..

.ORG $8

RJMP rutina_tx:

...

rutina_tx: LD R0,Z+

OUT UDR,R0 ;Transmite el dato

DEC CONT

CPI CONT,0

BRNE FIN

CBI UCR,UDRIE

FIN: RETI

...

.DSEG

BUFFER_TX: .BYTE N

Config_UART: LDI R16,$38 ;Configura recepción y transmisión con intrrupción de transmisor. Transmisión con ;8 bits de datos y sin posibilidad de transmitir un noveno bit. Sólo se puede configurar ;un único bit de stop.

OUT UCR,R16

LDI R16,25 ;Se aplica la relación BAUD= Fclk/(16*(UBRR+1)). UBRR=25

OUT UBRR,R16

SEI

LDI CONT,,N ;Inicializa el contador con el número de bytes a transmitir

LDI ZL,low(BUFFER_TX)

LDI ZH,high(BUFFER_TX) ;Inicializa el registro Z

RET

Problema 14.- Diseñe una subrutina que permita almacenar, a partir de la dirección de memoria Buffer_rx, el conjunto de datos que se han recibido por la UART. El tamaño de la zona reservada a almacenar los datos recibidos es de N bytes. La subrutina, irá depositando los datos recibidos en posiciones consecutivas hasta el tope. Una vez alcanzado éste, se proseguirá almacenando datos a partir de la dirección inicial. Supóngase que la rutina no debe quedarse esperando la recepción de un dato, de forma que, cada vez que se invoque, si existe un dato éste se leerá y almacenará, devolviendo el control al programa principal y, si no existe dato , simplemente, la rutina devuelve el control al programa principal.

.EQU N=.....

.DEF CONT=R16

Microprocesadores 19/12/06 17

Boletín de problemas del tema 4

Config_UART: LDI R16,$10 ;Habilita recepción

OUT UCR,R16

CLR CONT ; Inicializa el contador

LDI ZL,low(BUFFER_RX)

LDI ZH,high(BUFFER_RX) ;Inicializa el registro Z

RET

rutina_rx: SBIS USR,RX

RET

IN R0,UDR

ST R0,Z+

INC CONT

CPI CONT, N

BRNE FIN

CLR CONT ; Inicializa el contador

LDI ZL,low(BUFFER_RX)

LDI ZH,high(BUFFER_RX) ;Inicializa el registro Z

FIN: RET

.DSEG

BUFFER_RX: .BYTE N

Problema 15.- Repita el problema anterior siguiendo una configuración por interrupciones.

.EQU N=.....

.DEF CONT=R16

.ORG $7

RJMP rutina_rx

Config_UART: LDI R16,$90 ;Habilita recepción por interrupciones

OUT UCR,R16

CLR CONT ; Inicializa el contador

LDI ZL,low(BUFFER_RX)

LDI ZH,high(BUFFER_RX) ;Inicializa el registro Z

SEI

RET

rutina_rx: IN R0,UDR

ST R0,Z+

INC CONT

CPI CONT, N

BRNE FIN

CLR CONT ; Inicializa el contador

LDI ZL,low(BUFFER_RX)

LDI ZH,high(BUFFER_RX) ;Inicializa el registro Z

Microprocesadores 19/12/06 18

Boletín de problemas del tema 4

FIN: RETI

.DSEG

BUFFER_RX: .BYTE N

Problema 16.- Se desea diseñar una subrutina que permita configurar la UART a 2400bps y en canal full-dúplex. Se deben habilitar la generación de interrupciones por recepción y por búffer de transmisión vacío. ¿La SDU podría contener un bit de paridad? En caso afirmativo haga una función que permita calcularlo e introducirlo en la SDU y otra que se invoque cada vez que existe un dato nuevo y permita determinar si hay, o no, error de paridad. ¿La SDU podría contener 2 bits de stop?. En caso afirmativo, indique cómo. ¿Es posible que la SDU contenga un número de bits menor a 8?. Supóngase que la frecuencia de reloj del Microcontrolador es de 4Mhz.

Solución propuesta:• Existen varios apartados en este problema. En primer lugar se procederá a realizar una rutina que

permita establecer una comunicación full-duplex a 2400bps que sea gestionada mediante interrupciones.

• Registro UCR. Su contenido debe ser $B8. Esto permite habilitar el receptor (RxEN), el transmisior (TxEN), interrupciones de recepción (RxCIE) y de buffer de transmisión vacío (UDRIE).

• Registro UBRR. Configura la velocidad de TX y RX según la relación BAUD= Fclk/(16*(UBRR+1)). Puesto que BAUD=2400, Fclk=4Mhz, despejando UBRR de la relación anterior, se obtiene un valor igual a 103.

Config_UART: LDI R16,$B8

OUT UCR,R16

LDI R16,103

OUT UBRR,R16

SEI ;Habilitación global de interrupciones.

RET

• ¿La SDU podría contener un bit de paridad? En caso afirmativo haga una función que permita calcularlo e introducirlo en la SDU y otra que se invoque cada vez que existe un dato nuevo y permita determinar si hay, o no, error de paridad.

La SDU que genera la UART del microcontrolador, permite la transmisión y recepción de un noveno bit, a continuación del octavo bit de datos. Esta opción debe programarse activando el bit 2 (CHR9) del registro UCR. Una vez activada la función, el noveno bit que se transmite en la SDU se recoge del bit 0 del UCR, denominado TXB8, y el noveno bit recibido, se almacena, para su posterior lectura, en el bit 1 del UCR (RXB8). Desgraciadamente, la UART no contiene ninguna electrónica adicional que permita generar o chequear el noveno bit, en el caso en el que éste se escoja como bit de paridad. Esta operación hay que realizarla mediante software. Supongamos que se trata del bit de paridad par y que el dato a enviar se encuentra en un registro de propósito general.

.DEF Dato=R18

.DEF TEMP=R16

.DEF Cont=R17

Microprocesadores 19/12/06 19

Boletín de problemas del tema 4

.DEF Iteracion=R19

........

.ORG $007

RJMP Recibe_dato ;Vector de interrupción de dato recibido.

RJMP Envia_dato ;Vector de interrupción de buffer de transmisión vacío.

...

Config_UART: LDI R16,$BC ;Configura también el envío y recepción de 9 bits de datos.

OUT UCR,R16

LDI R16,25

OUT UBRR,R16

SEI ;Habilitación global de interrupciones.

RET

Envia_dato: IN TEMP,SREG

PUSH TEMP ;Salva SREG en PILA.

RCALL Calcula_par ;

SBI UCR, TXB8

SBRS Cont,0

CBI UCR,TXB8 ;Si la variable paridad es 1, TXB8=1 y si es cero, TXB8=0

OUT UDR,Dato ;Transmite el dato junto con el bit de paridad

POP TEMP

OUT SREG,TEMP

RETI

Calcula_par: MOV TEMP,Dato

CLR Cont ;Contador de número de unos

CLR Iteracion ;se realizan 8 iteraciones

Bucle: ROR TEMP

BRCC Salto

INC Cont ;Si tras la rotación se introduce un 1 en el bit C, se incrementa la variable Cont

Salto: INC Iteracion

CPI Iteracion,8

BRNE Bucle

RET ; La variable Cont es par o impar dependiendo del número de 1's de Dato. El bit 0 de la variable Cont se debe usar como bit de paridad par.

La rutina de recepción quedaría del siguiente modo:

.DEF Error,R30

......

Recibe_dato: IN TEMP,SREG

PUSH TEMP ;Salva SREG en PILA.

SEC ;C=1

SBIS UCR,RXB8

CLC ;C=RXB8

Microprocesadores 19/12/06 20

Boletín de problemas del tema 4

IN TEMP,UDR ;Dato recibido se pone en variable temporal

MOV Dato,TEMP ;y se copia en Dato

CLR Cont

LDI Iteracion,9

Bucle: BRCC Salto

INC Cont

Salto: ROR TEMP

DEC Iteracion

BRNE Salto

LDI Error,1

SBRS Cont,0 ;Si Cont es par, no hay error, en caso contrario, Cont[0]=1, se activará la variable de Error.

CLR Error

RETI

• ¿La SDU podría contener 2 bits de stop?. En caso afirmativo, indique cómo.

Sí, mientras que el noveno bit está siempre a 1, y no se desee generar bit de paridad. El procedimiento a seguir tan sólo requiere que el bit TXB8 del registro UCR esté siempre a 1.

• ¿Es posible que la SDU contenga un número de bits menor a 8?.

No. La UART del microcontrolador sólo permite el manejo de datos de 8 bits, no se pueden enviar longitudes inferiores.

Problema 17.- Diseñe un programa que permita configurar al microcontrolador como un repetidor. En concreto, éste recibirá, por la línea de recepción de la UART, un conjunto de caracteres que irá almacenando en una cola. Cuando existan 10 elementos almacenados, estos se transferirán por la línea de transmisión del puerto serie y así, sucesivamente. La comunicación serie trabaja a 2400bps y el reloj del microcontrolador está a 4Mhz. a) Supóngase que la recepción y transmisión se realiza sin el uso de interrupciones.b) Supóngase ahora que, ambas, deben ser gestionadas por interrupciones.

Solución propuesta:

Para ambos apartados, se utilizarán un conjunto de rutinas que permitan la definición, inicialización y manejo (introducir y extraer datos) de la COLA. La COLA se situará en la SRAM, a partir de la dirección $60. Puede reservarse una porción de memoria de la SRAM utilizando la directiva .BYTE, tal y como se muestra en el trozo de programa que aparece a continuación. Se necesita un puntero de lectura, el registro X, y otro de escritura, el registro Y, para extraer e introducir, respectivamente, datos en COLA.

.EQU N=10 ;Etiqueta que define el tamaño de la COLA.

.DEF TEMP=R16

Microprocesadores 19/12/06 21

Boletín de problemas del tema 4

.DEF TAM=R17

.ORG $60

.DSEG

COLA: .BYTE N

.ORG $0

.CSEG

..........

inicia_cola: LDI TAM,0 ;Pone a cero el número de elementos contenidos en la COLA.

LDI YLOW,low(COLA) ;Inicializa punteros de lectura y escritura.

LDI YHIGH,high(COLA)

MOV XLOW,YLOW

MOV XHIGH,YHIGH

RET

meter_cola: CPI TAM,N ;La rutina de meter en cola utiliza el puntero Y

BRCS Sigue_en_cola ;Si TAM=12, la cola está llena y no puede introducirse ningún dato adicional.

RET

sigue_en_cola: INC TAM ;Se incrementa el tamaño de la cola

ST Y+,R0 ;.. y se mete el dato que se ha depositado en el registro R0

CP YLOW,COLA+N ;Se comprueba que el puntero de escritura no haya superado el límite superior

BRCS fin_en_cola

LD YHIGH,high(COLA) ;... sino se restaura al inicio de la COLA

LD YLOW,low(COLA)

fin_en_cola: RET

sacar_cola: CPI TAM,0 ;La rutina de sacar de la cola utiliza el puntero X.

BREQ fin_out_cola ; Si TAM=0 , la cola está vacía. No se puede extraer ningún dato.

LD R0,X+ ; En caso contrario, el puntero de lectura nos indica el dato a leer.

DEC TAM ;Se decrementa el contenido de la cola

CP XLOW,COLA+N ;Se comprueba que el puntero de escritura no haya superado el límite superior

BRCS fin_out_cola

LD XHIGH,high(COLA) ;... sino se restaura al inicio de la COLA

LD XLOW,low(COLA)

fin_out_cola: RET

a) La UART debe trabajar en full-dúplex y a 2400bps, por consiguiente el registro UCR debe tener los bits TxEN y RxEN activos (habilitación de receptor y transmisor) y el registro UBRR = Fclk/(16 x 2400 ) -1 =103.

config_UART: LDI TEMP, $18 ;Habilita el transmisor y el receptor asíncrono

OUT UCR,TEMP

LDI TEMP,103

OUT UBRR,TEMP ;Configura velocidad de 2400bps.

RET

Microprocesadores 19/12/06 22

Boletín de problemas del tema 4

Se necesita una rutina de recepción, que consulte si existe un nuevo dato en el registro de recepción y lo introduzca en la COLA y otra rutina de interrupción que, cuando el registro de transmisións e quede vacío, sacará un dato de la COLA y lo introducirá en él.

RX: SBIS USR,RXC ;El bit RxC del registro USR informa que se ha recibido un dato cuando se pone a 1.

RET

IN R0, UDR ;Mete el dato recibido en el registro R0.

RCALL meter_cola ;..y lo introduce en la COLA.

RET

TX: SBIS USR,UDRE ;El bit UDRE indica que el buffer de transmisión se ha quedado vacío.

RET

RCALL sacar_cola ;Se saca un dato de la COLA

OUT UDR,R0

RET

El programa principal queda del siguiente modo.

.CSEG

.ORG $0

Main: LDI TEMP,$DF

OUT SPL,TEMP ;Inicia el puntero de PILA.

RCALL inicia_cola

RCALL Config_UART

Bucle_main: CPI TAM, N

BREQ bucle_aux

RCALL RX

RJMP Bucle_main

Bucle_aux: CPI TAM,0

BREQ Bucle_main

RCALL TX

RCALL RX

RJMP Bucle_aux

b) La interrupción de recepción deberá estar siempre activa, mientras que la de transmisión no siempre. Por tanto la configuración de la UART requiere activar el bit RXCIE del registro UCR y se diseñarán dos rutinas que permitan habilitar, una, e inhabilitar, la otra, las interrupciones de transmisión mediante la puesta a 1 y a 0, respectivamente, del bit UDRIE del registro UCR.

config_UART: LDI TEMP, $98 ;Habilita el transmisor y el receptor asíncrono

OUT UCR,TEMP

LDI TEMP,103

OUT UBRR,TEMP ;Configura velocidad de 2400bps.

Microprocesadores 19/12/06 23

Boletín de problemas del tema 4

RET

habilita_int_TX: SBI UCR,UDRIE ;Pone a 1 el bit UDRIE

RET

inhabiltia_int_TX: CBI UCR,UDRIE ;Pone a 0 el bit UDRIE

RET

Las rutina de interrupción de recepción lee el dato del registro UDR y lo deposita en la COLA. La de transmisión hace el proceso inverso. El programa principal, junto con las rutinas de interrupción puede quedar del siguiente modo.

.ORG $0

RJMP RESET

.ORG $7

RJMP INT_RX

RJMP INT_TX ;Vectores de interrupción de recepción y transmisión

RESET: LDI TEMP,$DF

OUT SPL,TEMP ;Inicia el puntero de PILA.

RCALL inicia_cola

RCALL Config_UART

SEI ;Habilitar de interrupciones

Bucle: CPI TAM,10

BRNE Bucle

RCALL Habilita_int_TX

bucle_aux: CPI TAM,0

BRNE bucle_aux

RCALL inhabilita_int_TX

RJMP bucle

INT_RX: IN R0,UDR

RCALL meter_cola

RETI

INT_TX: RCALL sacar_cola

OUT UDR,R0

RETI

Microprocesadores 19/12/06 24