Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
IDE de programación CodeWarrior
1
Uso de IDE de programación CodeWarrior (Agosto 2015) Cuervo Espinosa Diana Gerlid, Villamizar V illamizar Castellanos César Augusto {dgcuervoe, cavillamizarc}@unal.edu.co cavillamizarc}@unal.edu.co Universidad Nacional de Colombia documento se consignan los resultados y Resumen — En éste documento análisis del desarrollo de tres códigos básicos en el IDE de programación CodeWarrior en proyectos pensados para la programación del microcontrolador MC9S08QG8 de Freescale. El primer ejemplo analiza el código generado en un proyecto por defecto en el IDE, así como los archivos necesarios en el proyecto y su función. Posteriormente unos códigos de ejemplo desarrollados en lenguaje Assembler y C++ muestran los principios básicos para generar una salida digital en el microcontrolador. Palabr as Clave — Microcontrolador, MC9S08QG8, Freescale, CodeWarrior, Assembler, C++. Abstract — In this document the results and analysis of the development of three basic codes in the CodeWarrior IDE programming projects designed for programming the microcontroller Freescale MC9S08QG8 are recorded. The first example analyzes the generated code into a default project in the IDE, and the necessary files in the project and its function. Subsequently developed codes of Assembler language and C ++ are given and show the basic fundaments for generating a digital output in the microcontroller.
Microcontroller, MC9S08QG8, Freescale, CodeWarrior, Assembler, C++. I ndex
Terms —
I. INTRODUCCIÓN Para iniciar la programación de un nuevo microcontrolador es importante familiarizarse con las variables e instrucciones propias del mismo, para lo cual siempre resulta útil la ayuda de un IDE, el cual puede proporcionar herramientas como la generación automática de los archivos necesarios y un entorno de debugging, desde el cual es posible verificar paso a pasó qué operaciones deberá
cumplir el microcontrolador. Además de esto, el programador debe ser capaz de leer la documentación propia del dispositivo, en la cual podrá encontrar descripciones más precisas de cómo funciona el mismo para así poder aplicar este conocimiento en sus proyectos. En éste documento se describe el análisis y simulación de tres programas básicos que pueden ser una ayuda para el entendimiento de la programación de microcontroladores. II. PROCEDIMIENTO A. Creación de un proyecto por defecto Inicialmente se genera un proyecto por defecto desde el IDE Codewarrior desde el menú: File->new->Bareboard Project. Una vez seleccionado el nombre del proyecto, se selecciona como device el MC9S08QG8 y se marca la opción de tipo de proyecto como aplicación. La conexión a usar será la P&E Full Chip simulation y el lenguaje “Relocatable Assembly“. Una vez seleccionadas éstas especificaciones se finaliza el ayudante para creación de proyecto. B. Identificación de archivos del proyecto En la Tabla la Tabla 1 se encuentran organizados y descritos los archivos generados en un proyecto por defecto.
Tabla 1. Descripción de archivos generados en un proyecto default de lenguaje Assembler Ubicación
Project_Headers
Nombre de archivo
derivative.inc MC9S08QG8.inc
Descripción
Librería que incluye la definición de macros como feed_watchdog y realiza la inclusión del archivo MC9S08QG8.inc. () Librería que incluye los registros propios del microcontrolador MC9S08QG8
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
Project_Settings Project_Settings/Debugger
MC9S08QG8.mem MC9S08QG8.tcl
Project_Settings/Linker_Files
burner.bbl
Project_Settings/Startup_Code Sources
Project.prm main.asm
IDE de programación CodeWarrior
2
Archivo de configuración de memoria que define las áreas accesibles para modificación y/o lectura en el microprocesador seleccionado Script en el cual se pueden almacenar comandos para realizar debugging de forma automática. (bbl= batch burner language) Archivo de configuración de la construcción del proyecto. Archivo de propiedades del proyecto Código fuente a simular y/o programar en el microcontrolador
En esta etapa se declara una sección llamada “MY_ZEROPAGE”, de tipo de dato “short” Las secciones son porciones de código o datos que El código generado por defecto por el IDE de no pueden ser divididas en elementos más programación se encuentra como Anexo 1 a éste pequeños. Cada sección tiene un nombre, un tipo y documento. Cada una de las líneas de comando son algunos atributos. Cada archivo assembly contiene explicadas y analizadas a continuación. por lo menos una sección. C. Análisis de código generado por defecto
INCLUDE 'derivative.inc' La instrucción INCLUDE puede interpretarse como
XDEF _Startup, main
La directiva “XDEF” o “External symbol definition”, especifica etiquetas en el módulo actual y que pueden ser referenciadas por otros módulos conectados al módulo actual Para este caso se definen dos etiquetas, “_Startup” y “main”, las cuales se podrán usar en diferentes partes del código para ejecutar las instrucciones que se encuentren dentro de ellas XREF __SEG_END_SSTACK La directiva “XREF” o “External symbol Reference” especifica símbolos referenciados en el módulo actual, pero están definidos en otro módulo.
Sintaxis para la declaración de secciones: : SECTION [SHORT][ < Número > ]
MyCode:
SECTION
Al igual que en la instrucción anterior, ésta línea de código se encarga de crear una nueva sección, ésta vez con nombre “MyCode”.
main:
Etiqueta usada para poder ser referenciada luego como punto de inicio de una ejecución de instrucciones. (Inicio del programa).
_Startup:
En este caso se hace referencia al símbolo “ __SEG_END_SSTACK ”.
MY_ZEROPAGE: SECTION SHORT
Etiqueta usada para poder ser referenciada luego como punto de inicio de una ejecución de instrucciones.
LDHX #__SEG_END_SSTACK
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
La directiva “LDHX” o “Load Index Register from Memory” se encarga de cargar los contenidos de una ubicación específica en la memoria en el registro de índices (index register). TXS La directiva “TXS” o “Transfer Index Register to Stack Pointer ” carga el stack pointer (SP) con los contenidos del registro de índices (index register) menos 1.
IDE de programación CodeWarrior
3
La directiva “BRA” o “Branch Always” crea una rama hacia la dirección especificada. De éste modo, ésta instrucción hace que se vuelvan a realizar las instrucciones dentro de la etiqueta mainLoop de forma infinita.
CLI
La directiva “CLI” limpia el bit de máscara de interrupción, denominado “I”, en el “Condition Code Register” (CCR). Al limpiar este bit, se habilitan las interrupciones.
mainLoop:
Etiqueta usada para poder ser referenciada luego como punto de inicio de una ejecución de instrucciones.
D. Códigos de ejemplo En los anexos 2 y 3 de éste documento se encuentra el contenido de los archivos main.asm y main.cpp, usados como códigos principales de los ejemplos 1 y 2 respectivamente. E. Análisis de simulación 1) Ejemplo 1
En primer lugar se realiza la carga de un valor equivalente a 0x52 en el registro A del core del dispositivo. Ésta operación es realizada mediante el comando “LDA #$52” y puede ser evidenciado desde la simulación en el proceso de debugging.
NOP Instrucción de “No operation”, la cual consume un ciclo del reloj del procesador y no realiza cambios en registros o memoria.
feed_watchdog
La instrucción feed_watchdog es un macro contenido en la librería “derivative.inc”. Éste realiza la siguiente operación:
Figura 1. Registro del core antes de ser ejecutada la instrucción
STA SRS La directiva STA o “Store Accumulator in Memory”, almacena los contenidos del registro “A” en memoria. El registro SRS o “System Reset Status Register ” es un registro que incluye siete banderas de estado de solo lectura para indicar la fuente del más reciente reinicio. Escribir cualquier valor en la dirección del registro limpia el temporizador del “COP watchdog” (COP= computer operating properly).
BRA mainLoop
Figura 2. Registro del core luego de ser ejecutada la instrucción
Posteriormente, la línea de instrucciones “STA SOPT1” se encarga de almacenar en el registro SOPT1 (System Option register) el valor
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
encontrado en el registro A. Al tener un valor de 0x52 en éste registro se desactiva el COP watchdog.
IDE de programación CodeWarrior
4
Figura 5. Registro PTBDD antes de la ejecución
Figura 3. Memoria SOPT1 antes de ejecutar la instrucción Figura 6. Registro PTBDD luego de la ejecución
A continuación se ingresa a un ciclo infinito en el cual, en primer lugar se vuelve a asignar un nuevo valor al registro A, en éste caso el de 0x0f. Continua la ejecución asignando el valor de 0x08 a PTBD, lo cual es equivalente a poner en estado alto la salida PTB3. Figura 4. Memoria SOPT1 luego de ejecutar la instrucción
Posteriormente la instrucción “MOV #$08,PTBDD” mueve el valor 0x08 al registro de PIO llamado PTBDD (Parallel port B data direction). Es importante tener en cuenta en un bit en estado alto (valor binario 1) en un registro de dirección de datos representa que la posición asociada con éste bit será usada como salida.
Se realiza un decremento unitario en el registro “A” hasta que el mismo llega a ser 0 (puede ser interpretado como una pausa de 15 ciclos). Esto mediante la instrucción “DBNZA” Se asigna un valor de 0x00 al PTB3 y nuevamente se asigna un valor de 0x0f a “A”. Una vez más se realiza una cuenta descendente hasta llegar a un valor de A=0x00, se realiza la operación feed_watchdog y se reinicia el ciclo.
El puerto paralelo B tiene un total de 8 bits, En resumen, se puede afirmar que éste programa numerados de 0 a 7. Al asignar a PTBDD el número genera, aproximadamente, una señal de salida 0x08, equivalente en binario a 00001000, se está cuadrada por PTB3 con un ciclo útil del 50% y un periodo de 30 ciclos del reloj. asignando PTB3 como salida.
Figura 7. Señal de salida digital obtenida por la ejecución del código de ejemplo 1
IDE de programación CodeWarrior
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César. 2) Ejemplo 2
Es importante destacar en éste ejemplo que, durante la creación del proyecto es necesaria la selección del lenguaje de programación C++ en lugar de Assembler. La ejecución del programa inicia desde el método “main”, en el cual la primera instrucción se encarga de asignar un valor de 0x52 al registro SOPT1, desactivando así el COP watchdog tal como se indicó en el anterior ejemplo. “SOPT1 = 0x52;” La instrucción “ICSC1 = 0b10000000” se refiere a configuraciones del “Internal Clock Source”, de modo al asignar un estado alto únicamente al bit 7, indica que se usará una referencia externa de reloj. Por otro lado, la instrucción “ICSC2 = 0b00110110;” se puede interpretar por los bits en estado alto y la función de cada uno: Bit1 = Habilita la referencia externa de reloj Bit2 = Selecciona la fuente de referencia externa, para este caso un 1 significa que la referencia es un oscilador. Bit4 = Configura el oscilador externo para modo de operación de alta ganancia Bit5 = Se selecciona un rango de frecuencia alta del oscilador. (Información obtenida microcontrolador)
del
datasheet
del
5
La instrucción “for(;;){}” indica que el código agrupado entre los corchetes se ejecutará infinitamente. Dentro de ésta instrucción se realiza una asignación de salida del puerto B de 0b00111111, de modo que todas las salidas del puerto B se encontrarán en estado alto. “PTBD = 0b00111111;” Luego de esta asignación se realiza un delay o retraso, el cual, analizando el código, consiste simplemente en el conteo de 0 a 6000, conteo durante el cual no se realiza ninguna operación. Una vez más, se asigna un nuevo valor a las salidas del puerto B, ésta vez de 0b00000000, de modo que todas adquieren un estado bajo. Se ejecuta nuevamente un delay de 6000 ciclos y se inicia una nueva iteración del ciclo. “PTBD = 0;” En resumen, se puede firmar que la programación y ejecución de éste código en el microcontrolador resultará en la generación de 6 señales cuadradas en las salidas PTB0-5 con ciclo útil del 50% y con un periodo de 12000. III. PREGUNTAS SUGERIDAS
Que tipos de archivos son generados en la carpeta debug?
Archivos en la carpeta Debug son de tipo: MEM TLC LAUNCH
Figura 8. Descripción de campos para ICSC2
Figura 9. Descripción de campos para ICSC2
Luego se procede a asignar un valor de 0b00111111 al registro PTBDD, lo cual, como se describió en el anterior ejemplo, resulta ser la asignación como salidas en el puerto B a los pines 0 a 5 (PTB0-5). “PTBDD = 0b00111111;”
Qué tipo de información está en los archivos *.inc y para que se utiliza?
Un archivo .INC es un archivo de inclusión, una forma de tomar un pedazo de código y reutilizarlo en una varidedad de scripts de ASP, uno de los muchos lenguajes script (PHP, ASP, .NET, JSP, Perl, Phyton, etc.) que permiten crear webs dinámicas, desde páginas simples hasta potentes aplicaciones web. Originalmente los usuarios nombraban
IDE de programación CodeWarrior
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
Un ICE sirve como una CPU "sustituta" (unidad central de procesamiento) para el microcomputador en un sistema embebido. El ICE por lo general tiene un conector que se ajuste al zócalo de la CPU en el sistema. Si el conector suministrado con el ICE no coincide con el zócalo del sistema, se puede encontrar un adaptador adecuado. Un ICE puede ayudar a los ingenieros de diseño en el desarrollo de productos, y también ayudar a los programadores o usuarios finales en la mejora del producto, modificación o mantenimiento. [6]
a sus archivos de inclusión con la extensión .INC para diferenciarlos de los demás, y muchos la siguen usando. [2][3] Un archivo .INC es un archivo de texto que contiene declaraciones, encabezados, funciones y otros datos que puede ser utilizados por un código fuente como punto de referencia. Este archivo se puede utilizar en conjunto con C/C++, Pascal, Java, PHP y otros lenguajes. Si hay un visualizador de archivos .INC o un programa para abrirlos disponible, puedes encontrar el visualizador en la sección de programas de soporte y luego descargar un programa gratuito para abrir INClude file (Assembler language or Active Server) File. [4]
Qué es emulators, in-circuit emulator (ICE), in-citcuit programiming?
En informática, un emulador es un software que permite ejecutar programas o videojuegos en una plataforma, sea una arquitectura de hardware o un sistema operativo, diferente de aquella para la cual fueron escritos originalmente. A diferencia de un simulador, que solo trata de reproducir el comportamiento del programa, un emulador trata de modelar de forma precisa el dispositivo de manera que este funcione como si estuviese siendo usado en el aparato original. [5] Un in-circuit emulator (ICE), en español un emulador en circuito, es una interfaz de hardware que permite a un programador cambiar o depurar el software en un sistema embebido. El ICE se instala temporalmente entre el sistema embebido y un terminal externo o un computador personal para que el programador pueda observar y alterar lo que tiene lugar en el sistema embebido, que no tiene su propia pantalla o teclado.
6
Dentro de la programación del sistema (ISP), también conocida como la programación en circuito (ICP) , la programación serial o programación en serie en el circuito (ICSP) permite la programación y reprogramación de microcontroladores, memorias EEPROM serie y memorias flash ya soldada en una PCB de destino. In-System Programming (ISP) es una técnica donde un dispositivo programable se programa después de que los dispositivos son colocados en una placa de circuito, ICSP es una técnica mejorada ISP implementado en microcontroladores FLASH RISC (MCU). El uso de sólo dos pines I/O en serie de entrada y de salida de datos ICSP hace fácil usar y menos intrusivo en el funcionamiento normal de la MCU. Debido a que ISP puede adaptarse a los cambios rápidos de código en una línea de fabricación, ofrece una gran flexibilidad, reducción del tiempo de desarrollo y los ciclos de producción para mejorar el tiempo de comercialización. [7][8]
Qué significa puerto JTAG?
Puerto JTAG, desde su acrónimo en inglés, Joint Test Action Group, es el nombre común utilizado para la norma IEEE 1149.1 titulada Standard Test Access Port and Boundary-Scan Architecture, en español Test estándar de puertos de acceso y
IDE de programación CodeWarrior
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
arquitectura para la exploración de límites, para test de puertos de acceso utilizada para testear PCBs utilizando boundary scan, es decir, exploración de límites.
hardware, y cada uno de ellos aporta su propio nombre. BDM (Background Debug Mode), es uno de ellos, y más puntualmente es el término empleado por Motorola para una determinada forma de depuración de sistemas. También se refiere al nombre del puerto físico (conjunto de pines) con el que equipan a los chips de los microcontroladores para acceder al interior del chip.
JTAG se estandarizó en 1990 como la norma IEEE 1149.1-1990. En 1994 se agregó un suplemento que contiene una descripción del boundary scan description language (BSDL), en español descripción del lenguaje de boundary scan. Desde entonces, esta norma fue adoptada por las compañías electrónicas de todo el mundo.
Otros chips de otros fabricantes usan el puerto JTAG (IBM), el puerto OnCE (DSP`s de Motorola), el puerto MPSD (de Texas Instruments), etc. Pero la depuración on-chip (On-Chip Debbuding, OCD) abarca cualquiera de estos puertos y se le denomina a menudo “depuración BDM”, aunque sea realizada a través de un puerto JTAG. Todos ellos están basados en una serie de facilidades que el fabricante ha instalado dentro del chip y que sirven para inspeccionar, modificar y depurar el funcionamiento tanto del hardware como del software. [10]
Figura 10. Puerto JTAG
Actualmente, Boundary-scan y JTAG son sinónimos, aunque fue diseñado originalmente para circuitos impresos, ahora es utilizado para la prueba de sub-módulos de circuitos integrados, y es muy útil también como mecanismo para depuración de aplicaciones embebidas, puesto que provee una puerta trasera hacia dentro del sistema. Cuando se utiliza como herramienta de depuración, un emulador en circuito que usa JTAG como mecanismo de transporte permite al programador acceder al módulo de depuración que se encuentra integrado dentro de la CPU. El módulo de depuración permite al programador corregir sus errores de código y lógica de sus sistemas, lo que lleva a su utilidad a trascender más allá de una norma. [9]
Qué es BDM, para qué sirve?
Diferentes fabricantes tienen diferentes medios para la depuración de software y
7
Cómo se hace la programación de un mcu?
Se debe elegir un lenguaje de programación, para este caso se hablara del proceso de programación en C. Escribir el código de ensamble que será transmitido, grabado y ejecutado por el microcontrolador no es fácil, por lo que los programadores de computadoras de escritorio recurrieron a un lenguaje de programación de nivel alto. Los lenguajes de nivel alto son cada vez más populares, y C es quizás el lenguaje de programación de MCU más usado y más útil. Adicionalmente, existen varios compiladores de C disponibles en el mercado, muchos de ellos gratuitos o con una versión gratuita, por lo que para el buen funcionamiento de del programa se debe instalar un compilador de C que genere el
IDE de programación CodeWarrior
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
código para el MCU que se desea simular, y luego TINA, un potente pero accesible paquete de programas para analizar, diseñar y probar en tiempo real circuitos analógicos, digitales, HDL, MCU, electrónicos mixtos y sus circuitos impresos (PCB); lo integrará automáticamente en el depurador de código C.
b) c)
El código HEX, es decir, el código extraído y generado por el compilador se almacena automáticamente en los archivos TSC. Ya no necesita el compilador de C una vez compilado el código C en HEX. Sin embargo, necesita el compilador de C instalado para comprobar el código C. Si ejecuta la simulación los pines se manejan con valores lógicos según las reglas de la simulación en modo mixto. Esto supone una gran diferencia comparado con la simulación externa de MCU en comparación con TINA.
d) e)
f)
Dónde encuentro la herramienta Trace en CW y para qué sirve?
En caso de crear un proyecto con medio de conexión Open Source JTAG debemos cambiar la configuración por defecto para que reconozca el dispositivo o microcontrolador. a) Hacer Build al proyecto (se debe tener seleccionado el proyecto en el
Project Panel) y elegir entre RAM, Flash Debug y Flash Release. Ir a Run>Debug Configurations. Seleccionar proyecto en la parte izquierda (no está seleccionado por defecto así que verificar que esté seleccionado el proyecto correcto). Además del nombre del proyecto, debe decir el tipo de memoria que seleccionamos en a) y seguido de OSJTAG. Seleccionar botón Edit que está a la derecha del tipo de conexión. En la nueva ventana elegir como tipo de conexión J-Link\J-Trace for ARM. Dar OK a las ventanas que quedaron abiertas. [13]
El depurador CodeWarrior logra trazar capacidades y perfilar un conjunto de MCU`s. En términos básicos, el rastro de un programa dice dónde va el programa, mientras que su perfil informa que pasa con el programa la mayor parte de su tiempo. El trazado es útil para la depuración mostrando si se invoca una función o un conjunto de funciones específicas. [14]
También se pueden voltajes y visualizaciones del circuito completo durante una simulación e incluso seguir la operación paso a paso con la ayuda del depurador de C de TINA. Es importante anotar que existen dos maneras de alimentar el programa para microcontroladores en TINA. Puede utilizar el código binario y el archivo de depuración creados por cualquier compilador estándar (por ejemplo, MPLAB para los PIC) o puede simplemente cargar su código ensamblador para ejecutarlo y depurarlo directamente en TINA utilizando su depurador- ensamblador incorporado. [11][12]
8
IV. CONCLUSIONES Así como en otros campos de conocimiento, el campo de la electrónica dedicado a los microcontroladores tuvo la necesidad de estandarizar procesos y crear normas a las que se tuvieran que ceñir sus creaciones. Debido al gran número de fabricantes de estos elementos la tarea de los usuarios se dificulta al querer tener acceso total y universal, puesto que aunque la norma exista cada productor establece la codificación que desee, haciendo el abanico muy amplio y poco genérico para aquella persona que desea especializarse en el ámbito. Muchas de las siglas e instrucciones usadas para la programación del microcontrolador no resultan intuitivas a primera vista, por lo
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
cual es importante tener a la mano el manual del mismo. Para la programación de los microcontroladores se deben conocer lenguajes de programación de alto nivel, los cuales son dispuestos normalmente para esta tarea, como Assembler y C++; y de no conocerse se debe consultar la documentación necesaria y pertinente para un buen desarrollo de la tarea. Para la asignación de salidas o entradas en el microcontrolador es importante tener en cuenta la edición de los registros PTXDD (X siendo el nombre del puerto deseado). Siempre puede ser una buena práctica editar los mismos al inicio del código. Para el uso de cada microcontrolador es importante configurar la referencia de reloj que se utilizará, así como otros campos necesarios según la aplicación. El programador debe tratar de programar de una manera intuitiva, ordenada y eficaz en tiempo y memoria, así como en la programación regular, con el fin de optimizar lo más que se pueda el desempeño y los recursos del microcontrolador. V. R EFERENCIAS
[1] Freescale semiconductors, “HCS08 Family – Reference Manual”. [2] Disponible Online: http://www.forosdelweb.com/f15/queexactamente-archivo-inc-149619/ [3] Disponible Online: http://www.aulaclic.es/paginasweb/a_11_1_1.html [4] Disponible Online: http://es.downloadastro.com/Archivos%20de%20Windows/i nc/ [5] Disponible Online: https://es.wikipedia.org/wiki/Emulador [6] Disponible Online: http://whatis.techtarget.com/definition/in-circuit-emulatorICE [7] Disponible Online: http://www.xeltek.com/in-circuit programming-icp-in-asystem-programming-serial programming [8] Disponible Online: https://www.elnec.com/sw/30277d.pdf [9] Disponible Online: http://www.todopic.com.ar/foros/index.php?topic=16129.0;wa p2 [10] Disponible Online: ftp://ftp.ehu.es/cidira/dptos/depjt/Practicas/SED/documentacio n/practicas/02_DepuracionProgramas.PDF [11] Disponible Online: http://es.tina.com/programming_and_debugging_MCUs_using _c
IDE de programación CodeWarrior
9
[12] Disponible Online: http://es.tina.com/microcontroller_circuits [13] Disponible Online: https://sites.google.com/site/microcontroladorkwikstik/tutorial es/codewarrior/crear-un-proyecto-en-codewarrior [14] Disponible Online: http://blogs.freescale.com/mcus/2011/10/its-all-about-tracingfreescale-codewarrior/
Autores: Diana G. Cuervo E. Estudiante Ingeniería Mecatrónica Universidad Nacional de Colombia - Sede Bogotá 2015 César A. Villamizar C. Estudiante Ingeniería Mecatrónica Universidad Nacional de Colombia - Sede Bogotá 2015
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
IDE de programación CodeWarrior
10
VI. A NEXOS Anexo 1. Código generado automáticamente en el archivo main.asm para un proyecto en código Assembler ;******************************************************************* ;* This stationery serves as the framework for a user application. * ;* For a more comprehensive program that demonstrates the more * ;* advanced functionality of this processor, please see the * ;* demonstration applications, located in the examples * ;* subdirectory of the "Freescale CodeWarrior for HC08" program * ;* directory. * ;******************************************************************* ; Include derivative-specific definitions INCLUDE 'derivative.inc'
; export symbols XDEF _Startup, main ; we export both '_Startup' and 'main' as symbols. Either can ; be referenced in the linker .prm file or from C/C++ later on
XREF __SEG_END_SSTACK
; symbol defined by the linker for the end of the
stack
; variable/data section MY_ZEROPAGE: SECTION SHORT
; Insert here your data definition
; code section SECTION MyCode: main: _Startup: LDHX #__SEG_END_SSTACK ; initialize the stack pointer TXS CLI ; enable interrupts
mainLoop: ; Insert your code here NOP feed_watchdog BRA mainLoop
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
IDE de programación CodeWarrior
Anexo 2. Ejemplo 1 de simulación en lenguaje Assembler. Archivo main.asm ;******************************************************************* ;* Universidad Nacional de Colombia - Sede Bogotá ;* Facultad de ingeniería ;* Microcontroladores ;* Laboratorio 1. Cuervo Diana, Villamizar César ;* Código de ejemplo de programación en lenguaje Assembler ;******************************************************************* XDEF _Startup, main XDEF mainLoop XDEF loop XREF __SEG_END_SSTACK INCLUDE 'derivative.inc'
MyCode:
SECTION
main: _Startup: LDHX #__SEG_END_SSTACK ; initialize the stack pointer TXS CLI ; enable interrupts mainLoop: LDA #$52 STA SOPT1 MOV #$08,PTBDD #$0F loop: LDA MOV #$08,PTBD NOP DBNZA * MOV #$00,PTBD LDA #$0F DBNZA * feed_watchdog BRA loop BRA mainLoop
11
IDE de programación CodeWarrior
Universidad Nacional de Colombia. Cuervo Diana, Villamizar César.
Anexo 3. Ejemplo 2 de simulación. Lenguaje C++. Archivo main.cpp /* ;******************************************************************* ;* Universidad Nacional de Colombia - Sede Bogotá ;* Facultad de ingeniería ;* Microcontroladores ;* Laboratorio 1. Cuervo Diana, Villamizar César ;* Código de ejemplo de programación en lenguaje C++ ;******************************************************************* */ #include void Delay(unsigned long delay); void main(){ SOPT1 = 0x52; // disable PTBDD = 0b00111111; // set // select XTAL ICSC1 = 0b10000000; ICSC2 = 0b00110110; endless loop for (;;) // { PTBD = 0b00111111; // Delay(6000); PTBD = 0; Delay(6000); } }
void Delay(unsigned unsigned long (i=0; i<= for }
long delay){ i; delay;i++){}
COP watchdog PTB0-5 as
output
set
high
PTB0-5
12