46
SENA TECNOPARQUE UNIVERSIDAD AUTONOMA DE MANIZALES Mauricio Lozano Sánchez Este espacio va a ser dedicado a los microcontroladores PSoC (Programmable System on Chip) fabricados por la empresa Cypress, estos dispositivos ofrecen una gran versatilidad para el desarrollo de sistemas electrónicos embebidos ya que en el mismo chip gracias a su configuración por bloques se pueden desarrollar tanto sistemas digitales como análogos generando así una reducción significativa en el tamaño final de las tarjetas de los circuitos a implementar. GUIA DE USUARIO CY3210-PSoCEval1 EVALUATION KIT

Guia de Usuario Cy3210

Embed Size (px)

DESCRIPTION

datos sobre el cy3210

Citation preview

S E N A T E C N O P A R Q U E U N I V E R S I D A D A U T O N O M A D E M A N I Z A L E S

Mauricio Lozano Sánchez Este espacio va a ser dedicado a los microcontroladores PSoC (Programmable System on Chip) fabricados por la empresa Cypress, estos dispositivos ofrecen una gran versatilidad para el desarrollo de sistemas electrónicos embebidos ya que en el mismo chip gracias a su configuración por bloques se pueden desarrollar tanto sistemas digitales como análogos generando así una reducción significativa en el tamaño final de las tarjetas de los circuitos a implementar.

GUIA DE USUARIO CY3210-PSoCEval1 EVALUATION KIT

Tabla de contenido ¿Qué es PSoC? ......................................................................................................................... 3

¿Cómo instalar el kit? ............................................................................................................. 4

Características generales del PSoC 1, 3, 5 ...................................................................... 9 ¿Qué es el PSoC Designer? ................................................................................................ 10 Probando y conectando el modulo PSoC ........................................................................ 14

PSoC hardware ....................................................................................................................... 15 PSoC designer C…...………………………………………………………………………..18 PSoC designer assembler…………………………………………………………………27 Bibliografía……………………………………………………………………………………45

2

¿Qué es PSoC?

La palabra PSoC es el acrónimo de (Programmable System on Chip), estos dispositivos fabricados por la empresa cypress son microcontroladores cuya principal característica y atractivo es el contar con módulos tanto análogos y digitales en un solo chip, así mismo poder reconfigurar dinámicamente las entradas y salidas de estos módulos. De esta manera se obtiene un componente electrónico con una gran flexibilidad en su estructura y que permite una facilidad incomparable hasta el momento, para el desarrollo de sistemas electrónicos embebidos. Algunas características de la arquitectura de estos micro controladores son las siguientes: •Unidad multiplicadora MAC. • Reloj tanto interno como externo. • El voltaje de referencia puede ser variado para actuar con distintos sensores. • Voltaje de funcionamiento de 5 voltios ó 3,3 voltios. • Posibilidad de reconfiguración. Los PSoC tienen un programa de desarrollo llamado PSoC designer, en este programa se puede contar con una interfaz grafica en la cual se visualizan los bloques tanto digitales y análogos que posee el micro controlador, además cuántos de estos bloques estamos utilizando, también desde este programa podemos escribir nuestro código en C ó assembler para realizar nuestras aplicaciones, la selección del lenguaje de programación es según nuestras preferencias y dependiendo de con cual se nos facilite mas la programación, para este blog vamos a trabajar en C.

3

¿Cómo instalar el kit? Para instala en software del equipo, seguir los siguientes pasos:

1. Inserte el CD del kit en la unidad de CD de su PC. El CD está diseñado para la ejecución automática y la instalación de kit aparece en la pantalla de inicio.

Nota: Dado el caso en que no salga la ventana de reproducción automática, vamos a Mi PC y damos doble click en la unidad de Dvd.

4

2. Click Install the CY3210-PSoCEVAL1 para dar comienzo a la instalación del kit.

3. Saldrá una pantalla de InstallShield Wizard donde podremos escoger la

carpeta donde será instalado nuestro kit dando click en la opción change. 4. Click en NEXT para instalar el kit.

5. En la pantalla Product Installation Overview seleccionamos la instalación que mejor se adapte a nuestros requerimientos, en el menú desplegable hay tres opciones: typical, custom, complete. Si no se está seguro accedemos a la configuración por defecto typical.

5

6. Cuando se inicie la instalación, todos los paquetes aparecen en la Installation Page. Espere hasta que todos los paquetes se descarguen y se instalen correctamente.

6

7. Click en finish para completar la instalación.

Después de instalar el software, los drivers serán instalados cuando se conecte el MiniProg1.

Nota 1: Si el kit no cuenta con el CD de instalación, este también se puede descargar directamente con la página de cypress utilizando el siguiente link http://www.cypress.com/?rID=2541 . Hay tres formas de obtener el kit:

1.1 Este kit incluye: PSoC Programmer, PSoC Designer, ejemplos de código del kit, los archivos de hardware del kit y documentos de usuario.

7

1.2 Este kit incluye: ejemplos de código, archivos de hardware, archivos y documentos de usuario.

1.3 Este es un archivo imagen (tipo ISO) donde se puede encontrar todos los archivos ya descritos. Nota 2: Cuando se le da click en cualquiera de los archivos este nos enviará a otro enlace donde se deberá hacer lo siguiente:

• Click en la X para cerrar la pantalla saliente. • Click downloads the file without using the download manager. Al

darle click en este enlace el archivo descargara inmediatamente.

8

9

Características generales del PSoC 1, 3, 5 El núcleo de los PSoC es un elemento de gran alcance y que apoya a un amplio conjunto de características, el núcleo incluye una CPU, memoria, relojes y GPIO configurables (Entradas y salidas de propósito general). A medida que la empresa Cypress ha ido desarrollando estos microcontroladores incorpora nuevas características a cada familia de PSoC, entre estas se encuentran los núcleos, los cuales han sido diferentes en las 3 familias de microcontroladores PSoC existentes hasta el momento como se puede ver a continuación: • Familia CY8C2XXXX (PSoC 1): M8C processor speeds up to 24 MHz. • Familia CY8C3XXXX (PSoC 3): Single cycle 8051 CPU core. • Familia CY8C5XXXX (PSoC 5): 32-bit ARM Cortex-M3 CPU core. El M8C es un procesador que puede alcanzar una velocidad de hasta 24 MHz, posee una arquitectura tipo Harvard de 25 hilos con lo cual se logra simplificar la programación de eventos en tiempo real. Otras características que vale la pena resaltar de este núcleo son las siguientes: • Temporizadores, Sleep y watch Dog (WDT). • 32 KB de memoria flash para almacenamiento de programas. • 2 KB de memoria SRAM para almacenamiento de datos. • 2 KB de memoria EEPROM emulado usando la flash. • El reloj interno de 24 MHz se puede duplicar a 48 MHz para el uso del sistema digital. • Reloj de baja velocidad de 32 KHz para el temporizador de apagado y el WDT. • Las GPIOs permiten conectar el CPU a los recursos digitales y analógicos. • Cada pin también tiene la capacidad para generar una interrupción del sistema de alto nivel, bajo nivel y el cambio de la última lectura. El 8051 posee un set de instrucciones tipo RISC, con un gran rendimiento y un promedio de hasta 2 ciclos por instrucción, además puede llegar a tener una velocidad 10 veces mayor que la normal del procesador 8051, otras características importantes son las siguientes: • 64 KB de memoria flash para almacenamiento de programas. • 8 KB de memoria SRAM para almacenamiento de datos. • 2 KB de memoria EEPROM. • Periféricos HUB (PHUB). • Interfaz de memoria externa (EMIF). • Vector programable para el control de interrupciones. Por su parte, el ARM cortex contiene un procesador de bajo consumo de potencia de 32 bits y arquitectura Harvard, está diseñado para satisfacer las necesidades de aplicaciones que requieran una gran velocidad en el manejo de interrupciones, además también cuenta con las siguientes características: • 256 KB de memoria flash. • 64 KB de memoria SRAM. • 2 KB de memoria EEPROM. • Controlador de memoria cache de 128 bytes de memoria. • Periféricos HUB (PHUB). • 4 GB de espacio de direcciones.

10

¿Qué es el PSoC Designer? El programa está basado en una sencilla GUI (Interfaz Grafica de Usuario) en la que se permite hacer configuraciones de hardware del microcontrolador de una manera cómoda, algunas de estas configuraciones que son posibles de realizar desde la GUI son las siguientes: • Las configuraciones globales del microcontrolador como lo son: el voltaje de alimentación, la velocidad del reloj del CPU, sleep timer, Watchdog, voltajes de referencia, entre otros. • Configuración de cada uno de los pines I/O del microcontrolador. • Configuración de los módulos de usuario que han sido agregados al proyecto. • Conexiones de manera grafica entre los diferentes módulos de usuario. También permite la programación por medio de código, ya sea en lenguaje assembler ó C dependiendo el usuario con cual sienta más confianza, la sintaxis para cualquiera de los dos lenguajes es muy similar a como se maneja para los PIC de Microchip, simplemente lo que hay que tener en cuenta es el nombre de los puertos y los diferentes registros del mismo lo cual lo podemos conseguir fácilmente en el datasheet del PSoC con el que se esté trabajando. El PSoC Designer se puede decir que se divide básicamente en tres partes: • Device Editor. • Aplication Editor. • Debugger. Device Editor (editor de dispositivo): Es la primera página o pestaña que se abre cuando empezamos a trabajar en un proyecto, desde esta pestaña se pueden hacer la mayoría de configuraciones necesarias del PSoC, también se encuentran los módulos de usuario, el workspace explorer, y el área de trabajo donde son mostrados los bloques tanto analógicos como digitales que se tienen a disposición. Aplication Editor (editor de aplicacion): Son todos los archivos que hacen parte de la configuración de la aplicación que se está desarrollando, las librerías, encabezados, archivos de salida y los archivos fuente dentro de los cuales se encuentra el archivo main el cual es en donde se debe escribir todo el código de la aplicación a desarrollar. Debugger (depurador): Esta es una herramienta muy útil para llevar a cabo la depuración del código implementado, se pueden agregar breakpoints, observar los registros de la CPU, las memorias.

11

PSoC Programmer

1. Click en inicio/todos los programas / Cypress / PSoC programer / PSoC programer. Imagen psoc programer

2. Haga clic en el botón load file para cargar el archivo .hex.

3. Utilice el botón Program para programar el .hex en el chip.

4. Cuando la programación se realiza correctamente, aparecerá el mensaje Programming Succeeded en el panel de acción.

5. Cerrar PSoC Programmer.

12

13

Probando y conectando el modulo PSoC Cuando se conecta el MiniProg, puede utilizar el programador para programar el PSoC CY3210-PSoC EVAL1 evaluation kit. Conecte el cable USB en el MiniProg antes de insertarlo en la cabecera ISSP. Cuando esté conectado el MniProg en la ranura de ISSP el led rojo parpadeara, luego el led cercano a la coneccion USB, brillara verde.

14

PSoC hardware Descripción funcional

Sistema de alimentación El sistema de suministro de energía en esta tarjeta es muy versátil. El kit puede ser alimentado por la unidad MiniProg o 9 V a 12 V DC y a 100 mA oa un mayor rango. CY3210-PSOCEVAL1 también puede ser alimentado por una batería de 9 V conectada a los terminales de la batería. El regulador de voltaje convierte de 9 / 12 V a 3.3 / 5 v. Nota: usar solo una fuente de alimentación. No usar voltajes que superen los 7 v o 12 v respectivamente. Configuración de puente Las funciones de JP1, JP2 y JP3 son las siguientes:

• JP1 se conecta al pin P16 Rx para la comunicación UART y debe ser eliminado para el funcionamiento normal de I/O.

• JP2 se conecta al pin P27 Tx para la comunicación UART y debe ser eliminado para el funcionamiento normal de I/O.

• JP3 controla la configuración de voltaje y debe ser eliminada para el funcionamiento con 5 V.

15

Interface de programación El kit permite la programación con la cabecera de programación ISSP utilizando el MiniProg de PSoC. ISSP se utiliza para reprogramar o programar PSoC de la PCB y eliminar la necesidad de un paquete especifico. PSoC pins Pin No.

Nombre del pin

Descripción Conectar a

1 P0[7] Entrada mux columna analógica J6.8 2 P0[5] Columna de entrada analógica y salida

mux columna J6.6

3 P0[3] Columna de entrada analógica y salida mux columna

J6.4

4 P0[1] Entrada mux columna analógica J6.2 5 P2[7] J7.8 6 P2[5] J7.6 7 P2[3] Directa cambia la entrada del bloque de

condensador J7.4

8 P2[1] Directa cambia la entrada del bloque de condensador

J7.2

9 SMP SMP interruptor de la bomba (SMP) de conexión de modo que los componentes externos necesarios SMP

SMP

10 P1[7] Reloj serial I2C (SCL) J8.8 11 P1[5] Datos en serie I2C (SDA) J8.6 12 P1[13] J8.4 13 P1[1] Cristal (XTALin), I2C reloj serial (SCL),

ISSP-SCLK J8.2 y XTALIN /Sclk

14 VSS conexión a tierra Vss 15 P1[0] Cristal (XTALout), I2C Serial Datos (SDA),

ISSP-SDATA J8.1 y XTALout/Sdata

16 P1[2] J8.3 17 P1[4] Entrada de reloj externo opcional

(EXTCLK) J8.5

18 P1[6] J8.7 19 XRES Alta reset externo activa con interior

desplegable XRES/ TP4 DNP

20 P2[0] Directo cambia la entrada del bloque de condensador

J7.1

21 P2[2] Directo cambia la entrada del bloque de condensador

J7.3

22 P2[4] Tierra analógica externa (AGND) J7.5 23 P2[6] Referencia de tensión externa (VREF) J7.7 24 P0[0] Entrada mux columna analógica J6.1 25 P0[2] Columna de entrada analógica y salida

mux columna J6.3

26 P0[4] Columna de entrada analógica y salida mux columna

J6.5

27 P0[6] Entrada mux columna analógica J6.7 28 VDD La tensión de alimentación VCC

16

RS-232 Interface La interfaz RS-232 es una interfaz física de comunicación en serie a través del cual transfiere la información dentro o fuera de un bit a la vez. La placa tiene un transceptor RS-232 para la evaluación mediante RS-232 (UART) para diseños de bajo consumo. El RS-232 transceptor dispone de una configuración de Tx y Rx. Área de protoboard El área de protoboard tiene tres puertos completos para el desarrollo de circuitos de encargo: Puerto 0, puerto 1 y puerto 2. Estos puertos pueden ser utilizados con el área de creación de prototipos para crear diseños analógicos simples pero elegante. Interface de caracteres LCD El kit tiene un carácter de 2 × 16 LCD Módulo alfanumérico, que entra en la cabecera LCD de caracteres, J9. La pantalla LCD se ejecuta en una alimentación de 5 V y puede funcionar independientemente de la tensión en la que se alimenta PSoC. Un ajuste de contraste LCD también está disponible.

17

PSoC designer C Entrando al compilador ‘C’ Todas las características del compilador están disponibles y accesibles haciendo click en el Editor de Subsistema de PSoC Designer. Para acceder al editor de subsitema damos click en el siguiente icono . Nota: Evitar usar los siguientes caracteres en el nombre del archivo: \ / : * ? " < > | & + , ; = [ ] % $ ` '

Menu de opciones

Empezar un archivo PSoC Designer crea un archivo inicio llamada boot.asm. Sus funciones principales dentro de los parámetros de PSoC Designer incluye inicializar las variables de C, la organización de mesas de interrupción, y llamando _main. El guión bajo (_main) permite a boot.asm para llamar a un "main", ya sea en C o assembly.

Icono Opcion Menu Atajo Caracteristica Compile/assemble Build>>Compile/

Assemble [Ctrl] [F7]

Compila el archivo (.c o .asm)

Build Build >> Build [F7] Contruye todo el proyecto y lo vincula con los archivos en la carpeta

New File File >> New [Ctrl] [N] Adiere un nuevo archivo Open File File >> Open [Ctrl]

[O] Abre un archivo existente

Indent Alinea texto a la derecha Outdent Alinea texto a la izquierda Comment Para comentar texto

seleccionado. Uncomment Para quitar los comentarios

a un texto seleccionado Toggle Book-mark Alterna el marcador: Sets /

elimina marcadores definidos por el usuario se utilizan para navegar por los archivos de origen

Clear Book-mark Limpia todos los los marcadores

Next Book-mark Va al siguiente marcador

Previous Bookmark Va al anterior marcador

Find Text Edit >> Find [Ctrl] [F] Encuentra texto especifico

Replace Text Edit >> Replace [Ctrl] [H] Reemplaza texto especifico

Find in Files Edit >> Find in Files

Encuentra texto especifico en un documento especifico

Repeat Replace Repetir el reemplazo anterior

Set Editor Options Configurar las opciones del

editor

Undo Edit >> Undo [Ctrl] [Z] Des-hacer

Redo Edit >> Redo [Ctrl] [Y] Re-hacer

18

Descripción de librerías Hay tres librerías primarias usadas por el PSoC Disigner: libcm8c.a, libpsoc.a y cms.a. La librería libcm8c.a yace en el PSoC Designer…\tools directory (…\Program Files\Cypress Microsystems\PSoC Designer\tools). Esta librería contiene muchas funciones típicas de la programación en ‘C’. La librería libpsoc.a yace en proyecto \lib directory, y contiene las funciones del módulo de usuario. Editor de dispositivos agrega automáticamente el código fuente de los módulos de los usuarios a la biblioteca durante el proceso generate-aplication. Sin embargo, otros objetos de la biblioteca se pueden agregar manualmente a esta biblioteca. La librería cms.a yace en…\tools directory, esta biblioteca contiene funciones prácticas que no implican Módulos de Usuario. Por ejemplo, las funciones de lectura y escritura del flash reside aquí (Flash Block Programming). Prototipos "C" para el uso de estas funciones se dan en el archivo de inclusión (flashblock.h) almacenados en el directorio…\tools \include directory. Tipos de data PSoC DesignerC Compiler es compatible con los siguientes tipos de datos estándar:

Tipos de datos compatibles Tipo Bytes Descripción Rango

Char 1 Un byte de memoria que define los caracteres 1 unsigned 0…255 signed -128…127

Int 2 Se utiliza para definir los números enteros unsigned 0…65535 1 signed -32768…32767

Short 2 Tipo estándar especificando enteros de 2 bytes unsigned 0…65535 1 signed -32768…32767

Long 4 Tipo estándar que especifica la mayor entidad entero

unsigned 0…4294967295 1 signed - 2147483648…21474836 47

Float 4 Número de punto flotante de precisión simple en formato IEEE

1.175e-38…3.40e+3847

Double 4 Número de punto flotante de precisión simple en formato IEEE

1.175e-38…3.40e+38

Enum 1 si enum Se utiliza para definir una lista de alias que 0…65535

19

<256 2 si enum

>256

representan números enteros.

Las siguientes definiciones de tipos se incluyen en m8c.inc. Expresar las convenciones comunes para tipos de datos adicionales. typedef no firmado char BOOL; typedef no firmado char BYTE; typedef firmado char CHAR; typedef no firmado int WORD; typedef firmado int INT; typedef no firmado long DWORD; typedef firmado long LONG; Las siguientes operaciones de punto flotante son compatibles con PSoC Designer C Compiler. Comparador (=) Adición (+) Multiplicador (*) Sustractor (-) Divisor (/) Casting (long to float) OPERADORES A continuación se presenta una lista de los operadores más comunes soportados en el PSoC Desiger C Compiler. Los operadores con mayor precedencia se aplican primero. Los operadores con la misma precedencia se aplican derecha a izquierda. Utilice parentesis en su caso para evitar la ambigüedad. Pre. Operador Función Grupo Forma Descripción

1 ++ Pos-Incremento a ++ 1 -- Pos-Decrement a -- 1 [ ] Subindice a[b] 1 () Funcion de

llamado a(b)

1 . Selector a.b 1 -> Apuntador a->b 2 sizeof sizeof sizeof a 2 ++ Pre-Incremento ++ a 2 -- Pre-Decremento -- a 2 & Direccion de &a 2 * Indireccion *a 2 + mas +a 2 - menos -a 2 ~ NO bit a bit Unary ~ a 1’s complement de a 2 ! NO logico !a 2 (declaraci

on) Encasillar (declaracion)a

3 * Multiplicacion Binario a*b a multiplicado por b 3 / División Binario a/b a dividido por b 3 % Modulo Binario a%b El resto de a dividido

por b 4 + Adicion Binario a+b a mas b 4 - Subtraccion Binario a-b a menos b

20

5 << Left shift Binario a<<b Valor de a desplazado a los bits b por la izquierda

5 >> Right shift Binario a>>b Valor de a desplazado a los bits b por la derecha

6 < Menor que Binario a<b a menor que b 6 <= Menor igual que a<=b a menor o igual que

b 6 > Mayor que a>b a mayor que b 6 >= Mayor igual que a>=b a mayor o igual que b 7 == Igual a==b 7 != Distinto a!=b 8 & AND bit a bit Bit a bit a&b AND bit a bit de a y b 9 ^ OR exclusive bit a

bit Bit a bit a ^ b OR exclusico bit a bit

de a y b 10 | NOR bit a bit Bit a bit a | b OR bit a bit de a y b 11 && AND logica a && b 12 || OR logica a || b 13 ? : Condicional c?a:b 14 = Asignacion a = b 14 *= Asignacion multiple a *= b 14 /= Asignacion dividida a /= b 14 %= Asignacion

restante a %= b

14 += Añadir asignacion a += b 14 -= Sustraer

asignacion a -= b

14 <<= Asignacion left shift a <<= b 14 >>= Asignacion right

shift a >>= b

14 &= Asignacion AND bit a bit

a &= b

14 ^= Asignacion OR bit a bit

a ^= b

14 |= Asignacion NOR bit a bit

a |= b

15 , Coma a , b Declaraciones PSoC Designer compiler soporta los siguientes estados estándar:

• If else: Decide si una acción es cierta. • Switch: Compara una variable a varias constantes posibles. Si la variable

coincide con una de las constantes, se hace un salto. • While: Repeticiones (circular iterativo) una declaración hasta que la expresión

demuestra falsa. • Do: Igual que while, sólo la prueba se ejecuta después de la ejecución de la

declaración, no antes. • For: Ejecuta un bucle controlado. • Goto: Transfiere la ejecución a una etiqueta. • Continue: Se utiliza en un bucle para saltar el resto de la declaración.

21

• Break: Se utiliza con un switch o en un bucle para terminar el switch r o bucle.

• Return: Termina la función actual. • Struct: Se utiliza para agrupar variables comunes. • Typedef: Declara un tipo.

Las Directivas de procesamiento PSoC Designer C Compiler compatible con los siguientes pre-procesadores y pragmas: Pre-procesador Descripción #define Define una constante preprocesador o macro #else Ejecutado si # if, # ifdef o # ifndef falla #endif Cierra # if, # ifdef o # ifndef #if Bifurca sobre una expresión #ifdef Bifurcación si el preprocesador se ha definido constante #ifndef Bifurcación si el preprocesador no se ha definido constante #include Inserta un archivo de origen #line Especifica el número de la siguiente línea de código fuente #undef Elimina una constante preprocesador

Las directivas pragma

#pragma Descripción #pragma ioport LED:0x04; char LED;

Define una variable que ocupa una región en el espacio de I/O. Esta variable puede ser utilizado en I/O lee y escribe. El ioport # pragma debe preceder a una declaración de variable que define el tipo de variable utilizada en el pragma.

#pragma fastcall GetChar Proporciona un mecanismo optimizado de paso de argumentos. Este # pragma sólo se utiliza para las funciones de montaje llamados de "C."

#pragma abs_address:<address>

Le permite localizar el código "C" / data flash en una dirección específica como # pragma abs_address: 0x500. El end_abs_address # pragma (descrito más adelante) se debe utilizar para terminar el bloque de código / datos de Flash. Tenga en cuenta que los "datos" incluye tanto ROM y RAM.

#pragma end_abs_address Finaliza un bloque de código de / Flash de datos que se encuentran con el pragma abs_address. Esto permite que el código que sigue el pragma end_abs_address que se encuentra desde el último punto reubicable. Tener en cuenta que los "datos" incluye tanto ROM y RAM.

#pragma text:<name> Cambia el nombre de la zona "text". Hacer modificaciones "Custom.LKP" en el directorio del proyecto para colocar la

22

nueva zona en el espacio de código. #pragma interrupt_handler <func1> [ ,<func2> ]*

Para el manejador de interrupciones. Los registros virtuales se guardan sólo si se utilizan, a menos que el controlador llama a otra función. En ese caso, todos los registros virtuales se guardan.

#pragma nomac #pragma usemac

Estos dos pragmas anulan el argumento de the command line -nomac argument, or Project >> Settings, Compiler tab, Enable MAC option.Los pragmas deben especificarse fuera de una definición de función.

Funciones string Estas funciones pueden ser encontradas en el siguiente directorio: ...:\Program Files\CypressMicroSystems\PSoCDesigner\tools\include\string.h and stdlib.h y …:\Program Files\Cypress MicroSystems\PSoCDesigner\tools> ilibw –t libcm8c.a Función Prototipo Encabezado

abs int abs(int); stdlib.h atof double atof(CONST char *); stdlib.h atoi int atoi(CONST char *); stdlib.h atol long atol(CONST char *); stdlib.h itoa void itoa(char *string, unsigned int

value, int base);

stdlib.h

Itoa void ltoa(char *string, unsigned long value, int base);

stdlib.h

ftoa char *ftoa(float f, int *status); /* ftoa function */

#define _FTOA_TOO_LARGE -2 /*

|input| > 2147483520 */ #define _FTOA_TOO_SMALL -1

/* |input| < 0.0000001 */

/* ftoa vuelve buffer estático de ~ 15 caracteres. Si la entrada está

fuera de rango *, * Estado se establece en cualquiera de los

anteriores # define y se devuelve 0 *. De lo contrario, * estado se

establece en 0 y el char buffer se devuelve *

stdlib.h

rand int rand(void); stdlib.h srand void srand(unsigned); stdlib.h strtol long strtol(CONST char *, char **,

int); stdlib.h

strtoul unsigned long strtoul(CONST char *, char

**, int);

stdlib.h

cstrcat char *cstrcat(char *, const char *); string.h cstrcmp int cstrcmp(const char *cs, char

*); string.h

cstrcpy char *cstrcpy(char *, const char *cs);

string.h

23

cstrlen size_t cstrlen(const char *cs); string.h memchr void *memchr(void *, int, size_t); string.h memcmp int memcmp(void *, void *, size_t); string.h memcpy void *memcpy(void *, void *,

size_t); string.h

memmove void *memmove(void *, void *, size_t);

string.h

memset void *memset(void *, int, size_t); string.h strcat char *strcat(char *, CONST char

*); string.h

strcmp int strcmp(CONST char *, CONST char *);

string.h

strcoll int strcoll(CONST char *, CONST char *);

string.h

strcpy char *strcpy(char *, CONST char *);

string.h

strcspn size_t strcspn(CONST char *, CONST char

*);

string.h

strlen size_t strlen(CONST char *); string.h strncat char *strncat(char *, CONST char

*, size_t); string.h

strncmp int strncmp(CONST char *, CONST char *,

size_t);

string.h

strncpy char *strncpy(char *, CONST char *,

size_t);

string.h

strpbrk char *strpbrk(CONST char *, CONST char

*);

string.h

strrchr char *strrchr(CONST char *, int); string.h strspn size_t strspn(CONST char *,

CONST char *);

string.h

strstr char *strstr(CONST char *, CONST char *);

string.h

Funciones matematicas Estas funciones pueden ser encontradas en el siguiente directorio: ...:\Program Files\CypressMicroSystems\PSoCDesigner\tools\include\math.h.

Función Descripción float fabs(float x); fabs calcula el valor absoluto (magnitud) del argumento x,

mediante la manipulación directa de la representación de bits de x. Devuelve el valor absoluto del número de punto flotante x.

float frexp(float x, int *eptr); Todos los números no nulos, normales puede ser descrito como m * 2 ** p. frexp representa el doble val como una mantisa m y una potencia de dos p. La mantisa resultante siempre será mayor que o igual a 0,5, y menos de 1,0 (el tiempo que val es distinto de cero). El poder de los dos va a ser almacenado en * exp. Devuelva la mantisa y el exponente de x como el par (m, e). m es un flotador y e es un número entero tal que x == m * 2 ** e. Si x es igual a cero, (0,0, 0), de lo contrario 0.5 <= abs (m) <1

24

float tanh(float x); La función devuelve la tangente hiperbólica de x. float sin(float x); Devuelve el seno de x.

float atan(float x); La función devuelve el ángulo cuya tangente es x, en el intervalo [-pi / 2, + pi / 2] radianes.

float atan2(float y, float x); The function returns the angle whose tangent is y/x, in the full angular range [-pi, +pi] radians

float asin(float x); La función devuelve el ángulo cuyo seno es x, en el intervalo [-pi / 2, + pi / 2] radianes.

float exp10(float x); Devuelve 10 elevado a la cifra real especificado. float log10(float x); log10 devuelve el logaritmo en base 10 de x. Se

implementa como log (x) / registro (10). float fmod(float y, float z); La función fmod calcula el resto de punto flotante de x / y

(x modulo y). La función fmod devuelve el valor para el número entero más grande i tal que, si y es distinto de cero, el resultado tiene el mismo signo que x y la magnitud menor que la magnitud de y.

float sqrt(float x); La función devuelve la raíz cuadrada de x, x ^ (1/2). float cos(float x); La función devuelve el coseno de x para x en radianes. Si

x es grande el valor devuelto puede que no sea significativa, pero la función informa de ningún error.

float ldexp(float d, int n); ldexp calcula el valor que se necesita y vuelve flot en lugar de valores dobles. ldexp devuelve el valor calculado.

float modf(float y, float *i); modf divide la doble val aparte en una parte entera y una parte fraccional, devolviendo la parte fraccionaria y almacenar el entero. Se devuelve la parte decimal. Cada resultado tiene el mismo signo que el val argumento proporcionado.

float floor(float y); floor encuentra el número entero más cercano menor o igual a x. floor devuelve el resultado como un número entero doble.

float ceil(float y); ceil encuentra el número entero más cercano mayor o igual a x. ceil devuelve el resultado como un número entero doble.

float fround(float d); Produce un cociente que se ha redondeado al número entero más cercano matemático, si el cociente matemático es exactamente a medio camino entre dos números enteros, (es decir, que tiene la forma número entero 1/2), entonces el cociente se ha redondeado a la par (divisible por dos) número entero.

float tan(float x); La función devuelve la tangente de x de x en radianes. Si x es grande el valor devuelto puede que no sea significativa, pero la función informa de ningún error.

float acos(float x); acos calcula el coseno inverso (arco coseno) del valor de entrada. Argumentos a acos deben estar en el rango de -1 a 1. La función devuelve el ángulo cuyo coseno es x, en el intervalo [0, pi] radianes.

float exp(float x); exp calcula el exponencial de x, es decir, la base del sistema natural de los logaritmos, aproximadamente 2,71828). La función devuelve el exponencial de x, e ^ x.

float log(float x); Devuelva el logaritmo natural de x, es decir, su logaritmo en base e (donde e es la base del sistema natural de los logaritmos, 2,71828...). La función devuelve el logaritmo natural de x.

float pow(float x,float y); pow calcula x elevado a y exp1.0nt. En caso de éxito, pow

25

devuelve el valor calculado. float sinh(float x); sinh calcula el seno hiperbólico del argumento x. La

función devuelve el seno hiperbólico de x. float cosh(float x); cosh calcula el coseno hiperbólico del argumento x. La

función devuelve el coseno hiperbólico de x.

26

PSoC designer assembler Entrando al compilador assembler El lenguaje assembly es un lenguaje de bajo nivel. Esto significa que su estructura no es como un lenguaje humano. En comparación, 'C' es un lenguaje de alto nivel con las estructuras cercanas a los utilizados por los lenguajes humanos. A pesar de que es un conjunto de lenguaje de bajo nivel, que es una abstracción creado para hacer la programación del hardware más fácil para los seres humanos. Por lo tanto, esta abstracción debe ser eliminado antes de una entrada, en una forma nativa para el microcontrolador, se puede generar. Un ensamblador se utiliza para convertir las abstracciones utilizado en lenguaje ensamblador a código de máquina que el microcontrolador puede operar directamente sobre. Fuente de Formato de archivo El lenguaje assembly tiene cinco componentes básicos que se enumeran en la Tabla. Cada línea del archivo de origen puede tener una sola etiqueta, mnemónica, comment o directive. Múltiples operadores o expresiones se pueden usar en una sola línea del archivo fuente. La longitud máxima de una línea es 2048 caracteres (incluyendo espacios) y el máximo de longitud de palabra es de 256 caracteres. Una palabra es una cadena de caracteres rodeados por espacios.

Componente Descripción Label Nombre simbólico seguido de dos puntos

(:). Mnemonic Cadena de caracteres que representa

una instrucción M8C. Operand Los argumentos de las instrucciones

M8C. Comment Puede seguir operando o expresando y

se inicia en cualquier columna si el primer carácter que no sea espacio es o bien un estilo de comentario C ++ (/ /) o punto y coma (;).

Directive Un comando, interpretado por el ensamblador, para controlar la generación de código de máquina.

Evitar el uso de los siguientes caracteres en los nombres de ruta y el archivo (ya que son problemáticos): \ /: * ? "<> | & +,; = [ ]% $` '. Etiquetas Una etiqueta es una cadena de mayúsculas y minúsculas de los caracteres alfanuméricos y guiones bajos (_) seguido de dos puntos. Una etiqueta se asigna la dirección del contador actual programa por el ensamblador, a menos que la etiqueta se define en una línea con una directiva EQU. Las etiquetas se pueden colocar en cualquier línea, incluyendo líneas de código fuente siempre y cuando la etiqueta aparece en primer lugar. El ensamblador es compatible con tres tipos de etiquetas: locales, globales y reutilizables locales. Las etiquetas locales. Estos consisten en una cadena de caracteres seguido de dos puntos. Etiquetas locales no pueden hacer referencia a otros archivos de código fuente en el mismo proyecto, sólo se pueden utilizar dentro del fichero en el que se definen. Las etiquetas locales convertirse etiquetas globales si se "exportan". El siguiente

27

ejemplo se tiene una sola etiqueta local llamado SubFun. Las etiquetas locales entre mayúsculas y minúsculas. Las etiquetas locales: mov X, 10

SubFun: xor reg[00h], FFh dec X jnz SubFun

Las etiquetas globales. Estos se definen en la directiva de ensamblador exportación o poniendo fin a la etiqueta con dos signos de dos puntos "::" en lugar de una. Etiquetas globales pueden ser referenciadas desde cualquier archivo de origen en un proyecto. El siguiente ejemplo tiene dos etiquetas globales. La directiva de exportación se utiliza para hacer la etiqueta SubFun global, mientras que dos signos de dos puntos se utilizan para hacer la etiqueta Morefun global. Etiquetas globales entre mayúsculas y minúsculas. Las etiquetas globales: EXPORT SubFun

mov X, 10 SubFun: xor reg[00h], FFh dec X jnz SubFun mov X, 5 MoreFun:: xor reg[00h], FFh dec X jnz MoreFun

Las etiquetas locales reutilizables. Estos tienen varias definiciones independientes dentro de un solo archivo fuente. Se definen precediendo la cadena de la etiqueta con un punto ".". El ámbito de aplicación de una etiqueta local está limitada por la etiqueta local o global más cercano o el final del archivo fuente. El siguiente ejemplo tiene una sola etiqueta global llamada SubFun y un sello local reutilizable llamada. Morefun. Tenga en cuenta que mientras que las etiquetas no incluyen el colon cuando se hace referencia, etiquetas locales reutilizables requieren que un período preceden la cadena de la etiqueta de todos los casos. Etiquetas locales reutilizables entre mayúsculas y minúsculas. Las etiquetas locales reutilizables: EXPORT SubFun

mov X, 10 SubFun: xor reg[00h], FFh mov A, 5 .MoreFun: xor reg[04h], FFh dec A jnz .MoreFun dec X jnz SubFun

Mnemonics Una instrucción Mnemonics es una cadena de cuatro y cincuenta y ocho letra que representa una de las instrucciones del microcontrolador. No puede ser 0 o 1 Mnemonics por línea de un archivo de origen. Mnemonics no distinguen entre mayúsculas y minúsculas.

28

Los operandos Los operandos son los argumentos de instrucciones. El número de operandos y el formato que utilizan son definidos por la instrucción que se utiliza. Los operandos pueden tomar la forma de constantes, etiquetas, operador punto, los registros, la memoria RAM, o expresiones. Constantes. Estos son operandos que llevan valores establecidos explícitamente en el archivo de origen. Las constantes pueden ser expresadas en el archivo de origen utilizando uno de los radixes listados en la Tabla Radix Nombre Formato Ejemplo 127 Carácter ASCII ‘J’ mov A, ‘J’ ;character constant

mov A, ‘\’’ ;use “\” to escape “\” mov A, ‘\\’ ;use “\” to escape “\”

16 Hexadecimal 0x4A 4Ah $4A

mov A, 0x4A ;hex--”0x” prefix mov A, 4Ah ;hex--append “h” mov A, $4A ;hex--”$” prefix

10 Decimal 74 mov A, 74 ;decimal--no prefix 8 Octal 0112 mov A, 0112 ;octal--zero prefix 2 Binario 0b01001010

%01001010 mov A, 0b01001010 ;bin--“0b” prefix mov A, %01001010 ;bin--”%” prefix

Etiquetas. Éstos se pueden utilizar como un operando de una instrucción, las etiquetas se utilizan con mayor frecuencia que los operandos para jump e instrucciones call para especificar la dirección de destino. Sin embargo, las etiquetas se pueden utilizar como un argumento para cualquier instrucción. Operador de punto (.). Esto se utiliza para indicar que la dirección de la ROM del primer byte de la instrucción debe ser utilizada como un argumento para la instrucción. Example 1: mov A, <. ; mueve byte bajo de la PC a A Example 2: mov A, >. ; mueve byte alto del PC a A Example 3: jmp >.+3

nop nop; saltó a la instrucción nop

Registros. Estos tienen dos formas en dispositivos PSoC. El primer tipo son los que existen en los dos bancos de registros accesibles para el usuario. El segundo tipo son los que existen en el microcontrolador. La tabla contiene ejemplos de todos los tipos de operandos de registros. Tipo Formato Ejemplo Registros accesible al usuario

reg[expr] MOV A, reg[0x08]; registrar en la dirección 8 MOV A reg[OU+8] ;dirección = label OU + 8

Registros M8C A MOV A, 8; mover 8 en el acumulador F OR F, 1; el bit 0 de la bandera SP MOV SP, 8; establecer el puntero de pila a 8 X MOV X, 8; set the M8C’s X reg to 8

Memoria RAM. Estas referencias se hacen encerrando la dirección o la expresión entre corchetes. El ensamblador evaluará la expresión para crear la dirección RAM real.

29

Tipo Formato Ejemplo RAM actual [expr] MOV A, [0x08]; RAM en la dirección 8

MOV A, [OU+8]; address = OU etiqueta + 8 Expresiones. Estos se pueden construir utilizando cualquier combinación de etiquetas, constantes, el operador de punto, y las operaciones aritméticas y lógicas que se definen en la Tabla. prioridad expresión símbolo forma

1 complemento bit a bit ~ (~ a) 2 multiplicación

división Modulo

* /

%

(a * b) (a / b)

(a % b)

3 adición sustracción

+ -

(a + b) (a – b)

4 bit a bit AND & (a & b) 5 bit a bit XOR ^ (a ^ b) 6 bit a bit OR | (a | b) 7 Byte alto de una dirección > (>a) 8 Byte bajo de una

dirección < (< a)

Sólo la expresión de suma (+) se puede aplicar a un símbolo de re-localizables. Todas Las otras expresiones se deben aplicar a las constantes o símbolos que se pueden resolver por el ensamblador. Comentarios Un comentario comienza con un punto y coma (;) o una doble barra (/ /) y va a la final de una línea. Se utiliza por lo general para explicar el código ensamblador y puede colocarse en cualquier lugar en el archivo de origen. El ensamblador ignora los comentarios, sin embargo, se escriben en el archivo de lista de referencia. Directivas Una directiva de ensamblador se utiliza para decirle al ensamblador de tomar alguna acción durante el proceso de montaje. Directivas no son comprendidas por el microcontrolador M8C. Por lo tanto, las directivas permiten que el escritor firmware para crear código que es más fácil de mantener. Ficha Formato de archivo Un <project name> se crea cada vez que el ensamblador se completa sin errores ni advertencias. El archivo de la lista se puede utilizar para comprender cómo el ensamblador se convierte el código fuente a código máquina. Las dos líneas siguientes representan las líneas típicas que se encuentran en un archivo de lista. Las líneas que comienzan con un número de cuatro dígitos entre paréntesis ("()") son las líneas del archivo de origen. El número entre paréntesis es el número de línea del archivo fuente. El texto que sigue al paréntesis es el texto exacto del archivo fuente. La segunda línea en el siguiente ejemplo comienza con un número de cuatro dígitos seguido de dos puntos. Este número de cuatro dígitos indica la dirección de la ROM para el primer byte de código de máquina que sigue el colon. En este ejemplo, los dos números hexadecimales que siguen el colon son dos bytes que forman el MOV A, 74 de instrucciones.

30

Observe que el ensamblador convierte las constantes utilizadas en la fuente de los valores decimales y que el código de la máquina siempre se muestran en hexadecimal. En este caso el código fuente expresó la constante como un valor octal (0112), el ensamblador representado el mismo valor en decimal (74), y el código de máquina utiliza hexadecimal (4A). Mapa Formato de archivo Un <project name>.mp se crea cada vez que el ensamblador se completa sin errores ni advertencias. Los documentos de archivo del mapa donde el ensamblador ha puesto áreas definidas por la directiva de ensamblador AREA y enumera los valores de las etiquetas globales (también llamados símbolos globales). ROM Formato de archivo Un <project name>.rom se crea cada vez que el ensamblador se completa sin errores ni advertencias. Este archivo se ofrece como una alternativa en el fichero de Intel HEX que también está creado por el ensamblador. El archivo de ROM no contiene la configuración de protección definidas por el usuario para el flash o el valor de relleno utilizado para inicializar partes no utilizadas de flash después del final del código de usuario. El archivo de ROM es un archivo de texto simple con ocho columnas de datos delimitados por espacios. El ejemplo siguiente es un archivo de ROM completa para un programa de 47 bytes. El archivo de ROM no contiene ninguna información sobre dónde deben ubicarse los datos en Flash. Por convención, los datos en el archivo de ROM se inicia en la dirección 0x0000 en Flash. En el siguiente ejemplo, sólo se refiere a 0x0000 través 0x002E del flash han asignado valores de acuerdo con el archivo ROM. Ejemplo ROM Archivo: 80 5B 00 00 7E 00 00 00

7E 00 00 00 7D 02 62 7E 7E 00 00 00 7D 01 EF 7E 91 73 90 FE 90 89 90 14 3D 7F 60 3A 5B 60 3E 7F 3F 00 3D FF 3E CC FF

Intel® Formato de archivo HEX El archivo de Intel HEX creado por el ensamblador se utiliza como una manera independiente de la plataforma de distribución de la totalidad de la información necesaria para programar un microcontrolador PSoC. Además de los datos de usuario creados por el ensamblador, el archivo HEX también contiene la configuración de protección para el proyecto que será utilizada por el programador. El bloque de construcción básico del formato Intel HEX se denomina un registro. Cada registro se compone de seis campos, como se muestra en la Tabla. Todos los campos, excepto por el campo de inicio, representan información como hexadecimal codificado ASCII. Esto significa que cada ocho bits de información se codifican en dos caracteres ASCII. El campo de inicio es de un byte de longitud y siempre debe contener dos puntos (:). El campo de longitud es también un byte de longitud e indica el número de bytes de datos almacenados en el registro. Debido a que el campo de longitud es un byte de longitud, la máxima cantidad de datos almacenados en un disco es de 255 bytes que requerirían 510 caracteres ASCII en el archivo HEX. El campo de dirección de inicio indica la dirección del primer byte de la información en el registro. El campo de dirección es de 16 bits de longitud (cuatro caracteres ASCII) que permite espacio para 64 kilobytes de datos por disco.

31

Número de campo Nombre del campo Longitud (bytes) descripción 1 iniciar 1 El único valor

válido es los dos puntos (:).

2 longitud 1 Indica la cantidad de datos de 0 bytes a 255 bytes.

3 comienzo dirección

2

4 tipo 1 "00": los datos "01": fin de archivo "02": la dirección del segmento ampliado "03": la dirección de segmento de inicio "04": la dirección lineal extendida "05": registro de dirección lineal inicio

5 datos Determinado por el campo de longitud

6 checksum 1 Todos los archivos HEX creados por el ensamblador tienen la estructura que se muestra en la Tabla. Cada fila de la tabla se describe un tipo de registro utilizado en el archivo HEX.

Registro Descripción <data record 1: flash data> Este es el primero de muchos registros de datos

en el archivo HEX que contienen datos de Flash.

<data record n: flash data> El enésimo registro que contiene los datos para Flash (último registro). El número total de registros de datos para los datos de Flash se puede determinar dividiendo el espacio Flash disponible (en bytes) por 64. Por lo tanto, una parte 16 KB tendría un archivo HEX con 256 registros de datos de Flash.

:020000040010ea Los dos primeros caracteres (02) indican que este disco tiene una longitud de dos bytes (4 caracteres ASCII). Los siguientes cuatro caracteres (0000) especifica la dirección inicial. Los dos caracteres siguientes (04) indican que se trata de una dirección lineal extendida. Los cuatro caracteres siguientes 04 son los datos de este registro. Debido a que este es un registro de dirección lineal extendida, los cuatro personajes indican el valor de los 16 bits superiores de la dirección de 32 bits. Por lo tanto, el valor de 0x0010 es un 1 MB offset. Para los archivos HEX microcontrolador PSoC,

32

la dirección lineal extendida se utiliza para compensar la protección de datos Flash de los datos de Flash. Los bits de protección de Flash comienzan en la dirección de 1 MB.

<data record 1: protection bits>

Para los dispositivos de PSoC con 16 KB de flash o menos, este es el único registro de datos para los bits de protección.

<data record m: protection bits>

Para los dispositivos de PSoC con más de 16 KB de Flash, habrá un juego de datos adicional con los bits de protección para cada uno de 16 KB de flash adicional.

:020000040020da Este es otro registro de dirección lineal extendida. Este registro proporciona un 1 MB de desplazamiento de los bits de protección de Flash (dirección absoluta de 2 MB).

<data record: checksum> Este es un registro de datos de dos bytes que almacena una suma de comprobación para todos los datos de Flash almacenados en el archivo HEX. El registro comenzará siempre con: 0200000000 y terminan con los cuatro personajes que representan la suma de control de dos bytes.

:00000001ff Este es el registro de fin de archivo. Los campos de dirección de partida longitud y son todos cero. El campo tipo tiene un valor de 0x01 y el valor de suma de comprobación será siempre 0xff.

Ejemplo de código: mov A, reg[0x04]

inc A mov reg[0x04], A

Ejemplo de archivo de ROM: 5D 04 74 60 04 Ejemplo de archivo HEX: :400000005d0474600430303030303030303030303030303030303 030303030303030303030303030303030303030303030303030303 0303030303030303030303030303077 :40004000303030303030303030303030303030303030303030303 030303030303030303030303030303030303030303030303030303 0303030303030303030303030303080 Conjunto de instrucciones Añadir acarreo ADC Calcula la suma de los dos operandos más el valor de acarreo de la bandera de registro. Valor del primer operando se sustituye por la suma calculada. Si la suma es mayor que 255, el indicador de acarreo se encuentra en el registro la Bandera. Si la suma es cero, la bandera Zero se encuentra en el registro la Bandera.

33

Instrucciones Operación Opcode Ciclo

Bytes Mnemoni

Argumento

ADC A, expr A ← A + k + CF 0x09 4 2 ADC A, [expr] A ← A + ram[k] + CF 0x0A 6 2 ADC A, [X+expr] A ← A + ram[X + k] + CF 0x0B 7 2 ADC [expr], A ram[k] ← ram[k] + A + CF 0x0C 7 2 ADC [X+expr], A ram[X + k] ← ram[X + k] + A + CF 0x0D 8 2 ADC [expr], expr ram[k1] ← ram[k1] + k2 + CF 0x0E 9 3 ADC [X+expr], expr ram[X + k1] ← ram[X + k1] + k2 + CF 0x0F 10 3

Ejemplo 1: mov , 0; conjunto acumulador a cero or F, 0x02, bandera de acarreo conjunto adc A, 12; valor del acumulador es ahora 13 Ejemplo 2: mov [0x39], 0; initialize ram [0x39] = 0x00

mov [0x40], FFh; initialize ram [0x40] = 0xFF inc [0x40]; ram [0x40] = 0x00, CF = 1, ZF = 1

adc [0x39], 0; ram [0x39] = 0x01, CF = 0, ZF = 0

Añadir sin acarreo ADD Calcula la suma de los dos operandos. Valor del primer operando se sustituye por la suma calculada. Si la suma es mayor que 255, el indicador de acarreo se encuentra en el registro de Bandera. Si la suma es cero, la bandera Zero se encuentra en el registro de Bandera. El SP ADD, la instrucción expr no afecta a las banderas de ninguna manera.

Instrucciones Operación Opcode Ciclos Bytes Mnemonic Argumento

ADD A, expr A ← A + k 0x01 4 2 ADD A, [expr] A ← A + ram[k] 0x02 6 2 ADD A, [X+expr] A ← A + ram[X + k] 0x03 7 2 ADD [expr], A ram[k] ← ram[k] + A 0x04 7 2 ADD [X+expr], A ram[X + k] ← ram[X + k] + A 0x05 8 2 ADD [expr], expr ram[k1 ] ← ram[k1] + k2 0x06 9 3 ADD [X+expr], expr ram[X + k1 ] ← ram[X + k1 ] + k2 0x07 10 3 ADD SP, expr SP ← SP + k 0x38 5 2

Ejemplo 1: mov A, 10; inicializar A a 10 (decimal)

add A, 240; resultado es A = 250 (decimal) add, 6; resultado es A = 0, CF = 1, ZF = 1

Ejemplo 2: mov A, 10; inicializar A a 10 (decimal)

Add A, 240; resultado es A = 250 (decimal) add, 7; resultado es A = 1, CF = 1, ZF = 0 add A, 5; resultado es A = 6, CF = 0, ZF = 0

34

Ejemplo 3: mov A, 10; inicializar A a 10 (decimal) swap A, SP, poner 10 en SP add SP, 240; resultado es SP = 250 (decimal) add SP, 6, SP = 0, CF = sin cambios, ZF = sin cambios

AND bit a bit Calcula el AND lógico para cada posición de bit usando ambos argumentos. El resultado de la operación lógica AND se coloca en la posición de bit correspondiente para el primer argumento.

Instrucciones Operación Opcode Ciclos Bytes Mnemoni

Argumento

AND A, expr A ← A & k 0x21 4 2 AND A, [expr] A ← A & ram[k] 0x22 6 2 AND A, [X+expr] A ← A & ram[X+k] 0x23 7 2 AND [expr], A ram[k] ← ram[k] & A 0x24 7 2 AND [X+expr], A ram[X + k] ← ram[X + k] & A 0x25 8 2 AND [expr], expr ram[k1 ] ← ram[k1 ] & k2 0x26 9 3 AND [X+expr], expr ram[X + k1 ] ← ram[X + k1] & k2 0x27 10 3 AND REG[expr], expr reg[k1] ← reg[k1] & k2 0x41 9 3

AND REG[X+expr], expr reg[X + k1 ] ← reg[X + k1 ] & k2

0x42

10

3 AND F, expr F ← F & k 0x70 4 2

Ejemplo 1: and A, 0x00 ;A=0, CF=unchanged, ZF=1 Ejemplo 2: and F, 0x00 ;F=0 por lo tanto CF=0, ZF=0 Arithmetic Shift Left (Shift Aritmética Izquierda) ASL Desplaza todos los bits de la instrucción argumento de un bit a la izquierda. Bit 7 se carga en el indicador de acarreo y el bit 0 está cargado con un cero. Ejemplo 1: mov A, 0x7F ;inicializa A con 127

asl A ;A=0xFE, CF=0, ZF=0 Ejemplo 1: mov 0xEB], AA ;inicializa RAM @ 0xEB con 0

asl 0xEB] ;ram[0xEB]=54, CF=1, ZF=0

Arithmetic Shift Right (Shift Aritmética Derecha) ASR Desplaza todos los bits de la instrucción argumento de un bit a la derecha. Bit 7 sigue siendo el mismo, mientras que el bit 0 se desplaza en el indicador de acarreo. Ejemplo 1: mov A, 0x00 ;inicializa A to 0

and F, 0x00 ; asegúrese de que todas las banderas se borran

35

asr A ;A=0, CF=0, ZF=1

Ejemplo 2: mov A, 0xFF ;inicializa A to 255 and F, 0x00 ; asegúrese de que todas las banderas se borran asr A ;A=0xFF, CF=1, ZF=0

Ejemplo 3: mov A, 0xAA ;inicializa A to 170 and F, 0x00 ; asegúrese de que todas las banderas se borran asr A ;A=0xD5, CF=0, ZF=0

Función CALL Añade el argumento firmado a la PC actual 2 valor resultante en un nuevo PC que determina la dirección del primer byte de la siguiente instrucción. El valor PC actual se define como el valor PC que corresponde a la dirección de la ROM del primer byte de la siguiente instrucción. Dos impulsos se utilizan para almacenar el Contador de Programa (PC 2) en la pila. En primer lugar, los 8 bits superiores del PC (CPU_PC registro) se colocan en la pila seguido de los 8 bits inferiores. El puntero de pila se incrementa después de cada pulsación. Para los dispositivos con más de 256 bytes de RAM, la pila se limita a una página pila designada única definida en la hoja de datos del dispositivo. El M8C selecciona automáticamente la página de pila como el destino para el empuje durante la instrucción CALL. Por lo tanto, una instrucción CALL puede emitirse en cualquier página de RAM. Después de la instrucción CALL se ha completado, el código de usuario estará operando desde la misma página RAM como antes se ha ejecutado la instrucción CALL. Esta instrucción tiene una dirección relativa de 12 bits en complemento a dos que se añade a la PC. Los 12 bits se empaquetan en el formato de instrucción de dos bytes usando el inferior del código de operación y el segundo byte del formato de instrucción. Por lo tanto, todos los códigos de operación con un nibble superior de 9 son instrucciones CALL. El carácter "x" se utiliza en la tabla de abajo para indicar que el primer byte de la instrucción CALL puede tener uno de los valores de 16 (es decir, 0x90, 0x91, 0x92,..., 0x9F).

Ejemplo: 0000 _main:

0000 40 nop 0001 90 E8 call SubFun 0003 40 nop Tenga en cuenta que la dirección relativa para la CALL (llamada) anterior es positiva (0xE8) y que la suma de que la dirección y el valor PC para el primer byte de la siguiente instrucción (0x0003) es igual a la dirección de la etiqueta SubFun (0xE8 + 0x0003 = 0x00EB). 0004 9F FA call _main

(0xFA). Tenga en cuenta que la Call (llamada) a la principal utiliza una dirección negativa

Instrucciones Operación Opcode Ciclos Bytes Mnemoni Argumento

CALL expr PC ← PC + 2 + k, (–2048 ≤ k ≤ 2047) 0x9x 11 2

36

0006 00EB org 0x00EB 00EB SubFun: 00EB 40 nop 00EC 7F ret

Comparación no destructiva CMP Resta el segundo argumento de la primera. Si la diferencia es menor que cero se establece el indicador de acarreo. Si la diferencia es 0 la bandera Cero está establecida. El valor de Ningún operando es destruido por esta instrucción.

Instrucciones Operación Opcode Ciclos Bytes Mnemoni Argumento

CMP A, expr A – k 0x39 5 2 CMP A, [expr] A – ram[k] 0x3A 7 2 CMP A, [X+expr] A – ram[X + k] 0x3B 8 2 CMP [expr], expr ram[k1 ] – k2 0x3C 8 3 CMP [X+expr], expr ram[X + k1 ] – k2 0x3D 9 3

Ejemplo: mov A, 34 ; inicializar el acumulador a 34

cmp A, 33 ;A>=34 CF aprobado, A != 33 ZF aprobado cmp A, 34 ;A=34 CF aprobado, ZF set cmp A, 35 ;A<35 CF establecer, A != 35 ZF aprobado

Complementar Acumulador CPL Calcula el complemento bit a bit del acumulador y almacena el resultado en el acumulador. El indicador de acarreo no se ve afectado, sino que se establece el indicador cero, si el resultado del complemento es '0 '(por ejemplo, el valor original era 0xFF).

Instrucciones Operación Opcode Ciclos Bytes Mnemoni Argumento

CPL A A ← A 0x73 4 1

Ejemplo 1: mov A, 0xFF cpl A ;A=0x00, ZF=1

Ejemplo 2: mov A, 0xA5 cpl A ;A=0x5A, ZF=0

Ejemplo 3: mov A, 0xFE cpl A ;A=0x01, ZF=0

Decremento DEC

37

Resta uno del valor del argumento y reemplaza el valor original de la discusión con el resultado. Si el resultado es '-1' (valor original era nulo) se ajusta el indicador de acarreo. Si el resultado es 0 "(valor original era uno) se establece el indicador cero.

Instrucciones Operación Opcode Ciclos Bytes Mnemoni Argumento

DEC A A ← A – 1 0x78 4 1 DEC X X ← X – 1 0x79 4 1 DEC [expr] ram[k] ← ram[k] – 1 0x7A 7 2 DEC [X+expr] ram[X + k] ← ram[X + k] – 1 0x7B 8 2

Ejemplo: mov [0xEB], 3

loop2: ; El bucle se ejecuta 3 veces. dec [0xEB] jnz loop2 ; Jump no será tomada cuando ZF se establece por DEC (es decir, esperar a que el contador del bucle(0xEB) se decremento a 0x00).

Detener HALT Detiene la ejecución del procesador. El procesador permanecerá detenido hasta que el Power-On-Reset (POR), Reset Timer Watchdog (WDR), o reinicio externo (XRES). El POR, WDR y XRES son todas las restauraciones hardware que hará una restauración del sistema completo, incluyendo la puesta a cero de los registros a su estado de encendido. Watchdog reset no hará que el temporizador de vigilancia que se inutilice, mientras que el resto se reinicia, se desactivará el temporizador Watchdog.

Instrucciones Operación Opcode Ciclos Bytes Mnemoni Argumento

HALT reg[CPU_SCR] ← reg[CPU_SCR] + 1 0x30 9 1

Ejemplo: halt; conjuntos de registro de bit de parada en CPU_SCR

registro Incremento INC Se añade a la discusión. Valor original del argumento se sustituye por el nuevo valor. Si el valor después de que el incremento es de 0x00, se establecerá el indicador de acarreo y la bandera de cero (valor original debe haber sido 0xFF).

Instrucciones Operación Opcode Ciclos Bytes

Mnemoni Argumento INC A A ← A + 1 0x74 4 1 INC X X ← X + 1 0x75 4 1 INC [expr] ram[k] ← ram[k] + 1 0x76 7 2 INC [X+expr] ram[X + k] ← ram[X + k] 0x77 8 2

38

Ejemplo 1: mov A, 0x00 ;inicializa A a 0

or F, 0x06 ; asegúrese CF y ZF se establecen (1) inc A ;A=0x01, CF=0, ZF=0

Ejemplo 2: mov A, 0xFF ;inicializa A to 0 and F, 0x00 ; asegurarse de que los flags son todos 0 inc A ;A=0x00, CF=1, ZF=1

INDEX Coloca el contenido de ROM en la ubicación indicada por la suma del acumulador, el argumento, y la corriente de PC 2 en el acumulador. Esta instrucción tiene una dirección de desplazamiento en complemento a dos de 12 bits, con respecto a la actual PC 2. El valor PC actual se define como el valor PC que corresponde a la dirección de la ROM del primer byte de la instrucción. La instrucción de índice se utiliza para recuperar información de una tabla para el acumulador. El nibble inferior del primer byte de la instrucción se utiliza como los 4 bits superiores de la dirección de 12 bits. Por lo tanto, todas las instrucciones que comienzan con 0xF son instrucciones INDEX, por lo que todos los siguientes son códigos de operación INDEX: 0xF0, 0xF1, 0xF2,..., 0xFF. El desplazamiento en la tabla se toma como el valor del acumulador cuando se ejecuta la operación INDEX. El tamaño máximo de la tabla legible es de 256 bytes, debido a la Acumulador ser 8 bits de longitud.

Instrucciones Operación

Opcode

Ciclos

Bytes Mnemoni Argumento

INDEX expr A ← rom[k + A + PC + 2], (–2048 ≤ k ≤ 2047) 0xFx 13 2 Ejemplo: 0000 OUT_REG: equ 04h

0000 40 [04] nop 0001 50 03 [04] mov A, 3 0003 F0 E6 [13] index ASCIInumbers 0005 60 04 [05] mov reg[OUT_REG], A Tenga en cuenta que la dirección de 12 bits para la instrucción INDEX es positivo y que la suma de la dirección (0x0E6) y la dirección de la siguiente instrucción (0x0005) son iguales a la primera dirección de la tabla ASCIInumbers (0x00EB). Debido a que el acumulador se ha ajustado a 3 antes de ejecutar la instrucción ÍNDICE, el cuarto byte en la tabla ASCIInumbers será devuelto a A. Por lo tanto, A será 0x33 al final de la instrucción INDEX.

0007 00EB org 0x00EB 00EB ASCIInumbers: 00EB 30 31 ... ds "0123456789"

32 33 34 35 36 37 38 39

Acumulador jump JACC

39

Jump, sin condiciones, a la dirección calculada por la suma del acumulador, el argumento two'scompliment 12 bits, y la corriente de PC+1. El valor PC actual se define como el valor PC que corresponde a la dirección de la ROM del primer byte de la instrucción JACC. El acumulador no se ve afectada por esta instrucción. La instrucción JACC utiliza un formato de instrucción de dos bytes, donde se utiliza el inferior del primer byte de los 4 bits superiores de la dirección relativa de 12 bits. Esto hace que un código de operación efectiva de 4 bits. Por lo tanto, los siguientes son los bytes de código de operación válido para la instrucción JACC: 0xE0, 0xE1, 0xE2,..., 0xEF.

Instrucciones Operación

Opcode

Ciclos

Bytes Mnemoni Argumento

JACC expr PC ← (PC + 1) + k + A 0xEx 7 2 Ejemplo: 0000 _main:

0000 50 03 mov A, 3 ; conjunto A con el offset jump

0002 E0 01 jacc SubFun La ejecución del programa saltará a abordar 0x0007 (halt) 0004 SubFun: 0004 40 nop 0005 40 nop 0006 40 nop 0007 30 halt

Jump si acumula JC Si se establece el indicador de acarreo, salta a la suma de los argumentos dirección relativa y la corriente de PC+1. El valor PC actual se define como el valor PC que corresponde a la dirección de la ROM del primer byte de la instrucción JC. La instrucción JC utiliza un formato de instrucción de dos bytes, donde se utiliza el inferior del primer byte de los 4 bits superiores de la dirección relativa de 12 bits. Esto hace que un código de operación efectiva de 4 bits. Por lo tanto, los siguientes son los bytes de código de operación válido para la instrucción JC: 0xC0, 0xC1, 0xC2,..., 0xCF.

Ejemplo: 0000 _main:

0000 55 3C 02 mov [3Ch], 2 0003 16 3C 03 sub [3Ch], 3 ;2-2=0 CF=1, ZF=0 0006 C0 02 jc SubFun ;CF=1, jump to SubFun 0008 30 halt 0009 0009 SubFun: 0009 40 nop

Jump JMP Jump, sin condiciones, a la dirección indicada por la suma de los argumentos y la corriente PC+1. El valor PC actual se define como el valor PC que corresponde a la dirección de la ROM del primer byte de la instrucción JMP.

Instrucciones Operación

Opcode

Ciclos

Bytes Mnemoni Argumento

JC expr PC ← (PC + 1) + k, (–2048 ≤ k ≤ 2047) 0xCx 5 2

40

La instrucción JMP utiliza un formato de instrucción de dos bytes, donde se utiliza el inferior del primer byte de los 4 bits superiores de la dirección relativa de 12 bits. Esto hace que un código de operación efectiva de 4 bits. Por lo tanto, los siguientes son los bytes válidos código de operación de la instrucción JMP: 0x80, 0x81, 0x82,..., 0x8F.

Instrucciones Operación

Opcode

Ciclos

Bytes Mnemoni Argumento

JMP expr PC ← (PC + 1) + k, (–2048 ≤ k ≤ 2047) 0x8x 5 2 Ejemplo: 0000 _main:

0000 80 01 [05] jmp SubFun Jump es hacia adelante, en relación con PC, por lo tanto compensa es positivo (0x01). 0002 SubFun: 0002 8F FD [05] jmp _main Jump es al revés, en relación con PC, por lo tanto, el desplazamiento es negativo (0xFD).

Jump si no acumula JNC Si el indicador de acarreo no está establecido, el salto a la suma de los argumentos en la dirección relativa y la corriente de PC+1. El valor PC actual se define como el valor PC que corresponde a la dirección de la ROM del primer byte de la instrucción JNC. La instrucción JNC utiliza un formato de instrucción de dos bytes, donde se utiliza el inferior del primer byte de los 4 bits superiores de la dirección relativa de 12 bits. Esto hace que un código de operación efectiva de 4 bits. Por lo tanto, los siguientes son los bytes de código de operación válido para la instrucción JNC: 0xD0, 0xD1, 0xD2,..., 0xDF.

Instrucciones Operación

Opcode

Ciclos

Bytes Mnemoni Argumento

JNC expr PC ← (PC + 1) + k, (–2048 ≤ k ≤ 2047) 0xDx 5 2 Ejemplo: 0000 _main:

0000 55 3C 02 [08] mov [3Ch], 2 0003 16 3C 02 [09] sub [3Ch], 2 ;2-2=0 CF=0, ZF=1 0006 D0 02 [05] jnc SubFun ;jump to SubFun 0008 30 [04] halt 0009 0009 SubFun: 0009 40 [04] nop

Jump si no es cero JNZ Si la bandera de cero no está definida, el salto a la dirección indicada por la suma de los argumentos y la corriente de PC+1. El valor PC actual se define como el valor PC que corresponde a la dirección de la ROM del primer byte de la instrucción JNZ. La instrucción JNZ utiliza un formato de instrucción de dos bytes, donde se utiliza el inferior del primer byte de los 4 bits superiores de la dirección relativa de 12 bits. Esto hace que un código de operación efectiva de 4 bits. Por lo tanto, los siguientes son los bytes de código de operación válido para la instrucción JNZ: 0xB0, 0xB1, 0xB2,..., 0xBF.

41

Instrucciones Operación

Opcode

Ciclos

Bytes Mnemoni Argumento

JNZ expr PC ← (PC + 1) + k, (–2048 ≤ k ≤ 2047) 0xBx 5 2 Ejemplo: 0000 _main:

0000 55 3C 02 [08] mov [3Ch], 2 0003 16 3C 01 [09] sub [3Ch], 1 ;2-1=1 CF=0, ZF=0

0006 B0 02 [05] jnz SubFun ;jump to SubFun 0008 30 [04] halt 0009 0009 SubFun: 0009 40 [04] nop

Saltar si es Zero JZ Si se establece el indicador cero, salta a la dirección indicada por la suma de los argumentos y la corriente de PC+1. El valor PC actual se define como el valor PC que corresponde a la dirección de la ROM del primer byte de la instrucción JZ. La instrucción JZ utiliza un formato de instrucción de dos bytes, donde se utiliza el inferior del primer byte de los 4 bits superiores de la dirección relativa de 12 bits. Esto hace que un código de operación efectiva de 4 bits. Por lo tanto, los siguientes son los bytes de código de operación válido para la instrucción JZ: 0xA0, 0xA1, 0xA2,..., 0xAF.

Instrucciones Operación

Opcode

Ciclos

Bytes Mnemoni Argumento

JZ expr PC ← (PC + 1) + k, (–2048 ≤ k ≤ 2047) 0xAx 5 2 Ejemplo: 0000 _main:

0000 55 3C 02 [08] mov [3Ch], 2 0003 16 3C 02 [09] sub [3Ch], 2 ;2-2=0 CF=0, ZF=1 0006 A0 02 [05] jz SubFun ;jump a SubFun 0008 30 [04] halt 0009 0009 SubFun: 0009 40 [04] nop

Long Call (llamada larga) LCALL Sustituye el valor PC con el argumento de la instrucción LCALL. El nuevo valor de PC determina la dirección del primer byte de la siguiente instrucción. Dos impulsos se utilizan para almacenar el Contador de Programa (PC actual 3) en la pila. El valor PC actual se define como el valor PC que corresponde a la dirección de la ROM del primer byte de la instrucción. En primer lugar, los 8 bits superiores de la PC+3 se colocan en la pila seguido de los 8 bits inferiores. El puntero de pila se incrementa después de cada pulsación. Para microcontroladores PSoC con más de 256 bytes de RAM, la pila se limita a una página pila designada única definida en la hoja de datos del dispositivo. El M8C selecciona automáticamente la página de pila como el destino para el empuje durante la instrucción LCALL. Por lo tanto, una instrucción LCALL puede emitirse en cualquier página de RAM. Después de la instrucción LCALL ha completado, código de usuario estará operando desde la misma página RAM como antes se ha ejecutado la instrucción LCALL.

42

Esta instrucción tiene una dirección de 16 bits sin signo. Un formato de instrucción de tres bytes se utiliza cuando el primer byte es un código de operación completo de 8 bits.

Instrucciones Operación

Opcode

Ciclos

Bytes

Mnemoni Argumento

LCALL expr ram[SP] ← (PC + 3)[15:8]

SP ← SP + 1 ram[SP] ← (PC + 3)[7:0] SP ← SP + 1 PC ← k, (0 ≤ k ≤ 65535)

0x7C

13

3

Ejemplo: 0000 _main:

0000 7C 00 05 [13] lcall SubFun 0003 8F FC [05] jmp _main Aunque en este caso no se necesita una dirección de 16 bits completo para la llamada a SubFun, la lista de arriba muestra que la instrucción lcall utiliza un formato de tres bytes que da cabida a la dirección de salto absoluto de 16 bits de 0x0005. 0005 0005 SubFun: 0005 7F [08] ret

Long jump(salto de longitud) LJMP Saltar, sin condiciones, a la dirección indicada por firmar el argumento de la instrucción. La instrucción LJMP utiliza un formato de instrucción de tres bytes para dar cabida a un argumento de 16 bits completo. El primer byte de la instrucción es un código de operación completa de 8 bits.

Instrucciones Operación

Opcode

Ciclos

Bytes Mnemoni Argumento

LJMP expr PC ← K, (0 ≤ k ≤ 65535) 0x7D 7 3 Ejemplo: 0000 _main:

0000 7D 00 03 [07] ljmp SubFun Aunque en este caso no se necesita una dirección de 16 bits para el salto a SubFun la lista de arriba muestra que la instrucción ljmp utiliza un formato de tres bytes que da cabida a la dirección de salto absoluto de 16 bits de 0x0003. 0003 0003 SubFun: 0003 7D 00 00 [07] ljmp _main Tenga en cuenta que esta instrucción está saltando hacia atrás, en relación con el valor actual del PC, así como la dirección de la instrucción es un número positivo (0x0000). Esto se debe a que la instrucción ljmp utiliza una dirección absoluta.

43

Mueva MOV Permite una serie de combinaciones de movimientos: inmediata, directa y direccionamiento indexado se admiten.

Instrucciones Operación

Opcode

Ciclos

Bytes Mnemoni Argumento

MOV X, SP X ← SP 0x4F 4 1 MOV A, expr A ← k 0x50 4 2 MOV A, [expr] A ← ram[k] 0x51 5 2 MOV A, [X+expr] A ← ram[X + k] 0x52 6 2 MOV [expr], A ram[k] ← A 0x53 5 2 MOV [X+expr], A ram[X + k] ← A 0x54 6 2 MOV [expr], expr ram[k1 ] ← k2 0x55 8 3 MOV [X+expr], expr ram[X + k1 ] ← k2 0x56 9 3 MOV X, expr X ← k 0x57 4 2 MOV X, [expr] X ← ram[k] 0x58 6 2 MOV X, [X+expr] X ← ram[X + k] 0x59 7 2 MOV [expr], X ram[k] ← X 0x5A 5 2 MOV A, X A ← X 0x5B 4 1 MOV X, A X ← A 0x5C 4 1 MOV A, reg[expr] A ← reg[k] 0x5D 6 2 MOV A, reg[X+expr] A ← reg[X + k] 0x5E 7 2 MOV [expr], [expr] ram[k1] ← ram[k2] 0x5F 10 3 MOV REG[expr], A reg[k] ← A 0x60 5 2 MOV REG[X+expr], A reg[X + k] ← A 0x61 6 2 MOV REG[expr], expr reg[k1] ← k2 0x62 8 3

MOV REG[X+expr], expr reg[X + k1 ] ← k2

0x63

9

3 Ejemplo: mov A, 0x01 ; acumulador será igual 1, ZF=0

mov A, 0x00 ; acumulador será igual 0, ZF=1

Mueva indirecta, Post-Incremento de la memoria MVI Un puntero de datos en la memoria RAM se utiliza para mover datos entre otra dirección de la RAM y el acumulador. El puntero de datos se incrementa después de la transferencia de datos se ha completado. Para microcontroladores PSoC con más de 256 bytes de RAM, punteros de página especiales se utilizan para permitir que las instrucciones MVI para acceder a los datos en páginas de memoria RAM remotas. Dos punteros de página están disponibles, uno para MVI lectura (MVI A, [[expr] + +]) y otro para MVI escritura (MVI [[expr] + +], A). El puntero de datos siempre se encuentra en la página RAM actual. Los punteros de página determinan qué página RAM usará la dirección del puntero de datos. Al final de una instrucción MVI, código de usuario estará operando de la misma página de memoria RAM como antes de que se ejecute la instrucción MVI.

44

Instrucciones Operación

Opcode

Ciclos

Bytes

Mnemoni Argumento

MVI

A, [[expr]++] A ← ram[ram[k]]

ram[k] ← ram[k] + 1

0x3E

10

2

MVI [[expr]++], A ram[ram[k]] ← A

ram[k] ← ram[k] + 1

0x3F

10

2

Ejemplo 1: mov [10h], 4

mov [11h], 3 mov [EBh], 10h ; nicializar MVI escribir puntero 10h mvi A, [EBh] ;A=4, ram[EBh]=11h mvi A, [EBh] ;A=3, ram[EBh]=12h

Ejemplo 2: mov [EBh], 10h ; nicializar MVI escribir puntero 10h mov A, 8 mvi [EBh], A ;ram[10h]=8, ram[EBh]=11h mov A, 1 mvi [EBh], A ;ram[11h]=1, ram[EBh]=12h

45

Bibliografía Acosta, I. C. (s.f.). http://psocenespanol.blogspot.com/. Recuperado el 20 de Agosto de 2013 Cypress Semiconductor Corporation. (2001-2003). Assembly Language Guide. Champion Court. Cypress Semiconductor Corporation. (20 de August de 2003). C Language Compiler. Cypress Semiconductor. (2011). PSoC® 1 Evaluation Kit Guide. Champion Court.

46