Microprocesadores y Lógica
Programable
Práctica 3: Uso del HW para
Generar Formas de Onda
1
Objetivos práctica
• Generar formas de onda sin intervención
la CPU (sólo HW).
• Configurar entradas externas.
• Usar lógica programable para crear HW
especializado.
• Comunicar el HW con el SW.
2
Resumen prácticas (I)
• En las prácticas 1 y 2 hemos estado
generando una forma de onda.
• Para ello, en la práctica 1 hemos utilizado
intensivamente la CPU.
• Con la flexibilidad de una CPU y una
salida digital se puede crear casi cualquier
F.O. o implementar muchos protocolos.
• Esto se conoce como bitbanging.
3
Resumen prácticas (II)
• Si bien esto es posible para aplicaciones
sencillas, no es escalable ni eficiente.
• Las distintas tareas interfieren entre sí y
es difícil obtener una buena precisión
temporal.
4
Resumen prácticas (III)
• En la práctica 2, usamos interrupciones.
• Sólo usábamos ciclos de CPU cuando era
necesario.
• La precisión temporal mejoraba.
• Pero seguimos usando la CPU:
– Quitamos tiempo de otras tareas.
– Existe una latencia desde que la CPU detecta
la petición hasta que puede atenderla.
5
Situación ideal
• En un diseño, al elegir el uC, debemos
buscar uno cuyos periféricos puedan
resolver la mayor parte de sus tareas sin
intervención de la CPU.
• Idealmente la CPU sólo debería configurar
y supervisar el HW.
6
Actividad 1
• En esta actividad lograremos generar la
forma de onda sólo con HW, sin consumir
ciclos de CPU.
• Usaremos la sección OC (Output
Compare) de un temporizador.
• Generaremos un tren de pulsos con una
temporización tan precisa como el reloj del
uC.
7
Timer Output Compare (I)
• Casi siempre los timers CLK
incluyen una etapa OC
n
(comparación de salida). CONTADOR OC
>
• Se usa para generar REG. VALOR
n
COMPARACIÓN
formas de onda.
• En su forma más simple,
consta de un
comparador y un
registro para el valor de
comparación.
• OC = VALOR > CUENTA ? 1 : 0
8
Timer Output Compare (II)
• Con la frecuencia de CLK
reloj del timer y su
n
periodo, ajustamos el CONTADOR OC
periodo de la señal. REG. VALOR
n
>
COMPARACIÓN
• Con el valor del registro
de comparación, la
anchura del pulso.
9
Hacer copia de p1-a1
10
Renombrar copia a p3-a1
11
Añadir señal de reloj
12
Configurar a 1 kHz
13
Incorporar PWM
14
Configurar PWM
15
Conectar salidas al HW
16
Circuito final
17
Generar aplicación
18
Borrar código antiguo
19
Añadir código
inicialización PWM
20
Construir y programar
21
Visualizar mensajes
22
Cuestiones Actividad 1
• ¿Cuántos ciclos de CPU consume la
generación de la intermitencia?
• ¿Tiene algún efecto la generación de la
intermitencia sobre el código que ejecuta
la CPU?
• ¿Y el código que ejecuta la CPU sobre la
precisión de la intermitencia?
23
Actividad 2
• Usaremos el PWM para una conversión
D/A.
• Usaremos las capacidades de los circuitos
de E/S para:
– Configurar una patilla como entrada.
– Conectar la entrada a una resistencia de pull-
up interna.
24
Hacer copia de p3-a1
25
Renombrar copia a p3-a2
26
Cambiar frecuencia reloj
27
Reconfigurar PWM
28
Agregar entrada digital
29
Configurar entrada (I)
• Cambiamos el nombre a UsrBtn.
• No vamos a conectarla a ningún HW, así que
desmarcamos la casilla HW connection.
• Pero sí necesitamos acceso a una patilla
externa: marcamos la casilla External Terminal.
• El interruptor, al cortocircuitar a tierra, pone un
‘0’ en la entrada; pero cuando está abierto, el
nivel en la entrada es indeterminado.
• Necesitamos una resistencia de pull-up; vamos
a usar la interna que poseen las E/S del uC.
30
Configurar entrada (II)
31
Configurar entrada (III)
• Por último, usamos la capacidad de las
entradas digitales para provocar
interrupciones.
• Configuramos la entrada para provocar
una interrupción en el flanco de bajada (al
accionar el pulsador).
32
Configurar entrada (IV)
33
Asignar patilla
34
Añadir interrupción
35
Cambiar nombre a BtnIsr
36
Añadir pulsador
37
Añadir tierra
38
Finalizar esquemático
39
Generar aplicación
40
Escribir ISR
41
Inicializar interrupción
42
Enviar nivel por UART
43
Compilar y programar
44
Visualizar
45
Cuestiones Actividad 2
• ¿Por qué es necesario configurar la
entrada UsrBtn como pull-up?
46
Actividad 3
• Los PSoC de Cypress contienen periféricos
“fijos” como los de otros fabricantes.
• Pero, además, contienen hasta 24 bloques de
lógica programable llamados UDB (Universal
Digital Block).
• Estos UDB permiten:
– Adaptar o personalizar (customize) un periférico fijo a
nuestra aplicación.
– Crear componentes nuevos que el fabricante no ha
previsto.
47
Diagrama de un UDB
48
Diagrama de los PLD
49
Diagrama macrocelda
PLD
50
Objetivos Actividad 3
• Crear un componente con una
funcionalidad no proporcionada por el
entorno (contador de código Gray).
• Interactuar con el componente desde el
SW.
51
Contador de Código Gray
• Cuando la cuenta se incrementa en un
contador binario, puede cambiar más de
un bit de la salida a la vez.
• En un circuito real, es imposible conseguir
que dos salidas cambien exactamente a la
vez.
• Eso implica que en la salida aparecen
distintos valores hasta que se estabiliza el
valor final.
52
Contador de Código Gray
• En muchas aplicaciones (síncronas) esto
no es un problema.
• Pero en otras (asíncronas) puede ser
inaceptable.
• En estos casos se puede usar un contador
de código Gray.
• El código Gray garantiza que de un valor
al siguiente sólo cambia un bit.
53
Tabla verdad contador Gray
Cuenta Código Código + 1
0 000 001
1 001 011
2 011 010
3 010 110
4 110 111
5 111 101
6 101 100
7 100 000
54
Tabla de búsqueda
• Para implementar nuestro contador
usaremos el componente tabla de
búsqueda (LUT: Look-Up Table).
• Este componente nos permite usar
fácilmente los UDB del PSoC.
• Podemos introducir la tabla de la verdad
de nuestro diseño.
• Usando las salidas registradas podemos
implementar FSMs. 55
Implementación
• Usaremos una LUT con salidas
registradas.
• La LUT generará el siguiente valor del
contador.
• Este nuevo valor se guardará en los
registros de salida.
• Las salidas se realimentarán hacia las
entradas para calcular un nuevo valor.
56
Reset
• Añadiremos una entrada más como reset.
• Cuando esta entrada esté a ‘1’, el
siguiente código, sean cuales sean las
otras entradas, será 0.
• Usaremos el bit de más peso (MSB) de
las entradas.
• Conectaremos el reset con el pulsador de
la tarjeta a través de una ISR.
57
Tabla verdad LUT
Reset Código Código + 1
0 000 001
0 001 011
0 011 010
0 010 110
0 110 111
0 111 101
0 101 100
0 100 000
1 XXX 000
X: cualquier valor
58
Hacer copia de p3-a2
59
Renombrar copia a p3-a3
60
Páginas esquemático
• Cuando el diseño se complica:
– Hay que desplazarlo continuamente para ver
las distintas partes.
– Es complicado ver la estructura del diseño.
• El esquemático se puede dividir en varias
páginas para:
– Estructurar el diseño.
– Habilitar o deshabilitar partes concretas del
diseño.
61
Añadir página
62
Renombrar página (I)
63
Renombrar página (II)
64
Seleccionar y cortar PWM y
LEDs
65
Pegar en nueva página
66
Renombrar página original
67
Añadir LUT
68
Documentación LUT
69
Configurar LUT
70
Realimentar salidas
71
Añadir reloj 5Hz
72
Registros
• Vamos a hacer nuestro HW accesible
desde el SW.
• Para ello emplearemos registros:
– Un registro de estado para que el SW pueda
leer el valor del contador.
– Un registro de control para que el SW pueda
reiniciar el contador.
73
Registro de estado
74
Añadir registro de estado
75
Configurar registro de
estado
76
Registro de control
77
Añadir registro de control
78
Modo pulso
• Para el bit de reset usaremos el modo
“pulso”.
• Con este modo el bit permanece a ‘1’
durante un pulso de reloj y después
vuelve automáticamente a ‘0’.
• Esto simplifica el código de nuestra
aplicación.
79
Configurar registro de
control
80
Cablear
81
Deshabilitar HW
temporalmente
• En esta actividad no vamos a utilizar el
PWM ni los LEDs.
• No queremos borrarlos, sólo excluirlos de
la generación del programa.
• Para ello deshabilitaremos la página del
esquemático.
82
Deshabilitar página PWM
83
Generar código
84
Función StatusReg_Read
85
Función Control_Reg_Write
86
Modificar código aplicación
87
Construir y programar
88
Visualizar
89
Cuestiones Actividad 3
• ¿Nuestra aplicación puede leer/modificar
directamente los valores digitales del HW?
• Si no puede hacerlo, ¿cómo podemos
lograr que el SW interactúe con el HW?
90