En este primer ejemplo todavía no vamos a usar ningún micro, sino que utilizaremos el simulador que trae el Codewarrior para probar nuestro programa.
El objetivo de este ejemplo es aprender a configurar los puertos de entrada/salida del microcontrolador. El SH8 cuenta con tres puertos de 8 bits: El PTBD que se encuentra completo, mientras que PTAD y PTCD solamente poseen 6 y 4 bits respectivamente. Estos puertos son bidireccionales, lo que quiere decir que pueden configurarse como entrada o salida con tan solo escribir un 0 o un 1 en el registro PTxDD (Port Data Direction Register). En la siguiente imagen podemos observar la estructura del registro PTBDD.
Ejemplo:
| ASM | | copy code | | ? |
| 1 | ******************************************** |
| 2 | *Configuración de puertos de entrada/salida* |
| 3 | ******************************************** |
| 4 | bset 0,PTBDD ;Configuro el bit 0 del registro PTBDD como salida |
| 5 | mov #%11111111,PTADD ;Configuro todo el registro PTADD como salida |
| 6 | bclr 5,PTCDD ;Configuro el bit 5 del registro PTCDD como salida |
La instrucción bset (Bit Set), como su nombre lo indica, pone en 1 el bit indicado de una variable o registro específicos. En este caso, se pone en 1 el bit 0 del registro PTBDD, configurándolo como salida.
Con la instrucción mov, copiamos el valor indicado en la variable o registro especificado. Esta instrucción sirve siempre que se accedan variables o registros ubicados en página cero. De lo contrario deberemos usar el código:
| ASM | | copy code | | ? |
| 1 | lda #%11111111 ;Carga el valor binario 11111111 en el acumulador |
| 2 | sta REGISTRO ;Guarda el valor que se encuentra en el acumulador en un registro |
Volviendo al código anterior, el # indica que se trata de un número, y el % indica que es un número binario. Por lo tanto, lo que se está haciendo es copiar el valor 11111111 en binario en el registro PTADD, configurando de esta manera todos los bits del puerto A como salidas.
Por último, la instrucción bclr (Bit Clear) hace lo contrario que bset. En este caso se pone en 0 el bit 5 del registro PTCDD, configurando el bit 5 del puerto C como salida.
En definitiva, para variar el estado de un pin de salida solo tenemos que escribir un 1 o un 0 en el pin deseado.
Ejemplo:
| ASM | | copy code | | ? |
| 1 | bset 3,PTBD ;Pongo en 1 el bit 3 del puerto B |
| 2 | bclr 0,PTAD ;Pongo en 0 el bit 0 del puerto A |
Ahora pongamos todo esto en práctica. Primero debemos crear un proyecto nuevo en Codewarrior 10.2. Para esto podemos seguir los videos que se encuentran en el post anterior. Seleccionamos el micro MC9S08SH8 y luego de esto eligimos simulación por software (P&E Full Chip Simulation).
En la siguiente ventana podemos elegir el lenguaje, que en este caso es Absolute Assembly.
Y esto es todo lo que configuraremos por ahora.
A la izquierda podemos encontrar una lista de nuestros proyectos. Navegamos hasta la carpeta Sources y abrimos el archivo main.asm. Esta es la plantilla para crear nuestro programa.
Lo primero que haremos será modificar la siguiente línea:
| ASM | | copy code | | ? |
| 1 | ORG RAMStart |
Por:
| ASM | | copy code | | ? |
| 1 | ORG Z_RAMStart |
Luego debemos configurar los puertos de entrada/salida con el siguiente código:
| ASM | | copy code | | ? |
| 1 | ******************************************** |
| 2 | *Configuración de puertos de entrada/salida* |
| 3 | ******************************************** |
| 4 | bset 0,PTBDD ;Configuro el bit 0 del registro PTBDD como salida |
| 5 | mov #%11111111,PTADD ;Configuro todo el registro PTADD como salida |
| 6 | bclr 5,PTCDD ;Configuro el bit 5 del registro PTCDD como salida |
Por último observemos la etiqueta mainLoop. Lo que hace es indicar el comienzo del programa principal. Este será el lugar en dónde escribiremos nuestro código, que al terminarlo con la instrucción:
| ASM | | copy code | | ? |
| 1 | bra mainLoop ;Salta siempre al inicio del programa principal |
se creará un bucle infinito que ejecutará nuestro código una y otra vez.
En este caso escribiremos el siguiente código:
| ASM | | copy code | | ? |
| 1 | bset 0,PTBD ;Pongo en 1 el bit 0 del puerto B |
| 2 | bclr 0,PTBD ;Pongo en 0 el bit 0 del puerto B |
| 3 | bset 3,PTAD ;Pongo en 1 el bit 3 del puerto A |
| 4 | bclr 3,PTAD ;Pongo en 0 el bit 3 del puerto A |
Ya estamos listos para probar nuestro programa. Primero debemos compilarlo haciendo click en Build. Si todo está bien, no aparecerá ningún error. Luego hacemos click en Debug. Con la tecla F5 podemos hacer avanzar nuestro programa instrucción por instrucción y así ver como se van modificando los registros en la parte superior derecha de la pantalla. Nuevamente, para más detalles pueden seguir los videos que se encuentran en el post anterior.
Asi termina esta práctica. Para familiarizarse más con el asembler de esta familia de micros recomiendo leer el libro “Basic Micropocessors and the 6800” de Ron Bishop, y “6800 Assembly Language Programming” de Lance A. Leventhal. Si bien estos libros están dedicados al antiguo microprocesador 6800, muchos de los modos de direccionamiento e instrucciones son similares a las de la familia HCS08.
Código completo:
| ASM | | copy code | | ? |
| 01 | ;******************************************************************* |
| 02 | ;* This stationery serves as the framework for a user application. * |
| 03 | ;* For a more comprehensive program that demonstrates the more * |
| 04 | ;* advanced functionality of this processor, please see the * |
| 05 | ;* demonstration applications, located in the examples * |
| 06 | ;* subdirectory of the "Freescale CodeWarrior for HC08" program * |
| 07 | ;* directory. * |
| 08 | ;******************************************************************* |
| 09 | |
| 10 | ; Include derivative-specific definitions |
| 11 | INCLUDE 'derivative.inc' |
| 12 | |
| 13 | ; |
| 14 | ; export symbols |
| 15 | ; |
| 16 | XDEF _Startup |
| 17 | ABSENTRY _Startup |
| 18 | |
| 19 | ; |
| 20 | ; variable/data section |
| 21 | ; |
| 22 | ORG Z_RAMStart ; Insert your data definition here |
| 23 | ExampleVar: DS.B 1 |
| 24 | |
| 25 | ; |
| 26 | ; code section |
| 27 | ; |
| 28 | ORG ROMStart |
| 29 | |
| 30 | _Startup: |
| 31 | LDHX #RAMEnd+1 ; initialize the stack pointer |
| 32 | TXS |
| 33 | |
| 34 | ******************************************** |
| 35 | *Configuración de puertos de entrada/salida* |
| 36 | ******************************************** |
| 37 | bset 0,PTBDD ;Configuro el bit 0 del puerto B como salida |
| 38 | mov #%11111111,PTADD ;Configuro todo el puerto A como salida |
| 39 | bclr 2,PTCDD ;Configuro el bit 5 del puerto C como salida |
| 40 | |
| 41 | mainLoop: |
| 42 | bset 0,PTBD ;Pongo en 1 el bit 0 del puerto B |
| 43 | bclr 0,PTBD ;Pongo en 0 el bit 0 del puerto B |
| 44 | bset 3,PTAD ;Pongo en 1 el bit 3 del puerto A |
| 45 | bclr 3,PTAD ;Pongo en 0 el bit 3 del puerto A |
| 46 | NOP |
| 47 | |
| 48 | feed_watchdog |
| 49 | BRA mainLoop |
| 50 | |
| 51 | ;************************************************************** |
| 52 | ;* spurious - Spurious Interrupt Service Routine. * |
| 53 | ;* (unwanted interrupt) * |
| 54 | ;************************************************************** |
| 55 | |
| 56 | spurious: ; placed here so that security value |
| 57 | NOP ; does not change all the time. |
| 58 | RTI |
| 59 | |
| 60 | ;************************************************************** |
| 61 | ;* Interrupt Vectors * |
| 62 | ;************************************************************** |
| 63 | |
| 64 | ORG $FFFA |
| 65 | |
| 66 | DC.W spurious ; |
| 67 | DC.W spurious ; SWI |
| 68 | DC.W _Startup ; Reset |
En la próxima parte veremos un programa un poco más completo, tanto en lenguaje assembler como en C.
Fuente: MC9S08SH8.pdf
freescale, hc08, hcs08, micro, microcontroladores, micros, motorola

{ 1 comment to read ... please submit second! }