IMPORTANTE: Para revisar conceptos de microcontroladores (como interrupciones, stack pointer, etc) referirse al documento de Motorola Understanding Small Microcontrollers (Entendiendo Pequeos Microcontroladores) disponible en la pagina web del curso y en el sitio de Motorola http://e-www.motorola.com/brdata/PDFDB/docs/M68HC05TB.pdf
Carga el nmero binario 01000001 en el registro CONFIG2 (dir. de memoria RAM $001E) Lo anterior es equivalente a: LDA STA #%01000000 CONFIG2
Carga A (acumulador o registro de trabajo) con 01000000b Guarda el contenido de A en CONFIG2 Lo que hemos hecho es (ver Data Sheet Summary pag. 13) es: 0: 1: 0: 00: 00: 1: pull-up interno conectado a IRQ pin PTA2/IRQ/KBI2 queda configurado como IRQ reservado (no hace nada) use el oscilador interno (12.8 MHz) reservados pin PTA2/RST/KBI3 queda configurado como RST
Ejemplo 2 Acceso a pines MOV #%00010000,DDRA CLR PORTA BSET 4,PORTA 1. Configura pin 4 del puerto A como pin de salida 2. Pone en low todas las salidas del puerto A 3. pone en High el bit 4 del puerto A, esto traduce a poner en 5 V el pin PTA4
1. Pone el numero 10 (00001010) en la direccin de memoria RAM $80 (la primera disponible, ver Data Sheet Summary pag 7) 2. Carga el acumulador (A) con el nmero 23 (00010111) 3. Suma el contenido de la memoria $80 (10) + el contenido de A (23) y guarda el resultado (33) en A.
Ejemplo 4 Ramificacin tipo GOTO (JUMP) MOV #0, DDRA ;Puerto A todas entradas BRSET 1,PORTA,pinA1_high JMP pinA2_low Otras instrucciones. pinA1_high NOP INCA Etc... pinA2_low DECA Etc... 1. Configura el puerto A como entradas 2. Revisa el bit 1 del puerto A, si esta en H (set) salta a pinA1_high, si esta en cero sigue ejecutando el programa en la lnea siguiente 3. Salta a rutina pinA2_low
Ejemplo 5 Ramificacin tipo CALL (Jumto To Subroutine) AUX EQU $85 ... ... ... CMP BEQ JSR ... ... AUX ;Compara el contenido de AUX con A iguales ; si son iguales salta a iguales distintos ;Variable AUX representa registro en ;direccin $85 de la RAM
iguales BSET 0,PTB ... distintos BCLR 0,PTBS RTS 1. Define que al escribir AUX lo reemplace por $85 2. Compara el contenido de AUX con el de A, si son iguales, se setea (se pone en 1) el bit Z en el registro CCR (Condition Code Register) 3. Revisa el bit Z, si es 1 (o sea el contenido de AUX con el de A eran iguales) entonces salta a iguales y ejecuta BSET 0,PTB (pone en H pin 0 del puerto B, para encender un LED por ejemplo). Si eran distintos sigue ejecutando el cdigo en la lnea siguiente. (...) 4. Si ejecuta JSR (Jump To Subroutine) ir a ejecutar distintos, es decir 5. Pone en Low pin 0 del puerto B 6. RTS (Return From Subroutine), vuelve a donde estaba justo despus del JSR. Note la diferencia entre BEQ o JMP (ejemplo anterior) y JSR. Las primeras saltan a otro trozo del cdigo pero no vuelven al punto al cual se las invoco. En cambio JSR salta a otro trozo del cdigo y al encontrarse con RTS vuelve exactamente al punto desde donde se llam a la subrutina, independiente del lugar en el cdigo desde donde se haya llamado. Ejemplo 6 Deshabilitar el COP Una fuente comn de error es el RESET que causa el COP timer. Este modulo tiene algunas aplicaciones que le dan robustez a un software pero por el momento no nos interesa. Para evitar estos RESET peridicos lo ms simple es deshabilitar el COP timer de la siguiente manera: BSET 0,CONFIG1 Esta instruccin debe ser una de las primeras que se ejecute (idealmente en la seccin de configuracin, apenas se encienda el microcontrolador).
Elegir la carpeta (en Set...) y el nombre del proyecto Pinchar en HC08 Stationery y luego en OK
Elegir el microcontrolador (QT4 en este caso) y el tipo de stationary (Absolute Assembly en este caso) Esto genera los archivos y el cdigo base para comenzar a trabajar sobre el. Aparece la siguiente ventana.
Nosotros trabajaremos sobre el archivo main.asm , al abrirlo (doble clic) aparece el siguiente cdigo (el Stationary)
En negro est el cdigo y comentarios generados por CodeWarrior, en azul los comentarios de esta gua.
; ; ; ; This is a 'bare bone' example of source code for 68HC08 the different sections (absolute addressing) are indicated and can be edited with your code. Program code is the Flash section.
; >>>>>>>>>>>>>>>>>>>>>>> NOTE: ; the entry point (here 'main') is used in the ; 'debugger settings. Keep the label or edit in three places: ; - entry of executable code ; - RESET vector pointer ; - Entry label in Target Settings -> Debugger Settings ; >>>>>>>>>>>>>>>>>>>>>>> INCLUDE ; remove the following 'include' line if EQU statements are in this file ; and no external file is used. Include 'qtqy_registers.inc' ; For the QT1, QT2, QT4, QY1, QY2, QY4
El archivo en include 'qtqy_registers.inc' (vea el archivo) contiene las equivalencias entre los nombres de los registros del microcontrolador y sus direcciones de memoria (ver archivo y Data Sheet Summary en paginas 8 y 9). Esto es muy bueno tenerlo porque as se puede escribir DDRA en vez de $0004 (su direccin en memoria RAM) ORG $80 le dice al compilador que coloque la instruccin que viene a continuacin en la direccin 80hexadecimal (donde comienza la RAM, ver mapa de memoria en Data Sheet Summary pag. 17)
temp_long temp_word temp_byte ds ds ds 4 2 1 ; example of a 4-byte location ; example of a two-byte location ; example of a one-byte location ;**************************************** RAM SECTION ORG $80
ds es una directiva, solo tiene significado para el compilador (no esta en el set de instrucciones del Nitron), significa Define Constant. Reserva espacio en memoria para las variables temp_long, temp_word y temp_byte (4 registros o bytes para temp_long, 2 para temp_word, etc). Estas directivas en conjunto con ORG $80 hacen que temp_long ocupe los registros con direcciones desde $80 hasta $83, temp_word la $84 y $85 y temp_byte la $86. Estas variables se pueden usar despus libremente teniendo en cuenta su tipo (i.e. no se puede almacenar el numero 1000 (mil) en temp_byte ya que temp_byte al ser de 1 byte (8 bits) puede contener nmeros menores que 256)
;**************************************** FLASH SECTION ORG $F800 ; Jiazheng Shi changes
Esto le dice al compilador que el codigo que esta abajo lo comience a poner en la direccin $F800, comienzo de la Memoria Flash (o ROM o mem. De programa) del microcontrolador, ver Mapa de Memoria en Data Sheet Summary pag. 7. La instruccin en la direccin $F800 es la primera que se ejecuta el comenzar el programa (o sea al energizar el microcontrolador)
;*************************************************************** ;* This is the point where code starts executing after a RESET * See note at the top of this file * ;* REPLACE BY YOUR CODE HERE * ;*************************************************************** main: bra PgmStart ; skip identification data FCB '(C) Chris Joffrain July 14, 2002' *
bra -> branch always, hace que la CPU vaya a ejecutar lo que esta bajo el label PgmStart (ms abajo) FCB es una directiva (no instruccin) , que hace que el string '(C) Chris Joffrain July 14, 2002' se almacene en la ROM (o Flash) a continuacin de la instruccin bra (esto es un desperdicio de espacio en memoria, justificado en este caso). El string tiene 32 caracteres por lo que usara 32 byes de memoria ROM.
;************************************************************** ;* spurious - Spurious Interrupt Service Routine. * ;* (unwanted interrupt) * ;************************************************************** spurious: ; placed here so that security value nop ; does not change all the time. rti
spurious es un label o etiqueta para identificar el trozo de cdigo bajo el. nop -> no operation rti -> Return From Interrupt (spurious es una rutina que se ejecuta al producirse una interrupcin, esto quedar claro ms adelante). rti termina la interrupcin para que el microcontrolador siga operando desde donde quedo al producirse la interrupcin
;************************************************************** ;* Start of Program * ;* PgmStart - This is the point where code starts executing * ;* after a RESET. * ;************************************************************** PgmStart: rsp clra clrx loop: sta temp_byte ; clear byte nop bra loop
;**************************************************************
Como se explico ms arriba, cuando parte la CPU, es enviada a ejecutar las instrucciones bajo el label PgmStart rsp clra clrx loop: sta temp_byte nop bra loop -> reset stack pointer (conviene ponerlo siempre) -> clear (accumulator) , borra el registro de trabajo -> clear (X), borra el registro de indice, usado en algunas instrucciones label o etiqueta -> guarda el contenido de la variable temp_byte en A (accumulator) -> no operation -> branch always, manda a la CPU a ejecutar lo que esta bajo el label loop (sta temp_byte en este caso)
;* Interrupt Vectors * ;************************************************************** ORG $FFDE adc_isr fdb fdb fdb fdb fdb fdb spurious spurious spurious spurious spurious spurious
fdb fdb fdb fdb fdb fdb fdb fdb fdb fdb fdb
spurious spurious spurious spurious spurious spurious spurious spurious spurious spurious main
Al producirse una interrupcin, esta hace que el PC (program counter) se cargue con el contenido del registro con la direccin del vector de interrupcin. (ver Tabla 3, pag. 9 del Data Sheet Summary). En otras palabras, el program counter (PC) se carga con el contenido del vector de interrupcin correspondiente, apuntando asi a alguna parte del cdigo (creada por el programador) que procese dicha interrupcin. As, si la interrupcin es de ADC conversin complete (high), la CPU cargar el PC con el contenido de $FFDE, si la interrupcin es de TIM overflow high, el PC se cargara con lo que haya en $FFF2. En esta caso particular, todos los vectores de interrupcion contienen el fdb spurious , esto significa: Form Double Byte <posicion en mem. del label spurious>. El label spurious (ms arriba) qued en alguna posicin de la memoria que lo identifica (y permite hacer referencia al cdigo bajo el, bsicamente es un puntero) Por ejemplo, si la instruccin bajo el label spurious (nop en este caso) qued en la direccin $F843, entonces al escribir spurious dentro de una instruccin o directiva, esta palabra es reemplazada por el nmero $F843. Con lo cual la instruccin FDB spurious har que el PC se cargue con $F843 y a continuacin se ejecutara nop
END
Este archivo creado por CodeWarrior ofrece una base sobre la cual comenzar a programar, si se desea algo ms sencillo se puede comenzar de cero pero hay que tener cuidado con las directivas ORG y acordarse de incluir ' qtqy_registers.inc' bien copiar su contenido y pegarlo en el programa o al comienzo. Adems, si la rutina principal no se llama main, hay que cambiar esto en el men Target Settings -> Debugger Settings para que funcione el debugger.
El microcontrolador no es capaz de entender el lenguaje assembler, para esto se necesita el compilador que lo traduzca. Los archivos ejecutables de los microcontroladores Motorola se denominan S-Record, estos archivos son producto de la compilacin de un programa en assembler y tienen extensin .s19 Nota: Si se esta programando en lenguaje C o C++ es necesario forzar al compilador que genere el archivo s-record. Para esto se debe abrir la misma ventana de arriba, pinchar en Linker for HC08, pinchar en Options, luego en Output y marcar la opcin Generate S-Record File. Como compilar Para compilar simplemente pinche en Make . Si no hay errores, el archivo .s19 quedara en la subcarpeta \bin dentro de la carpeta donde se creo el proyecto.
Estos botones permiten ir ejecutando el programa paso a paso. Las ventanas muestran informacin sobre lo que ocurre en el microcontrolador y en el programa. Source: muestra el cdigo tal cual como fue escrito. La ltima instruccin ejecutada en la simulacin aparece resaltada (aqu en azul)
Data: Muestra las variables declaradas (por ejemplo con las directiva ds y fdb). Se puede ver su direccin de memoria y el dato que contienen. Command: Muestra informacin acerca de los errores as como el ultimo comando ejecutado. Tambin permite entrar comandos como >Reset Assembly: Muestra el cdigo en assembler puro, sin comentarios Register: Muestra el contenido de los registros de la CPU as como la cantidad de ciclos transcurridos Procedure: Muestra la rutina o subrutina en la que se encuentra actualmente el procesador Memory: Muestra el contenido de todos los registros de la memoria (RAM y ROM). Es decir el mapa de memoria completo (ver Data Sheet Summary pag. 7). En resumen, a cada paso se conoce el estado del microprocesador. Esto es de gran ayuda para depurar el programa y detectar las fuentes de error. En el men PEDebug se puede acceder a distintos mdulos del microcontrolador simulado y simular cambios en variables externas como un cambio en la frecuencia del clock, una entrada analgica al conversor A/D, niveles lgicos en los pines de I/O, etc.
1. 2. 3. 4. 5.
En Target Hardware Type elija Class I Motorola... Elija el Puerto Serial Elija Baud: en 19200 baud Marque IGNORE security failure and enter monitor mode. Pinche en Contact Target with these settings
Elija el microcontrolador apropiado y pinche en Open Aparecer la ventana principal de la aplicacin: Pinche en File y Specify S Record
Elija el S Record que desea y pinche en Open. Haga clic en Program Module y verifique la correcta programacin con Verify
Si no hay errores el microcontrolador ha quedado programado. Ya puede cambiar el jumper (J3) de la tarjeta a User Mode o bien sacar el chip y probar su programa en una protoboard. Si hay problemas intente lo siguiente: Reset Procesor Choose Module Erase Module Verifique que quedo borrado con Blank Check Luego reintente la programacin, si aun no funciona intente sacar y poner el microcontrolador en su base. O bien cambiar el Modulo o algoritmo (por ejemplo a veces ocurre que es necesario programar un QT2 con el algoritmo de un QT4, la nica diferencia entre estos microcontroladores es el tamao de su memoria)