Anda di halaman 1dari 16

Gua rpida de Programacin de Microcontroladores Nitron

Michael Van Sint Jan mayo de 2003

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

Ejemplos de instrucciones en assembler


(NOTA: es recomendable repasar los modos de direccionamiento en el documento Understanding Small Microcontrollers) Aclaraciones previas: En Assembler, los labels o etiquetas van pegados al lado izquierdo en cambio las instrucciones deben estar tabuladas o separadas por al menos un espacio en blanco, de lo contrario seran interpretadas como etiquetas. Las etiquetas permiten hacer referencia a distintos trozos del cdigo as como individualizar subrutinas y funciones. Al compilar la etiqueta es acta como un puntero a la direccin de memoria de la instruccin que la sucede (esto quedar claro ms adelante). Al anteponer # a un nmero, se le dice al compilador que interprete este como un valor y no como puntero a memoria que sera el caso si no se antepone #. El compilador permite trabajar indistintamente con datos en base decimal, hexadecimal, octal, binaria y cdigo ASCII. Para identificar la base se antepone un carcter como indica la siguiente tabla. Prefijo Ninguno $ @ % Indica que el valor que sigue es... Decimal Hex Octal Binario ASCII

Ejemplo 1 Movimiento de bytes y configuracin MOV #%01000001,CONFIG2

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

Ejemplo 3 - Suma MOV LDA ADC #10, $0080 #23 $80

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).

Programa en assembler para un microcontrolador QT/QY (Nitron)


Abrir CodeWarrior Pinchar en File New Aparece el siguiente cuadro

Elegir la carpeta (en Set...) y el nombre del proyecto Pinchar en HC08 Stationery y luego en OK

Aparece Esta ventana:

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

END fin de programa (siempre debe ir)


;* This source is (C)opyright 2002, P&E Microcomputer Systems, Inc. ;* This source has been modified by C.Joffrain (Metrowerks) July 14, 2002.

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.

Este men abre la siguiente ventana.

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.

Como depurar (Debug) Oprima el boton debug para abrir el Simulador/Depurador

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.

Como grabar un S-Record en el microcontrolador


Para esto se utiliza otro programa (no el CodeWarrior). Aqu vamos a utilizar el PROG08SZ Flash Programmer disponible en http://www.pemicro.com/ (con extensa documentacin) Descargue el programa de Internet. Antes de programar hay que configurar adecuadamente los Jumpers de la tarjeta de interfaz y conectarle una fuente de poder AC o DC de 7 a 12 V (la tarjeta cuenta rectificador y regulador de 5V ). Para el modo de programacin o Monitor Mode, ponga el Jumper 3 cortocircuitando los pines 1-2. Todos los dems jumpers quedan puestos. Abra el programa y aparecer la siguiente ventana.

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

Si la comunicacin con la tarjeta no se realiza, pruebe cambiando el Puerto Serial.

Aparecer esta ventana:

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)

Anda mungkin juga menyukai