ERS
Qu es un Microprocesador?
ERS
CPU
ERS
ERS
ERS
ERS
ERS
ERS
ERS
10
ERS
11
ERS
12
ERS
13
ERS
14
Intel 4004
ERS
15
ERS
16
http://www.blinkenlights.com/pc.shtml
ERS
17
ERS
18
Computadora Macintosh
us el microprocesador 68000
ERS
19
Microprocesador (MPU)
Un circuito integrado que contiene el CPU
CPU (unidad central de proceso)
Controla la transferencia de datos Ejecuta las instrucciones
ERS
20
Hardware
Cules son los bloques bsicos que conforman a un microprocesador?
ERS
21
A S M
ALU
REGISTROS
ERS
22
A S M
ALU
REGISTROS
ERS
23
A S M
ALU
REGISTROS
Bus de Direcciones
Bus de Control
ERS
24
A S M
Clock
ALU
REGISTROS
Bus de Direcciones
ERS
Bus de Control
25
ERS
26
ERS
27
ASM
CPU 12
ERS 28
CPU
MEMORIA (PROGRAMA+DATOS)
INTERFAZ E/S
BUS DE DATOS
BUS DE DIRECCIONES
BUS DE CONTROL
ERS
29
ERS
30
Microcontrolador (MCU)
Un circuito integrado usado para controlar otros dispositivos Contienes un CPU, memoria y circuitos de E/S Dispositivo de propsito general disponible para una gran variedad de aplicaciones Tpicamente, un MCU debe responder a entradas en un corto tiempo para producir salidas apropiadas Un MCU es un tipo de controlador embebido
ERS 31
Microcontrolador (MCU)
Un microcontrolador (MCU) es un circuito integrado que contiene muchas de las funciones encontradas en una computadora tpica. Un microcontrolador usa un MICROPROCESADOR como su Unidad de Proceso Central (CPU) e incorpora caractersticas tales como memoria, referencias de tiempo y perifricos de entrada y salida, todo en el mismo circuito.
ERS 32
Microcontrolador (MCU)
Un MCU es empaquetado en un solo circuito el cual puede ser programado 'por el usuario' con una serie de instrucciones que se encuentran cargadas en su memoria. El desarrollo de una nueva aplicacin para un microcontrolador esta limitada nicamente por la destreza e imaginacin del usuario. Puesto que los elementos de un sistema microcontrolador son fcilmente ensamblados, las aplicaciones de los microcontroladores generalmente hacen mas simples y poderosos los procesos de control, frecuentemente proveen nuevas funciones y reducen costos.
ERS 33
E/S
Perifricos
ERS
34
ERS
35
ERS
36
ERS
37
Microprocesador
ERS
38
ERS
39
ERS
40
68HC12/HCS12
TIMER PARALLEL I/O SPI SCI A/D
ERS
42
ERS
43
ERS
44
ERS
45
ERS
46
ERS
47
ERS
48
ERS
49
ERS
50
ERS
51
ERS
52
ERS
53
ERS
54
ERS
55
ERS
56
ERS
57
Memoria
ERS
58
Direccionamiento de Memoria
La memoria consiste en una secuencia de localidades directamente direccionables. Una localidad es referida como una unidad de informacin Una localidad de memoria puede utilizarse para almacenar datos, instrucciones y el estado de los dispositivos perifricos Una localidad de memoria tiene dos componentes: una direccin y su contenido
ERS
59
Byte Alto
15 14 13 12 11 10 9 8 7 6 5
Byte Bajo
4 3 2 1 0
Memoria Direccin $2A70 $2A71 $2A72 Direccin de Memoria $2A73 $2A73 $2A74 $2A75 $2A76 $2A77 $2A78 Datos $5E $6E $00 $17 $8C $5F $34 $80 $FF %00010111 = $17 Dato
ERS
60
Direccionamiento de Memoria
La transferencia de datos entre el CPU y la memoria se efecta en los buses comunes: el bus de direccionamiento y el bus de datos El ancho del bus de datos es el nmero de bits que se pueden transferir en el bus de datos
Notaciones:
m[addr] representa el contenido de una localidad de memoria. Por ejemplo, m[$20] se refiere al contenido de la localidad de memoria en $20 [reg] se refiere al contenido de un registro. [A] se refiere al contenido del acumulador A. ERS 61
Tamao de Memoria
El tamao de la memoria se mide en bytes
1 byte = 8 bits 1 nibble = 4 bits 1 palabra = 16 bits o 2 bytes 1K=2^10 =1024 1M= K2= 2^20=1048576 1G= K3= 2^30= 1073741824
El MC68HC12 tiene un bus de direccionamiento de 16 bits y un bus de datos de 16 bits Algunos miembros de la familia del 68HC12 (68HC912DG128) utilizan tcnicas de paginado e incorporan hardware para sostener el direccionamiento en una memoria de espacio mayor que 64KB.
ERS 62
RAM
random access memory
EPROM
eraseable programmable ROM
EEPROM
electrically EPROM, byte writeable Tambin llamada flash cuando los sectores son escribibles ERS 63
Programando un EPROM
Computadora Programador del EPROM
Chip Personal
Disco
64
Bus de Direcciones
16
Bus de Datos
ROM
LECTURA
ERS
65
Bus de Direcciones
Bus de Datos
RAM
ESCRITURA LECTURA
ERS
66
Salida
La salida debe ser vlida
El valor de la salida no est determinado Alta impedancia, tres estados, HiZ, sin impulso, flotante, 67
Ciclo de Escritura
Direccin
Lectura/Escritura
Escritura
Datos
ERS
68
Ciclo de Escritura
Ciclo de Lectura
Direccin
Lectura/Escritura
Lectura
Datos
ERS
69
Ciclo de Lectura
ERS
70
ERS
71
Timer
HC12
ROM
RAM
Puertos de E/S
Para transferir datos correctamente y proteger a la computadora de daos, solo un dispositivo a la vez deber permitrsele actuar sobre el bus de datos. El decodificador de direccin selecciona y habilita un y solo un dispositivo para que transfiera datos al CPU. ERS 72
Mapa de Memoria
$0000
RAM
$8000
ROM
$C000
$FF00 $FFFF
Vectores
ERS
73
Monochip
. . .
16
ERS
74
4 lneas de entrada: A0, A1, A9, A15 Selecciona nicamente 1 lnea de salida
16
ERS
75
Bus de Datos
A
Seal de interferencia
MPU
Seal deseada
B
Configuracin sin Buffer
ERS 76
ERS
77
ERS
78
Mapa de Memoria
$0000 $03FF $0800 $0FFF
$8000
$C000
$FF00 $FFFF
Vectores
ERS
79
Monochip
NADA
$0800 2K Byte RAM $0FFF NADA $8000
ERS
81
ERS
82
DIRECCIONA PC=$8000
EJECUTA
DIR PC=$8001
EJE $86 A
DIR PC=$8002
EJE
DIR PC=$8003
EJE
DIR PC=$8004
EJE
DIR PC=$0800
DEC $14 B
EJE $14
$8005 PC
FANTASMA
ERS
83
DIR PC=$8005
EJE
DIR PC=$8006
EJE A B A +
DIR PC=$8007
EJE
DIR PC=$8008
EJE
DIR PC=$8009
EJE $0801 PC
DIR PC=$0801
DEC
EJE $0801 A
PC $800A $0801
FANTASMA
ERS
84
ERS
85
ERS
86
Tipo de Memoria
1. 2.
Uso
Todo el cdigo del programa. Constantes tales como mensajes y tablas de bsqueda. Cualquier otra informacin que no cambia. Variables y datos del programa. Almacenamiento de datos en la pila (stack).
Flash
3.
RAM
1. 2.
ERS
87
ERS
88
ERS
89
ERS
90
RISC
Instrucciones de Mquina
Microcdigo de conversin
Ejecucin de instrucciones
ERS
92
ERS
93
ERS
94
ERS
95
ERS
96
ERS
97
ERS
98
ERS
99
ERS
100
ERS
102
ERS
103
ERS
104
Freescale incluye en cada uno de los miembros del HCS12 un mdulo de depuracin (BDM) para facilitar las actividades de depuracin del software. Freescale tambin incluye caractersticas especiales con objetivo en algunas aplicaciones como:
Controlador Ethernet: el MC9S12NE64 tiene un controlador de Ethernet para facilitar el acceso a Internet. Controlador de USB: el MC9S12UF32 tiene un chip controlador de USB para facilitar la interaccin con el bus USB.
ERS 105
Herramientas de Desarrollo
Herramientas para el desarrollo de Software
Editor de texto, terminal de programacin, ensamblador cruzado, compilador cruzado, simulador, depurador a nivel fuente, ambiente integrado de desarrollo (IDE)
Tarjetas de Demostracin
Estn disponibles muchas tarjetas de demostracin basadas en el HCS12 para aprender y poder depurar los programas de aplicacin del HCS12. Una tarjeta de demostracin tiene un MCU HCS12 y muchos chips de perifricos para ayudar a probar los programas del HCS12. Una tarjeta de demostracin tambin tiene un programa monitor para comunicarse con la PC o una estacin de trabajo donde cada usuario puede desarrollar programas de aplicacin. El programa monitor permite al usuario mostrar el contenido de los registros y las localidades de memoria, programar el contenido de los registros y de las localidades de memoria, programar puntos de interrupcin, localizar la ejecucin de una instruccin, y descargar programas dentro de la tarjeta de demostracin para ejecutarlos. La PC o la estacin de trabajo se comunica con la tarjeta de demostracin.
ERS 108
Tarjeta de Demostracin
Despliega los valores de los registros y de las localidades de memoria Establece los valores de los registros y de las localidades de memoria Establece puntos de ruptura Ejecuta programa de rastreo Se puede ingresar programas ensambladores directamente a la tarjeta de demostracin Desensambla el cdigo de mquina Programa el chip incluido EPROM, EEPROM y/o memoria flash. Ejecuta el programa descargado en la tarjeta
ERS 109
Tarjeta 9S12GC32
La tarjeta de desarrollo est basada en un microcontrolador Freescale 9S12GC32. El microcontrolador cuenta con 2 KBytes de memoria RAM, 512 Bytes de memoria EEPROM, 32 KBytes de memoria Flash.
ERS
110
Puentes:
1. Alimentacin de voltaje externa. Este puente alimenta a la tarjeta con la fuente externa conectada a 13. Este puente no debe estar colocado cuando la tarjeta este conectada al puerto USB de una PC. 2. Modo Monitor o modo usuario. Este puente selecciona entre la ejecucin al reset del programa de usuario cargado en flash o del programa monitor para depurar. Conectado selecciona el programa de usuario y desconectado al monitor. 3. Conector BDM. Se utiliza para programar al microcontrolador con un programador externo o utilizar el modo de background debug. 4. Conector USB. Se utiliza para conectar a la tarjeta con la PC por medio de un cable USB-B. 5. Conector del puerto serie. Estos puentes (TX, RX) conectan al convertidor USB de la tarjeta con el puerto SCI del 9S12GC32. Deben estar instalados para usar las herramientas de depuracin, como el CodeWarrior o el UBug12. Una vez programado el microcontrolador con la aplicacin de usuario, si esta utiliza el SCI, esos puentes se deben retirar. Pueden quedar instalados si el SCI no es utilizado por la aplicacin. 6. Conector de puertos P, T, B, y E.
ERS 111
7. Conector de puertos AD, A y E. 8. Conector de puertos S, J, M y P. 9. Interruptor de RESET (normalmente abierto. Oprimiendo se genera RESET) 10. Led indicador de comunicacin USB. Este led muestra la comunicacin entre la herramienta de depuracin (CodeWarrior, U-Bug12) y el microcontrolador. Al descargar o depurar programas este led destellar mostrando la comunicacin entre la tarjeta y la PC. 11. Led de encendido. Este led es el indicador de encendido de la tarjeta. Enciende al conectarla a la PC con un cable USB o conectando una fuente externa en 13. 12. Conectores de 5 volts. La tarjeta puede energizar otro circuito conectndolo a cualquiera de estos puntos. El voltaje proporcionado es de 5 volts a un mximo de 100 mA si la tarjeta esta conectada al puerto USB. Si la tarjeta esta conectada con una fuente externa a 13, puede proporcionar hasta 500 mA. 13. Conexin de fuente externa. Si la tarjeta va a ser usada por una aplicacin permanente, se debe alimentar con una fuente externa con un voltaje de 8 a 12 volts. La fuente debe proporcionar al menos 150 mA.
ERS 112
ERS
113
El Asistente para instalar nuevo hardware aparecer. Utilice la opcin de instalacin asistida para continuar.
ERS
114
ERS
115
ERS
116
Una vez instalado el convertidor USB se instalar el puerto com Virtual. Siga el mismo procedimiento descrito anteriormente. Una vez instalado el puerto , abra:
Mi PC Panel de Control Sistema Hardware Administrador de dispositivos
Y anote en que puerto quedo el convertidor USB a Serial, ya que ser necesario para la configuracin del CodeWarrior o el U-Bug12. Observe la siguiente figura:
ERS 117
ERS
118
Instalando la Aplicacin
CodeWarrior: Instale el CodeWarrior y posteriormente instale el service pack. Se le notificar que una versin anterior del Processor Expert est instalada. Indique que se actualice a la nueva versin. Cree un nuevo proyecto. File New Project Wizard
ERS
120
ERS
121
ERS
122
ERS
123
Por ultimo seleccione como herramientas de depuracin al simulador de metrowerks y tambin al Monitor serial de motorola.
ERS
124
Se abrir la pantalla general de proyecto. En la parte izquierda, haga clic en la carpeta Sources y el archivo main.asm ser visible.
ERS
125
Haga doble clic en main.asm y se abrir la plantilla predeterminada en la parte derecha de la pantalla. Esta pantalla contiene un ejemplo de cmo generar archivos en ensamblador. Se puede eliminar todo el contenido de esta pantalla y crear un archivo propio. Conserve la directiva ABSENTRY apuntando a su origen para que el ensamblador apunte su vector de reset a esa etiqueta.
ERS
126
ERS
127
ERS
128
Asegrese que en la herramienta de depuracin del proyecto se muestre: Monitor. Para ensamblar el programa ejecute la accin COMPILE ( CTRL + F7) , que equivale a ensamblar. Se mostrar el resultado o los errores de la ejecucin. Para simular o depurar, ejecute la accin MAKE ( F7). Si el simulador esta activo, se abrir la pantalla del simulador. Si el monitor est activo, se abrir la ventana de depuracin. Al abrir la ventana de depuracin por primera vez se le pedir que indique el puerto por el cual se establecer la conexin. Ese puerto es el que anot en el administrador de dispositivos.
ERS 129
Una vez que se le indique el puerto, procesa a depurar el ERS 130 proyecto:
ERS
131
ASM
CPU 12
Registros
Un registro es un localidad de almacenamiento en el CPU. Es utilizado para mantener un dato o una direccin de memoria durante la ejecucin de una instruccin. El nmero de registros vara dependiendo de la computadora. Registros del 68HC12:
Registros del CPU: realizan nicamente operaciones de propsito general (aritmticas, lgicas, control de flujo).
No ocupan el espacio de memoria
Registros de entrada/salida: Se utilizan principalmente para configurar las funciones perifricas, para mantener datos transferidos de entrada/salida dentro del subsistema perifrico, y para registrar el estado de las operaciones de entrada/salida.
Datos, direccin de datos, control, estado de los registros Son tratados como localidades de memoria
HC12/HCS12 Registros
Motorola HC12/HCS12 Registros
7 15 15 15 15 15
Acumulador A
Acumulador B
0 0 0 0 0 0
8-Bit Acumuladores A y B 16-bit Doble Acumulador D Registro de ndice X Registro de ndice Y Contador de Programa Apuntador de Pila Registro de cdigo de condicin
Acumulador D X Y PC SP S X H I N Z V
CCR
Registro de Cdigo de condicin (Estado) Banderas S X H I N Z V C
Bits del CCR modificados por instrucciones Acarreo Bandera C V Z N H Condiciones para levantarlas Acarreo o prstamo Sobreflujo de complemento a 2s Resultado Cero MSB (signo) es 1 Si el bit 3 resulta en un acarreo o prstamo Sobreflujo Cero Negativo Interrupt Mask Medio acarreo X interrupt bit Stop disable bit
CCR Bits usados para control de operacin del HC12 Bit (Mscara) I X S
Alto
Acumuladores
Los acumuladores A y B son registros de propsito general de 8-bit que contienen operandos y resultados de clculos aritmticos o de manipulacin de datos. El acumulador D es la concatenacin de los acumuladores A y B. Algunas instrucciones tratan a la combinacin de estos dos acumuladores de 8-bit como un acumulador doble de 16-bit .
Registros de ndice X y Y
Estos son usados por el modo de direccionamiento indicado. El direccionamiento indicado suma el valor de un registro de ndice a una constante o el valor de un acumulador para formar la direccin efectiva del operando. Los registros de ndice X y Y tambin pueden servir como localidades temporales de almacenamiento de datos con alguna capacidad combinacional.
Contador de Programa
El contador de programa contiene la direccin de la siguiente instruccin que va a ser ejecutada. El contador de programa tambin sirve como registro de ndice en todos los modos de direccionamiento indicados excepto en autoincremento y autodecremento.
H Bandera de Medio-Acarreo La bandera H es usada solo por operaciones aritmticas en BCD. Se pone en uno cuando una instruccin ABA, ADD, o ADC produce un acarreo desde el bit 3 del acumulador A. La instruccin DAA usa la bandera H y la bandera C para ajustar el resultado correcto al formato BCD. I Bit de Interrupcin Enmascarada Activando el bit I deshabilita la fuente de interrupcin enmascarada. N Bandera Negativa La Bandera N es puesta en uno cuando el resultado de una operacin es menor que 0.
Z Bandera Cero La bandera Z se pone en uno cuando el resultado de una operacin es todo cero. V Bandera de sobreflujo en complemento a dos La Bandera V se pone en uno cuando ocurre un sobreflujo en complemento a dos. C Bandera de Acarreo/Prstamo La bandera C se pone en uno cuando una operacin de suma o resta produce un acarreo o prstamo.
El bit de Acarreo
Suma de dos nmeros no signados 10110101 y 01101100 Acarreo 1111100 10110101 01101100 100100001
H=1; C = 1; S = 0; V=1; Z= 0
Suma de dos nmeros signados (Complemento a 2s ) 10110101 y 01101100 Carry 1111100 10110101 01101100 100100001
H=1; C = 1; S = 0; V=1; Z= 0
Sobreflujo (Overflow)
BIT de sobreflujo para lgica de nmeros en complemento a 2s
MSB de A 0 0 0 0 1 1 1 1 MSB de B 0 0 1 1 0 0 1 1 Acarreo in MSB (Ci) 0 1 0 1 0 1 0 1 Acarreo Out MSB (Co) 0 0 0 1 0 1 1 1 Suma 0 1 1 0 1 0 0 1 Bit V 0 1 0 0 0 0 1 0 Comentarios No sobreflujo Sobreflujo No sobreflujo No sobreflujo No sobreflujo No sobreflujo Sobreflujo No sobreflujo
BMS +3 = = = = 0 0 0 0
BMS 1 1 1 1
bms 1 1 0 0 0 1 0 1 1 0 0 0
0 0 0 1
0 0 1 1
0 1 0 0
0 1 1 0
1 1 1 0
1 1 0 0
1 0 1 1
1 0 1 1
(a)
Estado de la Bandera N 0 1
(b)
a) Ejemplos de nmeros positivos y negativos en complemento a dos. b) Sumario del estado de la bandera N.
Nota: BMS=Bit Ms Significativo bms=bit menos significativo
Modos de Direccionamiento
Modos de Direccionamiento
De qu manera tiene acceso el CPU a las localidades de memoria? Una instruccin del 68HC12, consiste en un cdigo de operacin (1 o 2 bytes) y un operando (0 a 5 bytes) que direcciona la informacin Los bytes del cdigo de operacin, especifican la operacin que realizar el CPU. El primer byte de un cdigo de operacin de dos bytes, es siempre $18 Los modos de direccionamiento determinan la manera en que el CPU accede a las localidades de memoria sobre las que actuar. Direccionamiento efectivo: direccin de memoria afectada por la instruccin
Modo de Direccionamiento
Casi todas las instrucciones del HC12 operan sobre la memoria. La direccin del dato sobre el que la instruccin opera es llamado la direccin efectiva de esa instruccin. Cada instruccin contiene informacin que le indica al HC12 la direccin del dato en memoria sobre el que opera. El modo de direccionamiento de la instruccin indica al HC12 cmo calcular la direccin efectiva para esa instruccin.
Modo de Direccionamiento
Cada instruccin del HC12 consiste en uno o dos bytes de cdigo de operacin el cual le indica al HC12 qu hacer y qu modo de direccionamiento utilizar, seguido, cuando es necesario de uno o ms bytes que le indican al HC12, cmo determinar la direccin efectiva. Todos los cdigos de operacin de dos bytes comienzan con $18. Por ejemplo, la instruccin LDAA tiene cuatro diferentes cdigos de operacin, uno por cada uno de los 4 diferentes modos de direccionamiento.
LDAA
Operacin
(Load A = Cargar A)
(M) => A o imm => A Carga A con cualquier valor en M o un valor inmediato
CCR Efectos
N: Se guarda si se pone el resultado de MSB, de otro modo se borra Z: Se guarda si el resultado es $00; de otro modo se borra V: Se borra
8 LSB de direccin efectiva est especificada por el siguiente byte del cdigo de operacin.
La direccin efectiva est especificada por los dos bytes que suceden al cdigo de operacin.
Las instrucciones de bifurcacin son de 2 o 4 bytes de longitud. Todas las bifurcaciones son tomadas desde la direccin de la siguiente instruccin. El destino de la bifurcacin es calculada sumando un byte signado de desplazamiento a la OCL +2 o +4.
Direccionamiento Indexado con Desplazamiento Constante de 9 bits La base del registro ndice puede ser X, Y, SP, o PC El rango del desplazamiento es de -256 a +255 Ejemplo: ldaa stab $FF,X -$20,Y
Algunas instrucciones tienen dos direcciones efectivas: MOVB $2000, $3000 Mueve el byte de la direccin $2000 a la $ 3000 MOVW 0, X, 0, Y Mueve la palabra de la direccin apuntada por X a la direccin apuntada por Y
Tipos de Datos
El 68HC12 soporta:
Bits Enteros signados de 5 bits Enteros signados y no signados de 8 bits Enteros signados de 9 bits Nmeros BCD de dos dgitos, 8 bits Enteros signados y no signados de 16 bits Direccionamiento efectivo de 16 bits Enteros signados y no signados de 32 bits
Un entero con mltiples bytes se almacena en la memoria desde el byte ms significativo al byte menos significativo, comenzando desde una direccin menor a una mayor. Un nmero puede representarse en formato binario, octal, decimal o hexadecimal.
CONJUNTO DE INSTRUCCIONES
Toma de decisin
Instrucciones de Carga
Instrucciones de Almacenamiento
Instrucciones de Transferencia
Instrucciones de Intercambio
Instrucciones de Movimiento
Instrucciones de Suma
Instrucciones de Resta
Ejemplo
Escriba un programa que sume dos nmeros de 16 bits, que estn almacenados en $0800-$0801 y $0802-$0803, y guarde la suma en $0900-$0901. Solucin: org ldd addd std end La Bandera de Acarreo - Corresponde al bit 0 del registro CCR. - Se pone en 1 cuando el resultado de la suma produce un acarreo de 1. - Se pone en 1 cuando el resultado de la resta produce un prestado de 1. - Habilita al usuario para implementar aritmtica de multiprecisin. $A000 $0800 $0802 $0900
Ejemplo
Escriba un programa que sume dos nmeros de 4 bytes almacenados en $0800$0803 y en $0804-$0807, guardar el resultado en $0810-$0813. Solucin: La adicin comienza con el bit menos significativo y contina hasta el bit ms significativo.
org ldd addd std ldaa adca staa ldaa adca staa end $B000 $0802 ; sumar y guardar los dos bytes menos significativos $0806 ; $0812 ; $0801 ; sumar y guardar los segundos bytes ms significativos $0805 ; $0811 ; $0800 ; sumar y guardar los bytes ms significativos $0804 ; $0810 ;
Ejemplo
Escriba un programa que reste el nmero hexadecimal almacenado en $0804$0807 al nmero hexadecimal almacenado en $0800-$0803, guardar el resultado en $0800-$0803. Solucin: La resta inicia en el bit ms significativo y contina hacia el bit ms significativo.
org ldd subd std ldaa sbca staa ldaa sbca staa end $C000 $0802 $0806 $0802 $0801 $0805 $0801 $0800 $0804 $0800 ; restar y guardar los dos bytes menos significativos ; ; ; restar y guardar la diferencia de los segundos bytes ; ms significativos ; ; restar y guardar la diferencia de los bytes ms significativos ; ;
Ejemplo
Escriba un programa que sume dos nmeros de 4 bytes almacenados en $0800$0803 y en $0804-$0807, guardar el resultado en $0810-$0813. Solucin: La adicin comienza con el byte menos significativo y contina hasta el byte ms significativo.
org ldd addd std ldaa adca staa ldaa adca staa end $B000 $0802 ; sumar y guardar los dos bytes menos significativos $0806 ; $0812 ; $0801 ; sumar y guardar los segundos bytes ms significativos $0805 ; $0811 ; $0800 ; sumar y guardar los bytes ms significativos $0804 ; $0810 ;
Instrucciones de Decremento
Instrucciones de Incremento
Instrucciones de Comparacin
Instrucciones de Prueba
Instrucciones Lgicas
Operaciones Lgicas
Operaciones de Desplazamiento
Instrucciones de Bifurcacin
(Cortas)
Instrucciones de Bifurcacin
(Cortas)
Instrucciones de Bifurcacin
(Largas)
Instrucciones de Bifurcacin
(Largas)
Ejercicio
Escribir un cdigo en el lenguaje assembly para sumar un arreglo de N nmeros y escribir el resultado en las localidades de memoria $0800 y $0801
Asignacin de espacio para variables y resultados Inicializar Programa Datos
Ejemplo
N sum i equ org rmb rmb org ldaa staa staa staa loop ldab cmpb beq ldx abx ldab ldy aby sty inc bra bra db 10 $0800 2 1 $8000 #0 i sum sum + 1 i #N fin #data 0,x sum sum i loop fin 1,2,3,4,5,6,8,7,10,9 ; inicializa el valor de N, equ=igual ; definicin del origen para resultados y variables ; rmb=Bytes de Reserva de Memoria.
; etiqueta loop ; compara el nmero de veces que se retoma loop ; data- direccin de inicio de los nmeros que sern ; sumados ; Modo de direccionamiento Indexado
fin data
; bifurcacin incondicional ; interrupcin de software ; db- define byte. Se definen 10 valores de datos ; los valores son almacenados al final del programa
Bifurcacin corta Usar BRSET, PORTA, #$0F, FINISH Este comando resulta en una operacin de bifurcacin si alguno de los bits entre el 3 y el 0 de la variable PORTA est en 1. El objetivo de la operacin bifurcacin es la etiqueta FINISH. #$0F define la mscara utilizada en la variable PORTA. Esta operacin permite que el objetivo de la bifurcacin est entre -128 a +127 bytes desde la instruccin que sigue de la BRSET.
Pila o STACK
Es un grupo de localidades de memoria en el que los datos son almacenados temporalmente.
Subrutinas, interrupciones.
Los datos en el stack pueden accederse en una sola direccin (de la direccin ms alta a la ms baja en el caso del HC12). El apuntador del stack (SP) rastrea la direccin ms alta del stack. Se debe tener suficiente espacio disponible, asignado para el stack, para prevenir que los datos o programas se corrompan. Se debe meter para almacenar datos en el stack. Se debe sacar para remover los datos del stack. El nmero de operaciones meter y sacar, debe estar balanceado.
Instrucciones de Pila
Instrucciones de Pila
La operacin PULL trabaja exactamente opuesta a PUSH. En el HCS12GC32 la RAM termina en la localidad $0FFF. Poner el SP en $1000 es usualmente una buena opcin, puesto que el Stack crece hacia abajo
Ejemplo
$0000 $03FF $0800 $0FFF
$8000
$C000
$FF00 $FFFF
Vectores
Monochip
Ejemplo
LDAA #$02 STAA DDRA TOP LDAA PORTA ANDA #$01 BEQ TOP JSR DELAY BSET PORTA,$02 LDAA #$25 DLY JSR DELAY DECA BNE DLY BCLR PORTA,$02 CERRADO BRSET PORTA,$00,CERRADO JSR DELAY BRA TOP INIC
Multiplicacin y Divisin
Ejemplo Escribir una secuencia de instrucciones para multiplicar los nmeros de 16 bits almacenados en $0800-$0801 y en $0802-$0803, y guardar el producto en $0900$0903. Solucin: ldd ldy emul sty std $0800 $0802 $0900 $0902
Ejemplo Escribir una secuencia de instrucciones para dividir el nmero de 16 bits almacenado en $0820-$0821 entre el nmero de 16 bits almacenado en $1005-$1006, y guardar el cociente y el residuo en $0900 y $0902, respectivamente. Solucin: ldd ldx idiv stx std $0805 $0820 $0900 $0902 ; guardar el cociente ; guardar el residuo
(2 de 35)
(3 de 35)
(4 de 35)
(5 de 35)
(6 de 35)
(7 de 35)
(8 de 35)
(9 de 35)
(10 de 35)
(11 de 35)
(12 de 35)
(13 de 35)
(14 de 35)
(15 de 35)
(16 de 35)
(17 de 35)
(18 de 35)
(19 de 35)
(20 de 35)
(21 de 35)
(22 de 35)
(23 de 35)
(24 de 35)
(25 de 35)
(26 de 35)
(27 de 35)
(28 de 35)
(29 de 35)
(30 de 35)
(31 de 35)
(32 de 35)
(33 de 35)
(34 de 35)
(35 de 35)
Asumir que el HCS12 trabaja con el oscilador de cristal con una frecuencia de 6 MHz, entonces la frecuancia E es de 8 MHz, por lo tanto su periodo de reloj es de 125 ns. Por esta razn la secuencia de instrucciones de la siguiente diapositiva tardara 5 ms para ejecutarse.
Ejemplo Escribir un programa de bucle para crear retardos de 100 ms. Solucin: Un retardo de 100 ms se puede crear repitiendo el bucle previo 20,000 tiempos. La siguiente secuencia de instrucciones crea un retardo de 100 ms. ldx #20000 loop psha ; 2 ciclos E pula ; 3 ciclos E psha pula psha pula psha pula psha pula psha pula psha pula nop ; 1 ciclo E nop ; 1 ciclo E dbne x,loop ; 3 ciclos E
Ejemplo Escribir una secuencia de instrucciones para crear un tiempo de retardo de 10 segundos. Solucin: Repitiendo durante 100 tiempos la secuencia de instrucciones previa, se podr crear un retardo de 10 segundos.
ldab out_loop ldx in_loop psha pula psha pula psha pula psha pula psha pula psha pula psha pula nop nop dbne dbne #100 #20000 ; 2 ciclos E ; 3 ciclos E
x,in_loop b,out_loop
ERS
270
III.- Comentarios
Explican la funcin de una sola o un grupo de ERS 271 instrucciones
ERS
272
(1) No hay etiqueta (b) movb; es el mnemotcnico de la instruccin (c) 0,X,0,Y; es el campo del operador (d) ; copiar de memoria a memoria; es un comentario
ERS
273
ORG $1000 LDAB #$FF pone el byte del cdigo de operacin para la instruccin LDAB #$FF en la localidad de memoria $1000
ERS 274
EQU (Equate a Symbol to a Value) - Con esta directiva le asignamos un valor a una etiqueta. - Al utilizar esta directiva logramos que el programa sea ms entendible al leerlo. - Ejemplos: arr_cnt EQU 100 oc_cnt EQU 50
ERS
275
DS (Define Storage): La directiva DS reserva localidades de memoria contiguas por medio del incremento del contador de localidades del ensamblador por el nmero de bytes especificado en la expresin . El bloque de memoria reservado no es inicializado con ningn valor.
DS $5 ;reserva $5 bytes en memoria RAM
ERS 276
DC (Define Constant): La directiva DC reserva localidades de memoria e inicializa valores a estas. Se pueden definir constantes de diferentes tamaos DC.B $25 ;Define un byte DC.W $1234 ;Define una palabra DC.L $12345678 ;Define cuatro bytes
array
msg
277
Macro
-
Nombre que se le asigna a un grupo de instrucciones. Se utiliza MACRO y ENDM para delimitar el macro. Ejemplo de macro: sumOf3 ldaa adda adda endm macro arg1 arg2 arg3 arg1,arg2,arg3
Para invocar un macro anteriormente declarado: escriba debajo del nombre y de los argumentos del macro. sumOf3 $1000,$1001,$1002 se reemplaza por ldaa $1000 adda $1001 adda $1002
ERS 278
ABSENTRY. (Application Entry Point). Especifica el punto de entrada en un programa en assembly absoluto ABSENTRY <etiqueta>
ERS
279
Cdigo Assembly
Cdigo de mquina
ERS 280
Otra forma de expresar el plan general es utilizando un Diagrama de Flujo o un pseudo cdigo.
Programando. Convertir el Algoritmo o Diagrama de Flujo en un programa. Pruebas del programa. Mantenimiento del programa.
ERS 281
Entender el problema
Cmo es que funciona el teclado? Dnde quedan las entradas y las salidas provenientes del teclado? Cul es el algoritmo a utilizar? Dnde se almacenar la salida?
Interfaz del teclado
Disear en Niveles
Simplificar el problema (Diseo Jerrquico)
Almacenar el valor
Identificar si alguna tecla est o no presionada Verificar si hay teclas presionadas Retraso para quitar rebote Qu tecla est presionada? Almacenar y grabar el valor una sola vez ERS
283
Identificacin de la tecla
Post-proceso
Posponer detalles
Almacenar el valor
Redefinir el diseo
ERS
284
Pseudocdigos
Pseudo cdigo secuencia Comienza A ... Termina A Comienza B ... Termina B Comienza C ... Termina C Pseudo cdigo decisin Si X entonces Comienza A Termina A de otro modo Comienza B Termina B fin Si X
ERS
Pseudo cdigo repeticin Mientras X Hacer Comienza A Termina A tambin Comienza B Termina B Modifica X Fin Mientras X
285
Subrutina
Decisin no
286
ERS
287
ERS
288
ERS
289
ERS
290
ERS
291
Veamos tres elementos de la programacin estructurada que pueden aparecer en el lenguaje assembly
ERS
292
Secuencia
La secuencia es directa. Deber haber un bloque de comentarios describiendo que es lo que hace la siguiente seccin del cdigo en assembly. Recuerde que el flujo del programa entra en la parte superior y sale en la parte inferior. No se debe entrar o salir del cdigo entre has A y termina A, excepto si hay un llamado y retorno de una subrutina o una interrupcin. No salte hacia dentro o hacia fuera dentro del bloque de una secuencia.
ERS
293
Ejemplo (secuencia)
Escriba un programa para restar el contenido de la localidad de memoria $1005 a la suma realizada entre las localidades de memoria $1000 y $1002, almacenar la diferencia en $1010.
Solucin:
*******************************************
; Programa para restar el contenido de ;la localidad de memoria $1005 a la suma ;realizada entre las localidades de memoria $1000 ; y $1002, almacenar la diferencia en $1010 **********************************************************
end
ERS
295
Ejemplo Escribir un programa que multiplique dos nmeros no signados de 32 bits almacenados en M~M+3 y N~N+3, respectivamente. Guardar el producto en P~P+7. Solucin: org M ds.b N ds.b P ds.b org ldd ldy emul sty std ldd ldy emul sty std ldd ldy emul
$1000 4 4 8 $1500 M+2 N+2 ; calcular MLNL P+4 P+6 M N ; calcular MHNH P P+2 M N+2 ; calcular MHNL
ERS 296
; sumar MHNL a la localidad de memoria P+2~P+5 addd P+4 std P+4 tfr Y,D adcb P+3 stab P+3 adca P+2 staa P+2 ; enviar el acarreo al byte ms significativo ldaa P+1 adca #0 ; sumar el acarreo a la localidad P+1 staa P+1 ; ldaa P ; sumar el acarreo a la localidad P adca #0 ; staa P ; ; calcular MLNH ldd M+2 ldy N emul
ERS 297
; sumar MLNH a la localidad de memoria P+2 ~ P+5 addd P+4 std P+4 tfr Y,D adcb P+3 stab P+3 adca P+2 staa P+2 ; enviar el acarreo al byte ms significativo clra adca P+1 staa P+1 ldaa P adca #0 staa P end
ERS
298
Ejemplo Escribe un programa que convierta al formato BCD el nmero de 16 bits almacenado en $1000-$1001, guardar el resultado en $1010-$1014. Convertir cada dgito BCD en cdigo ASCII y guardarlo en un byte. Solucin: -Un nmero binario puede ser convertido al formato BCD usando repetidamente la divisin entre 10. - El nmero binario de 16 bits ms largo es 65535 el cual tiene cinco dgitos decimales. - La primera divisin entre 10 genera el dgito menos significativo, la segunda divisin entre 10 obtiene el segundo dgito menos significativo, y as sucesivamente.
data result org dc.w org ds.b org ldd ldy ldx idiv addb stab xgdx ldx $1000 12345 $1010 5 $1500 data #result #10 #$30 4,Y #10 ERS 299 ; convertir el dgito en cdigo ASCII ; guardar el dgito menos significativo ; se realiza una prueba al dato ; bytes reservados para guardar el resultado
idiv adcb stab xgdx ldx idiv addb stab xgdx ldx idiv addb stab xgdx addb stab end
#$30 3,Y #10 #$30 2,Y #10 #$30 1,Y #$30 0,Y
ERS
300
Construccin IF
ERS
301
Ejemplo de Construccin IF
ERS
302
Construccin IF - ELSE
ERS
303
Ensamblador inicio Idaa TEM cmpa #Tset ble pren jsr apag bra cont jsr adel pren jsr ene
304
Hay cuatro tipos de instrucciones de bifurcacin: Bifurcacin incondicional: siempre se ejecuta. Bifurcaciones Simples: Se elige esta instruccin cuando un bit especfico del registro CCR se encuentra especficamente en un estado. Bifurcacin no signada: Esta instruccin es elegida cuando la comparacin de dos nmeros sin signo da como resultado una combinacin especfica de bits en el registro CCR. Bifurcacin signada: Se elige esta bifurcacin cuando la comparacin entre cantidades con signo da como resultado una combinacin especfica de bits en el registro CCR. Existen dos categoras de Instrucciones de Bifurcacin: Bifurcaciones Cortas: dentro del rango de -128 ~ +127 bytes. Bifurcaciones Largas: dentro del rango de 64KB.
ERS 306
ERS
307
ERS
308
ERS
309
ERS
310
Ejemplo Escribir un programa que sume un arreglo de N nmeros de 8 bits y guarde el resultado en las localidades de memoria $0800~$0801. Usar la estructura de lazo For i = n1 to n2 do. Solucin:
N sum i equ org rmb rmb org ldaa staa staa staa ldab cmpb beq ldx abx ldab ldy aby sty inc bra swi dc.b end 20 $0800 2 1 $8000 #0 i sum sum+1 i #N done #array 0,X sum sum i loop
; sum 0 ; ; is i = N?
loop
done Array
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
ERS
311
Ejemplo Escribir un programa para encontrar el mximo elemento de un arreglo de N elementos de 8 bits, usar la estructura de lazo: repeat S until C Solucin:
ERS
312
equ org max_val ds.b org ldaa staa ldx ldab loop ldaa cmpa bge ldaa staa chk_end dex dbne forever bra array db db end
20 $0800 1 $8000 array max_val #array+N-1 #N-1 max_val 0,x chk_end 0,x max_val
; establecer a array[0] temporalmente como el max ; ; comenzar en el final del array ; establecer el contador de lazo en N - 1
ERS
313
Construccin DO - WILE
ERS
314
Ensamblador loop jsr leecar stab 1,x+ cmpb #CR bne loop adel
ERS 315
Lazo WILE
while(c){ /*pro*/ }
ERS
316
leecar
leecar
Ensamblador start jsr leecar loop cmpb #CR beq ade stab 1,x+ jsr leecar bra loop ade ---
ERS
317
El Lazo FOR
ERS
for(S1;C;S2){ /*P*/ }
318
Ensamblador inicio ldab #100 lazo cmpb #0 beq adel jsr Proc decb bra lazo adel --ERS 319
La Construccin CASE
switch(c){ case G1: /*PROC1*/ break; case G2: /*PROC*/ /*PROC2*/ break; default: /*PROC3*/ }
ERS
320
Ensamblador inicio jsr leecar cmpb #A bne caseb jsr comA bra adel caseb cmpb #B bne dcom jsr comB bra adel Dcom jsr Dcom adel --321
ERS
Subrutinas
Una secuencia de instrucciones pueden ser llamadas desde diferentes partes del programa. Permiten que una misma operacin se ejecute con diferentes parmetros. Simplifica el diseo de un programa complejo utilizando el enfoque de divide y venceras. Instrucciones relacionadas con las llamadas a subrutinas:
[<label>] [<label>] [<label>] [<label>] bsr jsr rts call rtc <rel> <opr> <opr> [<comment>] [<comment>] [<comment>] [<comment>] ; bifurcacin a una subrutina ; salta a una subrutina ; regresa a la subrutina ; para usar con la memoria expandida ; regresa de CALL
donde <rel> es el desplazamiento a la subrutina <opr> es la direccn de la subrutina y se especifican con los modos de direccionamiento ERS DIR, EXT, o INDexado.
323
Diseo Modular
El diseo jerrquico y estructurado es la base del diseo modular. Funciones y Subrutinas. Mdulo de una sola funcin. Mdulo de acoplamiento.
Control de acoplamiento Acoplamiento de datos
ERS 325
Estructura de un Programa
ERS
326
ERS
327
Retorno de Resultados
Usar registros Usar la pila (el solicitante crea una localidad en donde se colocar el resultado) Usar la memoria global
ERS
Trama de Pila
La regin de la pila que almacena los parmetros entrantes, la direccin de retorno de la subrutina, las variables locales, y los registros guardados se refieren a la trama de pila. La trama de pila tambin es tambin llamada registro de activacin.
ERS
330
Trama de Pila
Ejemplo Dibujar una trama de pila para el siguiente segmento de programa despus de la ejecucin de la instruccin leas 10,sp:
ldd #$1234 pshd ldx #$4000 pshx jsr sub_xyz sub_xyz pshd pshx pshy leas -10,sp Solucin: La trama de pila se muestra en la Figura.
ERS
331
Programa Principal
ORG VAL ORG LDS LDAA JSR FCB SWI $A00 FCB $800 #$BFF VAL ROTLFT 4
BACK
Subrutina
ROTLFT ORG $900 PSHX PSHB TSX LDX 3,X LDAB 0,X TSTB BEQ AHEAD DECB ASLA ADCA #0 BRA BACK TSX INC 4,X BNE RET INC 3,X PULB PULX RTS 332
$0A
AHEAD
RET
ERS
Programa Principal
ORG $B00 LENGTH FCB 4 ORG RMB $B10 1
Subrutina
ORG $900 ; Save registers ZROCNT PSHA PSHB PSHX ;Get table length TSX LDX 4,X LDX 2,X LDAA 0,X ; Get table address TSX LDX 4,X LDX 0,X ; Initialize zero counter CLRB ; At end of table? AGAIN TSTA BEQ RET ; Is table entry zero? TST 0,X BNE AHEAD ERS
Subrutina (cont)
; Increment counter INCB ; Decrement loop counter and branch AHEAD DECA INX BRA AGAIN ; Send result to main program RET TSX LDX 4,X LDX 4,X STAB 0,X ; Adjust return address TSX LDD 4,X ADDD #6 STD 4,X ; Restore registers PULX PULB PULA RTS
ANS
ORG $800 ; Initialize stack and call subroutine LDS #$BFF JSR ZROCNT ; Addresses of parameters ; Call by reference TABLE FDB TABLE FDB LENGTH FDB ANS SWI
333
Ejemplos de Subrutinas
Algoritmo para encontrar el mximo comn divisor de los enteros m y n
Paso 1
If m = n then gcd m; return;
Paso 2
If n < m then intercambia m y n.
Paso 3
gcd 1. If m = 1 or n = 1 then retorna.
Paso 4
p = n % m;
Paso 5
if (p == 0) then m es el mcd. else n m; m p; goto Step 4.
ERS 334
Ejemplo Escribir una subrutina para calcular el mximo comn divisor de dos nmeros enteros de 16 bits sin signo. Solucin: los dos parmetros entrantes de 16 bits son pasados al registro de ndice X y al doble acumulador D. La trama de pila de esta subrutina se muestra a continuacin.
ERS
335
m n m_local n_local
equ equ equ equ org gcd ds.w org lds ldd pshd ldd pshd jsr std leas swi find_gcd pshx gcd_loop ldd ldx idiv cpd beq
; reajustar el SP de la pila para la variable local m ; reajustar el SP de la pila para la variable local n ; mantener el mcd de m y n ; establecer el apuntador a pila ; poner en la pila a m ; ingresar a m en la pila ; ; poner en la pila a n ; ingresar a n en la pila ;
ERS
336
done
ERS
337
Excepciones
Una manera de introducir asincrona para mejorar tiempos de respuesta.
ERS
338
Excepciones y Resets
ERS
339
Excepciones
Las excepciones son eventos que requiren procesamiento fuera del flujo normal de la ejecucin de un programa tal como una interrupcin. Las excepciones en el CPU12 incluyen resets, una trampa de cdigo de operacin no implementado, una interrupcin por software, interrupciones X-bit , e interrupciones I-bit (externas). Cada excepcin tiene asociada un vector de16-bit el cual apunta a la localidad de memoria donde la rutina que maneja la excepcin esta localizada. Los vectores estan almacenados en los 128 bytes superiores del mapa de ERS memoria de 64-Kbyte. 340
Cada excepcin tiene asociada un vector de 16-bit el cual apunta a la localidad de memoria donde la rutina que maneja la excepcin esta localizada. Los vectores estan almacenados en los 128 bytes superiores del mapa de memoria de 64-Kbyte.
ERS 341
ERS
342
Funciones de la Interupciones . - Coordinar actividades de E/S as como prevenir que el CPU no se sature de trabajo. - Proveer una forma exitosa para salir de los errores. - Recordar al CPU sobre sus Tareas de rutina. Interrupcin Enmascarada - Interrupciones que pueden ser ignoradas por el CPU. - Una interrupcin enmascarada debe ser habilitada antes de que el CPU pueda ser interrumpido. - Una interrupcin es habilitada esribiendo un 1 en la bandera de Habilitacin. - Las interrupciones que NO pueden ser ignoradas por el CPU se llaman Interrupciones No Enmascaradas.
ERS 343
Servicio de Interrupcin.
El CPU ejecuta programas que son llamados por la rutina del servicio de interrupcin. El ciclo completo de un Servicio de Interrupcin incluye:
Guardar el valor asignado al contador de pograma en una pila (stack). Guardar el estado del CPU (incluyendo el registro de estado del CPU y otros registros) en una pila. Identificar las causas de la Interrupcin. Resolver la direccin de inicio que corresponde a la rutina del Servicio de Interrupcin. Ejecutar la rutina del Servicio de Interrupcin. Restaurar el estado del CPU y del contador de programa almacenados en la pila. Reiniciar el programa interrumpido.
ERS 344
Vector de Interrupcin.
Iniciar la direccin de la rutina del Servicio de Interrupcin.
ERS
346
Reset
Los valores iniciales de algunos registros del CPU, los flip-flops y los registros de control de los registros de E/S deben ser establecidas correctamente para el buen funcionamiento de la computadora. Los mecanismos de Reset establecen las condiciones iniciales para sistemas computacionales. Existen al menos 2 tipos de Resets: el reset de encendido y el reset manual.
El reset de encendido establece los valores iniciales de los registros y de los registros de control para E/S. El reset manual permite a la computadora salir de la mayora de las condiciones de error si el hardware no falla y siempre y cuando est encendida.
347
ERS
348
7 IRQE reset: 0
6
IRQEN
5 0 0
4 0 0
3 0 0
2 0 0
1 0 0
0 0 0
IRQE -- IRQ edge sensitive only bit IRQE can be written once in normal mode. In special modes, it can be written any time, but the first write is ignored. 1 = IRQ pin responds only to falling edge 0 = IRQ pin responds to low level. IRQEN -- IRQ enable bit IRQEN bit can be written any time in all modes. The IRQ pin has an internal pullup. 1 = IRQ pin interrupt enabled 0 = IRQ pin interrupt disabled Figure 6.2 Interrupt control register (IRQCR)
ERS
350
ERS
351
ERS
352
ERS
353
ERS
354
ERS
355
Los seis vectores mas altos son usados para resets e interrupcin no enmascarada. El resto de los vectores son usados para interrupciones enmascaradas. Todos los vectores son programados para que apunten a la direccin de la rutina apropiada de servicio. ERS 356
Contras
Es necesario estar seguro que la seal de IRQ se desactiv despus de que se complete la rutina del Servico IRQ, solo si hay en espera una solicitud de interrupcin.
ERS 357
Contras:
No es adecuado para un ambiente ruidoso porque cuando hay una cada de orden por causa del ruido, sta se reconoce como una Interrupcin.
ERS 358
La organizacin de una pila a la entrada de una interrupcin. . Cuando hay una interrupcin el HCS12 salva todos los registros del CPU. La forma de guardar los registros del CPU se muestran a continuacin.
La Instruccin RTI. RTI se utiliza para finalizar rutinas de Servicios de Interrupcin. RTI restaurar los registros del CPU desde la pila. El HCS12 continuar ejecutando el programa interrumpido a menos que haya otra solicitud de interrupcin.
ERS 360
Interrupciones No Enmascaradas
Pin de Inrrupcin XIRQ.
La Interrupcin XIRQ es deshabilitada al reiniciar el sistema y al entrar a la rutina de otro servicio de Interrupcin. Despus de la inicializacin mnima del sistema, el software puede limpiar el bit X del registro CCR para habilitar (usando la instruccin andcc #$BF ) la interrupcin XIRQ. El Software no puede modificar el bit X una vez que est habilitado. Cuando se reconoce una Interrupcin no enmascarada, tanto el bit X como el bit I son habilitados despus de salvar los registros del CPU. Cuando se ejecuta una Interrupcin RTI al finalizar una rutina del servicio XIRQ se restaurarn los bits X e I al estado que presentaban antes de la solicitud de interrupcin.
En lenguaje C.
Incluir las siguientes declaraciones al inicio del programa: #define INTERRUPT __attribute__((interrupt)) Inluir los archivos de cabezera vectors12.h usando la declaracin: #include c:\egnu091\include\vectors12.h Declarar el prototipo de los servicios de rutina de la siguiente forma: #define INTERRUPT IRQISR(void); Almacenar el nombre de la rutina del servicio IRQ en la direccin destinada: UserIRQ = (unsigned short)&IRQISR;
ERS 362
Solucin
Las versiones del programa en Ensamblador y Lenguaje C se muestran a continuacin.
ERS 363
#include <hc9S12GC32.h> org $1000 count ds.b 1 org $1500 lds #$1500 movw #IRQISR,UserIRQ clr count movb #$FF,DDRB bset DDRJ,$02 bclr PTJ,$02 movb count,PTB movb #$C0,IRQCR
cli
; reserva un byte para count ; establece el apuntador a pila ; establece el vector de interrupcin en SRAM ; configura como salida al Puerto B ; configura el pin PJ1 para salida ; habilita los LEDs para encender ; muestra el valor de count en los LEDs ; habilita pin de interrupcin IRQ, selecciona disparador de borde
; "
forever
nop bra forever ; espera por el pin de interrupcin IRQ ; **************************************************************************** ; Esta es la rutina de servicio IRQ. ; **************************************************************************** IRQISR inc count ; incrementa count movb count,PTB ; muestra el valor de count en LEDs rti end
ERS 364
#include "c:\egnu091\include\hcs12.h" #include "c:\egnu091\include\vectors12.h" #define INTERRUPT __attribute__((interrupt)) void INTERRUPT IRQISR(void); unsigned char cnt; int main(void) { UserIRQ = (unsigned short)&IRQISR; DDRB = 0xFF; cnt = 0; DDRJ |= BIT1; /* configura el pin PJ1 como salida */ PTJ &= ~BIT1; /* habilita LEDs para encender */ IRQCR = 0xC0; /* habilita la interrupcion IRQ al caer el borde */ asm("cli"); /* habilita la interrupcion global */ while(1); /* siempre espera por una interrupcin */ return 0; } void INTERRUPT IRQISR(void) { cnt++; PTB = cnt; }
ERS 365
ERS
367
ERS
369
(6.1)
0 SYN0 0
7 0 reset: 0
6 0 0
5 0 0
4 0 0
3 0
2 0
1 0
0 0
ERS
370
La seleccin del PLL para la generacin del reloj est controlada por el registro CRGSEL.
ERS
371
CME: clock monitor enable bit 0 = clock monitor is disabled 1 = clock monitor is enabled. Slow or stopped clocks will cause a clock monitor reset sequence or self clock mode PLLON: phase lock loop on bit 0 = PLL is turned off 1 = PLL is turned on. If AUTO bit is set, the PLL will lock automatically. AUTO: automatic bandwidth control bit 0 = automatic mode control is disabled and the PLL is under software control, using ACQ bit. 1 = high bandwidth filter is selected ACQ: acquisition bit (if AUTO bit = 1, this bit has no effect) 0 = low bandwidth filter is selected 1 = high bandwidth filter is selected PRE: RTI enable during pseudo stop bit 0 = RTI stops running during pseudo stop mode 1 = RTI continues running during pseudo stop mode PCE: COP enable during pseudo stop bit 0 = COP stops running during pseudo stop mode 1 = COP continues running during pseudo stop mode. SCME: self clock mode enable bit 0 = detection of crystal clock failure causes clock monitor reset 1 = detection of crystal clock failure forces the MCU in self clock mode Figure 6.14 The CRG PLL control register (PLLCTL)
ERS
372
movb #$60,PLLCTL
Adems, el pin XCLKS debe estar a tierra para seleccionar al oscilador como fuente de reloj.
ERS 373
movb
#$60,PLLCTL
El pin XCLKS debe estar en alto para poder seleccionar al crystal externo como generador de la seal de reloj. ERS 374
Monitor de reloj
El monitor de reloj esta basado en un circuito RC. Si no se detectan bordes de OSCCLK con el tiempo de retraso del RC, el monitor de reloj quiza de un reset al MCU si el bit CME del registro PLLCTL se habilita en 1. El bit SCME del registro PLLCTL debe ser puesto a 0 para que el monitor de reloj trabaje.
ERS
375
ERS
377
ERS
378
ERS
380
Modo en Alto
El modo en alto entra cuando el MCU ejecuta la instruccin STOP. Cuando esta instruccin se ejecuta el MCU entra en un modo de inactividad.
La instruccin STOP no tiene ningn efecto si la bandera S del registro CCR es 1.
En el modo de alto, todas las seales de reloj en el MCU se detienen. Al activar un RESET, IRQ, o la seal XIRQ se termina el modo de inactividad.
ERS 382
Resets
Hay cuatro tipos de reset:
El reset de encendido (POR) y el reset detector de bajo voltaje (LVD). La terminal RESET El reset COP Monitor de Reloj de reset
ERS
383
Reset de Encendido
El HCS12 tiene un circuito para activar un reset cuando el suministro de VDD ha llegado a un cierto nivel. El mdulo CRG realiza un control de calidad en las seales de reloj entrantes tan pronto como se dispara el reset de encendido. El mdulo CRG liberar la seal de reset cuando se cumpla el control de calidad.
ERS 384
Reset Externo
La terminal de RESET permite que el usuario realice un reset al MCU. El MCU puede diferenciar entre un reset externo y una seal interna de reset. Cuando el suministro de energa baja de cierto nivel, puede corromper a la EEPROM.
Es aconsejable tener un circuito que pueda detectar esta situacin y que active el reset del MCU.
El chip de Motorola MC34064 puede detectar el voltaje bajo en el suministro de energa y dar un reset al CPU. Incorporando un circuito MC34064 de reset externo se ERS muestra en la Figura.
385
ERS
386
Esquemas de E/S
Esquema Aislado de E/S
El microprocesador tiene instrucciones dedicadas para operaciones de E/S. El microprocesador separa un espacio de direcciones para dispositivos de E/S.
ERS
391
ERS
392
Mapa de Memoria
ERS
393
ERS
394
Mapa de Registros
(1 de 37)
ERS
395
(2 de 37)
ERS
396
(3 de 37)
ERS
397
(4 de 37)
ERS
398
(5 de 37)
ERS
399
(6 de 37)
ERS
400
(7 de 37)
ERS
401
(8 de 37)
ERS
402
(9 de 37)
ERS
403
(10 de 37)
ERS
404
(11 de 37)
ERS
405
(12 de 37)
ERS
406
(13 de 37)
ERS
407
(14 de 37)
ERS
408
(15 de 37)
ERS
409
(16 de 37)
ERS
410
(17 de 37)
ERS
411
(18 de 37)
ERS
412
(19 de 37)
ERS
413
(20 de 37)
ERS
414
(21 de 37)
ERS
415
(22 de 37)
ERS
416
(23 de 37)
ERS
417
(24 de 37)
ERS
418
(25 de 37)
ERS
419
(26 de 37)
ERS
420
(27 de 37)
ERS
421
(28 de 37)
ERS
422
(29 de 37)
ERS
423
(30 de 37)
ERS
424
(31 de 37)
ERS
425
(32 de 37)
ERS
426
(33 de 37)
ERS
427
(34 de 37)
ERS
428
(35 de 37)
ERS
429
(36 de 37)
ERS
430
(37 de 37)
ERS
431
Puertos en el HCS12
Cmo sacar los datos al exterior del microcontrolador? Un PUERTO en el HCS12 es el dispositivo que el HCS12 utiliza para controlar algn hardware . Muchos de los puertos del HCS12 se utilizan para comunicar al HCS12 con hardware al exterior de ste. El HCS12 se comunica con sus puertos leyendo y escribiendo en las localidades de memoria $0000 a $03FF. Dos de los puertos ms simples para utilizar, son el PORTA y el PORTB
ERS 432
ERS
433
Puertos en el HC12
Se puede hacer que uno o todos los bits de los PORTA y PORTB sean salidas, escribiendo 1 en los bits correspondientes a sus Registros de Direccin de Datos. El registro de Direccin de Datos del PORTA (DDRA) se localiza en la direccin de memoria $0002. Para hacer que todos los bits del PORTA sean salidas, se escribe $FF en el DDRA. Para hacer que los cuatro bits ms bajos del PORTA sean salidas y los cuatro bits ms altos sean entradas, escribir $0F en el DDRA. El registro de Direccin de Datos del PORTB (DDRB) se localiza en la direccin de memoria $0003. Para hacer que todos los bits del PORTB sean salidas, se escribe $FF en el DDRB. Cuando se enciende o reinicia el HCS12, ambos puertos A y B son puertos de entrada. ERS 434
ERS
435
ERS
436
ERS
437
ERS
438
ERS
439
ERS
440
ERS
441
El PORTB funciona de la misma manera, excepto que DDRB est en la direccin 0x0003 y el PORTB est en la direccin 0x0001.
ERS 442
ERS
443
Se puede hacer que el PORTA sea una salida y el PORTB una entrada con una sola instruccin:
ERS
444
Comunicaciones Paralelas
ERS
446
Comunicaciones Paralelas
ERS
448
Comunicaciones Paralelas
ERS
450
Comunicaciones Paralelas
En la figura anterior, el microcontrolador emisor pone los datos en las lneas de datos y proporciona un DV bajo para indicar que hay nuevos datos disponibles. Cuando el microcontrolador receptor ve los nuevos datos disponibles, los lee de las lneas de datos, entonces proporciona un DR bajo para indicar que ha ledo los datos. Cuando el microcontrolador emisor ha visto el DR bajo, proporciona un DV alto. Cuando el microcontrolador receptor ve el DV alto, proporciona un DR alto. Ambas microcontroladores estn ahora listas para la siguiente transferencia de datos.
ERS 451
Puerto A y Puerto B
En forma general, El Puerto A lleva la parte alta de la seal de Direcciones y Datos A15/D15A8/D8 en tiempo multiplexado. En forma general, El Puerto B lleva la parte baja de la seal de Direcciones y Datos A7/D7A0/D0 en tiempo multiplexado. En modo monochip, estos dos puertos son utilizados para propsitos generales de E/S.
ERS 452
ERS
453
ERS
454
mostrado en la Figura. Encender cada LED a su vez por medio segundo y repetir, asumiendo que el HCS12 tiene un reloj de 24-MHz E.
- Para activar un LED a la vez por medio segundo, debemos sacar los valores de $80, $40, $20, $10, $08, $04, $02 y $01 y permanecer por medio segundo en ese valor.
ERS 455
forever led_lp
led_tab
ERS
456
Integrador
ERS 457
ERS
458
Ejemplo
$0000 $03FF $0800 $0FFF
$8000
$C000
$FF00 $FFFF
Vectores
ERS
459
Monochip
Ejemplo
LDAA #$02 STAA DDRA TOP LDAA PORTA ANDA #$01 BEQ TOP JSR DELAY BSET PORTA,$02 LDAA #$25 DLY JSR DELAY DECA BNE DLY BCLR PORTA,$02 CERRADO BRSET PORTA,$00,CERRADO JSR DELAY BRA TOP
ERS 460
INIC
Hay muchas tecnologas de Circuitos Integrados (CI) en uso. Algunas son Bipolares, as como otras son Unipolares (principalmente CMOS y BICMOS). Parmetros de Voltaje relacionados con la compatibilidad elctrica.
Voltaje de Entrada Alto (VIH) Voltaje de Entrada Bajo (VIL) Voltaje de Salida Alto (VOH) Voltaje de Salida Bajo (VOL)
ERS
461
ERS
463
Capacidad de Corriente
El dispositivo que transmitir a otro dispositivo debe tener suficiente abastecimiento (suministro de corriente) y capacidad de sinking (absorber corriente). La corriente fluye hacia afuera del dispositivo transmisor, cuando el voltaje de transmisin es alto. La corriente fluye hacia adentro del dispositivo transmisor cuando el voltaje de transmisin es bajo. El dispositivo transmisor debe ser capaz de abastecer (o quitar) la suficiente corriente que se necesite para que ambos dispositivos comiencen a transmitir y trabajar adecuadamente. Si un dispositivo no puede suministrar o quitar suficiente corriente es comn utilizar buffers para solucionar el problema. Las capacidades de corriente de un dispositivo lgico estn determinadas por las siguientes corrientes:
Corriente de Entrada Alta (IIH) Corriente de Entrada Baja (IIL) Corriente de Salida Alta (IOH) Corriente de Salida Baja (IOL)
Las capacidades de corriente que tienen diversas familias de chips lgicos se muestran en la Tabla siguiente.
ERS 464
1.
La IOH de un pin de salida debe ser igual o ms elevada que la corriente total que fluye en todos los pines perifricos que estn conectados a ese pin. La IOL de un pin de salida debe ser igual o ms elevada que la corriente total que fluye afuera de todos los pines perifricos que estn conectados a ese pin.
2.
ERS
465
Compatibilidad de Acoplamiento
No hay problemas de acoplamiento cuando est activado un pin del perifrico y ste no contiene latches o flip-flops. Cuando se controlan latches o unidades de flip-flop, necesitamos estar seguros que le tiempo de arranque de datos (data set up time (tSU)) y el tiempo de mantener datos (data hold time (tHD)) estn, ambos, satisfechos. Los requisitos de el tiempo de arranque de datos y el tiempo de amarre de datos estn ilustrados en la Figura siguiente.
ERS
466
Puerto E
Los pines del Puerto E son usados para el bus de control y las seales de solicitudes del servicio de interrupciones. Cuando un pin del Puerto E no se usa como seal de control o de interrupcin, se puede usar como un pin de propsitos general de E/S.
ERS 467
ERS
469
ERS
470
ERS
471
ERS
472
Puerto T
El puerto T esta conformado por el registro de datos (PTT), registro de direcciones de datos del Puerto T (DDRT), Registro de Puerto de salida (PTIT), Registro de Reduccin de Corriente (RDRT), Registro del dispositivo pull habilitador (PERT), y el Registro de seleccin de polaridad del puerto (PPST).
El registro PTIT permite al usuario leer el status de los pines del Puerto T. El registro RDRT puede configurar la unidad de potencia (salida de corriente) de cada uno de los pines del puerto, como carga completa o reducida. El registro PERT se utiliza para habilitar el pin de entrada del Puerto T si hay un dispositivo de pull-up o pull-down. El registro PPST indica si un dispositivo de pull-up o pull-down est conectado a una terminal.
Los pines del Puerto T tambin se utilizan como pines de comparacin y captura.
ERS 473
ERS
474
Puerto S
Los pines del Puerto S se utilizan para propsito general de E/S, interfaz de comunicacin serial y pines de interfaz serial con perifricos. El Puerto S tiene un registro PortS en modo de or alambrado (WOMS) adicionalmente a todos los registros asociados al Puerto T.
ERS
475
Puerto M
El Puerto M tiene todos los registros equivalentes a los que tiene el Puerto S y tambin un registro de mdulo de enrutamiento (MODRR).
El MODRR configura el cambio de rutas de CAN0, CAN4, SPI0, SPI1, y SPI2 en los pines definidos del puerto.
ERS 476
ERS
477
Ejemplo Indica una instruccin para configurar el registro MODRR para lograr
el siguiente enrutamiento del puerto:
1. CAN0: usar pins PM1 y PM0 2. CAN1: usar pins PM3 y PM2 3. CAN2: usar pins PM5 y PM4 4. CAN3: usar pins PM7 y PM6 5. I2C: usar PJ7 y PJ6 6. SPI0: usar pins PS7~PS4 7. SPI1: usar pins PH3~PH0 8. SPI2: usar pins PH7~PH4
Solucin: Este requisito de enrutamiento se puede lograr al prevenir a CAN4 de usar cualquier pin del puerto y mantener el valor por defecto de enrutamiento despus del RESET.
-La siguiente instruccin satisface este requisito. movb #$60,MODRR ; CAN4 debe ser deshabilitado
ERS
478
Ejemplo Indique una instruccin para configurar el registro MODRR para lograr el siguiente enrutamiento del puerto:
1. CAN0: usar pins PM1 y PM0 2. CAN1: usar pins PM3 y PM2 3. CAN2: deshabilitado 4. CAN3: deshabilitado 5. I2C: usar PJ7 y PJ6 6. SPI0: use pins PS7~PS4 7. SPI1: use pins PP3~PP0 8. SPI2: use pins PH7~PH4
ERS
479
Puertos J y P
Estos tres Puertos de E/S tiene el mismo grupo de registros:
Registro del puerto de E/S ( PTJ, PTP) Registro del puerto de Entrada (PTIJ, PTIP) Registro de Direcciones de Datos del Puerto ( DDRJ, DDRP) Registro de Carga Reducida del puerto (RDRJ, RDRP) Registro Habilitador de dispositivo Pull del puerto (PERJ, PERP) Registro de Seleccin de Polaridad del puerto (PPSJ, PPSP) Registro de Habilitacin de Interrupciones del puerto (PIEJ, PIEP) Registro de la Bandera de Interrupcin del puerto (PIFJ, PIFP)
Estos puertos tienen la capacidad de interrupcin disparada por Borde en la modalidad de OR alambrada. Lo bordes de Interrupciones pueden ser de bajada o de subida y se programan a travs del Registro Habilitador del Dispositivo del puerto y del Registro de Seleccin de Polaridad del puerto. El Registro de Interrupcin del Puerto permite que el usuario habilite las interrupciones en los tres puerto. ERS 480
Puerto AD0
Diverso dispositivos del HCS12 tienen convertidores A/D de 8-canales (AD0 y AD1). Cada dispositivo tiene solo un modulo de 8-canales al que se le hace referencia como AD. Cuando la funcin A/D est deshabilitada, estos dos puertos pueden utilizarse para propsitos generales de Entrada. Estos dos puertos no cuentan con Registros de Direcciones de Datos. Cada mdulo cuenta con un Registro Habilitador de Entradas Digitales. Con el fin de utilizar el pin A/D como una entrada digital, se necesitan establecer los bit asociados al registro.
ERS
481
ERS
482
ERS
483
Ejemplo Escribir una secuencia de instrucciones para mostrar 4 en el display de siete segmentos #4 de la Figure anterior Solucin: Para mostrar el dgito 4 en el display #4, necesitamos:
Sacar el valor hexadecimal $33 al Puerto B Poner el pin PK4 en 1 Poner los pines PK5 al PK3...P0 en 0
four #include <hcs12.inc> equ $33 movb #$3F,DDRK movb #$FF,DDRB bset PTK,$10 bclr PTK,$2F movb #four,PTB ; patrn de siete segmentos para dgito 4 ; configurar el PUERTO K como salida ; configurar PUERTO B como salida ; encender el display de siete segmentos #4 ; apagar los displays de siete segmentos #5, #3#0 ; sacar el patrn de siete segmentos por Puerto P
ERS
484
Ejemplo Escribe un programa que muestre 123456 en los seis displays de siete segmentos que se muestran en la Figura anterior. Solucin: Muestra 123456 en los display #5, #4, #3, #2, #1 y #0, respectivamente. Los valores que saldrn por el Puerto B y el Puerto K para mostrar un dgito a la vez se muestran en la Tabla.
ERS
486
#include pat_port equ pat_dir equ sel_port equ sel_dir equ org movb movb forever ldx loop movb movb ldy jsr cpx bne bra #include disp_tab dc.b dc.b dc.b dc.b dc.b dc.b end
mc68hcs12gc32.inc" PTB ; Puerto que opera el patrn de segmentos DDRB ; registro de direcciones del patrn de segmentos PTK ; Puerto seleccionador del digito DDRK ; Registro de direcciones de datos del puerto seleccionador del dgito $1500 #$FF,pat_dir ; configura el puerto de patrn como salida #$3F,sel_dir ; configura el puerto seleccionador de dgito como salida #disp_tab ; usa X como apuntador 1,x+,pat_port ; saca el patrn del dgito y mueve el apuntador 1,x+,sel_port ; saca el valor del dgito seleccionado y mueve el apuntador #1 ; espera por 1 ms delayby1ms ; #disp_tab+12 ; encuentra el final de la tabla loop forever "delay.asm" $30,$20 ; tabla del display de siete segmentos $6D,$10 $79,$08 $33,$04 $5B,$02 $5F,$01
ERS 487
#include <mc9hcs12gc32.inc> #include delay.c #define pat_port PTB /* puerto del patrn de siete segmentos */ #define pat_dir DDRB /* registro de direcciones de datos del puerto del patrn */ #define sel_port PTK /* puerto seleccionador de dgito */ #define sel_dir DDRK /* registro de direcciones del puerto seleccionador de dgito */ main (void) { char disp_tab[6][2] = {{0x30,0x20},{0x6D,0x10},{0x79,0x08}, {0x33,0x04},{0x5B,0x02},{0x5F,0x01}}; char i; pat_dir = 0xFF; /* configura pat_port como salida */ sel_dir = 0x3F; /* configura sel_port como salida */ while (1) { for (i = 0; i < 6; i++) { pat_port = disp_tab[i][0]; /* saca el patrn del segmento*/ sel_port = disp_tab[i][1]; /* enciende el display */ delaybyms(1); /* espera un 1 ms */ } } return 0; }
ERS 488
ERS
490
ERS
491
ERS
492
ERS
493
ERS
494
ERS
495
ERS
496
ERS
497
ERS
498
Regresar a Home
Poner las direcciones del contador en 0 El contenido del DDRAM no tiene cambios.
499
Conjunto de Instrucciones Establece la longitud de la interfaz (bit DL) para ser de 4 u 8 bits Selecciona el nmero de lneas (bit N) para ser de una o dos lneas Selecciona las fuentes de los caracteres (bit F) para ser de 5 8 o 5 10
ERS 500
ERS
502
ERS
503
Paso 2
Cambiar la seal R/W a un nivel bajo.
Paso 3
Cambia la seal E a un nivel alto.
Paso 4
Enviar los datos por el Puerto de Salida que est conectado al bus de datos del LCD. Necesitamos configurar el puerto de E/S como salida antes de escribir los datos en el kit del LCD.
Paso 5
ERS Poner la seal E en nivel bajo y asegurarse que la operacin se complet. 504
Paso 2
Poner la seal R/W en nivel bajo.
Paso 3
Poner la seal E en nivel alto.
Paso 4
Enviar datos por el puerto de E/S que est conectado al bus de datos del LCD.
Paso 5
Poner la seal E en bajo y asegurarse que la operacin interna se completo.
Este procedimiento necesita repetirse una vez cuando se utilizan LCDs con interfaz de 4 bits.
ERS 505
La funcin para configurar el LCD enva cuatro comandos al kit del LCD
Entry mode set Display on/off Function set Clear display
DDRH DDRK #$FF,lcdDIR lcdCtlDir,$B0 #5 delayby100ms #$38 cmd2lcd #$0F cmd2lcd #$06 cmd2lcd #$01 cmd2lcd #2 delayby1ms
lcdDIR equ lcdCtlDIR equ openlcd movb bset ldy jsr ldaa jsr ldaa jsr ldaa jsr ldaa jsr ldy jsr rts
; configura puerto H como salida ; configura los pines de control como salidas ; espera al LCD para completar configuracin ; interna ; establece datos de 8 bits, display de 2 lneas, fuente de 5x8 ; " ; enciende el display y el cursor parpadeante ; " ; mover cursor a la derecha (modo de entrada: set de instrucciones) ; " ; limpia pantalla del LCD y regresa a posicin original ; " ; espera hasta que la instruccin "clear display se complete ; "
ERS 507
Funcin para mostrar un caracter en el LCD El caracter que se mostrar esta almacenado en el acumulador A.
putc2lcd bset bclr bset staa nop nop bclr bset ldy jsr rts lcdCtl,lcdRS lcdCtl,lcdRW lcdCtl,lcdE lcdPort ; selecciona el registro de Datos del LCD ; habilita escritura del LCD ; Pon la seal E en un nivel alto ; enva los datos al LCD ; proveer a la seal E de suficiente longitud ; " ; pon la seal E en un nivel bajo ; pon la seal R/W en alto para completar el ciclo de escritura ; espera hasta que la operacin de escritura ; finalice
ERS
508
Funcin para mostrar una cadena que termina con un caracter NULO
La cadena que se va a enviar es apuntada por el ndice del registro X.
puts2lcd ldaa beq jsr bra done_puts rts 1,x+ done_puts putc2lcd puts2lcd ; obtn un caracter de la cadena ; encuentra algn caracter NULO?
Ejemplo Escribe un programa en assembly que pruebe las rutinas anteriores mostrando en el display el siguiente mensaje en dos lneas.
hello world! I am ready!
ERS 509
"hcs12.inc" equ PTH ; (PH7~PH0) pines de datos del LCD equ DDRH ; puerto de direcciones de datos del LCD equ PTK ; puerto de control del LCD equ DDRK ; puerto de direcciones de control del LCD equ $80 ; terminal de la seal E equ $20 ; terminal de la seal R/W equ $10 ; terminal de la seal RS org $1500 lds #$1500 ; establece el apuntador a pila jsr openlcd ; inicializa el LCD ldx #msg1lcd jsr puts2lcd ldaa #$C0 ; muvete a la siguiente fila jsr cmd2lcd ; " ldx #msg2lcd jsr puts2lcd swi msg1lcd fcc "hello world!" dc.b 0 msg2lcd fcc "I am ready!" dc.b 0 #include delay.asm" ; incluye aqu las rutinas de retraso ; incluir las cuatro funciones anteriores del LCD
ERS 510
ERS
511
Conectando un teclado
ERS
512
Conectando un Teclado
Un Teclado est organizado como un conjunto de interruptores que puede ser mecnico, de membrana, de capacitores, o efecto Hall. Los interruptores mecnicos para Teclados son los ms populares.
Los interruptores mecnicos tienen un problema llamado el rebote de contacto. Al cerrar un interruptor mecnico se generan una serie de pulsos porque el contacto de los interruptores no se interrumpe inmediatamente. Adems, un humano no es capaz de teclear ms de 50 teclas en un segundo. Leer el teclado ms de 50 veces en un segundo es leer el mismo golpe de tecla muchas veces.
ERS
514
ERS
515
ERS
516
Ejemplo. Escribe un programa que realice la exploracin de un teclado, quite el rebote, y regrese el cdigo ASCII al Acumulador A para el quien lo requiera. Solucin
Pines PA4..PA7 controlan una fila de 4 teclas cada uno. El escaneo se realiza al poner uno de los pines PA7..PA4 en bajo, los otros tres pines en alto y comprobando las teclas al mismo tiempo.
#include hcs12.inc" keyboard equ PTA get_char scan_r0 scan_k0 scan_k1 scan_k2 scan_k3 key0 key1 movb movb brclr brclr brclr brclr bra jmp jmp #$F0,DDRA #$EF,keyboard keyboard,$01,key0 keyboard,$02,key1 keyboard,$04,key2 keyboard,$08,key3 scan_r1 db_key0 db_key1 ; pon PA7~PA4 como salida, PA3~PA0 como entrada ; escanea la fila que contenga la teclas 0123 ; la tecla 0 est presionada? ; la tecla 1 est presionada? ; la tecla 2 est presionada? ; la tecla 3 est presionada?
ERS
517
key2 key3 scan_r1 scan_k4 scan_k5 scan_k6 scan_k7 key4 key5 key6 key7 scan_r2 scan_k8 scan_k9 scan_kA scan_kB key8 key9
jmp jmp movb brclr brclr brclr brclr bra jmp jmp jmp jmp movb bclr brclr brclr brclr brclr bra jmp jmp
db_key2 db_key3 #$DF,keyboard keyboard,$01,key4 keyboard,$02,key5 keyboard,$04,key6 keyboard,$08,key7 scan_r2 db_key4 db_key5 db_key6 db_key7 #$BF,keyboard keyboard,$40 keyboard,$01,key8 keyboard,$02,key9 keyboard,$04,keyA keyboard,$08,keyB scan_r3 db_key8 db_key9
; escanea la fila que contenga las teclas 4567 ; la tecla 4 est presionada? ; la tecla 5 est presionada? ; la tecla 6 est presionada? ; la tecla 7 est presionada?
; escanea la fila que contenga las teclas 89AB ; ; la tecla 8 est presionada? ; la tecla 9 est presionada? ; la tecla A est presionada? ; la tecla B est presionada?
ERS
518
jmp jmp movb brclr brclr brclr brclr jmp keyC jmp keyD jmp keyE jmp keyF jmp ; debounce key 0 db_key0 jsr brclr jmp getc0 ldaa rts ; debounce key 1
db_keyA db_keyB #$7F,keyboard keyboard,$01,keyC keyboard,$02,keyD keyboard,$04,keyE keyboard,$08,keyF scan_r0 db_keyC db_keyD db_keyE db_keyF
; escanea la fila que contenga las teclas CDEF ; la tecla C est presionada? ; la tecla D est presionada? ; la tecla E est presionada? ; la tecla F est presionada?
ERS
519
db_key1 jsr brclr jmp getc1 ldaa rts db_key2 jsr brclr jmp getc2 ldaa rts db_key3 jsr brclr jmp getc3 ldaa rts db_key4 jsr brclr
delay10ms keyboard,$02,getc1 scan_k2 #$31 delay10ms keyboard,$04,getc2 scan_k3 #$32 delay10ms keyboard,$08,getc3 scan_r1 #$33 delay10ms keyboard,$01,getc4
ERS
520
jmp getc4 ldaa rts db_key5 jsr brclr jmp getc5 ldaa rts db_key6 jsr brclr jmp getc6 ldaa rts db_key7 jsr brclr jmp
scan_k5 #$34
delay10ms keyboard,$02,getc5 scan_k6 #$35 ; regresa el cdigo ASCII de 5 delay10ms keyboard,$04,getc6 scan_k7 #$36 ; regresa el cdigo ASCII de 6 delay10ms keyboard,$08,getc7 scan_r2
ERS
521
getc7 db_key8
getc8 db_key9
getc9 db_keyA
getcA db_keyB
getcB
ldaa rts jsr brclr jmp ldaa rts jsr brclr jmp ldaa rts jsr brclr jmp ldaa rts jsr brclr jmp ldaa rts
delay10ms keyboard,$04,getcA scan_kB #$41 ; obtener el cdigo ASCII de A delay10ms keyboard,$08,getcB scan_r3 #$42 ; obtener el cdigo ASCII de B
ERS 522
db_keyC
getcC db_keyD
getcD db_keyE
jsr brclr jmp ldaa rts jsr brclr jmp ldaa rts jsr brclr jmp ldaa rts jsr brclr jmp ldaa rts
delay10ms keyboard,$01,getcC scan_kD #$43 ; obtener el cdigo ASCII de C delay10ms keyboard,$02,getcD scan_kE #$44 ; obtener el cdigo ASCII de D delay10ms keyboard,$04,getcE scan_kF #$45 ; obtener el cdigo ASCII de E delay10ms keyboard,$08,getcF scan_r0 #$46 ; obtener el cdigo ASCII de F
getcE db_keyF
getcF
ERS
523
delay10ms movb movb movb ldd addd std wait_lp2 brclr rts
; habilita TCNT y limpia rpido las banderas ; configura el factor de preescala a 64 ; habilita OC0 ; inicia y enva la operacin de comparacin ; con un retraso de 10 ms
ERS
524
- La salida de cada DAC esta dada por: VOUTA/B = 2 VREF (N/256) donde: N es el valor digital aERS convertir.
526
ERS
527
Ejemplo Escribe un programa que genere una onda de dientes de sierra en el pin VOUTA. El programa en assembly es como sigue: #include "hcs12.inc" org $1500 movb #$FF,DDRB ; configura al PORTB para salida bset DDRJ,$03 ; configura a PJ1~PJ0 para salida bclr PTJ,$02 ; selecciona la salida VOUTA loop inc PORTB ; incrementar la salida por un paso bclr PTJ,$01 ; generar un aumento de borde el el pin PJ0 bset PTJ,$01 ; " bset PTJ,$01 ; aumenta 9 instrucciones bset ms para proporcionar 2 ms bset PTJ,$01 ; para completar la conversin D/A bset PTJ,$01 ; " bset PTJ,$01 ; bset PTJ,$01 ; bset PTJ,$01 ; " bset PTJ,$01 ; bset PTJ,$01 ; bset PTJ,$01 ; bra loop ; para completar la conversin D/A end La versin del programa en lenguaje C est en la siguiente pgina.
ERS 528
Paso 2
Selecciona borde de subida o de bajada del pin activador para interrumpir el MCU programando los registros relacionados.
Paso 3
Escribe la rutina de servicio para la interrupcin de la tecla activadora e inicializa el vector de interrupcin de la tecla activadora.
Paso 4
Limpia todas las banderas que hayan sido activadas en el registro de banderas de las Teclas Activadoras.
Paso 5
Habilita la funcin de teclas activadoras poniendo el bit correspondiente en el registro habilitador de interrupciones activadoras.
Paso 6
Limpia la mascara global de interrupcin (el bit I del registro CCR ).
ERS 530
ERS
532
Ejemplo Escriba una secuencia de instrucciones para configurar a los cuatro pines superiores del Puerto P con la caracterstica activadora. Programa el Puerto P para que las terminales PP7...PP4 generen una interrupcin siempre que haya una bajada de borde aplicado a cualquiera de las terminales. Solucin:
#include hcs12.inc bclr DDRP,$F0 bset PERP,$F0 bclr PPSP,$F0 movb #$FF,PIFP bset PIEP,$F0 cli
; configura las terminales PP<7:4> para entrada ; habilita las terminales PP7~PP4 del dispositivo pull ; elige el dispositivo pull-up ; limpia bandera de teclas activadoras del Puerto P ; habilita la interrupcin del Puerto P ; habilita la interrupcin global de teclas activadoras
ERS 533
Convertidor Analgico/Digital
Entrada
Transductor transductor
Acondicionador de seal
micro micro
Ejemplo. Suponer que hay un convertidor A/D de 10 bits con VRL = 1 V y VRH = 4V. Encontrar para los resultados 25, 80, 240, 500, 720, 800, y 900 el voltaje correspondiente de la conversin A/D. Solucin: rango = VRH VRL = 4V 1V = 3V
V(25) V(80) V(240) V(500) V(720) V(800) V(900) = 1 V + (3 25) (210 1) = 1.07 V = 1 V + (3 80) (210 1) = 1.23 V = 1 V + (3 240) (210 1) = 1.70 V = 1 V + (3 500) (210 1) = 2.47 V = 1 V + (3 720) (210 1) = 3.11 V = 1 V + (3 800) (210 1) = 3.35 V = 1 V + (3 900) (210 1) = 3.64 V
Circuito Escalador
Algunos transductores tienen un voltaje de salida dentro del rango de 0 ~ VZ, donde VZ < VDD. VZ puede ser mucho ms pequeo que VDD. Cuando VZ es mucho ms pequeo que VDD, no puede ser exacto el resultado de la conversin A/D. La solucin a este problema es utilizar un circuito escalador para amplificar la salida del transductor y poder cubrir todo el rango de voltajes: 0 V VRH a VDD.
Ejemplo. Elegir los valores apropiados para R1 y R2 de la Figura para escalar el voltaje dentro del rango de 0~200mV a 0~5V. Solucin: AV = 1 + R2/R1 = 5V / 200mV = 25 R2/R1 = 24 Para lograr el rango deseado elegir R1 = 10 K y R2 = 240 K .
Ejemplo. Elegir una resistencia apropiada para ajustar el voltaje en el circuito que se muestra en la figura anterior y as poder desplazar el voltaje del rango de 1.2 V ~ 3.0 V al rango de 0V ~ 5V. Solucin: Aplicando la ecuacin 12.5:
0 = -1.2 (Rf/R1) (Rf/R2) V1 5 = 3.0 (Rf/R1) (Rf/R2) V1
- Para trasladar y escalar al voltaje deseado es necesario elegir los valores de R0 = R1 = 10 K, R2 = 50 K , Rf = 12 KW, y V1 = -5V.
ATDCTL5
Las terminales del puerto son compartidas con las entradas analgicas AN0~AN7 y AN8~AN15.
Solucin:
El primer canal a convertir es AN6. Hay 5 canales que sern convertidos. La secuencia de conversin es la siguinete: AN6, AN7, AN0, AN1 y AN2.
El Modo FIFO
Los 8 registros de resultados de 16 bits estn organizados en un anillo circular. El contador de la conversin en el registro ATDSTAT0 especifica los registros de resultados que retendrn la conversin actual. En el modo FIFO, cuando una nueva secuencia comienza no se da un reset a 0 a la conversin. En el modo FIFO, el primer resultado de la conversin no podr ser almacenado en ATDDR0.
Ejemplo. Asumir que la siguiente configuracin fue programada antes de que comience una nueva conversin: El valor del contador de la conversin en el registro ATDSTAT0 es 5. El cdigo del canal seleccionado en el registro ATDCTL5 es 6. El lmite de la secuencia de conversin en el registro ATDCTL3 se establece en 5. El bit MULT del registro ATDCTL5 se establece en 1. Cmo debern ser almacenados los resultados cuando se seleccione o no se seleccione el modo FIFO? Solucin: El contador de la conversin especifica los registro de resultados que retendrn el resultado de la primera conversin. El cdigo del canal seleccionado especifica el primer canal que ser convertido. El lmite de la secuencia de conversin especifica el nmero de canales que sern convertidos.
Ejemplo Escribir una subrutina para inicializar el convertidor AD del MC9SGC32 y comenzar la conversin con la siguiente configuracin: Modo No Exploratorio Seleccionar el canal 7 (modo de canal nico) Limpieza rpida de la bandera del ATD Detener el AD en modo de espera Deshabilitar interrupciones Ejecutar 4 conversiones en una secuencia Deshabilitar modo FIFO Terminar la conversin actual y al activarse el BDM congelarlo. Usar para la segunda etapa del tiempo de muestreo Operaciones de 10 bits y 2 periodos del reloj A/D. Elegir una frecuencia de conversin de 2 MHz para el reloj del bus de 24 MHz. El resultado debe ser sin signo y justificado a la derecha. Solucin: La configuracin del ATD0CTL2 Habilitar AD0 Seleccionar la limpieza rpida de banderas (establecer el bit 6 en 1) Detener a AD0 cuando est en modo de espera (establecer el bit 5 en 1) Deshabilitar el disparador externo del canal 7 (establecer los bits 4, 3 y 2 en 0) Deshabilitar la interrupcin del AD0 (establecer el bit 1 en 0) Escribir en ATD0CTL2 el valor 0xE0.
La configuracin de ATDCTL3:
Ejecutar cuatro conversiones. Deshabilitar el modo FIFO. Completar la conversin actual cuando se active el BDM y despus bloquearlo. Escribir en el registro de control el valor 0x22.
La configuracin de ATD0CTL4:
Seleccionar operaciones de 10 bits (establecer el bit 7 en 0). 2 periodos de reloj A/D para tiempo de muestreo (establecer los bits 6 y 5 en 00). Establecer el valor de PRS4~PRS0 en 00101. Escribir en el registro de control el valor 0x05.
La configuracin de ATD0CTL5:
Justificacin a la derecha en el registro de resultados (establecer el bit 7 en 1). El resultado sin signo (establecer el 6 en 0). Modo sin escaneo (establecer el bit 5 en 0). Modo de canal unitario (establecer el bit 4 en 0). Seleccionar el canal 7 (seleccionar los bits de 2..0 en 111). Escribir en el registro de control el valor 0x87.
Ejemplo Escribe un programa que ejecute la conversin A/D de la seal analgica conectada a la terminal AN7. recoger 20 resultados de conversiones A/D y almacenarlos en las localidades de memoria comenzando en $1000. Usar la mima configuracin del Ejemplo anterior. Solucin: - En el Ejemplo anterior se configuran 4 secuencias de conversiones AD0 en el canal AN7. - Es necesario escribir 5 ocasiones en ATD0CTL5 para recolectar las 20 muestras.
#include "hc12.inc" org $1500 lds #$1500 ldx #$1000 ; usar el registro X como apuntador al buffer jsr openAD0 ; inicializar la conversin ATD0 ldy #5 loop5 movb #$87,ATD0CTL5 ; iniciar la secuencia de conversin A/D brclr ATD0STAT0,SCF,* movw ATD0DR0,2,x+ ; recolectar y guardar los resultados de la conversin movw ATD0DR1,2,x+ ; fijar el incremento del apuntador en 2 movw ATD0DR2,2,x+ ; movw ATD0DR3,2,x+ ; dbne y,loop5 swi ; incluir AQUI la subrutina openAD0 end
Ejemplo Convertir la temperatura y mostrarla en con tres dgitos enteros y un dgito fraccionario utilizando el LCD. Mostrar todo el rango de la temperatura del TC1047A. Actualizar el valor 5 veces por segundo. El reloj E es de 24 MHz. Solucin: - El rango completo de la temperatura es de 165oC. - Para traducir el resultado de la conversin A/D a temperatura dividir el resultado entre 6.2, se puede realizar primero multiplicando el resultado por 10 y dividiendo el producto entre 62.
#include "hcs12.inc" period equ $2E degree equ 223 org $1000 quo ds.b 1 rem ds.b 1 sign ds.b 1 fract ds.b 1 buf ds.b 8 org $1500 lds #$1500 ldy #2 jsr delayby100ms jsr openlcd ldaa #$80 jsr cmd2lcd ldx #msg1 jsr puts2lcd jsr openAD0 forever movb #$20,buf movb #$20,buf+1 movb #$30,buf+2
; cdigo ASCII del caracter de periodo ; cdigo ASCII del caracter de grados
; mantener la cadena que se mostrar en el LCD ; activar el apuntador a pila ; esperar a que el LCD est listo ; configuracin interna ; configurar el LCD ; colocar el cursor del LCD en la esquina ; superior izquierda ; mostrar "Temperature = " ; " ; configurar el mdulo ATD0 ; inicializar el contenido del buffer en 0.0oC ; " ; "
movb movb movb movb movb movb movb movb brclr ldd ldy emul ldx ediv stab tfr subb bhs negb stab movb
#period,buf+3 #$30,buf+4 #degree,buf+5 #$43,buf+6 #0,buf+7 #$87,ATD0CTL5 #0,sign #$30,fract ATD0STAT0,SCF,* ATD0DR0 #10 #62 rem y,d #40 save_quo quo #1,sign
; " ; " ; caracter de grados ; letra 'C' ; caracter nulo ; iniciar la secuencia de conversin ATD ; inicializar el signo positivo ; inicializar el dgito fraccional en 0 ; esperar a que termine la conversin ; leer el resultado de la conversin ; calcular resultado x 10 / 62 ; " ; " ; " ; guardar el resto ; transferir el cociente a B ; restar la temperatura de compensacin ; no usar el resto si es no negativo ; calcular el complemento a 2 del cociente ; la temperatura es negativa
ldab beq ldab subb stab bra save_quo stab cal_fract ldab beq ldaa mul ldx idiv cmpb blt inx cpx bne inc bra no_round tfr addb stab
rem convert #62 rem rem cal_fract quo rem convert #10 #62 #31 no_round #10 no_round quo convert x,d #$30 fract
; si el resto es 0, omitir algunas instrucciones ; ; calcular 62 - rem ; " ; " ; guardar la actualizacin del cociente ; cuando es positivo venir a esta instruccin ; calcular dgitos fraccionales ; " ; " ; " ; redondear los dgitos fraccionales ; " ; " ; " ; " ; " ; preparar la separacin de dgitos enteros ; convertir los dgitos fraccionales en cdigo ASCII ; " ; "
convert
add_fra
ldab clra ldx idiv addb stab tfr tstb beq ldx idiv addb stab tfr tstb beq movb movb ldaa beq movb
quo #10 #$30 buf+2 x,d add_fra #10 #$30 buf+1 x,d add_fra #$31,buf fract,buf+4 sign out_it #$2D,buf ; " ; dividir las repeticiones entre 10 por separado ; dgitos enteros ; " ; salvar los dgitos de unidades ; transferir el cociente a D ; el cociente es igual a cero? ; si la parte entera es 0, sumarle un dgito fraccional ; separar los dgitos de decenas ; convertir y guardar los dgitos de decenas ; " ; comprobar si hay dgitos de centenas ; el cociente es igual a 0? ; si hay dgitos de centenas, solo es 1 ; insertar dgitos fraccionales ; comprobar el signo ; agregar el caracter de menos cuando el signo es menos
out_it
ldaa #$C0 ; colocar el cursor en la segunda fila jsr cmd2lcd ; " ldx #spaces ; limpiar el 2do rengln del LCD jsr puts2lcd ; " ldaa #$C5 ; establecer la posicin del Cursor del LCD jsr cmd2lcd ; " ldx #buf ; mostrar la cadena de la temperatura jsr puts2lcd ; " ldy #2 ; esperar 200 ms jsr delayby100ms ; " jmp forever ; continuar ; ******************************************************************************************** ; La siguiente funcin ejecuta la configuracin del AD0. ; ******************************************************************************************** openAD0 movb #$E0,ATD0CTL2 ; habilita el AD0, limpieza rpida de la bandera ATD, ; detener en modo de espera ldy #2 jsr delayby10us ; esperar mientras se estabiliza AD0 movb #$0A,ATD0CTL3 ; ejecutar una conversin A/D movb #$25,ATD0CTL4 ; tiempo de muestreo de 4 ciclos, poner la preescala en 12 rts
El Temporizador
ERS
595
ERS
597
ERS
598
ERS
599
ERS
600
SistemaTemporizadordelHCS12
ElHCS12tieneunmdulodetiempoestndar(TIM)queconsisteen:
8canalesdeentradasdecapturasconmutadascon8canalesdesalidasdecomparacin. UnacumuladordepulsosAde16bit. UncontadorTemporizadorde16bits. EldiagramaabloquesdelTIMsemuestraenlaFiguradelalminasiguiente.
ElTIM(yelECTtambin)compartenlasterminalesdelosochoPuertosT (IOC0IOC7).
ERS
602
ERS
603
RegistroContadordelTemporizador (TCNT)
Requeridoporlasentradasdecapturaysalidasde comparacin. Debeseraccedidoenunaoperacinde16bitsconel findeobtenerelvalorcorrecto. Otrostresregistrosrelacionadosconlaoperacindel TCNTson:TSCR1,TSCR2,TFLG2.
ERS 604
ERS
605
El contador temporizador
ERS
606
RegistrodeControl1delSistemaTemporizador (TSCR1)
LoscontenidosdelTSCR1se muestraenlaFigura. Escribiendo1y0enelbit 7del TSCR1iniciar ydetendr lacuenta delTCNT. Escribirun1enelbit 4habilitar la funcindelimpiarrpidamentela banderadeltemporizador.Siste bit est encero,elusuariodeber escribirun1enlabanderadel temporizadorconelfinde
ERS
607
RegistrodeControl2delSistema Temporizador(TSCR2)
ElBit 7eselbit quehabilitalainterrupcindesobreflujo del TCNT. ElTCNTpuedeserreiniciadoa0cuandoelTCNTigualaaTC7 escribiendoununoelbit 3delTSCR2. ElrelojdeentradaalTCNTpuedeserpreescalado porunfactor, seleccionandolostresbitsmenossignificativosdelTSCR2. LoscomponentesdelTSCR2semuestranenlasiguienteFigura.
ERS
608
Registrodecontrol2delTemporizador (TSCR2)
ERS
609
RegistrodeBanderas2delTemporizador (TFLG2)
ERS
610
Funcines deEntradasdeCaptura
Eltiempofsicotambinesrepresentadoporloscontenidosdeltemporizador principal. Laocurrenciadeuneventoestarepresentadoporelbordedeuna seal (bordedesubidaobajada). Eltiempocuandoocurreuneventopuedeserregistradoalalmacenarla cuentadelTemporizadorprincipal,cuandollegaelbordedeunasealcomo semuestraenlaFigura. ElHCS12tieneochocanalesdeentradasdecaptura.Cadacanaltieneun registrodecapturade16bits,unpindeentrada,undetectorlgicodeborde yungeneradorlgicodeinterrupcin. Loscanalesdeentradasdecapturacompartenlamayoradeloscircuitoscon lasfuncionesdesalidasdecomparacin.Porestarazn,nopuedenser habilitadossimultneamente.
ERS
611
Entradas de captura
Contador Subida de borde Bajada de borde Captura de Entrada1
Registro Bandera1
Registro Mscara1
Modo de Captura
ERS
612
Entradas de Captura
ERS
613
FuncionesdeEntradadeCaptura
Laseleccinentreentradasdecapturaysalidasdecomparacinsonrealizadas programandoelregistroTIOS. LoscontenidosdelregistroTIOSsemuestranenlaFigura.Alescribirun1seselecciona lafuncindecomparacindesalida.Encasocontrario,lasfuncionesdeentradasde capturaestarnseleccionadas.
TerminalesdelPuertoT
Cadaterminaldelpuertopuedeserutilizadacomoterminalde E/SdepropsitogeneralcuandolafuncindelTemporizadorno est seleccionada. Laterminal7puedeserutilizadacomoentradadecaptura7, accindesalidadecomparacin7,yacumuladordepulsode entrada. Cuandounaterminaldelpuertodeltemporizadorseutilizacomo terminaldepropsitogeneralesdeE/S,sudireccines configuradaporelregistroDDRT.
ERS 615
RegistrodeControl3y4delTemporizador
Elbordequese detectaes seleccionadoporel TCTL3yelTCTL4. Elbordedetectadoes seleccionadopor2 bits.Elusuariopuede elegirdetectarel bordedesubida,el bordedebajadao ambosbordes.
ERS
616
RegistroHabilitadordeInterrupcionesdel Temporizador(TIE)
Opcionalmentelallegadadeunbordedeunaseal puedegenerarunainterrupcinalCPU. ElhabilitadordeInterrupcionesescontroladoporel Registrohabilitadordeinterrupcionesdel Temporizador.
ERS
617
RegistrodeBanderasdeInterrupcindel Temporizador(TFLG1)
Siemprequellegueunbordedeunaseal,labadera asociadadeinterrupcindeltemporizadorsepondr a 1.
ERS
618
Mtodo2
Utilicelainstruccinmovb conun1enlaposicinoposicionesdelbit correspondientealabandera(s)queselimpiar.Porejemplo, movb #$01,TFLG1
ERS 619
quelimpiar labanderaC0F.
AplicacionesdelaFuncindeEntradade Captura
Registrodelahoradelallegadade unevento. Periododemedicin:necesita capturarlosvaloresdel temporizadorprincipalque correspondanados levantamientosodosbajadasde bordeconsecutivas.
Medicindepulso:necesitacapturarbordedesubidaybordedebajada.
ERS
620
EntradadeCaptura
GeneracindeInterrupciones:Cadaentradadecapturapuedeutilizarsecomounafuentede interrupcinsensitivaaunborde. Contandoeventos:Cuentaelnmerodebordesdelassealesquelleganduranteunperiodo.
TiempodeReferencia:Tambinutilizadoenconjuntoconlafuncindesalidade comparacin.
ERS
621
MedicindelCiclodeTrabajo
ERS
622
MedicindelaDiferenciadeFase
ERS
623
MedicindePerodo
Ejemplo:UtilicelaIC0paramedirelperododeunasealdesconocida.El perodoesconocidoporserinferiora128ms.Asumirquelafrecuenciadel relojEesde24MHz.Utiliceelnmerodeciclosderelojcomolaunidaddel perodo. Solucin: Dadoqueelregistrodeentradadecapturaesde16bits,elperodomslargo delasealpuedesermedidopreescalando elTCNT.
216 24MHz =2.73ms.
Paramedirunperodoqueesiguala128ms,tenemos2opciones:
Ponera1elfactordepreescala yllevarunregistrodelnmerodevecesqueel contadordeltemporizadordetectasobreflujos. Ponera64elfactordepreescala ynollevarunregistrodelnmerodevecesque elcontadordeltemporizadordetectasobreflujos.
MedicindelPerodo
ERS
625
ERS
626
ProgramaenCparaMedicindePerodo
#include "hcs12.h" void main(void) { unsigned int edge1,period; TSCR1 =0x90; /*habilitatemporizador,habilitalimpiezadebanderarpida*/ TIOS &=~IOS0; /*habilitaentradadecaptura0*/ TSCR2 =0x06; /*deshabilitainterrupcindesobreflujo delTCNT,ponera64lapreescala */ TCTL4 =0x01; /*capturaelbordedesubidadeterminalPT0*/ TFLG1 =C0F; /*limpiarlabanderaC0F*/ while (!(TFLG1&C0F)); /*esperaporprimerbordedesubida*/ edge1 =TC0; /*guardacapturadeprimerbordeylimpialabanderaC0F*/ while (!(TFLG1&C0F)); /*esperaporllegadadelsegundoborde*/ period =TC0 edge1; asm ("swi"); }
ERS
627
Elanchodelpulsopuedesercalculadoconlassiguientesecuaciones: Caso 1 borde2 borde1 ancho_de_pulso = ovcnt 216 + diff Caso 2 borde2 < borde 1 ancho_de_pulso = (ovcnt 1) 216 + diff
ERS 628
ERS
629
"hcs12.inc" org $1000 edge1 ds.b 2 overflow ds.b 2 pulse_width ds.b 2 org $1500 movw #tov_isr,UserTimerOvf ;establecevectordeinterrupcionesdesobreflujo delTCNT lds #$1500 ;estableceapuntadorapila movw #0,overflow movb #$90,TSCR1 ;habilitalimpiezarpidadebanderadeltemporizadorTCNT movb #$05,TSCR2 ;deshabilitainterrupcindelTCNT,ponerpreescala a32 bclr TIOS,IOS0 ;seleccionaIC0 movb #$01,TCTL4 ;capturabordedesubida movb #C0F,TFLG1 ;limpiabanderaC0F wait1 brclr TFLG1,C0F,wait1 ;esperaporprimerborde movw TC0,edge1 ;guardaprimerbordeylimpiabanderaC0F movb #TOF,TFLG2 ;limpiabanderaTOF bset TSCR2,$80 ;habilitainterrupcindesobreflujo delTCNT cli ;" movb #$02,TCTL4 ;capturabordedebajadaenelpinPT0 wait2 brclr TFLG1,C0F,wait2 ;esperaporllegadadebordedebajada ldd TC0 subd edge1
ERS 630
#include
next tov_isr
std bcc ldx dex stx swi movb ldx inx stx rti end
;limpiarbanderaTOF
ERS
631
ProgramaenCparalaMedicindelAncho dePulso
#include <hcs12.h> #include <vectors12.h> #define INTERRUPT__attribute__((interrupt)) unsigned diff,edge1,overflow; unsigned longpulse_width; void INTERRUPTtovisr(void); void main(void) { UserTimerOvf =(unsigned short)&tovisr; overflow =0; TSCR1 =0x90; /*habilitatemporizadorylimpiezadebanderarpida*/ TSCR2 =0x05; /*Ponerlapreescala en32,nohayinterrupcindesobreflujo del temporizador*/ TIOS &=~IOS0; /*seleccionarentradadecaptura0*/ TCTL4 =0x01; /*preprateparacapturarelbordedesubida*/ TFLG1 =C0F; /*limpiabanderaC0F*/ while(!(TFLG1&C0F)); /*esperaporllegadadelbordedesubida*/ TFLG2 =TOF; /*limpiabanderaTOF*/
ERS 632
TSCR2 |=0x80; /*habilitainterrupcindesobreflujo delTCNT*/ asm("cli"); edge1 =TC0; /*guardaelprimerborde*/ TCTL4 =0x02; /*preprateparacapturarelbordedebajada*/ while (!(TFLG1&C0F)); /*esperaporllegadadelbordedebajada*/ diff =TC0 edge1; if (TC0<edge1) overflow =1; pulse_width =overflow *65536u+diff; asm ("swi"); } void INTERRUPTtovisr(void) { TFLG2 =TOF; overflow =overflow +1; }
/*limpiabanderaTOF*/
ERS
633
FuncindeSalidadeComparacin
ElHCS12tieneochofuncionesdesalidadecomparacin. Cadacanaldesalidadecomparacinconsisteen
Uncomparadorde16bits. UnregistroTCx decomparacinde16bits(tambinseutilizacomo registrodecapturadeentradasalida). Unaterminaldesalidadeaccin(PTx,puedeseralta,bajaosubeybaja). UncircuitodesolicituddeInterrupcin. Unafuncindecomparacinforzada(CFOCx). UnalgicadeControl.
ERS
634
FuncionamientodelaFuncindeSalidade Comparacin
Unadelasaplicacionesdelafuncindesalidadecomparacines dispararunaaccinenunmomentoespecficoenelfututo. Parautilizarlafuncindesalidadecomparacin,elusuario necesita:
HacerunacopiadeloscontenidosactualesdelregistroTCNT. Sumaraestacopiaunvalorigualalretardodeseado. Almacenarlasumaenelregistrodesalidadecomparacin(TCx,x= 0..7).
ERS
635
Salidas de Comparacin
ERS
636
SalidasdeComparacin
ERS
637
FuncionamientodelaFuncindeSalidade Comparacin
Lasaccionesquepuedenseractivadasenlaterminaldesalidadecomparacinincluyen
Salidaenalto Salidaenbajo SubeyBaja
Laaccinest determinadaporelRegistrodeControl1y2delTemporizador(TCTL1&TCTL2):
ERS
638
FuncionamientodelaFuncindeSalidade Comparacin
Unacomparacinexitosaestablecer elbit delabanderacorrespondienteen elregistroTFLG1. Unainterrupcinpuedesersolicitadaopcionalmentesielbit dela interrupcinasociadasehabilitaenelregistroTIE. Ejemplo:Generarunaformadeondadigitalde1KHz activaaltoconunciclo detrabajodel30%delaterminalPT0.Utiliceelmtododeencuestapara comprobarelxitodelaoperacindesalidadecomparacin.Lafrecuencia delrelojEesde24MHz. Solucin:Unaformadeondade1KHz activaaltoconunciclodetrabajodel 30%semuestraenFigura.EldiagramadeFlujodeesteproblemasemuestra enlminasiguiente.
Establecerlapreescala delTCNTen8,entonceselperododelasealderelojser de1/3ms.Elnmerodevecesenquelasealdelcicloderelojesaltaybajason 900y2100respectivamente.
ERS 639
FuncionamientodelaFuncindeSalidade Comparacin
ERS
640
repeat low
high
"hcs12.inc" equ 900 equ 2100 org $1500 movb #$90,TSCR1 movb #$03,TSCR2 bset TIOS,OC0 movb #$03,TCTL2 ldd TCNT addd #lo_time std TC0 brclr TFLG1,C0F,low movb #$02,TCTL2 ldd TC0 addd #hi_time std TC0 brclr TFLG1,C0F,high movb #$03,TCTL2 ldd TC0 bra repeat end
;habilitaTCNTconlimpiezadebanderarpidadeltemporizador ;deshabilitainterrupcindelTCNT,establecepreescala en8 ;habilitaOC0 ;seleccionaaltocomoaccindelaterminal ;inicialaoperacinOC0con700us comoretardo ;" ;" ;esperahastaquelaterminalOC0sepongaenalto ;seleccionaenbajocomolaaccindelaterminal ;inicialaoperacinOCcon300us comoretardo ;" ;" ;esperahastaquelaterminalOC0sepongaenbajo ;seleccionaaltocomoaccindelaterminal
ERS
641
ProgramaenCparagenerarunaFormade OndaDigitalde1KHz
#include "hcs12.h" #definehi_time 900 #definelo_time 2100 void main (void) { TSCR1 =0x90; /*habilitaelTCNTylimpiezadebanderarpidadeltemporizador*/ TIOS |=OC0; /*habilitalafuncinOC0*/ TSCR2 =0x03; /*deshabilitalainterrupcinTCNT,establecerpreescala en8*/ TCTL2 =0x03; /*establecelaaccinOC0parasepull up*/ TC0 =TCNT+lo_time; /*inicialaoperacinOC0*/ while(1){ while(!(TFLG1&C0F)); /*esperaquePT0sepongaenalto*/ TCTL2 =0x02; /*establecelaterminaldeaccinOC0paraserpull down */ TC0 +=hi_time; /*iniciaunanuevaoperacinOC0*/ while(!(TFLG1&C0F)); /*esperaquePT0sepongaenbajo*/ TCTL2 =0x03; /*establecelaterminaldeaccinOC0paraserpull up*/ TC0 +=lo_time; /*iniciaunanuevaoperacinOC0*/ } }
ERS 642
ERS
643
TSCR1 TEN
TSCR2 PR2 PR1 PR0 TSCR2 TOI PACLK PACLK/256 PACLK/65536 00 01 TCNT 10 MUX 11 Reloj CLK1 CLK2 PACLK TIE Cnl Comparador de 16 bits TFLG1 CnF CFORC FOCn TCNT Contador de 16 bits TFLG2 TOF CCR I
Registro TCn
PTn
Control del Bit de Salida
TCTL1 o TCTL2 OMn OLn TIOS 7 6 5 4 3 2 1 0 Establecer en 1 el Bit IOSn para la Salida de Comparacin OC7M:OC7D OC7Mn OC7Dn
ERS
644
TIOS - $0040 Registro Seleccionador de Entrada de Captura o de Salida de Comparacin Bit 7 Read: Write: Reset: Read: En cualquier momento. Write: En cualquier momento IOS7 6 IOS6 5 IOS5 4 IOS4 3 IOS3 2 IOS2 1 IOS1 0 IOS0
ERS
645
ERS
646
ERS
647
TCTL3, TCTL4 Registro de Control del Timer Bit 7 TCTL3 Reset: EDG7B 0 Bit 7 TCTL4 Reset: EDG3B 0 6 EDG7A 0 6 EDG3A 0 5 EDG6B 0 5 EDG2B 0 4 EDG6A 0 4 EDG2A 0 3 EDG5B 0 3 EDG1B 0 2 EDG5A 0 2 EDG1A 0 1 EDG4B 0 1 EDG0B 0 0 EDG4A 0 0 EDG0A 0
ERS
648
/1024
RTR6
RTICTL RTR5 RTR4 CRGINT RTIE RTR0 CRGFLG RTIF CRGFLG I Peticin de Interrupcin en Tiempo Real
RTR3
ERS
649
ERS
650
Reloj del Bus Registro PWMDTYn Divisor Programable y Lgica de Seleccin del Reloj Registro PWMCNTn Reloj A, Reloj SA, Reloj B, Reloj SB 8 bits Comparador del Periodo Registro PWMPERn
ERS
Q MUX PWMn
Flip Flop T
RESET
651
ERS
652
ERS
653
ERS
654
PWMCTL - $00E5 Registro de Control de PWM Bit 7 Read: Write: Reset: 0 0 6 CON45 0 5 CON23 0 4 CON01 0 3 PSWAI 0 2 PFRZ 0 1 0 0 0 0 0
= Reservado, sin implementar, o no se puede escribir en l. Read: En cualquier momento. Write: En cualquier momento PWMCAE - $00E4 Registro de Habilitacin de Alineacin del Centro de PWM Bit 7 Read: Write: Reset: 0 0 6 0 0 5 CAE5 0 4 CAE4 0 3 CAE3 0 2 CAE2 0 1 CAE1 0 0 CAE0 0
= Reservado, sin implementar, o no se puede escribir en l. Read: En cualquier momento. Write: En cualquier momento, pero escribir solo cuando el canal correspondiente est deshabilitado PWMCNT0, PWMCNT1, PWMCNT2, PWMCNT3, PWMCNT4, PWMCNT5 - Registro Contador del Canal Bit 7 Read: Write: Reset: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 4 3 2 1 0
= Reservado, sin implementar, o no se puede escribir en l. Read: En cualquier momento. Write: En cualquier momento (cualquier valor escrito ocasiona que el contador de PWM tenga un reset a $00).
ERS
655
ERS
656
delayby1ms
again0 wait_lp0
pshd movb movb bset ldd addd std brclr ldd dbne puld rts
#$90,TSCR1 ;habilitaelTCNTylimpiezadebanderasrpidas #$06,TSCR2 ;establecerpreescala en64 TIOS,OC0 ;habilitaOC0 TCNT #375 ;iniciaconunaoperacindesalidadecomparacin TC0 ;conuntiempoderetardode1ms TFLG1,OC0,wait_lp0 TC0 y,again0
ERS
657
#include CR LF
"hcs12.inc" equ $0D equ $0A org $1000 oc_cnt rmb 1 frequency rmb 2 org $1500 movb #$90,TSCR1 movb #$02,TSCR2 movb #$02,TIOS movb #100,oc_cnt movw movb movb bset cli #0,frequency #$01,TCTL4 #C0F,TFLG1 TIE,IC0
;habilitaTCNTylimpiezarpidadebandera ;estableceelfactordepreescala en4 ;habilitaOC1yIC0 ;prepreseparaejecutar100operacionesOC1,cadauna ;creaunretardode10ms haciendountotalde1segundo ;inicializarcuentadefrecuenciaen0 ;prepreseparacapturarellevantamientodebordedelPT0 ;limpialabanderaC0F ;habilitalainterrupcinIC0 ; "
ERS 658
ldd continue addd std w_lp brclr ldd dec bne ldd pshd ldd jsr leas swi msg db TC0_isr ldd ldx inx stx rti org fdb end
TCNT #60000 TC1 TFLG1,C1F,w_lp TC1 oc_cnt continue frequency #msg [printf,PCR] 2,sp
CR,LF,"The frequency is %d",CR,LF,0 TC0 ;limpialabanderaC0F frequency ;incrementaelconteodelafrecuenciaen1 ;" frequency ; $3E6E TC0_isr ;estableceelnmerodelvectordeinterrupcin ;paraTC0
ERS
659
HaciendoSonidoutilizandolaFuncinde SalidadeComparacin
Unsonidopuedesergeneradomediantelacreacindeunaformade ondadigitalconlafrecuenciaapropiadayutilizndolaparacontrolaruna bocinaounachicharra. ElcircuitodeconexionesparaunzumbadorsemuestraenlaFigura. Lacancinmssencillaesunasirenadedostonos.
ERS
660
AlgoritmoparaGenerarunaSirena
Paso1
Habilitauncanaldesalidadecomparacinparacontrolarelzumbador(olabocina).
Paso2
Inicialaoperacindesalidadecomparacinconunconteoderetardoigualalamitad delperododelasirenayhabilitalainterrupcinOC.
Paso3
Espereporladuracindeltododelasirena(esdecirmediosegundo).Duranteel perododeespera,lafuncindesalidadecomparacinsolicitar muchas interrupciones.Larutinadelserviciodeinterrupcionessimplementereiniciar la operacindesalidadecomparacin.
Paso4
Alfinaldeladuracindeltonodelasirena,elegirunconteodiferentederetardoparala operacindesalidadecomparacinconelfindequeelsonidodelasirenapuedatener diferentesfrecuencias.
Paso5
EspereporlamismaduracinquesevioenelPaso3.Duranteesteperodolaoperacin desalidadecomparacinsolicitar muchasinterrupciones.
Paso6
ERS
661
forever
oc5_isr
#include
bset TIOS,OC5 movb #toggle,TCTL1 movw #hi_freq,delay ldd TCNT addd delay std TC5 bset TIE,OC5 cli ldy #5 jsr delayby100ms movw #lo_freq,delay ldy #5 jsr delayby100ms movw #hi_freq,delay bra forever ldd TC5 addd delay std TC5 rti c:\miniide\delay.asm end
;habilitaOC5 ;seleccionartoggle delaterminalOC5 ;utilizaprimerfrecuenciaaltadelcontadorderetardo ;comienzafrecuenciabajadesonido ;" ;" ;habilitainterrupcinOC5 ;" ;esperamediosegundo ;" ;cambiaafrecuenciabajaelcontadorderetardo
;cambiaafrecuenciaaltaelcontadorderetardo
ERS
663
UsandoOC7paracontrolarmltiplesFunciones OC
OC7puedecontrolarhastaochocanalesdefuncionesOC. ElregistroOC7Mespecificaqu canalOCescontroladoporOC7. ElregistroOC7DespecificaelvalorquecualquierpinPTx asumecuandounaoperacin OC7tienexito. ParaOC0aOC6,cuandoelbit OC7Mn (n=0,,6)est enuno,ylacomparacinOC7es exitosa,stainvalidaunaaccindecomparacinexitosadelaterminalOC0OC6 duranteelmismociclo.
ERS
664
ERS
665
SalidadeComparacinForzada
Hayaplicacionesenlasquecadausuarioquierequeunaaccin desalidadecomparacinocurrainmediatamente,enlugarde esperarunencuentroentreelTCNTyelregistrodesalidade comparacinapropiado. Estasituacinsurgeenen algunasaplicacionesdecontrolde automviles. Paraforzarunaoperacindesalidadecomparacin,escribir1s enlosbitscorrespondientesalregistroCFORC. Acontinuacineltemporizadorcuenta,despusdeescribirenel registroCFORC,loscanalesforzadosadispararlasacciones programadasparaqueocurran.
ERS
666
SalidadeComparacinForzada
Ejemplo.SuponerqueloscontenidosdelosregistrosTCTL1yTCTL2son$D6y $6E,respectivamente.ElcontenidodeTFLG1es$00.Qu debeocurrirenlas terminalesPT7aPT0enelprximocicloderelojsielvalor$7Fesescritoenel registroCFORC? Solucin:
ElTCTL1yelTCTL2configuranlasaccionesdesalidadecomparacincomose muestranenlaTabla. ElregistroTFLG1indicacualesdelasoperacionesdesalidadecomparacinnohan tenidoxitoan. LasaccionesindicadasenlaTablafueronforzadasaocurririnmediatamente.
ERS
667
Acumulador de pulsos
ElsistematemporizadorestndardelHCS12tieneunacumuladordepulsosde16bit,llamadoPACTN.
ERS
668
TSCR1 TEN
1 2 4 8 16 32 64 128
Sele cci n
Sele cci n
Al Contador TCNT
PACLK/65536 PACLK/256 PACTL PAEN 0 MUX PACLK 1 PACNT (BYTE ALTO) PACNT (BYTE BAJO)
PAMOD PACTL
ERS
669
ModosdeOperacindelAcumuladorde Pulsos
MododeconteodeEventos.ElPACTNde16bitspuedeoperar enestemodoycontarelnmerodeeventosquelleganala terminalPT7. MododeAcumulacinporCompuerta.ElPACTNtambinpuede operarenestemodo.Mientrassemantengaactivalasealde PT7(puedeseraltaobaja),elcontadorPACTNesalimentado porunasealquecorrelibrementeE 64sig
FuentesdeInterrupcinparaelAcumuladorde Pulsos
ElPACTNtienedosfuentesdeinterrupcin:deteccindeun bordeenPT7yelsobreflujo delPACTN
ERS 670
RegistrosRelacionadosalosAcumuladores dePulsos
LaoperacindelPACTNestacontroladaporelregistroPACTL.Loscontenidosde steregistrosemuestranenlaFiguradelalaminasiguiente. PACTNtieneuncontadorde16bitsquecomprendeaPACNTLyPACNTH.Se puedeaccederaestecontadorde16bitsutilizandoelnombrePACNT. ElestadodePACNTesregistradoenelregistroPAFLG.
ERS
671
ERS
672
ERS
673
EjemploSuponerqueciertoseventosconectadosalaterminalPT7seconviertenenpulsos. EscribirunprogramaquehabilitaelPACTNparagenerarunainterrupcinalMCUcuandoN eventoshayanocurrido. Solucin:Escribiendouncomplementoa2sdeN,elPACTNinterrumpir alMCUcuandon eventosocurran: #include "hcs12.inc" N equ 1350 org $1500 lds #$1500 ;establecerelapuntadorapila movw #paov_isr,UserPAccOvf ;establecerelvectordeinterrupcinPAOV ldd #N ;colocarelcomplemento2senPACNT coma ; comb ; addd #1 ; std PACNT ; movb #$52,PACTL ;habilitaPACA,mododeconteodeeventos, ;elbordeestalevantndose cli ;habilitainterrupcinPAOV ; swi paov_isr movb #PAOVF,PAFLG ;limpialabanderaPAOVF end
ERS 674
ProcedimientoparalaMedicindelaFrecuenciade unaSealUsandolaFuncinPA
Paso1
ConectarlasealalaterminalPT7. EstablecerelPACNTparaoperarenelmododeconteodeeventos. Utilizaunadelasfuncionesdesalidadecomparacinparagenerarunintervalodetiempode1segundoo llamedelabibliotecaalafuncinderetardo. Utilizaunalocalidaddememoriaparallevarunregistrodelnmerodevecesquehaydesobreflujos en PACNT. HabilitalainterrupcinPAOV. DeshabilitalainterrupcinPAOVdespusdeunsegundo. frequency =paov_cnt 216 +PACNT
Paso 2 Paso 3
Paso 4
Paso 5
"hcs12.inc" org $1000 oc_cnt rmb 1 paov_cnt rmb 2 ;llevauregistrodelconteodesobreflujos delPACNT frequency rmb 4 ;mantienelafrecuenciadelaseal org $1500 lds #$1500 movw #paov_isr,UserPAccOvf ;establecervectordeinterrupcinPAOV movb #50,oc_cnt ;sepreparapararealizar50accionesOC0 ldd #0 std PACNT ;PACNTdejadecontaren0 std paov_cnt ;PACNTinicializaelconteodesobreflujo en0 std frequency ;inicializarfrecuenciaen0 std frequency+2 ; " movb #$90,TSCR1 ;habilitaTCNTybanderadelimpiezarpida bset TIOS,OC0 ;seleccionarfuncinOC0 movb #$03,TSCR2 ;establecerpreescala delTCNTen8 bclr DDRT,$80 ;configuraPT7comoentrada ;configuralafuncinPA:habilitaPA,seleccionaelmododeconteo,levantamientodeborde ;delasealPAI,incrementaelcontadorPACNT,habilitainterrupcinPAOV movb #$52,PACTL cli ;habilitainterrupcinPAOV ldd TCNT
ERS 676
#include
sec_loop addd std brclr ldd dec bne movb sei ldd std ldd std swi paov_isr movb ldx inx stx end
#60000 TC0 TFLG1,C0F,* TC0 oc_cnt sec_loop #0,PACTL PACNT frequency+2 paov_cnt frequency #PAOVF,PAFLG paov_cnt paov_cnt
;aqu espera20ms
;deshabilitalafuncinPA ;Deshabilitalainterrupcin
ERS
677
UsandolaFuncinPAparaMedirlaDuracindel Pulso
Paso1
Seleccionarelmododeacumulacindetiempoporcompuerta,einicializaraPACNTen0.
Paso2
Seleccionarlabajadadebordecomobordeactivo,estohabilitar alTACNTparacontar cundolaterminalPAIest enalto.
Paso3
HabilitalainterrupcinPAIdelbordeactivoyesperaporlallegadadelbordeactivodePAI.
Paso4
Detengaelconteodelacumuladordepulsocuandolleguelainterrupcin.
Paramedirunpulsolargo,necesitamosllevarunregistrodelossobreflujos PA: ancho_de_pulso =[(216 paov_cnt)+PACNT] 64TE Ejemplo Escribeunprogramaparamedirladuracindeunasealdesconocidaenla terminalPAI. Solucin: Elprogramaenasembly escomosigue:
ERS 678
#include hcs12.inc" org $1000 paov_cnt ds.b 1 ;registraelconteodesobreflujos delPACNT pulse_width ds.b 3 ;mantieneelanchodepulso org $1500 movw #paov_isr,UserPAccOvf ;estableceelvectordeinterrupcinPAOV ldd #0 std PACNT ;PACNTdejadecontarhasta0 clr paov_cnt ;PACNTinicializaconteodesobreflujos hasta0 movb #$0,TSCR2 ;establecerlapreescala delTCNTen1 movb #$72,PACTL bclr DDRT,$80 ;configuralaterminalPAIcomoentrada cli ;habilitainterrupcinPAOV brclr PAFLG,PAIF,* ; PAI esperaporllegadadelevantamientodebordes movb #0,PACTL ;deshabilitalafuncinPA sei ;deshabilitainterrupcin ldd PACNT std pulse_width+1 ldaa paov_cnt staa pulse_width swi paovISR movb #PAOVF,PAFLG inc paov_cnt rti end ERS
679
ERS
680
SistemadeModulacindelAnchodePulso (PWM)
Muchasaplicacionesrequierenlageneracindeformasdeondadigitales. Lafuncindesalidadecomparacinpuedeutilizarseparagenerarunaformadeonda digitalperoincurremuchoenlarepeticindeinstrucciones. Elsistemademodulacindeanchodepulsorequieresololaconfiguracininicialdel perodoydelciclodetrabajoparagenerarformasdeondadigitales. ElMC9S12GC32tieneunmduloPWMde6canales. CadacanalPWMtieneunregistrodeperodo,unregistrodeciclodetrabajo,un registrodecontrolyuncontadordedicado. ElrelojdeentradadelPWMesprogramableatravsdeuncircuitodedosetapas. HaycuatroposiblesfuentesderelojparaelmduloPWM:relojA,relojSA,relojBy relojSB. ElrelojSAsederivadedividiralrelojApornmerosparesenunrangode2a512. ElrelojSBsederivadedividiralrelojApornmerosparesenunrangode2a512. ElrelojAyelrelojBsederivandedividiralrelojEporuna potenciade2.Elrangodela potenciapuedeserde0a7.
ERS 681
ERS
682
ERS
683
GeneracindelRelojdePWM
Losfactoresdepreescala paraelrelojAyelrelojBestapredeterminadaporlosbits PCKA2PCKA0yPCKB2PCKB0delregistroPWMPRCLK. ElrelojSAsederivadedividirelrelojAporlosvaloresdelregistroWMSCLAdivididos entre2. ElrelojSBsederivadedividirelrelojBporlosvaloresdelregistroPWMSCLBdivididos entre2. Laseleccindelafuentederelojest controladaporelregistroPWMCLK.
ERS
684
TemporizadoresdelosCanalPWM
LaparteprincipaldecadacanalxdelPWMconsistedeuncontadorde8bits(PWMCNTx),un registrodeperodode8bits(PWMPERx)yunregistrodeciclodetrabajode8bits(PWMDTYx). Elperododelaformadeondadesalidaest controladoporlacoincidenciaentreelregistro PWMPERx yelregistroPWMCNTx. Elciclodetrabajodelaformadeondadesalidaest controladoporlauninentreelregistro PWMDTYx yelregistroPWMCNTx. Lapolaridadinicialdelasalidaesseleccionablesobrelasbasesdeuncanalprogramandoel registroPWMPOL. ElcanalPWMdebeestarhabilitadoactivandoelbit correspondienteenelregistroPWME. ElfuncionamientoglobaldelmduloPWMsemuestraenlaFigura.
ERS 685
ERS
686
AlineacindelaFormadeOndaPWM
LaformadeondadesalidadelPWMpuedeseralineada aladerechaoalaizquierda. Laeleccindeelalineamientoest controladaporel registroPWMCAE.
ERS
687
SalidaconAlineacinIzquierda
ElcontadorPWMCNTx est configuradocomouncontadorascendente.
FrecuenciaPWMx =Reloj(FrecuenciaA,B,SA,SB) PWMPERx Polaridad=0 CiclodeTrabajoPWMx =[(PWMPERx PWMDTYx) PWMPERx] 100% Polaridad=1 CiclodeTrabajoPWMx =[PWMDTYx PWMPERx] 100%
ERS
688
MododeAlineacinCentrada
ElcontadorPWMoperacomouncontadorascendente/descendenteyel conteoascendenteest activadosiemprequeelcontadorseaiguala$00. Cuandoelcontadorencuentraunacoincidenciaentreelregistro delcicloyla salidadelflipflop,cambiasuestadoocasionandoquelasalidadelPWM tambincambiedeestado. UnacoincidenciaentreelcontadorPWMyelregistrodelperodocambiala direccindelcontadordeascendente/descendentea descendente/ascendente. CuandoelcontadorPWMdesciendeydenuevohayunacoincidencia conel registrodelciclodetrabajo,lasalidadelflipflop cambiadeestado ocasionandoquelasalidadelPWMtambincambiedeestado. CuandoelcontadorPWMdesciendehasta0,ladireccindelcontadorcambia deuncontadordescendenteregresandoauncontadorascendentey los registrosdelperodoydelciclosonrecargadosporsusbuffers.
ERS
689
MododeAlineacin
Frecuencia PWMx = Frecuancia (A, B, SA, or SB) de Reloj (2 PWMPERx) Cuando Cuando Polaridad = 0, Ciclo de Trabajo PWMx = [(PWMPERx PWMDTYx) PWMPERx] 100% Cuando Polaridad = 1, Ciclo de Trabajo PWMx = [PWMDTYx PWMPERx] 100%
ERS
690
ModoPWMde16bits
DoscanalesPWMadyacentespuedenconcatenarseparaformaruncanal PWMde16bit. LaconcatenacindeloscanalesPWMest controladoporelregistro PWMCTL. ElsistemaPWMde16bitsest ilustradoenlaFiguradelalminasiguiente. Cuandoestnconectadosloscanaleskyk+1,elcanalkeselcanaldemayor ordenmientrasqueelcanalk+1esdemenororden(kesunnmeropar).El canaldesalidade16bit delaterminaldelcanaldemenorordentambinest habilitadoporelcanaldemenororden. LosmodosdeAlineacin,tantoizquierdacomoderecha,sonaplicablesenel modode16bits.
ERS
691
ModoPWMde16bits
ERS
692
ERS
693
#include hcs12.inc movb movb movb movb movb movb movb movb bset
Ejemplo. Escribeunasecuenciadeinstruccionesparagenerarunaformade
ondacuadradaconunperiodode20ms yunciclodetrabajodel60%del PWM0,utilizaelmododealineacincentrada.
Solucin:
SeleccionaelrelojAcomolafuentederelojyestablecesupreescala en2. Cargarelvalor120enelregistroPWMPER0. PWMPER0=(20 24,000,000 1000,000) 2 2=120 PWMDTY0=PWMPER0 60%=72.
movb movb movb movb movb movb movb bset #0,PWMCLK #1,PWMPOL #1,PWMPRCLK #1,PWMCAE #$0C,PWMCTL #120,PWMPER0 #72,PWMDTY0 PWME,PWME0 ;seleccionaelrelojAcomofuentedereloj ;activalasalidadelPWM0empezandoconnivelalto ;establecerpreescala delrelojAen2 ;seleccionaelmododealineacincentrada ;seleccionamodode8bit,detnaPWMenmododeespera ;activaelvalordelperodo ;activaelvalordelciclodetrabajo ;habilitacanal0delPWM
ERS 695
ERS
697
ControldeMotorDC
ElmotorDCtieneuncampomagnticopermanenteysuarmaduraesuna bobina. Cuandounvoltajeyposteriormenteunacorrientesonaplicadosa su armadura,elmotorcomienzaagirar. Elniveldevoltajeaplicadoatravsdelaarmaduradeterminalavelocidad delarotacin. CasitodaslasaplicacionesenlasqueseusanmotoresDCrequieren invertirladireccindelgiroomuchavelocidad. Sepuedeinvertirladireccindelgiroalcambiarlapolaridaddelvoltaje aplicadoalmotor. Cambiarlavelocidadrequierevariarelniveldevoltajedeentradaal motor.
ERS
698
ControldeMotorDC
Sepuedelograrcambiarelniveldevoltajealvariarelancho depulsodelasealdigitaldeentradaalmotorDC. ElHCS12puedeinteractuarconelmotorDCatravsdel controladormostradoverlminassiguientes. Sedebeseleccionaruncontroladoradecuadoparatomarel controldelasealdelHCS12yentregarelvoltajeyla corrientenecesariasparaelmotor. ElejemplodeuncontroladordemotorDCsemuestraenuna lminaadelante. ElL293tienedosvoltajesdesuministro:VSSyVS.VSSesun suministrolgicoypuedetenerunrangode4.5a36V.VSes analgicoypuedesertanaltacomo36V. ERS 699
ControldeMotorDC
ERS
700
ControldeMotorDC
ERS
701
MotordeDCRetroalimentado
LavelocidaddelmotordeDCdebeserretroalimentadaal microcontroladorparapodersercontrolado. Lavelocidaddelmotorpuedeserretroalimentadausandounlector ptico,undetectorinfrarrojoounsensor deEfectoHall. Basndoseenlaretroalimentacindelavelocidad,elmicrocontrolador puedeajustarelincrementoodecrementodelavelocidad,invertirla direccinoparaelmotor. AsumiendoquedosmagnetossonfijadosalejedelrotordelmotordeDC yuntransistordeEfectoHallesmontadoenlaarmaduradelestator. Comosemuestraenlasiguientelmina,cadavezqueeltransistorde EfectoHallpasaatravsdelcampomagnticosegeneraunpulso. LafuncindeentradadeCapturadelHCS12puedecapturareltiempodel pulsoquevapasando.Eltiempoentredoscapturaseslamitaddeuna revolucin.As lavelocidaddelmotorpuedesercalculada.
ERS 702
MotorDCRetroalimentado
ERS
703
SistemadeControldeunMotorDCbasado enunHCS12
Elesquemasemuestraenlaminassiguientes. LasalidaPWMdelaterminalPP3est conectadoaunextremodelmotor mientrasquePP7est conectadoalotroextremodelmotor. Elcircuitoest conectadodemaneraqueelmotorgireenelsentidodel relojcuandoelvoltajeenlaterminalPP7seaceromientrasque enla salidaPWMnoescero(espositiva). Ladireccindelarotacindelmotorestailustradaenlaminassiguientes. AplicandoelvoltajeapropiadoalasterminalesPP7yPP3(PWM3),el motorpuedegirarenelsentidodelreloj,ensentidocontrarioalrelojo inclusodetenerse.
ERS
704
SistemadeControldeunMotorDCbasado enunHCS12
ElCanal0deEntradadeCapturaseutilizaparacapturarla retroalimentacindeltransistordeEfectoHall. CuandoseenergizaprimeroaunmotorDC,tomatiempoparaalcanzarsu velocidadfinal. Cuandoseincrementalacargadelmotor,ser mslentoyporlotantoel ciclodetrabajoenPWM3deber incrementarparamantenerlavelocidad constante. Cuandosereducelacarga,lavelocidaddelmotorseincrementar yporlo tantoelciclodetrabajoenPWM3debedisminuir. ElmotorDCnorespondeinstantneamentealoscambiosenelciclode trabajo.Variosciclosdebenserpermitidosporelmicrocontroladorpara determinarsielcambiodelciclodetrabajohalogradosuefecto.
ERS 705
SistemadeControldeunMotorDCbasado enunHCS12
ERS
706
SistemadeControldeunMotorDCbasado enunHCS12
ERS
707
ERS
708
El perro de guardia
COP
ERS
709
ERS
710
ERS
711