Documentos de Académico
Documentos de Profesional
Documentos de Cultura
de 8 cabezas
Un documento en castellano basado en la docuentacin del fabricante
Parallax y destinado a los clientes y usuarios de
Ingeniera de Microsistemas Programados S.L. distribuidor de Parallax en Espaa
INGENIERIA DE MICROSISTEMAS
PROGRAMADOS S.L.
C/ Alda. Mazarredo N 47 - 1 Dpto. 2
48009 BILBAO - BIZKAIA
Tel/Fax: 94 4230651
email: info@microcontroladores.com
www.microcontroladores.com
www.microcontroladores.com
info@microcontroladores.com
INDICE GENERAL
CAPITULO 1: ARQUITECTURA, FUNCIONAMIENTO Y CARACTERSTICAS
DEL PROPELLER
1.1. Qu es el Propeller?
1.2. Tipos de encapsulado
1.3. Diagrama de conexiones
1.4. El arranque o Reset
1.5. Proceso de ejecucin
1.6. Modo de apagado
1.7. Diagrama por bloques de la arquitectura interna
1.8. Los recursos compartidos
1.9. El reloj del sistema
1.10. Cogs (procesadores)
1.11. El Hub
1.12. Pines de E/S
1.13. Contador del sistema
1.14. Registro CLK
1.15. Semforos
1.16. Memoria Principal
1.17. RAM Principal
1.18. ROM Principal
1.19. Definicin de caracteres
1.20. Tablas de registro y contra-registro
1.21. Tabla de seno
1.22. Boot Loader e Intrprete Spin
i-1
i-2
www.microcontroladores.com
info@microcontroladores.com
i-3
www.microcontroladores.com
info@microcontroladores.com
i-4
www.microcontroladores.com
info@microcontroladores.com
www.microcontroladores.com
info@microcontroladores.com
CAPITULO 1:
ARQUITECTURA, FUNCIONAMIENTO Y
CARACTERISTICAS DEL PROPELLER
1.1 QU ES EL PROPELLER?
El procesador Propeller est diseado para proporcionar un elevadsimo rendimiento para los sistemas embebidos
mientras mantiene un bajo consumo de energa y ocupa una superficie de instalacin pequea. Adems de ser
rpido, el Propeller proporciona flexibilidad y potencia a travs de sus ocho procesadores, llamados Cogs, que
pueden realizar simultneamente tareas independientes o cooperativas, todo esto mientras soporta una
arquitectura relativamente simple que es fcil de aprender y de utilizar.
El diseo resultante del Propeller libera al desarrollador
programacin de sistemas embebidos. Por ejemplo:
El mapa de memoria es plano. No hay necesidad de paginar los bloques del cdigo, de datos o de
variables. Esto permite ahorrar mucho tiempo durante el desarrollo de la aplicacin.
Los acontecimientos asncronos son ms fciles de controlar que con dispositivos que utilizan
interrupciones. El Propeller no tiene necesidad de interrupciones; slo hay que asignar algunas patitas a
tareas de alta frecuencia y mantener otras patitas libres. El resultado es una aplicacin ms receptiva que
es ms fcil de mantener.
El lenguaje ensamblador del Propeller ofrece la ejecucin condicional y la escritura opcional del resultado
para cada instruccin individual.
Figura1-1.-Encapsulados del
Propeller.
1-1
www.microcontroladores.com
info@microcontroladores.com
Nombre de PIN
P0-P31
VDD
VSS
BOEn
Direccin
E/S (E/S)
--I
Descripcin
Puerto A de E/S de propsito general.
Los pines mostrados a continuacin tienen un propsito
especial sobre encendido/reset pero son de propsito
general E/S de todas formas.
P28 Conexin opcional de I2C LCC a EEPROM externa.
P29 Conexin opcional de I2C SDA a EEPROM externa.
P30 - Tx al host.
P31 - Rx del host.
2.7 3.3 VDC
Tierra. 0 VDC
Brown Out Enable.
Debe conectarse con Vdd o el Vss.
Si es baja, RESn se convierte en una salida dbil (que
entrega Vdd con 5 K ) para monitorizar, pero puede
todava utilizarse para crear un reset.
Si es alta, RESn acta como entrada de CMOS con
Schmitt Trigger.
RESn
E/S
XI
XO
El Propeller (P8X32A) tiene 32 patitas de E/S (Puerto A, pines P0 a P31). Los ltimos cuatro pines de E/S, P28P31 son de propsito especial para encendido/reset. En encendido/reset, los pines P30 y P31 se comunican con
un host para programar y los pines P28 y P29 interactan con una EEPROM (24LC256) de 32 KB externa.
1-2
www.microcontroladores.com
info@microcontroladores.com
Especificaciones
Modelo
Requerimientos de arranque
Velocidad de Reloj Externo
Velocidad de Reloj del
sistema
Oscilador RC Interno
RAM/ROM Global
Cog RAM
Organizacion RAM/ROM
Pines E/S
Fuente/ Sumidero actual por
E/S
Fuente/ Sumidero actual por
chip
Current Draw @ 3.3 vdc,
70 F
P8X32A
3.3 VDC
DC a 80 MHz (4 MHz a 8 MHz con el Reloj PLL en ejecucion)
DC a 80 MHz
12 MHz o 20 kHz
(aprox. rango de 8 MHz 20 MHz, o
13 kHz 33 kHz, respectivamente)
64 K bytes; 32 K RAM / 32 K ROM
2 K bytes cada Cog
32 bits (4 bytes)
32, CMOS, VDC, VDD umbral lgico de 1.65 V.
50 mA
TBD mA
500 uA por MIPS (MIPS = Freq en MHz / 4 * Nmero de Cogs
Activos)
Figura 1-3.- Esquema de conexionado del Propeller a un host ( To PC) y a una EEPROM externa de 32 KB.Se
utiliza un cristal externo.
1-3
www.microcontroladores.com
info@microcontroladores.com
Si no se detect ninguna EEPROM, el Boot Loader se para, se detiene el Cog 0, el chip del Propeller
entra en modo de parada, y todos los pines de E/S se fijan como entradas.
3. Si los pasos 2a o 2b son capaces de cargar un programa en la RAM global, y el host no ha mandado un
comando de suspensin, el Cog 0 se re arranca con el intrprete Spin embebido y el cdigo del usuario se
ejecuta desde la RAM global.
1.5. Proceso de Ejecucin
Una Aplicacin Propeller es un programa de usuario compilado a su forma binaria (ejecutable) y descargado en
la RAM/EEPROM del Propeller. La aplicacin consiste de cdigo escrito en lenguaje Spin del Propeller (cdigo de
alto nivel) con componentes opcionales del lenguaje ensamblador del Propeller (cdigo de bajo nivel). El cdigo
escrito en lenguaje Spin es interpretado durante tiempo de ejecucin por un Cog que ejecuta el intrprete Spin
mientras que el cdigo escrito en ensamblador Propeller es ejecutado directamente por un Cog. Cada Aplicacin
Propeller consiste en, por lo menos, un cdigo Spin y debe ser escrito todo en Spin o combinando Spin y
ensamblador. El intrprete Spin del Propeller arranca en el paso 3 del proceso de reset, para ejecutar la
aplicacin.
Una vez finalizado el proceso de arranque y se est ejecutando una aplicacin, arranca en el Cog 0, cualquier
otra actividad es definida por la misma aplicacin. La aplicacin tiene control completo sobre aspectos como la
velocidad de reloj interna, uso de pines de E/S, registros de configuracin, y cundo, cules y cuntos Cogs
estn funcionando en un momento dado. Todo esto es variable en el tiempo de ejecucin, segn la aplicacin,
incluyendo la velocidad de reloj interna.
1.6. Modo de apagado
Cuando el Propeller entra modo de apagado, el reloj interno se para causando la parada de todos los Cogs y
fijando como entradas (alta impedancia) a todos los pines de E/S. Este modo puede ser causado por uno de estos
tres acontecimientos:
1) Vdd cae por debajo del umbral del brown-out (~2.7 VDC), cuando el brown-out del circuito est activo.
2) El pin de RESn pasa a ser activo por tensin baja.
3) La aplicacin solicita un reboot (vase ms adelante el comando del REBOOT).
Contina el modo de parada cuando el voltaje sube y alcanza el umbral del brown-out y el pin de RESn es alto.
1-4
www.microcontroladores.com
info@microcontroladores.com
El oscilador interno de RC
El circuito PLL
El oscilador de cristal (un circuito interno que es alimentado por un cristal externo). La fuente se determina
en los ajustes del registro CLK, que es seleccionable en tiempo de ejecucin. Los nicos componentes que
no utilizan el reloj del sistema directamente son el Hub y el Bus, que dividen por 2 el reloj del sistema.
1-5
www.microcontroladores.com
info@microcontroladores.com
1-6
www.microcontroladores.com
info@microcontroladores.com
1.11. El Hub
Para mantener la integridad del sistema, los recursos mutuo-exclusivos no deben ser accedidos por ms de un
Cog a la vez. El Hub mantiene esta integridad controlando el acceso a los recursos mutuo-exclusivos, dando a
cada Cog un turno para acceder a ellos de forma "round robin" desde el Cog 0 a el Cog 7 y volviendo al Cog 0
otra vez.
El Hub y el Bus que lo controla, funcionan a la mitad de la frecuencia del reloj del sistema. Esto significa que el
Hub da a acceso al Cog a los recursos mutuo-exclusivos una vez cada 16 ciclos de reloj del sistema. Las
instrucciones del Hub, las instrucciones de ensamblador del Propeller que tienen acceso a recursos mutuoexclusivos, requieren 7 ciclos para ejecutarse, pero primero necesitan ser sincronizadas en el comienzo de la
Ventana de Acceso del Hub. Necesita como mximo 15 ciclos (16 menos 1, si acabamos de perderlo) para
sincronizarse a la Ventana de Acceso del Hub, ms 7 ciclos para ejecutar la instruccin del Hub, as que las
instrucciones del Hub consumen de 7 a 22 ciclos para completarse.
Las Figuras 1-5 y 1-6 muestran ejemplos donde el Cog 0 tiene una instruccin Hub para ejecutar.
La Figura 1-5 muestra el escenario del mejor-caso; la instruccin Hub est lista justo en el comienzo de la
Ventana de Acceso de ese Cog. La instruccin Hub se ejecuta inmediatamente (7 ciclos) dejando los 9 ciclos
adicionales para otras instrucciones antes de que llegue la siguiente Ventana de Acceso del Hub.
Figura 1-5.- Interaccin entre Cog/Hub en el escenario del caso mejor, cuando la instruccin Hub est lista justo al
comienzo de la Ventana de Acceso al Cog 0.
1-7
www.microcontroladores.com
info@microcontroladores.com
La Figura 1-6 muestra el peor caso; la instruccin Hub est lista justo en el siguiente ciclo antes del comienzo de
la Ventana de Acceso del Cog 0; justo acaba de perderlo. El Cog espera hasta que la siguiente Ventana de
Acceso del Hub (15 ciclos ms adelante) entonces la instruccin del Hub se ejecuta (7 ciclos), sumando un total
de 22 ciclos para esa instruccin del Hub. Una vez ms, hay 9 ciclos adicionales despus de que llegue la
instruccin del Hub para que otras instrucciones se ejecuten antes de la siguiente Ventana de Acceso del Hub.
Para conseguir la mayor eficacia en las rutinas de ensamblaje del Propeller que tienen acceso frecuente a
recursos mutuo-exclusivos, puede ser beneficioso interpolar instrucciones del no-Hub con instrucciones del Hub
con el fin de disminuir el nmero de los ciclos que esperan la siguiente Ventana de Acceso del Hub. Como la
mayora de las instrucciones de ensamblador del Propeller necesitan 4 ciclos, se podran ejecutar dos de estas
instrucciones entre instrucciones contiguas de Hub.
1-8
www.microcontroladores.com
info@microcontroladores.com
1-9
1-10
www.microcontroladores.com
info@microcontroladores.com
www.microcontroladores.com
info@microcontroladores.com
1.15. Semforos
Hay ocho semforos disponibles para facilitar el acceso exclusivo a los recursos definidos por el usuario entre los
mltiples Cogs. Si un bloque de memoria va a ser utilizado por dos o ms Cogs inmediatamente y ese bloque
tiene ms de un long (cuatro octetos), cada Cog tendr que realizar mltiples lecturas y escrituras para recuperar
o actualizar ese bloque de memoria. Esto conduce a la posibilidad de contencin de lectura/escritura en ese
bloque de memoria donde un Cog puede escribir mientras que otro est leyendo, dando por resultado malas
interpretaciones y/o prdidas de escritura.
Los semforos son bits globales accedidos a travs del Hub con las siguientes instrucciones: LOCKNEW,
LOCKRET, LOCKSET y LOCKCLR. Porque los semforos solo pueden ser accedidos a travs del Hub, slo un
Cog a la vez puede afectarlos, conformando todo esto un mecanismo eficaz de control. El Hub mantiene un
inventario de los semforos que estn en uso y sus estados actuales y de los Cogs que pueden comprobar,
devolver, fijar, y resetear los semforos, segn lo que se precise durante tiempo de ejecucin.
1.16 Memoria Principal
La memoria principal es un bloque de 64 K bytes (16 K longs) que es accesible por todos los Cogs como recurso
mutuo-exclusivo a travs del Hub. Est formada por 32 KB de RAM y 32 KB de ROM. Los 32 KB de RAM principal
son de propsito general y constituyen el destino de una aplicacin Propeller, que puede ser descargada de un
host o cargada de los 32 KB de EEPROM externa.
1-11
www.microcontroladores.com
info@microcontroladores.com
Los 32 KB de la ROM principal contienen todos los recursos del cdigo y los datos vitales para la funcin del
Propeller: definiciones del carcter, registro, funciones de contra-registro y de seno, el Boot Loader y el intrprete
Spin. La organizacin de la memoria principal se muestra en la Figura 1-6.
1-12
www.microcontroladores.com
info@microcontroladores.com
1-13
www.microcontroladores.com
info@microcontroladores.com
La herramienta del Propeller incluye y usa la fuente True Type de Parallax que sigue el diseo de la fuente
Propeller embebida en hardware. Con esta fuente, y la herramienta del Propeller, se pueden incluir diagramas
esquemticos, diagramas de coordinacin y otros diagramas en cdigo fuente de la aplicacin.
1.20 Tablas de registro y contra-registro
Las tablas de registro y de contra-registro son tiles para convertir valores entre formato numrico y formato
exponencial. Cuando los nmeros se codifican en forma exponencial, las operaciones simples matemticas
adquieren efectos ms complejos. Por ejemplo ' add ' y ' subtract' se convierten en ' multiply ' y ' divde'. Shift left'
se convierte en ' square' y la ' Shift right ' se convierte en square-root '. 'Divide by 3 ' (dividir entre 3) se convertir
en ' cube root ' (raz cbica).
Una vez que el exponente s e convierta de nuevo a un nmero, el resultado ser evidente.
1.21 Tabla del seno
La tabla del seno proporciona 2.049 muestras de seno de 16 bits que van de 0 hasta el 90 inclusive (resolucin
de 0.0439). Los valores del seno para el resto de los cuadrantes que cubren de 91 a 359 se pueden calcular a
partir de transformaciones en esta tabla del seno de un cuadrante. La tabla del seno se puede utilizar para los
clculos relacionados con los fenmenos angulares.
1.22 Boot Loader e Intrprete Spin
La ltima seccin de la ROM principal contiene el Boot Loader del Propeller y los programas del intrprete Spin. El
Boot Loader es responsable de inicializar el Propeller en el encendido/reset. Cuando comienza el proceso de
arranque, el Boot Loader se carga en el Cog 0 de la RAM y el Cog ejecuta el cdigo que comienza en la posicin
0. El programa del Boot Loader primero chequea el host y los pines de comunicacin desde code/data a
download/upload de la EEPROM, procesa dicha informacin y finalmente lanza el programa del Intrprete Spin en
el Cog 0 de la RAM (que se sobreescribe) para ejecutar la aplicacin Propeller del usuario, o para poner el
Propeller en modo parada.
El programa del Intrprete Spin recupera y ejecuta la aplicacin Propeller de la RAM Principal. Esto puede precisar
lanzar Cogs adicionales para ejecutar ms cdigo Spin o cdigo ensamblador del Propeller, si lo solicita la
aplicacin.
1-14
www.microcontroladores.com
info@microcontroladores.com
CAPITULO 2:
MANEJO Y DESARROLLO DE APLICACIONES
2.1. LA CONCEPCIN DEL SOFTWARE
Este captulo describe las caractersticas del software que utiliza el Propeller, comenzando por su gestacin y su
estructura, pasando por la organizacin y el propsito de la pantalla del software, los detalles de las funciones del
men y las caractersticas avanzadas, para terminar con las teclas rpidas.
Los ingenieros de desarrollo de Parallax han utilizado muchos ambientes durante ms de 20 aos. En bastantes
ocasiones han tenido que resolver preguntas tales como:
Sera ms amigable el sistema haciendo que la caracterstica "x" fuera ms fcil de buscar/invocar?.
Dnde se colocan los archivos del proyecto y por qu hay tantos?
Se podr instalar/recompilar/mantener este sistema en otra computadora, en los prximos aos?
No hay una solucin ms econmica?
Estas dudas han conducido a tomar la determinacin de crear herramientas sencillas y baratas para los productos
Parallax. La herramienta para el Propeller fue diseada con la idea de proporcionar muchas funciones tiles
mientras se mantiene un sencillo y constante ambiente de trabajo que anima al desarrollo rpido y fcil de los
objetos de los programas para el Propeller.
El software del Propeller consta de: a) un archivo ejecutable, b) unos archivos de ayuda on-line y c) archivos de la
biblioteca del Propeller, todo ello almacenado en la misma carpeta por el instalador, que por defecto es:
C:\Program Files\Parallax Inc\Propeller. El fichero ejecutable "Propeller.exe" puede ser copiado y ejecutado desde
cualquier carpeta en la computadora.
Cada archivo de la biblioteca (archivos con extensin "spin") es un objeto independiente, disponible para utilizar en
los proyectos Propeller, con cdigo fuente y documentacin incorporado. Son realmente archivos de texto, tipo
ANSI o Unicode-encoded, que pueden ser corregidos en cualquier editor de texto que soporte dicho tipo de
codificacin; incluso el Notepad de Windows 2000 (y posteriores) soporta el ANSI y los archivos de texto
Unicode-encoded.
Es posible escribir la documentacin de usuario para un objeto dentro del archivo fuente del objeto. Esto significa
que habr menos archivos para mantener y una probabilidad ms alta que la documentacin permanezca en
armona con la revisin del cdigo fuente. Para permitir este proceso, se han creado:
Dos tipos de comentarios en el fuente: 1) los comentarios del cdigo, y 2) comentarios de documento
(dentro del cdigo, pero pensado para SER LEDO con la opcin de "vista de documentacin".
El modo de vista de la documentacin" que extrae la documentacin del cdigo fuente de un objeto para
los propsitos de visualizacin.
Una fuente especial, la fuente Parallax, que contiene caracteres especiales para elementos como
diagramas esquemticos, diagramas de tiempo y tablas que hay en la documentacin del objeto.
La fuente Parallax es una fuente True Type construida en la Herramienta del Propeller ejecutable. Fue diseada
en el mismo estilo que la fuente construida en la ROM del chip Propeller. Usando los caracteres especiales de la
fuente, la documentacin del objeto puede incluir los diagramas interesantes en ingeniera tales como los de la
Figura 2-1.
2-1
www.microcontroladores.com
info@microcontroladores.com
2-2
www.microcontroladores.com
info@microcontroladores.com
Figura 2-2.- La ventana principal del software de la herramienta Propeller contiene cuatro secciones importantes
llamados "paneles."
Los paneles uno, dos y tres de la Figura 2-2 corresponden a la parte del explorador integrado. El explorador
integrado est situado en el panel 4, que proporciona las vistas del proyecto que se est trabajando as como
carpetas y archivos en disco. Una barra alta vertical separa al explorador integrado del panel del editor, que se
puede reajustar su tamao con el ratn en cualquier momento. El explorador integrado puede incluso ser ocultado
reajustando su tamao hasta cero, seleccionando File Hide Explorer, o pulsando Ctrl+E. Las opciones del men
y las teclas rpidas cambian el modo del Explorador Integrado entre visible e invisible.
Figura 2-3.- El Explorador integrado y sus componentes pueden ser reajustados en tamao con las barras de
divisin.
2.2.1. Panel 1: Panel de visualizacin de objetos.
El lenguaje Spin est basado en objetos y un proyecto Propeller se puede componer de mltiples objetos.
La pantalla del visor de objetos muestra la vista jerrquica del proyecto que se compil con xito por ltima vez.
Usando la vista del objeto, se puede determinar qu objetos se utilizan, cmo encajan con otros objetos, su
localizacin fsica en disco (carpeta del trabajo, carpeta de biblioteca o editor), optimizacin de la redundancia (si
hubiera) y cualquier potencial de colisin entre objetos.
2-3
www.microcontroladores.com
info@microcontroladores.com
Figura 2-4.- Muestra una etiqueta al pasar el ratn para ver el path completo y el nombre del fichero que contiene
la tabla.
El editor puede mostrar el cdigo fuente de 4 formas: 1) fuente completa, 2) condensada, 3) resumen, o 4)
documentacin. El modo de la vista puede ser considerado o cambiado, en cada pestaa, 1) seleccionando el
2-4
www.microcontroladores.com
info@microcontroladores.com
botn respectivo con el ratn, 2) presionando Alt+Up o Alt+Down, 3) presionando Alt+<letra>; donde <letra> es la
letra de acceso rpido de visin deseada, o 4) presionando Alt y moviendo la rueda del ratn para arriba o abajo.
No se podr acceder a la vista de documentacin si el objeto no se puede compilar completamente en ese
momento.
Puesto que un proyecto puede consistir en muchos objetos, desarrollar un proyecto puede ser costoso a menos
que se puedan ver el objeto en el que se est trabajando y el objeto sobre el que se est interactuando.
El panel del editor ofrece ayuda permitiendo que cada editor pueda ser arrastrado y desplegado en distintas
localizaciones. Por ejemplo, una vez que los objetos estn abiertos, se puede utilizar el botn izquierdo del ratn
para seleccionar y para arrastrar la pestaa de un objeto hacia la mitad inferior del panel del editor y dejarlo all.
2-5
www.microcontroladores.com
info@microcontroladores.com
2-6
www.microcontroladores.com
info@microcontroladores.com
2-7
www.microcontroladores.com
info@microcontroladores.com
Men archivo
New
Open...
Crea una nueva pestaa que contiene un editor vaci. Las pestaas existentes no
se ven afectadas.
Abre un archivo en un nuevo editor.
Open From...
Save
Save As...
Save To...
Save All
Close
Close All
nombre.
Archive
Proyect...
Recoge todos los objetos y ficheros de datos para el proyecto mostrado en Object
View y los almacena en un archivo comprimido (zip) junto con un fichero "readme"
que contiene la informacin del archivo y de la estructura.
Hide/Show Explorer
Print Preview...
Print...
<recent files>
El rea del men entre Print... y Exit muestra hasta un mximo de diez archivos
mas recientemente accedidos. Solo hay que seleccionar uno de estos archivos
para abrirlo.
Exit
2-8
www.microcontroladores.com
info@microcontroladores.com
Men Edit
Undo
Redo
Cut
Copy
Paste
Select All
Find/Replace...
Find Next
Replace
Go To Bookmark
Text Bigger
Text Smaller
Preferences...
Abre la ventana de preferencias. Los usuarios pueden modificar los ajustes para
requisitos particulares dentro de la herramienta Propeller usando esta
caracterstica.
Run Menu
Compile Current
Visin Info...
Update Status
2-9
www.microcontroladores.com
info@microcontroladores.com
Load EEPROM
Compile Top
Este men es igual que Compile Current, excepto que la compilacin comienza del
archivo designado como el "fichero objeto superior" (Top Object File.)
View Info...
Update Status
Load RAM + Run
Load EEPROM + Run
Load EEPROM
Identify Hardware...
Help Menu
Propeller Tool...
Spin Languaje...
Assembly Lenguaje...
Example Projects...
Muestra la ayuda on-line que contiene proyectos del Propeller del ejemplo.
Abre el software del email por defecto de la computadora y abre un nuevo mensaje
dirigido al soporte Parallax.
About...
2-10
www.microcontroladores.com
info@microcontroladores.com
Dilogo Find/Replace
Este dilogo se usa para buscar o reemplazar texto en el editor de la pestaa actual.
2-11
www.microcontroladores.com
info@microcontroladores.com
Boton Replace
Este botn se muestra activo nicamente si se ha introducido una secuencia de caracteres en el campo Replace y
permite sustituir en contenido del ese por la secuencia del campo Find en el caso de que exista una coincidencia
en el texto. Para sustituir se pueden utilizar tanto el botn Replace como la tecla F4.
Despus de realizar una sustitucin es necesario pulsar el botn Find Next o F3 para poder realizar de nuevo un
Replace. Si se mantiene presionada la tecla control (Ctrl) el botn Replace cambia a Find/Replace, que realiza las
dos acciones, bsqueda y sustitucin, a la vez. Para esto tambin se puede utilizar la combinacin Ctrl+F4.
Boton Replace All
Este botn se muestra activo nicamente si se ha introducido una secuencia de caracteres en el campo Replace y
permite sustituir todas las coincidencias encontradas en el texto. Al pulsar este botn, el dialogo se cierra y se
muestra otro dialogo con el numero de ocurrencias encontradas y sustituidas.
Boton Close
Cierra el dilogo de Find/Replace.
Vista de Objetos (Object View)
El visor de objetos muestra una vista jerrquica del proyecto que se ms recientemente compil de forma
satisfactoria. Hay dos vistas de objetos en la herramienta Propeller: 1) la vista de objetos en la parte superior del
explorador integrado en la ventana de la aplicacin principal y la vista de informacin de objetos en la parte
superior izquierda del formulario del Object Info (se detalla mas adelante). Ambas vistas de objetos funcionan de
una manera similar. La vista de objetos proporciona un feedback visual de la estructura de ltima compilacin
realizada con xito as como la informacin para cada objeto dentro del proyecto compilado.
Figure 2-8: Ejemplo del visor de Objetos mostrando la estructura de la compilacin del Producto ABC
En la Figura 2-8 arriba, la vista del objeto indica la estructura de la aplicacin de producto ABC. En este ejemplo,
el objeto del producto ABC es el fichero objeto superior.
Los nombres de objeto que se muestran son los nombres reales de los archivos sin la extensin. El nombre
incluye su extensin solamente si es un archivo de datos y este nombre se mostrara en cursiva. Los iconos a la
izquierda de cada nombre de objeto indican la carpeta en la cual reside el objeto. A continuacin se muestran las
cuatro posibilidades:
(amarilla): El objeto est dentro de la carpeta del trabajo
(azul): El objeto est dentro de la carpeta de la biblioteca
(rayada): El objeto est en la carpeta del trabajo pero hay otro objeto con el mismo nombre que
tambin se est utilizando de la carpeta de la biblioteca
(hueca): El objeto no est en ninguna carpeta porque nunca no se ha salvado.
Carpeta de trabajo
La carpeta del trabajo (amarilla) es la carpeta donde existe el fichero objeto superior. Cada proyecto tiene una, y
solamente una, carpeta del trabajo.
2-12
www.microcontroladores.com
info@microcontroladores.com
Carpeta Librera
La carpeta de librera (azul) es donde existen los objetos de librera de la herramienta Propeller, por ejemplo las
que vinieron con el software de la herramienta Propeller. La carpeta librera es la carpeta por la que siempre
comienza el ejecutable de la herramienta Propeller, y de cada objeto (archivo con extensin .spin) dentro de ella
se considera ser un objeto de la librera.
Carpeta rayada
Los objetos rayados de indican que existe un conflicto de nombres entre objetos del mismo nombre que existen
tanto en la carpeta del trabajo y como en la carpeta librera.
Este objeto de mismo nombre puede ser: 1) una copia exacta del mismo objeto, 2) dos versiones del mismo
objeto, o 3) dos objetos totalmente diversos que han coincidido en tener el mismo nombre. Independientemente de
la situacin, se recomienda resolver este problema potencial cuanto antes puesto que puede conducir a futuros
problemas, como por ejemplo no poder utilizar las caractersticas de archivo.
Carpeta Hueca
Los objetos huecos indican que el objeto fue creado en el editor y nunca ha sido guardado en ninguna carpeta ni
disco. Esta situacin, como la mencionada antes, no es un problema inmediato pero puede conducir a problemas
futuros si no se trata pronto.
Para obtener informacin adicional de los objetos se puede usar el ratn para seleccionar un objeto. Si clickamos
sobre un objeto de la Vista de Objetos, este, se abre en el panel del editor. El botn izquierdo abre ese objeto en
la vista de fuente completa, el botn derecho abre la vista de documentacin y el doble click abre el objeto y todos
sus sub-objetos en la vista de fuente completa.
Pasando el ratn sobre un objeto en la vista de objetos muestra una etiqueta con la informacin adicional para ese
objeto.
La Figura 2-9a muestra la etiqueta para el objeto del producto ABC. Esta etiqueta indica que 1) el objeto del
producto del ABC es el fichero objeto superior del proyecto, 2) reside en la carpeta del trabajo, y 3) su path y
nombre del archivo son: C:\Source\ABC Product.spin. De esta informacin se puede tambin deducir que la
carpeta del trabajo para este proyecto es:
C:\Source
2-13
www.microcontroladores.com
info@microcontroladores.com
Object Info
La ventana del objeto Info muestra los detalles sobre el proyecto que se acaba de compilar con xito usando la
funcin Current/TopView Info
Figura 2-10: La ventana del Objet Info muestra los detalles sobre "la
compilacin del proyecto del producto ABC".
Al clickar en un objeto dentro de la vista del Objet Info actualiza el display del Objet Info con la informacin
que pertenece a ese objeto
Doble-click en un objeto dentro de la vista del Objet Info abre ese objeto en el panel del editor
Los ficheros de datos no son seleccionables en la vista del Objet Info.
2-14
www.microcontroladores.com
info@microcontroladores.com
Vista Hex
El botn Show/Hide de la ventana del Object Info, muestra u oculta la vista detallada de hexadecimal del objeto.
Como se ve en el cuadro 2-11 de la pgina siguiente. La vista hexadecimal muestra los datos compilados reales
del objeto, en hexadecimal, que se cargan en el RAM/EEPROM del Propeller.
2-15
www.microcontroladores.com
info@microcontroladores.com
2-16
www.microcontroladores.com
info@microcontroladores.com
Orden Simblica
La orden simblica muestra los caracteres
dispuestos categricamente. Esto es til para
encontrar los caracteres especiales en la
fuente Parallax para representar lneas,
flechas, y diagramas esquemticos. Figura 214
La visin de la fuente completa muestra cada lnea del cdigo fuente del objeto y es la nica visin que es
que es editable.
La visin condensada, oculta las lneas que contienen comentarios del cdigo as como las lneas
contiguas que estn en blanco; mostrando nicamente el cdigo compilable.
La visin resumen muestra solamente las lneas de ttulo del bloque (CON, VAR, OBJ, PUB, PRI, y DAT);
una manera fcil para ver la estructura del objeto entero en un vistazo.
La visin de documentacin muestra la documentacin del objeto generada por el copilador que se genera
con los comentarios del cdigo de fuente.
Cambiando a otra visin se puede localizar la rutina o la regin del cdigo deseada.
2-17
www.microcontroladores.com
info@microcontroladores.com
2-18
www.microcontroladores.com
info@microcontroladores.com
Figura 2-16: Ejemplo del editor con los bookmarks habilitados y dos bookmarks fijados.
2-19
www.microcontroladores.com
info@microcontroladores.com
Nmeros de Lnea
Puede resultar fcil recordar una regin de cdigo por su nmero de lnea. En cualquier momento, se pueden
habilitar o deshabilitar los nmeros de lnea del editor. Las lneas se numeran automticamente mientras se crean;
son slo un artculo visual y no se almacenan en el cdigo de fuente. Aunque los nmeros de lnea compartan
espacio con los bookmarks, son independientes el uno del otro y se pueden habilitar o deshabilitar
individualmente. Los nmeros de lnea pueden ser impresos, si se quiere.
Figura 2-17: Ejemplo de un editor con los bookmarks y los nmeros de lnea habilitados
Modos Edit
Hay tres modos proporcionados por el panel del editor: 1) insertar (defecto), 2) alinear (disponible para el cdigo
de la vuelta solamente), y 3) sobrescribir.
Se puede cambiar entre cada modo usando la tecla Insert. El modo actual se observa en la forma del cursor y en
el tercer panel de la barra de estado.
Figura 2-18: Modos Edit
Modo Insertar.
Modo Alinear.
Modo Sobrescribir.
2-20
www.microcontroladores.com
info@microcontroladores.com
2-21
www.microcontroladores.com
info@microcontroladores.com
2-22
www.microcontroladores.com
info@microcontroladores.com
2-23
www.microcontroladores.com
info@microcontroladores.com
Usando el tabulador, este cdigo se habra podido introducir rpidamente con la secuencia siguiente en el teclado:
Observe que la tecla Enter alinea automticamente el cursor con el nivel de la sangra actual; esto significa que el
tabulador solo necesita pulsarse una vez para tabular al nivel siguiente. Si hay caracteres a la derecha del cursor
cuando se presiona el tabulador, se desplazan tambin a la derecha, como en la Figura 2-25.
Figura 2-25: Indenting
Si el cursor est justo a la izquierda del primer carcter en una lnea, tanto las teclas Shift + Tab como la tecla de
Backspace hacen que el cursor y el se desplacen a la izquierda a la posicin del tabulador anterior; es decir:
outdenting. Sin embargo, si el cursor no est justo a la izquierda del primer carcter en una lnea, la tecla
Backspace acta normal (suprimiendo el carcter anterior) y las teclas Shift + Tab mueven solamente el cursor a
la posicin del tabulador anterior.
Figura 2-26: Outdenting
Lneas Mltiples
Adems de afectar lneas independientes, en las lneas mltiples del cdigo se puede realizar indenting o
outdenting sobre las posiciones de tabulacin fijas.
Supongamos que se desea coger las primeras cuatro lneas de este ejemplo y encapsularlas en un bucle de
Repeat 31; para repetir esas lneas 31 veces.
Habra que seguir los pasos siguientes: 1) incorpora la lnea de la "repeat 31" sobre las lneas existentes, 2) con el
ratn, seleccionar las cuatro lneas, y 3) pulsar el tabulador.
Estos pasos se ilustran en la Figura 2-28.
2-24
www.microcontroladores.com
info@microcontroladores.com
2-25
www.microcontroladores.com
info@microcontroladores.com
Hay que observar que slo el cdigo compilable que est dentro de un bloque condicional o un bloque finito se
realza con los indicadores de la sangra. Esto es simplemente una ayuda visual para ver cmo el cdigo ser
ejecutado; no afecta al cdigo ni al archivo de fuente fsicamente; solamente los niveles reales de sangra.
2.9 TECLAS DE ACCESO RPIDO
Listados Categricos
En la tabla 2-1, las teclas de acceso rpido se agrupan por funciones relacionadas. En la tabla 2-2, las teclas de
acceso rpido son agrupadas por tecla ms que por la funcin.
Tabla 2-1: Teclas de acceso rpido Listado Categrico
Funcin
Teclas
Abrir
Ctrl + O
Cerrar
Alt + Q
Guardar
Ctrl + S
Guardar todo
Ctrl + Alt + S
Imprimir
Ctrl + P
Mostrar/Ocultar Bookmarks
Ctrl + B
Mostrar/Ocultar Bookmarks de la lnea actual
Ctrl + Shift + B
Indicadores de la sangra de bloque
Ctrl + I
Mostrar/Ocultar el explotador
Ctrl + E
Mostrar/Ocultar Numero de Linea
Ctrl + N
Incrementar tamao fuente
Ctrl + Arriba -o- Ctrl +Rueda ratn arriba
Decrementar tamao fuente
Ctrl + Abajo-o- Ctrl +Rueda ratn abajo
Seleccionar el modo de visin Fuente Alt + S
completa
Seleccionar el modo de visin Condensado
Alt + C
Seleccionar el modo de visin Resumen
Alt + U
Seleccionar el modo de visin Documentacin Alt + D
Seleccionar modo de visin alterna
Alt + Arriba
Seleccionar modo de visin alterna
Alt + Abajo -o- Alt + Rueda ratn abajo
Seleccionar la edicin activa
Esc
Hardware
F7
Compilar fichero actual y ver informacin
F8
Compilar fichero actual y actualizar el estado
F9
Compilar fichero actual , Cargar RAM y F10
ejecutar
Compilar fichero actual, Cargar EEPROM y F11
ejecutar
2-26
F12
Ctrl + F8
Ctrl + F9
Ctrl + F10
Ctrl + F11
Ctrl + F12
Alt + Drcha-o- Ctrl + Tab
Alt + Izda -o- Ctrl + Sift + Tab
Re Pag
Av Pag
Ctrl + Drcha
Ctrl + Izda
Inicio
Fin
Ctrl + Re Pg
Ctrl + Av Pg
Ctrl + Inicio
Ctrl + Fin
Doble Click
Triple Click
Ctrl + Shift + Drcha
Ctrl + Shift + Izda
Shift + Inicio
Shift + Fin
Ctrl + Shift + Re Pg
Ctrl + Shift + Av Pg
Shift + Re Pg
Shift + Av Pg
Ctrl + Shift + Inicio
Ctrl + Shift + Fin
Ctrl + Z
Ctrl + Shift + Z
Ctrl + A
Ctrl + C
Ctrl + X
Ctrl + V
Ctrl + F
F3
F4
Ctrl + F4
Insert
Ctrl + Insert
Tab
Shift + Tab
Ctrl + Y
Ctrl + Shift + Y
F2
Ctrl + Alt + 1
2-27
www.microcontroladores.com
info@microcontroladores.com
www.microcontroladores.com
info@microcontroladores.com
Ctrl + Shift + 1
Ctrl + Shift + 2
Ctrl + Shift + 3
Ctrl + Shift + .
Ctrl + Alt + .
Ctrl + Shift + Alt + <
Ctrl + Shift + Alt + >
Ctrl + Shift + Alt + Izda
Ctrl + Shift + Alt + Drcha
Ctrl + Shift + Alt + Arriba
Ctrl + Shift + Alt + Abajo
Ctrl + Shift + $
Ctrl + Alt + $
Ctrl + Shift + Alt + $
Ctrl + Alt + Izda
Ctrl + Alt + Drcha
Ctrl + Alt + Arriba
Ctrl + Alt + Abajo
Ctrl + Shift + %
Ctrl + Shift + Ctrl + Shift + *
Ctrl + Shift + /
Ctrl + Shift + R
Ctrl + Shift + I
Ctrl + Shift + D
Ctrl + Shift + M
Ctrl + Shift + O
Ctrl + Shift + P
Ctrl + Shift + S
Funcin
Renombrar carpeta/fichero
Buscar siguiente ; Find Next
Reemplazar ; Replace
Identificar Hardware
Compilar fichero actual y ver informacin
Compilar fichero actual y actualizar el estado
Compilar fichero actual , Cargar RAM y ejecutar
Compilar fichero actual, Cargar EEPROM y ejecutar
Compilar fichero actual y Cargar EEPROM solo
Saltar al final de lnea
Seleccionar la vista de fuente completa
Saltar al comienzo de lnea
Cambiar el modo de edicin
Saltar a la siguiente pagina
Saltar a la pagina anterior
Tabular
Seleccionar una palabra
Seleccionar una lnea
Seleccionar todo
Mostrar/Ocultar Bookmarks
Copiar
2-28
www.microcontroladores.com
info@microcontroladores.com
Mostrar/Ocultar el explotador
Buscar/ Remplazar ; Find / Replace
Indicadores de la sangra de bloque
Mostrar/Ocultar Numero de Lnea
Abrir
Guardar
Imprimir
Seleccionar el fichero raz
Pegar
Cortar
Borrar lnea actual
Deshacer
Reemplazar y Buscar siguiente
Compilar fichero raz y ver informacin
Compilar fichero raz y actualizar el estado
Compilar fichero raz, Cargar RAM y ejecutar
Compilar fichero raz, Cargar EEPROM y ejecutar
Compilar fichero raz y Cargar EEPROM solo
Decrementar el tamao de fuente
Saltar al final del archivo
Saltar al comienzo de archivo
Cambiar el modo de edicin entre Insert / Align
Saltar hasta el comienzo de la siguiente palabra
Saltar hasta fin de pgina
Decrementar el tamao de fuente
Incrementar el tamao de fuente
Seleccionar el modo de visin Condensado
Seleccionar el modo de visin Documentacin
Seleccionar el modo de visin Fuente completa
Cerrar
Seleccionar el modo de visin Resumen
Seleccionar el modo de visin alternos
Seleccionar la pestaa del editor anterior
Seleccionar el modo de visin alternos (desde
Documentacin)
Seleccionar el modo de visin alternos (desde fuente
completa)
Seleccionar la siquiente pestaa del editor
Seleccionar el modo de visin alternos (desde fuente
completa)
Seleccionar hasta fin de lnea
Seleccionar hasta principio de lnea
Seleccionar hasta la siguiente pagina
Seleccionar hasta la pagina anterior
Borrar espacios hasta la tabulacin anterior
Insertar un carcter de rectngulo ( )
Insertar un carcter Yen ( )
Insertar el carcter superndice de manos uno ()
Guardar todo
Insertar carcter de flecha hacia abajo ( )
Insertar carcter de flecha hacia la izda ( )
Insertar carcter de flecha hacia la drcha ( )
2-29
www.microcontroladores.com
info@microcontroladores.com
2-30
()
()
()
()
()
()
()
www.microcontroladores.com
info@microcontroladores.com
CAPITULO 3:
EL LENGUAJE SPIN
3.1. INTRODUCCIN
Este captulo describe los elementos del lenguaje Spin del Propeller y se divide en dos secciones principales:
1) El listado por categoras de todos los elementos del lenguaje Spin del Propeller. Todos ellos, incluyendo
operadores y smbolos de la sintaxis, estn agrupados por la funcin relacionada. Esto es una manera de
localizar rpidamente la amplitud del lenguaje y qu caractersticas estn disponibles para las aplicaciones
especficas. Algunos de los elementos mencionados estn marcados con un exponente a que indica que
estn tambin disponibles en ensamblador del Propeller, aunque la sintaxis puede variar.
2) La descripcin de los elementos del lenguaje Spin. La mayora de los elementos tienen su propia subdivisin,
dispuesta alfabticamente para facilitar su bsqueda. Los elementos individuales sin subdivisin, tales como
operadores, smbolos y algunas constantes, se agrupan dentro de otras subdivisiones relacionadas.
3.2. LISTADO POR CATEGORAS DEL LENGUAJE SPIN DEL PROPELLER
Los elementos marcados con un subndice a estn tambin disponibles en ensamblador del Propeller.
Declaraciones de Bloque
CON
VAR
OBJ
PUB
PRI
DAT
Declaracin de constantes
Declaracin de variables
Declaracin de referencias de objetos
Declaracin de mtodos pblicos
Declaracin de mtodos privados
Declaracin de datos
Configuracin
CHIPVER
CLKMODE
_CLKMODEa
CLKFREQ
_CLKFREQa
CLKSETa
_XINFREQa
_STACKa
_FREEa
RCFASTa
RCSLOWa
XINPUTa
XTAL1a
XTAL2a
XTAL3a
PLL1Xa
PLL2Xa
PLL4Xa
PLL8Xa
PLL16X
3-1
www.microcontroladores.com
info@microcontroladores.com
Control de Cog
COGIDa
COGNEW
COGINITa
COGSTOPa
REBOOT
Control de Proceso
LOCKNEWa
LOCKRETa
LOCKCLRa
LOCKSETa
WAITCNTa
WAITPEQa
WAITPNEa
WAITVIDa
Control de Flujo
IF
ELSEIF
ELSE
CASE
OTHER
REPEAT
FROM
TO
STEP
UNTIL
WHILE
NEXT
QUIT
RETURN
ABORT
Memoria
BYTE
WORD
LONG
BYTEFILL
WORDFILL
LONGFILL
BYTEMOVE
WORDMOVE
LONGMOVE
LOOKUP
LOOKUPZ
LOOKDOWN
LOOKDOWNZ
STRSIZE
STRCOMP
3-2
www.microcontroladores.com
info@microcontroladores.com
Directivas
STRING
Declaracin de expresiones de tipo string
CONSTANT
Declaracin de expresiones de tipo constante
FLOAT Declaracin de expresiones de punto flotante
ROUND
Redondea en tiempo de compilacin FLOATs a integer
TRUNC Trunca en tiempo de compilacin FLOATs s decimal
FILE
Importa datos de un fichero externo
Registros
DIRAa
Registro de Direcciones de 32-bits del puerto A
DIRBa
Registro de Direcciones de 32-bits del puerto B (uso futuro)
INAa
Registro de Entrada de 32-bits del puerto A
INBa
Registro de Entrada de 32-bits del puerto B (uso futuro)
OUTAa Registro de Salida de 32-bits del puerto A
OUTBa Registro de Salida de 32-bits del puerto B (uso futuro)
CNTa
Registro de Contador del Sistema de 32-bits
CTRAa
Contador A del Registro de Control
CTRBa
Contador B del Registro de Control
FRQAa
Contador A del Registro de Frecuencia
FRQBa
Contador B del Registro de Frecuencia
PHSAa
Contador A del Registro de PLL
PHSBa
Contador B del Registro de PLL
VCFGa
Registro de Configuracin de Video
VSCLa
Registro de Escala de Video
PARa
Registro de Parmetros de Arranque del Cog
SPR
Array de Registros de Propsito especial; acceso indirecto de registros cog
Constantes
TRUEa
True (verdadero) lgico: -1 ($FFFFFFFF)
FALSEa
False (falso) lgico: 0 ($00000000)
POSXa
Valor entero mximo positivo: 2,147,483,647 ($7FFFFFFF)
NEGXa Valor entero mximo negativo: -2,147,483,648 ($80000000)
PIa
Valor de punto flotante PI: ~3.141593 ($40490FDB)
Variables
RESULT
Operadores Unitarios
+
-++
^^
||
~
~~
?
|<
>|
!
3-3
www.microcontroladores.com
info@microcontroladores.com
Boleado: NOT
Direccin de smbolo
Valor de smbolo y direccin de Objeto
Operadores Binarios
=
:=
+
*
**
/
//
#>
<#
~>
<<
>>
<->
><
&
|
^
AND
OR
==
<>
<
>
=<
=>
--y---y---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o---o--
=
:=
+=
-=
*=
**=
/=
//=
#>=
<#=
~>=
<<=
>>=
<-=
->=
><=
&=
|=
^=
AND=
OR=
===
<>=
<=
>=
=<=
=>=
Sintaxis de Smbolos
#
.
..
:
|
\
,
()
[]
{}
{{ }}
3-4
www.microcontroladores.com
info@microcontroladores.com
nmero decimal.
nmero decimal con separadores en los millares.
nmero binario.
nmero binario con separadores en los bytes.
nmero del hexadecimal.
nmero hexadecimal con separadores en las words.
Carcter.
Definiciones De Sintaxis
Adems de descripciones detalladas, las siguientes pginas contienen las definiciones sintcticas para los
elementos que describen las opciones de ese elemento. Las definiciones sintcticas utilizan smbolos especiales
para indicar cuando y cmo deben ser utilizadas ciertas caractersticas del elemento.
BOLDCAPS
Bold Italics
Los tem en negrita y cursiva deben ser sustituidos por el texto del usuario; smbolos,
operadores, expresiones, etc..
. ... : , #
Los puntos, los doble-puntos, los dos puntos, las comas, la almohadilla,
raya vertical, la barra, los corchetes y parntesis deben ser
mecanografiados de esta manera.
<>
Los corchetes angulosos contienen tem opcionales.
(( | ))
...
| \ [] ()
la
El smbolo de dobles parntesis incluye los tem mutuo-exclusivos, separados por una barra.
El smbolo de la repeticin indica que el tem anterior, o el grupo de tem, se puede repetir las
numerosas veces.
El smbolo de nueva lnea y de la tabulacin indica que los puntos siguientes deben aparecer
en la lnea siguiente y tabulados por lo menos un espacio.
El smbolo de la tabulacin indica que los puntos siguientes se deben tabular por lo menos un
espacio.
3-5
Lnea doble:
www.microcontroladores.com
info@microcontroladores.com
3.3.1. ABORT
Salida del mtodo de PUB/PRI usando estado Abort con valor de retorno opcional.
ABORT <Value>
Devuelve: El valor del RESULTADO actual, o Value si proporciona.
Value es una expresin opcional cuyo valor debe ser devuelto, con estado de la interrupcin, del mtodo
PUB o PRI.
Explicacin
ABORT es uno de dos comandos (ABORT y RETURN) que terminan la ejecucin de un mtodo PUB o PRI.
ABORT causa el retorno de un mtodo de PUB o PRI con estado Abort; esto significa que hace pop sobre la pila
de llamadas (Call Stack) en varias ocasiones hasta que la pila de llamadas queda vaca o se encuentra un
llamador con un Abort Trap (\), y entrega un valor en el proceso.
ABORT es til para los casos donde un mtodo necesita terminar e indicar un estado anormal o elevado al
llamador inmediato o a sus llamadores anteriores.
Cuando el ABORT aparece sin el valor opcional, devuelve el valor actual de la variable incorporada del RESULT
de PUB/PRI. Si el campo de valor fue incorporado, PUB o PRI aborta y devuelve ese valor.
3-6
www.microcontroladores.com
info@microcontroladores.com
... donde < condicin mala > es la condicin que determina si el mtodo debe abortar y <valor> es un valor a
devolver al abortar.
El Abort Trap ( \ )
Para capturar un ABORT, la llamada al mtodo o cadena de mtodos que podran abortar potencialmente se
deben preceder con el smbolo del Abort Trap (/) por ejemplo,
if \MayAbort
abort <value>
El tipo de salida que esta usando MayAbort , ABORT o RETURN, no puede conocer el abort trap; por lo que el
cdigo debe ser escrito de tal manera que se pueda detectar qu tipo fue utilizado. Algunas posibilidades son:
1) el cdigo puede ser diseado para que un mtodo de alto nivel sea el nico lugar que capture una interrupcin y
otros procesos de cdigo de nivel medio
2) los mtodos abortables puede devolver un valor especial que no pueda darse en ninguna circunstancia
normal, o
3) se puede fijar un flan global por el mtodo abort antes de abortar.
Lo siguiente es un ejemplo de una aplicacin de robot en la que el robot debe huir de un objeto usando sus cuatro
sensores. ( izquierda, derecha, delante y detrs). Se asume que CheckSensors, Beep, y MotorStuck son mtodos
definidos en otra parte.
CON
#0, None, Left, Right, Front, Back
Enumeracion de Direcciones
PUB Move(Direction)
result := True
if Direction == None
return
repeat 1000
DriveMotors(Direction)
PUB DriveMotors(Direction)
<code to drive motors>
if MotorStuck
abort False
<more code>
3-7
www.microcontroladores.com
info@microcontroladores.com
El ejemplo anterior muestra tres mtodos de varios niveles lgicos, Main ("de alto nivel"), Move ("nivel medio") y
DriveMotors ("bajo nivel"). El mtodo de alto nivel, Main, es el que toma las decisiones de la aplicacin ;
decidiendo cmo responder a los acontecimientos como activaciones del sensor y movimientos del motor. El
mtodo de nivel medio, Move, es responsable de mover el robot una distancia corta. El mtodo de bajo nivel,
DriveMotors, maneja los detalles de conducir los motores correctamente y de verificar que es correcto.
En una aplicacin como esta, los acontecimientos crticos podran ocurrir en el cdigo de bajo nivel que
necesitaran ser tratados por cdigo de alto nivel.
El mtodo principal recoge entradas del sensor y decide a qu direccin mover el robot con la declaracin de
CASE. Entonces llama a Move de una manera especial, precedindola con \. El mtodo Move fija su RESULT a
verdadero y despus llama a DriveMotors en un bucle finito. Si termina con xito, Move devuelve verdadero. El
mtodo de DriveMotors maneja la complicacin de mover los motores del robot para alcanzar la direccin
deseada, pero si determina estn boqueados y no puede moverlos; aborta con un valor falso. Si no retorna
normalmente.
3.3.2. BYTE
Declaracin de smbolos o datos tamao-byte, o lectura / escritura de bytes en memoria principal.
BYTE Symbol <[Count]>
BYTE Data
BYTE [BaseAddress] <[Offset]>
Explicacin
El BYTE es una de las tres declaraciones de propsito mltiple (BYTE, WORD, y LONG) que declaran o operan en
memoria. El BYTE se puede utilizar para:
1) declarar un smbolo de tamao byte o un array de elementos de tamao byte en un bloque del VAR, o
2) declarar datos de alineacin byte, y de tamao byte, en un bloque de DAT, o
3) leer o escribir un byte en memoria principal en una direccin base con un ajuste opcional.
Declaracin Variable del Byte (Sintaxis 1)
En bloques del VAR, la sintaxis 1 del BYTE se utiliza para declarar las variables globales, simblicas de tamao
byte, o es cualquier array de bytes. Por ejemplo:
VAR
byte Temp
byte Str[25]
'Temp es un byte
'Str es un array de byte
El ejemplo anterior declara dos variables, Temp y Str. Temp es simplemente una variable de tamao byte. La
lnea siguiente utiliza el campo de Count opcional para crear un array de 25 elementos variables llamado Str.
Temp y str se pueden alcanzar desde cualquier mtodo PUB o PRI dentro del mismo objeto que este bloque del
VAR. Un ejemplo:
PUB SomeMethod
3-8
www.microcontroladores.com
info@microcontroladores.com
byte
byte
64, $AA, 55
"Hello",0
El ejemplo anterior declara dos smbolos de datos, MyData y MyString. Cada smbolo de datos seala el comienzo
de datos en memoria principal. Los valores de MyData, en memoria principal, son 64, $AA y 55, respectivamente.
Los valores de MyString, en memoria principal, son "H", "e", "l", "l", "o", y 0, respectivamente. Estos datos se
compilan en el objeto y en la aplicacin resultante como parte de la seccin ejecutable de cdigo y se pueden
alcanzar usando la forma de lectura / escritura, sintaxis 3, del BYTE (ver abajo).
Lectura / escritura de Bytes en memoria principal (Sintaxis 3)
En bloques PUB y PRI, la sintaxis 3 del BYTE se utiliza para leer o para escribir valores byte en memoria principal.
Si se asume que el objeto contiene el bloque DAT del ejemplo de arriba, se poda utilizar el siguiente ejemplo para
tener acceso a esos datos.
La primera lnea del mtodo GetData, arriba, utiliza la declaracin del BYTE para leer un byte de memoria principal
en localizacin MyData y lo almacena en Temp, en este caso, el valor 64. A continuacin en el bucle de REPEAT,
la declaracin del BYTE lee un byte de memoria principal en localizacin MyString + el ndice Index y lo almacena
en Temp. Puesto que Index se fija a 0, el primer byte de MyString se lee, "H". Esa misma lnea tiene un
postincremento de Index con ++, por lo que la siguiente vuelta del bucle lee el siguiente byte, MyString + 1 (la "e"),
y la prxima vez MyString + 2 (el "l"), etc.
Usando una sintaxis similar, los bytes de memoria principal se pueden escribir tambin, mientras sean
localizaciones RAM. Por ejemplo:
BYTE[MyString][0] := "M"
Esta lnea escribe el carcter "M" al primer byte de datos de la secuencia en MyString, cambiando la secuencia
para ser "Mello", 0.
3-9
www.microcontroladores.com
info@microcontroladores.com
3.3.3. BYTEFILL
Rellena la memoria principal con un valor.
BYTEFILL (StartAddress, Value, Count )
StartAddress es una expresin que indica la localizacin del primer byte en memoria a llenar del valor Value.
Value es una expresin que indica el valor de los bytes con los que se quiere rellenar.
Count es una expresin que indica el nmero de bytes a rellenar, comenzando con StartAddress.
Explicacin
BYTEFILL es uno de tres comandos (BYTEFILL, WORDFILL, y LONGFILL) usados para llenar bloques de
memoria principal de un valor especfico. BYTEFILL rellena Count bytes de memoria principal con valor,
comenzando en la localizacin StartAddress.
Uso de BYTEFILL
BYTEFILL es una gran manera de inicializar grandes bloques de la memoria. Por ejemplo:
VAR
byte Buff[100]
PUB Main
bytefill(@Buff, 0, 100)
Inicializar Buff a 0
La primera lnea del mtodo principal, arriba, fija el array entero Buff de 100-bytes a ceros. BYTEFILL es ms
rpido en esta tarea que es un bucle dedicado de la REPEAT.
3.3.4. BYTEMOVE
Copia bytes de una regin a otra en memoria principal.
BYTEMOVE (DestAddress, SrcAddress, Count )
DestAddress es una expresin que especifica la localizacin destino en memoria principal para copiar el
primer byte.
SrcAddress es una expresin que especifica la localizacin en memoria principal del primer byte fuente para
copiar.
Count es una expresin que indica el nmero de bytes fuente para copiar al destino.
Explicacin
BYTEMOVE es uno de tres comandos (BYTEMOVE, WORDMOVE, y LONGMOVE) usados para copiar bloques
de memoria principal a partir de una rea a otra. BYTEMOVE copia Count Bytes de memoria principal que
empiezan con SrcAddress a la memoria principal que comienza en DestAddress.
Uso de BYTEMOVE
BYTEMOVE es una gran manera de copiar grandes bloques de memoria byte. Por ejemplo:
VAR
byte Buff1[100]
byte Buff2[100]
PUB Main
bytemove(@Buff2, @Buff1, 100)
La primera lnea del mtodo principal, arriba, copia el array entero de 100-byte Buff1 al array Buff2. BYTEMOVE
es ms rpido en esta tarea que es un bucle dedicado de REPEAT.
3-10
www.microcontroladores.com
info@microcontroladores.com
3.3.5. CASE
Compara una expresin emparejndola con otras expresiones y ejecuta el bloque de cdigo en el que la expresin
resulte verdadera.
CASE CaseExpression
MatchExpression :
Statement(s)
< MatchExpression :
Statement(s) >
< OTHER :
Statement(s) >
Explicacin
CASE es uno de los dos comandos condicionales principales (IF y CASE) que ejecuta un bloque de cdigo
condicional. CASE es la estructura preferida a utilizar, en comparacin con IF..ELSEIF..ELSE, cuando se necesita
comparar la igualdad de CaseExpression a un nmero de distintos valores.
CASE compara CaseExpression con los valores de cada MatchExpression, en orden, y si se encuentra una
igualdad, ejecuta el Statement(s) asociado. Si no se encuentra ninguna igualdad en los emparejamientos
anteriores, el Statement(s) asociado al comando opcional OTHER se ejecuta.
La Sangra es critica
IMPORTANTE: La sangra es crtica. El lenguaje Spin confa en la sangra (de un espacio o ms) en lneas que
siguen comandos condicionales para determinar si pertenecen a ese comando o no. Para que la herramienta
Propeller indique stos bloques de cdigo agrupados lgicamente en pantalla, se puede presionar Ctrl + I y
encender los indicadores de grupo . Presionando Ctrl + I otra vez esa caracterstica se desactivara.
Uso de CASE
CASE es muy prctico donde se necesita que se realice una de varias acciones dependiendo del valor de una
expresin. El siguiente ejemplo asume que A, X e Y son variables definidas anteriormente.
case X+Y
10
: !outa[0]
A*2
: !outa[1]
30..40 : !outa[2]
X += 5
Testea X+Y
X = 10? Activar P0
X = A*2? Activar P1
X en 30 a 40? Activar P2
Suma 5 a X
Puesto que las lneas de MatchExpression estn tabuladas de la lnea de CASE, pertenecen a la estructura del
CASE y se ejecutan basadas en los resultados de la comparacin de CaseExpression. La lnea siguiente, X + = 5,
no est tabulada de CASE, as que se ejecuta sin importar los resultados del CASE.
Este ejemplo compara el valor de X + Y con 10, A*2 y el rango 30 a 40. Si X + Y es igual a 10, se activa P0. Si X +
Y es igual a A*2, se activa P1. Si X + Y est en el rango 30 a 40, inclusivo, entonces P2 se activa. Si o no ningn
fsforo fue encontrado, X + = la lnea 5 se ejecuta despus.
3-11
www.microcontroladores.com
info@microcontroladores.com
Uso de OTHER
El componente opcional OTHER del CASE es similar al componente OTHER opcional de la estructura IF. Por
ejemplo:
case X+Y
10
: !outa[0]
25
: !outa[1]
20..30 : !outa[2]
OTHER : !outa[3]
X += 5
'Testea X+Y
'X = 10? Activar P0
'X = 25? Activar P1
'X en 20 a 30? Activar P2
Si no, Activar P3
Suma 5 a X
Este ejemplo es similar el anterior excepto que se el tercer MatchStatement comprueba el rango 20 a 30 y hay un
componente OTHER. Si X + Y no es igual a 10, ni 25, ni est en el rango 20 a 30, el bloque OTHER de
Statement(s) siguiente se ejecuta. Siguiendo eso, se ejecuta la lnea X + = 5.
Hay un concepto importante a observar sobre este ejemplo. Si X + Y es 10, se activa P0, o si X + Y es 25, se
activa P1, o si X + Y es 20 a 30, P2, etc. Esto es porque el MatchExpressions se comprueba uno por vez, en el
orden en el que se enumeran y solamente se ejecuta el cdigo de la primera expresin que se iguale esta. No se
comprueban el resto de expresiones. Esto significa que si hubiramos cambiado las lneas 25 y 20..30, para
comprobar el rango de 20..30 primero, habra un fallo en nuestro cdigo. Se hizo esto abajo:
case X+Y
10 : !outa[0]
20..30: !outa[2]
25 : !outa[1]
Testea X+Y
X = 10? Activar P0
X en 20 a 30? Activar P2
X = 25? Activar P1 <-- ESTE CODIGO NO SE EJECUTARA NUNCA
El ejemplo anterior contiene un error porque, mientras que X + Y podra ser igual a 25, esa expresin nunca sera
probada desde la anterior, porque se probara 20..30 primero, y puesto que es verdad, se ejecutara su bloque y
no se aria ninguna comprobacin posterior.
Variaciones en Statement(s)
Los ejemplos anteriores solo usan una lnea como bloque de Statement(s), pero cada bloque puede tener varias
lneas. Adems, el bloque de Statement(s) puede tambin aparecer abajo, y tabulado levemente
MatchExpression. Los dos ejemplos siguientes demuestran estas variaciones.
case A
4
Z+1
:
:
10..15:
!outa[0]
!outa[1]
!outa[2]
!outa[3]
case A
4:
!outa[0]
Z+1:
!outa[1]
!outa[2]
10..15:
!outa[3]
Testea A
A = 4? Activar P0
A = Z+1? Activar P1
Y Activar P2
A en 10 a 15? Activar P3
Testea A
A = 4?
Activar P0
A = Z+1?
Activar P1
Y Activar P2
A en 10 a 15?
Activar P3
3-12
www.microcontroladores.com
info@microcontroladores.com
3.3.6. CHIPVER
Recoge el nmero de versin del chip del Propeller.
CHIPVER
Devuelve: El numero de versin del chip Propeller.
Explicacin
El comando CHIPVER lee y devuelve el nmero de versin del chip Propeller. Por ejemplo:
V: = chipver
Este ejemplo asigna a V con nmero de versin del chip Propeller, 1 en este caso. Las futuras Aplicaciones del
Propeller pueden utilizarlo para determinar la versin y el tipo de chip del Propeller que estn ejecutando y para
hacer modificaciones a sus operaciones como sea necesario.
3.3.7. CLKFREQ
Recoge la frecuencia de reloj actual del sistema; la frecuencia en la cual cada Cog est ejecutndose.
CLKFREQ
Devuelve: Frecuencia de reloj actual del sistema, en el Hz.
Explicacin
El valor devuelto por CLKFREQ es la frecuencia de reloj actual del sistema segn lo determinado por el modo de
reloj actual (tipo del oscilador, aumento, y ajustes de PLL) y la frecuencia externa del pin XI, si la hay. Los objetos
usan CLKFREQ para determinar el retraso apropiado para operaciones muy sensibles al tiempo. Por ejemplo:
waitcnt(clkfreq / 10 + cnt)
Esta declaracin divide CLKFREQ por 10 y asigna el resultado a CNT (el valor actual del Contador del Sistema)
entonces espera (WAITCNT) hasta que el contador del sistema alcanza el valor del resultado. Puesto que
CLKFREQ es el nmero de ciclos por segundo, hay que dividir por 10 el nmero de los ciclos de reloj por 0.1
segundo, o 100 ms.
As, sin hacer caso del tiempo que toma para procesar la expresin, esta declaracin pausa la ejecucin de
programa del Cog en 100ms.
El valor que CLKFREQ devuelve puede cambiarse siempre que la aplicacin cambie el modo de reloj,
manualmente o a travs del comando CLKSET. Los objetos que son sensibles al tiempo deben comprobar
CLKFREQ en los puntos estratgicos para adecuarse a los nuevos ajustes automticamente.
CLKFREQ vs. _CLKFREQ
CLKFREQ est relacionado con _CLKFREQ, pero no son iguales. CLKFREQ es el comando que devuelve la
frecuencia de reloj actual del sistema mientras que _CLKFREQ es una constante definida por la aplicacin que
contiene la frecuencia de reloj del sistema en el arranque. Es decir CLKFREQ es la frecuencia de reloj actual y
_CLKFREQ es la frecuencia de reloj original; ambos pueden tener el mismo valor pero ciertamente pueden ser
diferentes.
3-13
www.microcontroladores.com
info@microcontroladores.com
3.3.8. _CLKFREQ
Constante predefinida, ajustable una sola vez para especificar la frecuencia de reloj del sistema.
CON
_CLKFREQ = Expression
Expression es una expresin del nmero entero que indica la frecuencia de reloj del sistema en el
arranque de la aplicacin.
Explicacin
_CLKFREQ especifica la frecuencia de reloj del sistema para el arranque. Es un smbolo constante predefinido
cuyo valor es determinado por el fichero objeto superior de una aplicacin.
_CLKFREQ se puede ajustar directamente por la misma aplicacin, o indirectamente como resultado de los
ajustes de _CLKMODE y _XINFREQ.
El fichero objeto superior en una aplicacin (donde empieza la compilacin) puede especificar un ajuste para
_CLKFREQ en su bloque CON. Esto define la frecuencia de reloj inicial del sistema para la aplicacin y es la
frecuencia a la cual el reloj del sistema cambiar tan pronto como la aplicacin arranque y la ejecucin comience.
La aplicacin puede especificar tanto _CLKFREQ como _XINFREQ en el bloque CON; son mutuamente
exclusivos y el no especificado se calcula y se fija automticamente como resultado de la otra especificacin.
Los siguientes ejemplos asumen que estn contenidos dentro del fichero objeto superior. Cualquier ajuste de
_CLKFREQ en objetos hijo son simplemente ignorados por el compilador.
Por ejemplo:
CON
_CLKMODE = XTAL1 + PLL8X
_CLKFREQ = 32_000_000
La primera declaracin en el bloque CON anterior, fija el modo de reloj para un cristal externo de poca velocidad y
un PLL del reloj mltiplo de 8. La segunda declaracin fija la frecuencia de reloj del sistema a 32 Mhz, que significa
que la frecuencia del cristal externo debe ser 4 Mhz, porque 4 Mhz * 8 = 32 Mhz. El valor de _XINFREQ se fija
automticamente a 4 Mhz debido a estas declaraciones.
CON
_CLKMODE = XTAL2
_CLKFREQ = 10_000_000
Estas dos declaraciones fijaron el modo de reloj para un cristal externo de velocidad media, ningn multiplicador
del reloj PLL, y una frecuencia de reloj del sistema de 10 Mhz. El valor de _XINFREQ se fija automticamente a 10
Mhz, tambin, debido a estas declaraciones.
_ CLKFREQ Vs CLKFREQ
_CLKFREQ est relacionado con CLKFREQ, pero no iguales. _CLKFREQ contiene la frecuencia de reloj del
sistema de la aplicacin en el arranque mientras que CLKFREQ es un comando que devuelve la frecuencia de
reloj actual del sistema. Es decir, _CLKFREQ es la frecuencia de reloj original del sistema y CLKFREQ es la
frecuencia de reloj actual del sistema; ambos pueden tener el mismo valor pero ciertamente pueden ser diferentes.
3-14
www.microcontroladores.com
info@microcontroladores.com
3.3.9. CLKMODE
Recoge el modo actual del reloj.
CLKMODE
Devuelve: Modo actual del reloj.
Explicacin
El ajuste del modo de reloj es un valor de tamao byte, fijado normalmente en tiempo en compilacin, que es una
combinacin de las constantes de RCxxxx, de XINPUT, de XTALx y de PLLxx. Por ejemplo:
Mode: = clkmode
Esta declaracin se puede utilizar para fijar una variable, Mode, al ajuste actual del modo de reloj. Muchas
aplicaciones mantienen un ajuste esttico del modo de reloj; sin embargo, algunas aplicaciones cambian el modo
de reloj y lo fijan durante el tiempo de ejecucin para ajustes de la velocidad de reloj, los modos de baja potencia,
el etc. Puede ser necesario que algunos objetos presten la atencin a los modos de reloj dinmicos para mantener
la sincronizacin y la funcionalidad apropiadas.
CLKMODE vs _CLKMODE
CLKMODE est relacionado con _CLKMODE, pero no son iguales. CLKMODE es un comando que devuelve el
modo de reloj actual mientras que _CLKMODE es una constante definida por la aplicacin que contiene el modo
de reloj solicitado por la aplicacin en el arranque. Es decir, CLKMODE es el modo de reloj actual y _CLKMODE
es el modo de reloj original; ambos pueden suceder tener el mismo valor pero ciertamente pueden ser diferentes.
3.3.10. _CLKMODE
Constante predefinida, ajustable una sola vez para especificar ajustes del modo de reloj a nivel de aplicacin.
CON
_CLKMODE = Expression
Expression es una expresin de nmero entero cuyo resultado es un valor 8-bit del modo reloj. ste ser
el modo de reloj en el arranque de la aplicacin.
Explicacin
_CLKMODE se utiliza para especificar la naturaleza deseada del reloj del sistema. Es un smbolo constante
predefinido cuyo valor es determinado por el fichero objeto superior de una aplicacin. El ajuste del modo de reloj
es un valor de tamao byte que es una combinacin de las constantes de RCxxxx, de XINPUT, de XTALx y de
PLLxx. La tabla 4-1 ilustra el modo de reloj que fija constantes.
3-15
www.microcontroladores.com
info@microcontroladores.com
3-16
www.microcontroladores.com
info@microcontroladores.com
Esto fija el modo de reloj para un cristal externo de poca velocidad pero con las hojas del reloj PLL inhabilitadas; el
reloj del sistema ser igual a la frecuencia del cristal externo.
Los ajustes de _CLKFREQ y _XINFREQ
Para la simplicidad, los ejemplos de arriba solamente muestran ajustes de _CLKMODE, pero se requieren tanto
ajustes de _CLKFREQ como de _XINFREQ para continuar, de modo que los objetos puedan determinar su
frecuencia de reloj actual del sistema. Lo siguiente es el segundo ejemplo con una frecuencia de cristal externa (_
XINFREQ) de 4 Mhz.
CON
_CLKMODE = XTAL1 + PLL8X
_XINFREQ = 4_000_000
Este ejemplo es exactamente igual al segundo ejemplo de arriba, pero _ XINFREQ indica que la frecuencia del
cristal externo es 4 Mhz. El chip Propeller utiliza este valor junto con el ajuste de _CLKMODE para determinar la
frecuencia de reloj del sistema, de modo que los objetos puedan ajustarse correctamente su sincronizacin.
_CLKMODE vs CLKMODE
_ CLKMODE est relaciona con CLKMODE, pero no son iguales. _CLKMODE contiene el modo de reloj solicitado
por la aplicacin en el arranque mientras que CLKMODE es un comando que devuelve el modo de reloj actual. Es
decir, _CLKMODE es el modo de reloj original y CLKMODE es el modo de reloj actual; ambos pueden tener ser el
mismo valor pero ciertamente pueden ser diferentes.
3.3.11. CLKSET
Fija el modo de reloj y la frecuencia de reloj del sistema en el tiempo de ejecucin.
CLKSET (Mode, Frequency)
Mode es una expresin de nmero entero compuesta de una combinacin de los valores de RCxxxx, de
XINPUT, de XTALx, y de PLLxx. El modo de reloj del Propeller ser cambiado a Mode.
Frequency es una expresin de nmero entero que indica la frecuencia de reloj del sistema.
Explicacin
Una de las caractersticas ms potentes del chip Propeller es la capacidad de cambiar el comportamiento del reloj
en el tiempo de ejecucin. Una aplicacin puede elegir activar o desactivar entre una velocidad de reloj lenta
(para una consumicin de potencia baja) y una velocidad de reloj rpida (para las operaciones de mucho ancho de
banda), por ejemplo. CLKSET se utiliza para cambiar el modo y la frecuencia de reloj durante tiempo de ejecucin.
Es el equivalente en tiempo de ejecucin las constantes _CLKMODE y _CLKFREQ definidas por la aplicacin en
de tiempo de compilacin.
Por ejemplo:
clkset(XTAL1 + PLL2X,
4_000_000)
Esto fija el modo de reloj a un cristal externo de poca velocidad y un multiplicador del reloj PLL de 2, y fija la
frecuencia de reloj del sistema a 4 Mhz. Despus de ejecutar este comando, los comandos de CLKMODE y de
CLKFREQ divulgarn los ajustes actualizados para los objetos que los utilizan.
3-17
www.microcontroladores.com
info@microcontroladores.com
3.3.12. CNT
Registro Contador del Sistema.
CNT
Devuelve: El valor actual de 32-bits del Contador del Sistema.
Explicacin
El registro de CNT contiene el valor actual de 32-bits del contador global del sistema. El contador del sistema sirve
como referencia del tiempo central para todos los Cogs; incrementa su valor de 32-bits una vez por ciclo de reloj
del sistema.
Sobre encendido/reset, el contador del sistema comienza con un valor arbitrario y cuenta en ascendente desde
ese valor, incrementndolo en cada ciclo de reloj del sistema. Puesto que el contador del sistema es un recurso
inalterable, cada Cog puede leerlo simultneamente y puede utilizar el valor devuelto para sincronizar
acontecimientos, contar ciclos y medir tiempo.
Uso de CNT
Lee CNT para conseguir el valor actual del contador del sistema. El valor real en s mismo no es importante para
ningn propsito en particular, pero la diferencia en lecturas sucesivas si resulta ser muy importante.
Habitualmente, el registro de CNT se utiliza para retrasar la ejecucin por un perodo especfico o sincronizar un
acontecimiento al comienzo de una ventana de tiempo. Los ejemplos siguientes utilizan la instruccin de
WAITCNT para alcanzar lo explicado.
waitcnt(3_000_000 + cnt)
El cdigo anterior es un ejemplo de un "retraso fijo." Retrasa la ejecucin del Cog en 3 millones de ciclos de reloj
del sistema (alrededor de segundos si se esta ejecutando con un oscilador interno rpido).
El siguiente es un ejemplo del " retraso sincronizado."
Aqu, el pin 0 de E/S se fija a la salida. Entonces la variable local OneMS se fija a la frecuencia de reloj actual del
sistema dividida por 1000; es decir: el nmero de los ciclos de reloj del sistema por 1 milisegundo de tiempo.
Despus, la variable local timeBase se fija al valor actual del contador del sistema. Finalmente, las ultimas dos
lneas del cdigo repiten sin fin; esperando al comienzo del prximo milisegundo y activando el estado de P0.
3.3.13. COGID
Recoge el numero de ID actual del Cog (0-7).
COGID
Devuelve: El ID actual del Cog (0-7).
3-18
www.microcontroladores.com
info@microcontroladores.com
Explicacin
El valor devuelto por COGID es el identificador del Cog que ejecut el comando. Normalmente, el cdigo del Cog
actual que se est ejecutando no importa, sin embargo, para algunos objetos puede que sea importante no
perderlo de vista. Por ejemplo:
PUB StopMyself
Detiene el cog que se est ejecutando
cogstop(cogid)
El mtodo del ejemplo, StopMyself, tiene una lnea de cdigo que llama simplemente COGSTOP con COGID
como parmetro. Como COGID devuelve la identificacin del Cog en ejecucin, esta rutina causa que el Cog se
detenga.
3.3.14. COGINIT
Arranca o reanuda un cog por su ID para ejecutar el cdigo Spin o el cdigo ensamblador del Propeller.
COGINIT (CogID, SpinMethod <(ParameterList)>, StackPointer )
COGINIT (CogID, AsmAddress, Parameter )
Explicacin
COGINIT trabaja exactamente como COGNEW con dos excepciones: 1) lanza cdigo sobre un Cog especfico
cuya ID es CogID, y 2) no devuelve un valor. Puesto que COGINIT opera en un Cog especfico, CogID, puede ser
utilizado para detener y para reanudar un Cog activo en un solo paso.
Cdigo Spin (Sintaxis 1)
Para ejecutar un mtodo Spin en un Cog especfico, el comando COGINIT necesita la identificacin del Cog, el
nombre del mtodo, sus parmetros, y un puntero a un espacio de pila. Por ejemplo:
coginit(1, Square(@X), @SqStack)
Este ejemplo lanza el mtodo Square en el Cog 1, pasando la direccin de X en Square y la direccin de SqStack
como puntero de pila de COGINIT's.
Cdigo Ensamblador del Propeller (Sintaxis 2)
Para ejecutar cdigo ensamblador del Propeller en un Cog especfico, el comando de COGINIT necesita la
identificacin del Cog, la direccin de la rutina del ensamblador , y un valor que se pueda utilizar opcionalmente
por la rutina del ensamblador . Por ejemplo:
coginit(2, @Update, Pos)
3-19
www.microcontroladores.com
info@microcontroladores.com
Este ejemplo lanza la rutina del ensamblador del Propeller, Update, en el Cog 2 con la direccin de Pos en PAR
del Cog 2.
3.3.15. COGNEW
Arranca el siguiente Cog disponible para ejecutar el cdigo Spin o cdigo ensamblador del Propeller.
COGNEW (SpinMethod <(ParameterList)>, StackPointer )
COGNEW (AsmAddress, Parameter )
Devuelve: El ID del nuevamente arrancado Cog (0-7) si es correcto, o -1 si es falso.
SpinMethod es el mtodo Spin de PUB o PRI que debe ejecutar el nuevo Cog. Opcionalmente, puede
seguirle una lista de parmetros incluida entre parntesis.
ParameterList es una lista opcional, de unos o varios parmetros limitados por comas para SpinMethod.
Debe ser incluido solamente si SpinMethod requiere parmetros.
StackPointer es un indicador de memoria, como un array de longs, reservado para el espacio en pila del Cog
afectado. El Cog afectado utiliza este espacio para almacenar datos temporales durante futuras llamadas y
evaluaciones de expresiones. Si se asigna poco espacio, la aplicacin no podr ejecutarse o se ejecutar con
extraos resultados.
AsmAddress es la direccin de una rutina del ensamblador Propeller de un bloque de DAT.
Parameter se utiliza para pasar opcionalmente un valor al Cog nuevo. Este valor termina en el registro de solo
lectura (PAR) del cog. Parameter se puede utilizar para pasar un valor de 14-bit o la direccin de un bloque de
memoria que se utilizar por la rutina del ensamblador . Parameter es requerido por COGINIT, pero si se
necesita para su rutina simplemente se fija a un valor inofensivo como cero (0).
Explicacin
COGNEW arranca un Cog nuevo y ejecuta un mtodo Spin o una rutina de ensamblador del Propeller. Si es
correcto, COGNEW devuelve el ID del Cog arrancado. Si no haba Cogs disponibles, COGNEW devuelve -1.
Cdigo Spin (Sintaxis 1)
Para ejecutar un mtodo Spin en otro Cog, el comando COGNEW necesita el nombre del mtodo, sus
parmetros, y un puntero a un espacio de pila. Por ejemplo:
VAR
long SqStack[6]
PUB Main | X
X := 2
cognew(Square(@X), @SqStack)
<check X here>
Inicializa X
Lanza Square en cog
Bucle y chequea X
PUB Square(XAddr)
Cuadrado del valor en XAddr
repeat
long[XAddr] *= long[XAddr]
waitcnt(2_000_000 + cnt)
Este ejemplo muestra dos mtodos, Main y Square. Main arranca otro Cog que ejecuta de manera infinita Square,
entonces Main puede mostrar los resultados en la variable X. Square, ejecutndose por otro Cog, toma el valor de
XAddr, realiza el cuadrado de su valor y almacena el resultado nuevamente dentro de XAddr, despus espera 2
millones de ciclos antes de que lo repita.
El mtodo principal, Main, declara una variable local, X, que se fija a 2 en su primera lnea. Entonces Main arranca
un Cog nuevo, con COGNEW, para ejecutar el mtodo Square en otro Cog. El primer parmetro de COGNEW,
Square(@X), es el mtodo Spin a ejecutar y su parmetro requerido; en este caso le pasamos la direccin de la
3-20
www.microcontroladores.com
info@microcontroladores.com
variable X. El segundo parmetro de COGNEW, @SqStack, es la direccin del espacio de pila reservado para el
nuevo Cog. Cuando un Cog se arranca para ejecutar cdigo Spin, necesita un cierto espacio donde pueda
almacenar datos temporales tales como pila de llamadas, parmetros de pila y la expresin resultante intermedia.
Este ejemplo requiere solamente 6 longs de espacio de pila para operacin apropiada.
Despus de que se ejecute el comando de COGNEW, se estn ejecutando dos Cogs; el primero todava est
ejecutando el mtodo principal y el segundo est comenzando a ejecutar el mtodo Square. A pesar del hecho de
que estn utilizando cdigo del mismo objeto Spin, se estn ejecutando independientemente. La lnea <check X
here> se puede sustituir por cdigo que utiliza el valor de X de alguna manera.
Cdigo Ensamblador del Propeller (Sintaxis 2)
Para ejecutar cdigo ensamblador del Propeller en otro Cog, el comando de COGNEW necesita la direccin de la
rutina del ensamblador y un valor que se pueden utilizar opcionalmente por la rutina del ensamblador . Por
ejemplo:
VAR
byte Cog
3-21
www.microcontroladores.com
info@microcontroladores.com
Es importante observar que el campo Parameter est pensado para pasar una direccin larga, y solamente 14-bits
(bits de 2 a 15) se pasan en el registro PAR del Cog.
3.3.16. COGSTOP
Detiene un cog por su ID.
COGSTOP (CogID )
CogID es el ID (0 7) del cog a detener.
Explicacin
COGSTOP detiene un Cog cuya ID sea CogID y pone ese Cog en un estado inactivo. En el estado inactivo, el Cog
deja de recibir pulsos del reloj del sistema para reducir notablemente el consumo de energa.
Para detener un Cog, hay que utilizar el comando COGSTOP con el ID del Cog a parar. Por ejemplo:
VAR
byte Cog
Explicacin
El bloque Constante es una seccin del cdigo fuente que declara smbolos constantes globales y ajustes globales
de la configuracin del Propeller. sta es una de las seis declaraciones especiales (CON, VAR, OBJ, PUB, PRI, y
DAT) que proporcionan la estructura inherente a la lengua Spin.
Las constantes son valores numricos que no pueden cambiar en tiempo de ejecucin. Pueden ser definidas en
trminos de valores nicos (1, $F, 65000, %1010, "A", los etc.) o como expresiones, llamadas expresiones
constantes, (25 + 16/2, 1000 * 5, etc.) que siempre hacen referencia a un nmero especfico.
3-22
www.microcontroladores.com
info@microcontroladores.com
El bloque Constante es un rea de cdigo usada especficamente para asignar smbolos (nombres tiles) a las
constantes, para poder utilizar los smbolos en cualquier parte del cdigo donde sea necesario usar ese valor
constante. Esto hace que el cdigo sea ms legible y ms fcil mantener, si ms adelante hubiese que cambiar el
valor de una constante a la que se haga referencia en varios lugares. Estas constantes son globales al objeto, de
modo que cualquier mtodo dentro de l puede utilizarlas. Hay muchas maneras de definir las constantes, que se
describen abajo.
Declaraciones Comunes de Constantes (Sintaxis 1)
Las formas ms comunes de declaracin de constantes comienzan con CON en una lnea, seguida por una o ms
declaraciones. CON debe comenzar en la columna 1 (la columna extrema izquierda) de la lnea actual y las lneas
siguientes se deben tabular por lo menos un espacio. Las expresiones pueden ser combinaciones de nmeros,
operadores, parntesis, y caracteres acotados.
Ejemplo:
CON
Delay = 500
Baud = 9600
Achar = A
-oCON
Delay = 500, Baud = 9600, AChar = A
Ambos ejemplos crean un smbolo llamado Delay que es igual a 500, un smbolo llamado Baud que es igual a
9600, y un smbolo llamado AChar que es igual al carcter "A". Para la declaracin Delay, por ejemplo, se podra
tambin haber utilizado una expresin algebraica, por ejemplo:
Delay = 250 * 2
La declaracin anterior da como resultado un valor igual a 500, como antes, pero la expresin puede hacer que el
cdigo sea ms fcil de entender.
El bloque CON tambin se utiliza para especificar ajustes globales, como ajustes del reloj del sistema. El ejemplo
de abajo se muestra cmo fijar el modo de reloj a cristal de poca velocidad, al reloj PLL a 8x, y especificar que el
pin frecuencia de XIN es 4 Mhz.
CON
_CLKMODE = XTAL1 + PLL8X
_XINFREQ = 4_000_000
Los valores de punto flotante tambin se pueden definir como constantes. Los valores de punto flotante son
nmeros reales (con los componentes fraccionarios) y estn codificados en 32-bits.
Para especificar una constante de punto flotante, se debe especificar que el valor es un valor de punto flotante; la
expresin debe ser un valor de punto flotante o estar compuesto enteramente de valores de punto flotante (ningn
nmero entero).
Los valores de punto flotante se deben escribir de la siguiente forma:
1) dgitos decimales seguidos por un punto decimal y por un dgito decimal ms por lo menos,
2) dgitos decimales seguidos por "e" (para el exponente) y un valor entero del exponente, o,
3) una combinacin de 1 y 2.
Los siguientes son ejemplos de constantes vlidas:
0.5
valor de punto flotante
1.0
valor de punto flotante
3-23
www.microcontroladores.com
info@microcontroladores.com
A continuaron se muestra un ejemplo que declara una constante entera y dos constantes de punto flotante.
CON
Num1 = 20
Num2 = 127.38
Num3 = 32.05 * 18.1 - Num2 / float(Num1)
El cdigo anterior fija Num1, Num2 y Num3 a 20, a 127.38 y a 573.736, respectivamente. Hay que tener en cuenta
que la expresin anterior de Num1 tiene que ser incluida en la declaracin FLOAT de modo que el compilador lo
trate como valor de punto flotante.
El compilador del Propeller maneja constantes de punto flotante como nmeros reales de simple precisin segn
lo descrito por el estndar IEEE-754.
Enumeraciones (Sintaxis 2 y 3)
Los bloques constantes pueden tambin declarar smbolos constantes enumerados. Las enumeraciones son
smbolos agrupados lgicamente que tienen asignado un valor entero incremental nico para el grupo. Por
ejemplo, un objeto puede tener la necesidad de ciertos modos de operacin. Cada uno de estos modos se puede
identificar por un nmero, un 0, un 1, 2 y 3, por ejemplo. Los nmeros por si mismos no son importantes para
nuestro propsito; solo necesitan ser nicos dentro del contexto del modo de operacin.
Por ejemplo:
CON
Declara los modos de operacin
RunTest
= 0
RunVerbose = 1
RunBrief
= 2
RunFull
= 3
El ejemplo anterior sera suficiente para nuestro propsito; porque los usuarios de este objeto pueden indicar
"RunFull" en vez de "3" para especificar el modo de operacin deseado. El problema esta en que, definir un grupo
lgico de tems de esta manera puede causar fallos y problemas de mantenimiento porque si se altera algn valor
(a propsito o por accidente) sin cambiar el resto por consiguiente, puede causar fallos en el programa. Tambin,
se puede imaginar un caso en el que haya 20 modos de operacin. se sera un sistema mucho ms largo de
constantes y de ms posibilidades de incidencias en el mantenimiento. Las enumeraciones solucionan este
problema automticamente incrementando el valor para los smbolos. Podemos rescribir el ejemplo anterior con
sintaxis de enumeracin:
CON
Declara los modos de operacin
#0, RunTest, RunVerbose, RunBrief, RunFull
Aqu, # 0, dice a compilador que comience a contar desde el nmero 0 y que fije el smbolo siguiente a ese valor.
Entonces, cualquier smbolo adicional que no especifique su propio valor se asigna automticamente el valor
anterior ms 1. El resultado es que RunTest es igual a 0, RunVerbose es igual a 1, RunBrief es igual a 2 y RunFull
es igual a 3. Definir valores enumerados de esta manera tiene las ventajas de asegurar que los valores asignados
sean nicos y contiguos dentro del grupo.
Usando el ejemplo anterior, los mtodos que los utilizan pueden hacer cosas como la siguiente (se asume que
Mode es un smbolo fijado por un objeto llamador):
3-24
www.microcontroladores.com
info@microcontroladores.com
case Mode
RunTest
: <test code here>
RunVerbose
: <verbose code here>
RunBrief
: <brief code here>
RunFull
: <full code here>
-oif Mode > RunVerbose
<brief and run mode code here>
Lo siguiente tambin funciona y deja sitio para comentarios sobre cada modo.
El ejemplo anterior hace lo mismo que el ejemplo visto antes, pero ahora tenemos sitio conveniente para describir
el propsito de cada modo sin perder la ventaja del incremento automtico. Mas adelante, si hubiera una
necesidad de agregar un quinto modo, lo agrega simplemente a la lista en cualquier posicin que sea necesaria.
Si hubiera necesidad de que la lista comenzase en un cierto valor, habra que cambiar el #0 a lo que se necesite:
# 1, # 20, etc. Es posible incluso modificar el valor enumerado en el centro de la lista.
CON
Declara los modos de operacin
#1, RunTest, RunVerbose, #5, RunBrief, RunFull
Alcance de Constantes
Las constantes simblicas definidas en bloques constantes son globales al objeto en el cual se definen pero no
fuera de ese objeto. Esto significa que las constantes se pueden alcanzar directamente en cualquier lugar dentro
del objeto pero su nombre no estar en conflicto con los smbolos definidos en otros objetos padre o hijo.
Las constantes simblicas se pueden alcanzar indirectamente por objetos padre, usando la sintaxis de referencia
constante. Ejemplo:
OBJ
Num : Numbers
PUB SomeRoutine
Format := Num#DEC
Aqu un objeto, Numbers," se declara como smbolo Num. Num es la referencia del objeto, # indica que
necesitamos acceder a las constantes del objeto, y la DEC es la constante dentro del objeto que necesitamos.
Esta caracterstica permite que los objetos definan constantes para su propio uso y para que los objetos padre
tengan acceso a esas constantes sin interferir con cualquier smbolo que crearon.
3-25
www.microcontroladores.com
info@microcontroladores.com
3.3.18. CONSTANT
Declara expresiones constantes en lnea para ser totalmente resueltas en tiempo de compilacin.
CONSTANT (ConstantExpression )
Devuelve: El valor resuelto de la expresin constante.
ConstantExpression es la expresin constante deseada.
Explicacin
El bloque CON se puede utilizar para crear constantes de expresiones que se referencian desde mltiples lugares
en el cdigo, pero hay ocasiones en las que una expresin constante se necesita con propsitos temporales.
Sin el uso de la directiva CONSTANT, las expresiones en lnea de un mtodo se resuelven en el tiempo de
ejecucin, incluso si la expresin es un valor constante.
Uso de CONSTANT
La directiva CONSTANT puede crear expresiones constantes de un solo uso que guardan espacio de cdigo y
aumentan la velocidad de ejecucin en tiempo de ejecucin. Se muestran dos ejemplos abajo:
Ejemplo 1, usando expresiones estndares en tiempo de ejecucin:
CON
X = 500
Y = 2500
PUB Blink
!outa[0]
waitcnt(X+200 + cnt)
!outa[0]
waitcnt((X+Y)/2 + cnt)
Ejemplo 2, igual que arriba, pero con la directiva CONSTANT alrededor de expresiones constantes:
CON
X = 500
Y = 2500
PUB Blink
!outa[0]
waitcnt(constant(X+200) + cnt)
CONSTANT
!outa[0]
waitcnt(constant((X+Y)/2) + cnt)
CONSTANT
Los dos ejemplos anteriores hacen exactamente lo mismo: su mtodo Blink activa P0, espera X+200 ciclos, activa
de nuevo P0 y espera (X+Y)/2 ciclos antes de volver. Mientras que los smbolos de X y de Y del bloque CON
pueden que necesiten usarse en mltiples lugares dentro del objeto, las expresiones de WAITCNT usadas en el
mtodo Blink solamente deberan necesitarse en ese lugar. Por esta razn, no tiene sentido definir constantes
adicionales en el bloque CON para cosas como X+200 y (X+Y)/2.
La directiva CONSTANT es perfecta para esta situacin, porque resuelve cada expresin constante de un solo uso
a un valor nico, esttico, guardando espacio de cdigo y velocidad de ejecucin. En el ejemplo 1, el mtodo Blink
consume 33 bytes de espacio de cdigo mientras que mtodo Blink del ejemplo 2, con la adicin de la directiva
CONSTANT, slo requiere 23 bytes de espacio. Hay que observar que la porcin de las expresiones de "+ cnt" no
3-26
www.microcontroladores.com
info@microcontroladores.com
est incluida dentro del parntesis de la directiva CONSTANT; esto es porque cnt es una variable (variable del
contador del sistema; vear CNT) as que su valor no puede resolverse en tiempo de compilacin.
Si una constante necesita utilizarse en ms de un lugar del cdigo, es mejor definirlo en el bloque CON,
definindola solamente una vez y el smbolo que la representa se puede utilizarse mltiples veces.
Constantes (pre-definidas)
Las siguientes constantes estn predefinidas por el compilador:
TRUE
FALSE
POSX
NEGX
PI
RCFAST
RCSLOW
XINPUT
XTAL1
XTAL2
XTAL3
PLL1X
PLL2X
PLL4X
PLL8X
PLL16X
Verdadero lgico:
-1 ($FFFFFFFF)
Falso lgico:
0 ($00000000)
Entero positivo mximo:
2,147,483,647 ($7FFFFFFF)
Entero negativo mximo:
-2,147,483,648 ($80000000)
Valor Float para PI:
~3.141593 ($40490FDB)
Oscilador interno rpido:
$00000001 (%00000000001)
Oscilador interno lento:
$00000002 (%00000000010)
Reloj/Oscilador externo:
$00000004 (%00000000100)
Cristal externo de baja velocidad:
$00000008 (%00000001000)
Cristal externo de media velocidad:
$00000010 (%00000010000)
Cristal externo de alta velocidad:
$00000020 (%00000100000)
Frecuencia externa 1:
$00000040 (%00001000000)
Frecuencia externa 2:
$00000080 (%00010000000)
Frecuencia externa 4:
$00000100 (%00100000000)
Frecuencia externa 8:
$00000200 (%01000000000)
Frecuencia externa 16:
$00000400 (%10000000000)
3-27
www.microcontroladores.com
info@microcontroladores.com
Sntesis de la frecuencia.
Medida de la frecuencia.
Contador del pulso.
Medida del pulso.
Medida del estado multi-pin.
Modulacin de la anchura de pulso (PWM).
Medida del tiempo de utilizacin.
Conversin de digital a analgico (DAC).
Conversin de analgico a digital (ADC).
Y ms.
Para algunas de estas operaciones el Cog puede fijar la configuracin del contador, va CTRA o CTRB, y realizar
su tarea totalmente independientemente. Para otros, el Cog puede utilizar WAITCNT para alinear en tiempo en el
que el contador lee y escribe dentro de un bucle; creando el efecto de una mquina de estados ms compleja.
APIN
El campo de APIN de CTRA selecciona un pin primario de E/S para ese contador. Puede ser ignorado si no se
utiliza. %0xxxxx = puerto A, %1xxxxx = puerto B (reservado para uso futuro). En ensamblador del Propeller, el
campo APIN se puede escribir usando la instruccin MOVS.
Si se escribiese un cero en CTRA inhabilitara inmediatamente el contador A y parara todo el pin a salida y la
acumulacin a PHSA.
3-28
www.microcontroladores.com
info@microcontroladores.com
BPIN
El campo de BPIN de CTRx selecciona un pin secundario de E/S para ese contador. Este campo puede ser
ignorado si no se utiliza. %0xxxxx = puerto A, %1xxxxx = puerto B (reservado para uso futuro). En ensamblador
del Propeller, el campo BPIN se puede escribir usando la instruccin MOVD.
PLLDIV
El campo de PLLDIV de CTRx selecciona una salida para PLLx. Esto determina qu energa de las dos divisiones
de la frecuencia del VCO se utilizara como la salida final de PLLx (un rango de 500 KHz a 128 Mhz). Este campo
puede ser ignorado si no se utiliza. En ensamblador del Propeller, el campo de PLLDIV se puede escribir, junto
con CTRMODE, usando la instruccin MOVI.
CTRMODE
El campo de CTRMODE de CTRA y de CTRB selecciona uno de los 32 modos de funcionamiento para el contador
correspondiente A o B. En ensamblador del Propeller, el campo de CTRMODE se puede escribir, junto con
PLLDIV, usando la instruccin MOVI.
Los modos de %00001 a %00011 causan FRQx-a-PHSx, una acumulacin que se da cada ciclo de reloj. Esto
crea un oscilador controlado numricamente (NCO) en PHSx[31], que alimenta la entrada de referencia del PLLx.
El PLLx multiplicar esta frecuencia por 16 usando el controlado de voltaje del oscilador (VCO).
Para operaciones estables, se recomienda que la frecuencia de VCO est entre 64 Mhz y 128 Mhz. Esto se
traduce a una frecuencia NCO de 4 Mhz a 8 Mhz.
Uso de CTRA and CTRB
En Spin, CTRx puede ser leido/escrito como cualquier otro registro o variable predefinida. En cuanto se escribe en
este registro, el nuevo modo de funcionamiento entra en efecto para el contador. Por ejemplo:
CTRA := %00100 << 26
El cdigo anterior fija el campo CTRA de CTRMODE al modo NCO (%00100) y al resto de bits a cero.
3-29
www.microcontroladores.com
info@microcontroladores.com
Symbol es un nombre opcional para los datos, el espacio reservado, o la instruccin que sigue.
Size es la alineacin y el tamao deseados (BYTE, WORD, o LONG) de los elementos de datos. Todos los
datos sern alineados segn la primera ocurrencia del tamao Size. Cualquier otra ocurrencia de Size en la
misma lnea indica el tamao del dato siguiente; la alineacin no se cambia.
Data es una expresin constante o una lista de expresiones constantes separadas por comas. Tambin se
permiten Las sentencias protegidas de caracteres; se tratan como una lista de caracteres separadas por
comas.
Condition es una condicin en lenguaje ensamblador, IF_C, IF_NC, IF_Z, etc.
Instruction es una instruccin en lenguaje ensamblador, ADD, SUB, MOV, etc.
3-30
www.microcontroladores.com
info@microcontroladores.com
Operand(s) es/son uno o dos operandos separados por comas en lenguaje ensamblador, "# valor", "x, # 8",
etc.
Effect(s) es/son uno, dos o tres efectos en lenguaje ensamblador, que causan que el resultado de la
instruccin sea escrito o no, NR, WR, WC, o WZ.
Explicacin
Un bloque de datos es una seccin de cdigo fuente que contiene datos predefinidos, memoria reservada para el
uso en tiempo de ejecucin y el cdigo ensamblador del Propeller. sta es una de las seis declaraciones
especiales (CON, VAR, OBJ, PUB, PRI, y DAT) que proporcionan la estructura inherente al lenguaje Spin.
Los bloques de datos son secciones multiusos de cdigo fuente, que se utilizan para las tablas de datos, el
espacio de trabajo en tiempo de ejecucin, y cdigo ensamblador del Propeller. El cdigo y los datos de
ensamblador se pueden entremezclar, en caso de necesidad, para cargar datos en un Cog junto con el cdigo
ensamblador .
Declaring Data (Sintaxis 1)
Los datos se declaran con una alineacin y un tamao especficos (BYTE, WORD, o LONG) para indicar cmo
deben almacenarse en memoria. La localizacin en la que estn actualmente almacenados los datos depende de
la estructura del objeto y de la aplicacin en la que se compila, si los datos estn incluidos como parte del cdigo
compilado.
Por ejemplo:
DAT
byte 64, A, String, 0
word $FFC2, 75000
long $44332211, 32
Lo primero que hay en la lnea dos de este ejemplo, BYTE, indica que los datos que la siguen, deben ser de
tamao y alineacin byte. En tiempo de compilacin, los datos BYTE, 64, "A", etc., se almacenan en memoria de
programa en el siguiente byte disponible. La lnea tres especifica datos de tamao y alineacin word. Sus datos,
$FFC2 y 75000, comenzarn en la siguiente posicin al lmite de word. La cuarta lnea especifica datos long. La
tabla 4-5 muestra lo que contendra la memoria (mostrada en hexadecimal).
Los primeros nueve bytes (0 - 8) son los datos del byte de la lnea uno; $40 = 64 (decimal), $41 = "A", $53 = "S",
etc. El byte 9 se rellena con ceros para alinear la primera palabra de datos word, $FFC2, en el byte 10. Los Bytes
10 y 11 (word 5) contienen el primer valor de tamao word, $FFC2, almacenado en el formato byte-bajo-primero
como $C2 y $FF. Los Bytes 12 y 13 (word 6) toman el valor de la palabra ms baja de 75000; que se comentara
mas adelante.
Los Bytes 14 y 15 (word 7) se rellena a ceros para alinear el primer long de datos, $44332211. Los Bytes 16 a 19
(long 5) contienen ese valor en el formato byte-bajo-primero. Finalmente, los bytes 20 a 23 (long 6) contiene el
segundo long de datos, 32, en el formato byte-bajo-primero.
Se puede notar que el valor 75000 fue especificado como word. El nmero 75000 en hexadecimal es $124F8,
pero como es mayor que un word, slo se almaceno el valor del word mas bajo ($24F8). Esto da lugar al word 6
(bytes 12 y 13) que contiene $F8 y $24, y word 7 (bytes 14 y 15) que contiene $00 y $00 debido al relleno para
los valores long siguientes.
3-31
www.microcontroladores.com
info@microcontroladores.com
Este fenmeno, intencionado o no , ocurre tambin para los datos byte, por ejemplo:
DAT
Byte
$FFAA,
$BB995511
... da lugar a que solamente se almacenen los bytes mas bajos de cada valor, $AA y $11 .
De vez en cuando, puede ser deseable almacenar un valor grande entero como unidades elementales ms
pequeas. Para hacer esto, hay que especificar el tamao justo antes del mismo valor.
DAT
byte word $FFAA, long $BB995511
Este ejemplo especifica datos alineados byte, pero un valor de tamao word seguido por un valor de tamao long.
El resultado es que la memoria contiene $AA y $FF, consecutivamente, y seguido de, $11, $55, $99 y $BB.
Si modificamos la lnea tres del primer ejemplo de esta forma:
word $FFC2, long 75000
... entonces terminaramos con $F8, $24, $01, y $00 ocupando los bytes de 12 a 15. El byte 15 es el byte de valor
superior y va a pasar a estar inmediatamente a la izquierda del lmite long siguiente as que no hay necesidad de
rellenar los bytes a cero.
Opcionalmente, el campo Symbol del sintaxis 1 se puede usar para "nombrar" los datos. Esto hace que sea mas
fcil referirse a los datos de un bloque PUB o PRI. Por ejemplo:
DAT
MyData
Este ejemplo crea una tabla de datos llamada MyData que contiene los bytes $FF, 25 y %1010. El mtodo pblico,
GetData, lee el primer byte de MyData de la memoria principal y lo almacena en su variable local, Temp.
Escribir cdigo Ensamblador del Propeller (Sintaxis 2)
Adems de los datos numricos y strings, el bloque de los datos se utiliza para el cdigo ensamblador del
Propeller. Por ejemplo,
DAT
Loop
org
rdlong
if_z jmp
movd
:arg mov
t1, par WZ
#loop
:arg, #arg0
t2, t1
Este ejemplo contiene smbolos opcionales, "loop" y ":arg", un condicional, "IF_Z", el campo de la instruccin,
ORG, RDLONG, etc, seguidos por operandos y una declaracin, "wz."
3.3.21. DIRA, DIRB
Registro de Direcciones para los puertos A y B de 32 bits.
DIRA <[Pin(s)]>
DIRB <[Pin(s)]>(Reservado para uso futuro)
3-32
www.microcontroladores.com
info@microcontroladores.com
Devuelve: Valor actual de los bits de direccin de E/S de Pin(s) en los puertos A o B, si est utilizado como
variable fuente.
Pin(s) es una expresin opcional, o una expresin de rango, que especifica el pin ,o pins, de E/S para
acceder al puerto A (0-31) o al puerto B (32-63). Si se da una expresin nica, solamente se tendr
acceso al pin especificado. Si se da una expresin de tipo rango (dos expresiones en un formato rango;
x..y) se tendr acceso a los pins contiguos desde el comienzo de la expresin hasta el fin.
Explicacin
DIRA y DIRB son uno de los seis registros (DIRA, DIRB, INA, INB, OUTA y OUTB) que afectan directamente los
pins de E/S. El registro DIRA contiene los estados de la direccin de cada uno de los 32 pins de E/S en el puerto
A; los bits 0 a 31 corresponden de P0 a P31. El registro de DIRB contiene los estados de la direccin de cada uno
de los 32 pins de E/S en el puerto B; los bits 0 a 31 corresponden de P32 a P63.
NOTA: DIRB est reservado para el uso futuro; el Propeller P8X32A no incluye los pins de E/S del puerto B.
DIRA se utiliza para fijar y recoger los estados de la direccin actual de uno o ms pins de E/S en el puerto A. Un
bit bajo (0) fija el pin correspondiente de E/S a una direccin de entrada. Un bit alto (1) fija el pin correspondiente
de E/S a una direccin de salida. El registro de DIRA es cero por defecto, en el arranque del Cog; todos los pins
de E/S estn fijados como entradas por ese Cog hasta que el cdigo diga lo contrario.
Cada Cog tiene acceso a todos los pins de E/S en cualquier momento. Esencialmente, todos los pins de E/S estn
conectados directamente con cada Cog.
Esta configuracin se puede describir con las siguientes reglas:
A. Un pin es una entrada slo de Cogs no activos fijados a salida.
B. Un pin es una salida si cualquier Cog activo lo fija a salida.
Uso de DIRA
Fija a uno o a cero los bits en DIRA para afectar a la direccin de los pins de E/S segn lo deseado. Por ejemplo:
DIRA := %00000000_00000000_10110000_11110011
El cdigo anterior fija el registro completo de DIRA (los 32-bits de una vez) a un valor que hace los pins de E/S 15,
13, 12, 7, 6, 5, 4, 1 y 0 a salidas y al resto a entradas.
Usando los operadores unitarios post-clear (~) y post-set (~~), el Cog puede fijar todos los pins de E/S a entradas,
o a salidas, respectivamente; aunque generalmente no es deseable fijar todos los pins de E/S a salidas. Por
ejemplo:
DIRA~
--y-DIRA~~
Para afectar solamente un pin de E/S (un bit), se debe incluir el campo opcional Pin(s). Esto trata el registro de
DIRA como array de 32-bits.
DIRA[5]~~
Esto fija P5 a salida. Todos los dems bits de DIRA siguen en su estado anterior.
El registro DIRA soporta una forma especial de expresin, llamada expresin de rango, que permite afectar a un
grupo de pins de E/S, sin afectar otros fuera del rango especificado.
DIRA[5..3]~~
Esto fija P5, P4 y P3 a salida; todos los dems bits de DIRA recuerdan su estado previo. A contignacin se
muestra otro ejemplo:
3-33
www.microcontroladores.com
info@microcontroladores.com
El ejemplo anterior fija los bits 5, 4 y 3 de DIRA a 1, 1, y 0, respectivamente, dejando el resto de los bits en su
estado anterior. Por lo tanto, P5 y P4 ahora son salidas y P3 es una entrada.
Normalmente DIRA se escribe pero tambin se puede leer para recuperar el pin de direcciones de E/S actual. El
ejemplo siguiente asume que Temp es una variable creada en otra parte:
Temp := DIRA[7..4]
Recoge la direccin de P7 a P4
Lo anterior fija Temp a los bits 7, 6, 5, y 4 de DIRA; es decir: los 4 bits ms bajos de Temp son iguales ahora
DIRA7:4 y los otros bits de Temp se aclararon a cero.
3.3.22. FILE
Importa un fichero externo como datos.
FILE FileName
FileName es el nombre, sin la extensin, del fichero de datos. FileName puede contener cualquier
carcter vlido de fichero; los caracteres no permitidos son \, /,:, *?, ", y |.
Explicacin
El directorio FILE se utiliza para importar un fichero de datos externo (generalmente un archivo binario) en el
bloque de DAT de un objeto. De esta manera los datos se pueden alcanzar por el objeto, como cualquier dato
normal del bloque de DAT.
Uso de FILE
FILE se utiliza en los bloques de DAT de manera similar a como se usan BYTE, WORD o LONG excepto que lo
que sigue es un nombre de fichero en vez de valores de los datos. Por ejemplo:
DAT
Str
byte
Data file
En este ejemplo, el bloque de DAT se compone de una secuencia (string) de bytes seguida por los datos de un
fichero llamado Datafile.dat. Antes de la compilacin, la herramienta Propeller buscar por de las etiquetas de
editores, del directorio en uso o del directorio de biblioteca para un archivo llamado Datafile.dat y cargar sus
datos en el primer byte de string libre. Los mtodos pueden acceder a los datos importados usando declaraciones
BYTE, WORD o LONG como los datos normales. Por ejemplo:
PUB GetData | Index, Temp
Index := 0
repeat
Temp := byte[Data][Index++] Lee el dato a Temp 1 byte por vez
<do something with Temp> Realiza una tarea con valor para Temp
while Temp > 0
Bucle hasta que encuentre en final
Este ejemplo leer los datos importados, un byte cada vez, hasta que encuentra un byte igual a 0.
3-34
www.microcontroladores.com
info@microcontroladores.com
3.3.23. FLOAT
Convierta una expresin entera a un valor de punto flotante en tiempo de compilacin.
FLOAT (IntegerConstant)
Devuelve: El valor resuelto de la expresin de la constante entera como nmero de punto flotante.
IntegerConstant es la expresin deseada de la constante entera que se utilizar como valor constante de
punto flotante.
Explicacin
El FLOAT es una de las tres directivas (FLOAT, ROUND and TRUNC) usadas para las expresiones constantes de
punto flotante. La directiva FLOAT convierte un valor constante
entero a un valor constante de punto flotante.
Uso de FLOAT
Mientras que la mayora de las constantes son valores enteros de 32-bits, el compilador del Propeller soporta
valores de 32-bits de punto flotante y expresiones constantes para el uso en tiempo de compilacin. Hay que tener
en cuenta que esto es nicamente para expresiones constantes, no para expresiones variables en tiempo de
ejecucin.
Para declaraciones constantes de punto flotante, la expresin se debe mostrar como valor de punto flotante en
una de estas tres maneras siguientes: 1) como nmero entero seguido por un punto y por lo menos un dgito, 2)
como nmero entero con una E seguido por un valor del exponente, o 3) 1 y 2. Por ejemplo:
CON
OneHalf = 0.5
Ratio
=
Miles
= 10e5
2.0 / 5.0
El cdigo anterior crea tres constantes de punto flotante. OneHalf es igual a 0.5, el Ratio es igual a 0.4 y Miles es
igual a 1.000.000.
Se aprecia que en el ejemplo anterior, cada componente de cada expresin est mostrado como un valor de punto
flotante. Ahora se muestra el ejemplo siguiente:
CON
Two
Ratio
=
=
2
Two / 5.0
Aqu, Two se define como una constante entera y Ratio aparece definida como constante de punto flotante. Esto
causa un error en la lnea Ratio porque, para las expresiones constantes de punto flotante, cada valor dentro de la
expresin debe ser un valor de punto flotante; no se puede mezclar valores de nmero entero y de punto flotante
como en Ratio = 2/5.0.
Se puede, sin embargo, utilizar la directiva FLOAT para convertir un valor de nmero entero a un valor de punto
flotante, por ejemplo en el siguiente:
CON
Two = 2
Ratio = float(Two) / 5.0
La directiva FLOAT en este ejemplo convierte la constante entera, Two, en la forma de punto flotante de ese valor
para poderlo utilizarlo en la expresin de punto flotante.
Sobre el Punto Flotante
El compilador del Propeller maneja constantes de punto flotante como nmeros reales de simple precisin segn
lo descrito por el estndar IEEE-754.
3-35
www.microcontroladores.com
info@microcontroladores.com
3.3.24. _FREE
Constante predefinida, ajustable una sola vez para especificar el tamao del espacio libre de una aplicacin.
CON
_FREE = Expression
Expression es un nmero entero que indica que el nmero de longs a reservar para el espacio libre.
Explicacin
_FREE es una constante opcional predefinida, ajustable una sola vez que especifica la memoria libre requerida de
una aplicacin. Este valor se agrega a _STACK, si est especificado, para determinar la cantidad total de
memoria de free/stack a reservar para una aplicacin Propeller. Se utiliza _FREE si una aplicacin requiere una
cantidad mnima de memoria libre para ejecutarse correctamente. Si la aplicacin compilada resultante es
demasiado grande para permitir la memoria libre especificada, se mostrara un mensaje de error. Por ejemplo:
CON
_FREE = 1000
La declaracin de _FREE en el bloque CON anterior indica que la aplicacin necesita tener por lo menos 1.000
longs de memoria libre despus de la compilacin.
3.3.25. FRQA, FRQB
Contador A y B del Registro de Frecuencia.
FRQA
FRQB
Devuelve: Valor actual del contador A o del contador B del registro de frecuencia, si est utilizado como variable
de fuente.
Explicacin
FRQA y FRQB son dos de los seis registros (CTRA, CTRB, FRQA, FRQB, PHSA, y PHSB) que afectan el
comportamiento de los mdulos del Contador de un Cog. Cada Cog tiene dos mdulos Contador idnticos (A y B)
que puede realizar muchas tareas repetitivas. El registro de FRQA contiene el valor que se acumula en el registro
de PHSA. El registro de FRQB contiene el valor que se acumula en el registro de PHSB.
Uso de FRQA and FRQB
FRQA y FRQB pueden ser leidos/escritos como cualquier otro registro o variable predefinida. Por ejemplo:
FRQA := $00001AFF
El cdigo anterior fija FRQA a $00001AFF. Dependiendo del campo de CTRMODE del registro de CTRA, este
valor en FRQA se puede sumar en el registro de PHSA en una frecuencia determinada por el reloj del sistema y
los pins primarios y/o secundarios de E/S.
3.3.26. IF
Comprueba una o varias condiciones y ejecuta un bloque de cdigo en el aso de que sean verdadero.
IF Condition(s)
IfStatement(s)
<ELSEIF Condition(s)
ElseIfStatement(s) >
<ELSE
3-36
www.microcontroladores.com
info@microcontroladores.com
ElseStatement(s) >
Explicacin
IF es uno de los dos comandos condicionales principales (IF y CASE) que ejecuta de forma condicional un bloque
del cdigo. IF se puede combinar opcionalmente con uno o ms comandos de ELSEIF y/o un comando de.
IF comprueba Condition(s) y, si es verdadero, ejecuta IfStatement(s). Si Condition(s) es falso, se comprueban los
siguientes Condition(s) opcionales de ELSEIF, en orden, hasta que se encuentra una lnea verdadera de la
condicin, entonces se ejecuta el bloque asociado de ElseIfStatement(s). Se ejecuta el bloque opcional de
ElseStatement(s) si no se encuentra ninguna condicin verdadera anterior.
La Sangra es critica
IMPORTANTE: La sangra es crtica. El lenguaje Spin confa en la sangra (de un espacio o ms) en lneas que
siguen comandos condicionales para determinar si pertenecen a ese comando o no. Para que la herramienta
Propeller indique stos bloques de cdigo agrupados lgicamente en pantalla, se puede presionar Ctrl + I y
encender los indicadores de grupo . Presionando Ctrl + I otra vez esa caracterstica se desactivara.
Sentencia IF Simple
La forma ms comn del comando IF condicional realiza una accin si, y solo si, una condicin es verdadera. Esto
se escribe como una declaracin IF seguida por una o ms lneas tabuladas de cdigo. Por ejemplo:
if X > 10
!outa[0]
!outa[1]
Si X es mayor que 10
Activa P0
Activa P1
Este ejemplo comprueba si X es mayor que 10; si es as, se activa el pin 0 de E/S. Sea o no verdadera la
condicin IF, el pin P1 de E/S se activara despus.
Como la lnea !outa[0] est tabulada desde la lnea IF, pertenece al bloque de IfStatement(s) y ejecutada
solamente si la condicin IF es verdadera. La lnea siguiente, !outa[1 ], no est tabulada desde la lnea IF, as que
esta se ejecuta despus Condition(s) sea o no verdad. Aqu hay otra versin del mismo ejemplo:
if X > 10
!outa[0]
!outa[1]
waitcnt(2_000 + cnt)
Si X es mayor que 10
Activa P0
Activa P1
Espera a 2,000 ciclos
Este ejemplo es muy similar al primero, excepto que ahora haya dos lneas de cdigo tabuladas de declaracin IF.
En este caso, si X es mayor que 10, se activa P0 entonces se activa P1 y finalmente se ejecuta la lnea del
waitcnt. Si, por el contrario, X no era mayor que 10, se saltaran las lneas de !outa[0] y !outa[1] (puesto que estn
tabuladas y son parte del bloque de IfStatement(s)) y se ejecuta la lnea de waitcnt (puesto que no est tabulada;
no es parte del bloque de IfStatement(s)).
3-37
www.microcontroladores.com
info@microcontroladores.com
Combinando Condiciones
El campo Condition(s) se evala como una sola condicin boleana, pero se puede componer de ms de una
expresin boleana combinando con los operadores AND y OR. Por ejemplo:
if X > 10 AND X < 100
Si X es mayor que 10 y menor que 100
Esta declaracin del IF sera verdadera si, y solo si, X es mayor que 10 y X es tambin menor que 100.
Es decir, X es verdadero si est en el rango de 11 a 99. Para hacer ms fcil leer este tipo de condiciones, se
pueden utilizar parntesis para agrupar cada subcondicin, por ejemplo como el siguiente.
if (X > 10) AND (X < 100)
X > 100
!outa[0]
else
!outa[1]
Aqu, si X es mayor que 100, se activa el pin 0 de E/S, si no, X debe ser menor o igual a 100, y se activa el pin 1
de E/S. Esta estructura de IF... ELSE, realiza siempre una activacin de P0 o P1; nunca ambos, y ninguno.
Uso de IF con ELSEIF
La tercera forma del comando condicional IF realiza una accin si una condicin es verdadera o una diversa
accin si esa condicin es falsa pero otra condicin es verdad, etc. Esto se escribe como declaracin del IF
seguida por su bloque de IfStatement(s), despus una o ms declaraciones de ELSEIF seguidos por sus bloques
respectivos de ElseIfStatement(s). Aqu hay un ejemplo:
if X > 100
!outa[0]
elseif X == 90
!outa[1]
Aqu, si X es mayor que 100, se activa el pin 0 de E/S, si no, si X es igual a 90, el pin 1 de E/S se activa, y si
ninguna de esas condiciones son verdaderas, ni se activa P0 ni P1. sta es una forma de escritura levemente ms
corta que el cdigo siguiente:
if X > 100
!outa[0]
else
if X == 90
!outa[1]
Ambos ejemplos realizan las mismas acciones, pero el primero es ms corto y generalmente se considera ms
fcil leer.
if X > 100
!outa[0]
elseif X == 90
!outa[1]
elseif X > 50
!outa[2]
3-38
www.microcontroladores.com
info@microcontroladores.com
En este ejemplo, tenemos tres condiciones y tres acciones posibles. Como el ejemplo anterior, si X es mayor que
100, se activa P0, si no, si X es igual a 90, se activa P1, pero si no se cumplen ninguna de las condiciones y X es
mayor que 50, se activa P2. Si no se cumple ninguna condicin, no se ejecuta ninguna accin.
Hay un concepto importante a observar sobre este ejemplo. Si X es 101 o superior, se activa P0, si X es 90, se
activa P1, y si X es de 51 a 89, o 91 a 100, P2. Esto es porque las condiciones del IF y de ELSEIF se comprueban
de forma secuencial y solo se ejecuta el cdigo de la primera condicin que resulte verdadera.
Esto significa que si hubiramos cambiado de orden los dos ELSEIFs, de modo que se comprobase primero "X >
50", tendramos un fallo en nuestro cdigo.
Por ejemplo:
if X > 100
!outa[0]
elseif X > 50
!outa[2]
elseif X == 90
!outa[1]
Pin(s) es una expresin opcional, o una expresin de rango, que especifica el pin ,o pins, de E/S para
acceder al puerto A (0-31) o al puerto B (32-63). Si se da una expresin nica, solamente se tendr
acceso al pin especificado. Si se da una expresin de tipo rango (dos expresiones en un formato rango;
x..y) se tendr acceso a los pins contiguos desde el comienzo de la expresin hasta el fin.
Explicacin
INA e INB son uno de los seis registros (DIRA, DIRB, INA, INB, OUTA y OUTB) que afectan directamente los pins
de E/S. El registro INA contiene los estados actuales de cada uno de los 32 pins de E/S en el puerto A; los bits 0 a
31 corresponden de P0 a P31. El registro de DIRB contiene los estados actuales de cada uno de los 32 pins de
E/S en el puerto B; los bits 0 a 31 corresponden de P32 a P63.
NOTA: INB est reservado para el uso futuro; el Propeller P8X32A no incluye los pins de E/S del puerto B.
3-39
www.microcontroladores.com
info@microcontroladores.com
INA es de solo-lectura y no est realmente implementado como un registro es mas como una direccin que, lee
los pins del puerto A E/S en el momento en el que es accedida. El resultado puede mostrar, un bit bajo (0) que
indica que el pin correspondiente E/S est a tierra, y un bit alto (1) que indica que el pin correspondiente de E/S
est a VDD (3.3 voltios).
Cada Cog tiene acceso a todos los pins de E/S en cualquier momento. Esencialmente, todos los pins de E/S estn
conectados directamente con cada Cog.
Debido a la naturaleza "wired-OR" de los pins de E/S, no hay contencin elctrica entre los Cogs, y se puede tener
acceso a los pins de E/S simultneamente. Es funcin del desarrollador de la aplicacin asegurarse de que
ningunos de los Cogs causan contencin lgica en el mismo pin de E/S durante el tiempo de ejecucin.
Uso de INA
Lee INA para conseguir el estado de los pins de E/S en ese momento. El ejemplo siguiente asume que Temp fue
creado en otra parte.
Temp := INA
Este ejemplo lee los estados de los 32 pins de E/S del puerto A y los deja en Temp.
Usando el campo opcional Pin(s), el Cog puede leer un pin de E/S (un bit) a la vez. Por ejemplo:
Temp := INA[16]
La lnea anterior lee el pin 16 de E/S y almacena su estado (0 o 1) en el bit ms bajo de Temp; el resto de los bits
de Temp se ponen a 0.
En Spin, el registro de INA soporta una forma especial de expresin, llamada una expresin de rango, que permite
que se lean un grupo de pins de E/S inmediatamente, sin leer los que quedan fuera del rango especificado. Para
leer los mltiples pins, contiguos de E/S, hay que utilizar una expresin de rango (como x..y) en el campo de
Pin(s).
Temp := INA[18..15]
Aqu, los cuatro bits ms bajos de Temp (3, 2, 1, y 0) se fijan a los estados de los pins 18, 17, 16, y 15,
respectivamente, y el resto de los bits de E/S de Temp se fijan a 0.
IMPORTANTE: El orden de los valores en una expresin de rango afecta a la utilizacin. Por ejemplo:
Temp := INA[15..18]
Aqu, los bits 3, 2, 1, y 0 de Temp se fijan a los estados de los pins 15, 16, 17, y 18 de E/S, respectivamente (al
contrario del ejemplo anterior).
3.3.28. LOCKCLR
Fija el semforo a falso y recoge su estado anterior.
LOCKCLR ( ID )
Devuelve: El estado previo del semforo (Verdadero o Falso).
Explicacin
3-40
www.microcontroladores.com
info@microcontroladores.com
LOCKCLR es uno de los cuatro comandos del semforo (LOCKNEW, LOCKRET, LOCKSET, y LOCKCLR) usados
para manejar los recursos que son definidos por el usuario y de uso mutuo-exclusivo. LOCKCLR fija a falso el
semforo de identificador ID semforo y recupera el estado anterior de ese semforo (verdadero o falso).
Lo siguiente asume que un Cog (ste u otro) ya ha comprobado un semforo usando LOCKNEW y ha compartido
ya el ID con este Cog, que se guarda como SemID. Tambin asume que este Cog tiene un array de longs llamado
LocalData.
PUB ReadResource | Idx
repeat until not lockset(SemID)
repeat Idx from 0 to 9
LocalData[Idx] := long[Idx]
lockclr(SemID)
PUB WriteResource | Idx
repeat until not lockset(SemID)
repeat Idx from 0 to 9
long[Idx] := LocalData[Idx]
lockclr(SemID)
Ambos mtodos, ReadResource y WriteResource, siguen las mismas reglas antes y despus de acceder al
recurso. Primero, esperan indefinidamente en el primer bucle de repeticin hasta que se bloquee el recurso; es
decir: se ha fijado con xito el semforo asociado a falso. Si LOCKSET devuelve verdadero, la condicin "until not
lockset..." es falso, y significa que actualmente hay otro Cog accediendo al recurso, de modo que el primer bucle
se repetir otra vez. Si LOCKSET devuelve falso, la condicin " until not lockset..." es verdadero, significando se
ha bloqueado el recurso. El segundo bucle de repeticin de cada mtodo, lee o escribe el recurso, a travs de las
declaraciones long[Idx] y LocalData[Idx]. La ultima lnea de cada mtodo, lockclr(SemID), fija el semforo asociado
del recurso a falso, lgicamente desbloqueando o liberando el recurso para otros usos.
3.3.29. LOCKNEW
Chequea un semforo nuevo y recoge su ID.
LOCKNEW
Devuelve: El idetificativo ID (0-7) del semforo que se ha chequeado o 1 si no haba ninguno disponible.
Explicacin
LOCKNEW es uno de los cuatro comandos del semforo (LOCKNEW, LOCKRET, LOCKSET, y LOCKCLR)
usados para manejar los recursos que son definidos por el usuario y usado como mutuo-exclusivo. LOCKNEW
comprueba un semforo nico, del Hub, y recupera la identificacin ID de ese semforo. Si no hay semforos
disponibles, el retorno de LOCKNEW es -1.
Sobre los semforos
El semforo es un mecanismo que se usa para la comunicacin entre dos o mas entidades. En el chip del
Propeller, un semforo es simplemente uno de los ocho bits globales en un registro protegido dentro del Hub. El
Hub mantiene un inventario de cuales son los semforos que estn en uso y sus estados actuales. Los Cogs
pueden comprobar, fijar, y devolver semforos segn lo necesario durante el tiempo de ejecucin para indicar si
un tem compartido, como puede ser un bloque de memoria, est disponible o no. Como los semforos son
manejados solamente por el Hub, solo puede afectarlo un Cog cada vez, siendo un mecanismo eficaz de control.
En las aplicaciones donde estn compartiendo la misma memoria dos o ms Cogs, se puede requerir una
herramienta como un semforo para evitar que ocurran colisiones. El Hub evita que tales colisiones ocurran en
datos elementales (como byte, word o long) en un momento dado, pero no puede prevenir las colisiones "lgicas"
en bloques de mltiples elementos (como un bloque de bytes, words, longs o cualquier combinacin de stos).
3-41
www.microcontroladores.com
info@microcontroladores.com
Los semforos sirven como flags que notifican a cada Cog cundo un bloque de memoria es seguro para
manipular o no.
Uso de LOCKNEW
Un recurso definido por el usuario, mutuo-exclusivo se debe instalar inicialmente por un Cog, entonces ese mismo
Cog debe comprobar un semforo nico en el que manejar ese recurso, utilizando LOCKNEW y pasar la
identificacin de ese semforo a cualquier otro Cog que la requiera. Por ejemplo:
VAR
byte SemID
PUB SetupSharedResource
<cdigo para instalar recursos definidos por el usuario, recursos compartidos>
if (SemID := locknew) == -1
<error, no hay semforos disponibles>
else
<comparte el valor de SemID con otros cogs>
El ejemplo llama a LOCKNEW y almacena el resultado en SemID. Si ese resultado es -1, es que ha ocurrido un
error. Si SemID no es -1, es que se ha chequeado un semforo valido y ese SemID necesita ser compartido con
otros Cogs junto con la direccin del recurso que SemID est utilizado. El mtodo usado para comunicar la
direccin de SemID y del recurso depende de la aplicacin, pero normalmente se pasan como parmetros al
mtodo Spin que se lanza en un Cog, o como el parmetro PAR al lanzar una rutina de ensamblador en un Cog.
Sugerencia de reglas para semforos
Lo siguiente son reglas sugeridas para el uso de semforos.
Los objetos que necesitan un semforo para manejar un recurso definido por el usuario, mutuo-exclusivo
deben comprobar un semforo usando LOCKNEW y guardar la identificacin de retorno, la llamamos aqu
SemID. Solamente un Cog debe comprobar este semforo. El Cog que comprob el semforo debe
comunicar SemID a el resto de los Cogs que utilicen el recurso.
Cualquier Cog que necesite tener acceso al recurso debe primero fijar con xito el semforo SemID. Se
fija con xito cuando LOCKSET(SemID) devuelve falso. Si LOCKSET devuelve verdadero, entonces otro
Cog debe tener acceso al recurso; por lo que se debe esperar e intentar otra vez ms adelante conseguir
fijarlo con xito.
El Cog que ha conseguido fijar un semforo con xito puede manipular el recurso como sea necesario.
Cuando haya finalizado, debe despejar el semforo con LOCKCLR(SemID) para que otro Cog pueda tener
acceso al recurso.
Si un recurso ya no es necesario, o llega a ser no-exclusivo, el semforo asociado se debe volver al pool
de semforos con LOCKRET(SemID). Normalmente esto lo el mismo Cog que comprueba originalmente el
semforo.
Las aplicaciones deben ser escritas para que los semforos no se accedan con LOCKSET o LOCKCLR a menos
que sea para una comprobacin.
3.3.30. LOCKRET
Libera el semforo al pool de semforos, hacindolo disponible otra vez para futuras peticiones LOCKNEW.
LOCKRET ( ID )
Explicacin
LOCKRET es uno de los cuatro comandos del semforo (LOCKNEW, LOCKRET, LOCKSET, y LOCKCLR) usados
para manejar los recursos que son definidos por el usuario y usados como mutuo-exclusivo. LOCKRET devuelve
un semforo, por su ID, de nuevo al pool de semforos del Hub para poder reutilizarse por otros Cogs mas
adelante. Por ejemplo:
3-42
www.microcontroladores.com
info@microcontroladores.com
LOCKRET(2)
Este ejemplo devuelve el semforo 2 de nuevo al Hub. Esto no previene los Cogs de acceder al semforo 2 mas
adelante, solamente permite que el Hub lo reasigne a los Cogs que llaman a LOCKNEW en el futuro. Las
aplicaciones deben ser escritas para que los semforos no se alcancen con LOCKSET o LOCKCLR a menos que
sea para una comprobacin.
Se debe tener en cuenta que los recursos definidos por el usuario no son bloqueados por el Hub ni por el
semforo que se ha comprobado. La caracterstica del semforo solamente proporciona los medios para que los
objetos bloqueen de forma cooperativa esos recursos. Es labor de los mismos objetos el decidir las reglas de uso
del semforo y qu recurso(s) ser gobernado por ellos. Adems, el Hub no asigna directamente un semforo al
Cog que llama a LOCKNEW, sino que simplemente las marca como que est siendo comprobado por un Cog;
cualquier otro Cog puede devolver semforos al pool de semforos disponibles. Tambin, cualquier Cog puede
tener acceso a cualquier semforo con los comandos de LOCKCLR y de LOCKSET incluso si esos semforos no
han sido comprobados; aunque generalmente no se recomienda debido a el estrago que puede causar con otros
objetos de la aplicacin.
3.3.31. LOCKSET
Fija el semforo a verdadero y recoge su estado anterior.
LOCKSET ( ID )
Devuelve: El estado previo del semforo (Verdadero o Falso).
Explicacin
LOCKSER es uno de los cuatro comandos del semforo (LOCKNEW, LOCKRET, LOCKCLR, y LOCKCLR)
usados para manejar los recursos que son definidos por el usuario y de uso mutuo-exclusivo. LOCKCLR fija a
falso el semforo de identificador ID semforo y recupera el estado anterior de ese semforo (verdadero o falso).
Lo siguiente asume que un Cog (ste u otro) ya ha comprobado un semforo usando LOCKNEW y ha compartido
ya el ID con este Cog, que se guarda como SemID. Tambin asume que este Cog tiene un array de longs llamado
LocalData.
PUB ReadResource | Idx
repeat until not lockset(SemID)
repeat Idx from 0 to 9
LocalData[Idx] := long[Idx]
lockclr(SemID)
PUB WriteResource | Idx
repeat until not lockset(SemID)
repeat Idx from 0 to 9
long[Idx] := LocalData[Idx]
lockclr(SemID)
Ambos mtodos, ReadResource y WriteResource, siguen las mismas reglas antes y despus de acceder al
recurso. Primero, esperan indefinidamente en el primer bucle de repeticin hasta que se bloquee el recurso; es
decir: se ha fijado con xito el semforo asociado a falso. Si LOCKSET devuelve verdadero, la condicin "until not
lockset..." es falso, y significa que actualmente hay otro Cog accediendo al recurso, de modo que el primer bucle
se repetir otra vez. Si LOCKSET devuelve falso, la condicin " until not lockset..." es verdadero, significando se
ha bloqueado el recurso. El segundo bucle de repeticin de cada mtodo, lee o escribe el recurso, a travs de las
declaraciones long[Idx] y LocalData[Idx]. La ultima lnea de cada mtodo, lockclr(SemID), fija el semforo asociado
del recurso a falso, lgicamente desbloqueando o liberando el recurso para otros usos.
3-43
www.microcontroladores.com
info@microcontroladores.com
3.3.32. LONG
Declara smbolos de tamao long, datos de alineacin long, o n long de lectura / escritura de la memoria principal.
LONG Symbol <[Count]>
LONG Data
LONG [BaseAddress] <[Offset]>
Explicacin
LONG es una de las tres declaraciones de propsito mltiple (BYTE, WORD, y LONG) que declaran o operan en
memoria. El LONG se puede utilizar para:
1) declarar un smbolo de tamao long o un array de elementos de tamao long en un bloque del VAR, o
2) declarar datos de alineacin long, y de tamao long, en un bloque de DAT, o
3) leer o escribir un long en memoria principal en una direccin base con un ajuste opcional.
Declaracin Variable del Long (Sintaxis 1)
En bloques del VAR, la sintaxis 1 del LONG se utiliza para declarar las variables globales, simblicas de tamao
long, o es cualquier array de longs. Por ejemplo:
VAR
long Temp
long List[25]
'Temp es un long
'Str es un array de long
El ejemplo anterior declara dos variables, Temp y Str. Temp es simplemente una variable de tamao long. La
lnea siguiente utiliza el campo de Count opcional para crear un array de 25 elementos variables llamado List.
Temp y List se pueden alcanzar desde cualquier mtodo PUB o PRI dentro del mismo objeto que este bloque del
VAR. Un ejemplo:
PUB SomeMethod
Temp := 25_000_000
Str[0] := 500_000
Str[1] := 9_000
Str[24] := 60
El ejemplo anterior declara dos smbolos de datos, MyData y MyList. MyData seala el comienzo de datos long en
memoria principal. Los valores de MyData, en memoria principal, son 640,000 y $BB50 respectivamente. MyList
utiliza una sintaxis especial del bloque DAT para un LONG que crea datos de tamao long pero de alineacin Byte
en memoria principal. Los valores de MyList, en memoria principal, son $ FF995544 y 1,000, respectivamente.
3-44
www.microcontroladores.com
info@microcontroladores.com
Cuando se accede un byte cada vez, MyList contiene $44, $55, $99, $FF, 232 y 768, 0 y 0 puesto que los datos se
almacenan en formato little-endian.
Estos datos se compilan en el objeto y en la aplicacin resultante como parte de la seccin ejecutable de cdigo y
se pueden alcanzar usando la forma de lectura / escritura, sintaxis 3, del LONG (ver abajo).
Lectura / escritura de Longs en memoria principal (Sintaxis 3)
En bloques PUB y PRI, la sintaxis 3 del LONG se utiliza para leer o para escribir valores long en memoria
principal. Si se asume que el objeto contiene el bloque DAT del ejemplo de arriba, se poda utilizar el siguiente
ejemplo para tener acceso a esos datos.
PUB GetData | Index, Temp
Temp := LONG[MyData]
<do something with Temp>
repeat Index from 0 to 1
Temp := LONG[MyList][Index]
<do something with Temp>
La primera lnea del mtodo GetData, arriba, utiliza la declaracin del LONG para leer un byte de memoria
principal en localizacin MyData y lo almacena en Temp, en este caso, el valor 640,000. A continuacin en el
bucle de REPEAT, la declaracin del LONG lee un long de memoria principal en localizacin MyList + el ndice
Index y lo almacena en Temp. Puesto que Index se fija a 0, el primer long de MyString se lee, $FF995544. La
siguiente vuelta del bucle lee el siguiente long, MyString + 1 (1,000).
Usando una sintaxis similar, los longs de memoria principal se pueden escribir tambin, mientras sean
localizaciones RAM. Por ejemplo:
LONG[MyList][0] := 2_000_000_000
MyList
Inicializar Buff a 0
3-45
www.microcontroladores.com
info@microcontroladores.com
La primera lnea del mtodo principal, arriba, fija el array entero Buff de 100-longs a ceros. LONGFILL es ms
rpido en esta tarea que es un bucle dedicado de la REPEAT.
3.3.34. LONGMOVE
Copia longs de una regin a otra en memoria principal.
LONGMOVE (DestAddress, SrcAddress, Count )
DestAddress es una expresin que especifica la localizacin destino en memoria principal para copiar el
primer long.
SrcAddress es una expresin que especifica la localizacin en memoria principal del primer long fuente para
copiar.
Count es una expresin que indica el nmero de longs fuente para copiar al destino.
Explicacin
LONGMOVE es uno de tres comandos (BYTEMOVE, WORDMOVE, y LONGMOVE) usados para copiar bloques
de memoria principal a partir de una rea a otra. LONGMOVE copia Count longs de memoria principal que
empiezan con SrcAddress a la memoria principal que comienza en DestAddress.
Uso de LONGMOVE
LONGMOVE es una gran manera de copiar grandes bloques de memoria long. Por ejemplo:
VAR
long Buff1[100]
long Buff2[100]
PUB Main
longmove(@Buff2, @Buff1, 100)
La primera lnea del mtodo principal, arriba, copia el array entero de 100-longs Buff1 al array Buff2. LONGMOVE
es ms rpido en esta tarea que es un bucle dedicado de REPEAT.
3.3.35. LOOKDOWN, LOOKDOWNZ
Recoge el ndice de un valor en una lista.
LOOKDOWN ( Value : ExpressionList )
LOOKDOWNZ ( Value : ExpressionList )
Devuelve: Posicin del ndice de base-uno (LOOKDOWN) o posicin del ndice de base-cero (LOOKDOWNZ) de
un valor Value en la ExpresionList, o 0 si Value no se encontr.
Explicacin
LOOKDOWN y LOOKDOWNZ son los comandos que recuperan ndices de valores de una lista de valores.
LOOKDOWN vuelve la posicin de ndice de base-uno (1..N) del valor de ExpressionList. LOOKDOWNZ es como
LOOKDOWN pero devuelve la posicin de ndice de base-cero (0..N-1). Para ambos comandos, si el valor no se
encuentra en ExpressionList entonces se devuelve 0.
3-46
www.microcontroladores.com
info@microcontroladores.com
Index es una expresin que indica la posicin del valor deseado en ExpressionList. Para LOOKUP, Index
es de base-uno (1..N). Para LOOKUPZ, Index es de base cero (0..N-1).
ExpressionList es una lista de expresiones separada por comas. Tambin se permiten los strings
acotados de caracteres; se tratan como lista de caracteres separadas por comas.
Explicacin
LOOKUP y LOOKUPZ son los comandos que recuperan entradas de una lista de valores. LOOKUP devuelve el
valor de ExpressionList que est situado en la posicin de base-uno (1..N) dada por Index. LOOKUPZ es como
LOOKUP pero utiliza un ndice de base-cero (0..N-1). Para ambos comandos, si el ndice est fuera del rango
entonces se devuelve 0.
Uso de LOOKUP o LOOKUPZ
LOOKUP y LOOKUPZ son tiles para mapear un sistema contiguo de nmeros (1, 2, 3, etc. - o 0, 1, 2, los etc.) a
un sistema de los nmeros no-contiguos (45, -103, 18, de etc.). El ejemplo siguiente asume que Print es un
mtodo creado en otra parte.
PUB ShowList | Index, Temp
3-47
www.microcontroladores.com
info@microcontroladores.com
Repite 10 veces
Salta si X = 4
Limpia o fija a cero las localizaciones de RAM
Muestra X por pantalla
El cdigo anterior limpia iterativamene las localizaciones RAM y muestra el valor de X por pantalla, pero con una
excepcin. Si X es igual a 4, la declaracin IF ejecuta el comando NEXT Esto tiene el efecto de limpiar (fijar a 0)
las localizaciones de la RAM de $7000 a $7003 y de $7005 a $7009 y de mostrar 0, 1, 2, 3, 5, 6, 7, 8, 9 por
pantalla.
El comando NEXT se puede utilizar solamente dentro de un bucle REPEAT; si no, ocurrira un error.
3.3.38. OBJ
Declara un Bloque Objeto.
OBJ
Symbol <[Count]>: ObjectName < Symbol <[Count]>: ObjectName>
3-48
www.microcontroladores.com
info@microcontroladores.com
ObjectName es el nombre de fichero, sin la extensin, del objeto deseado. El nombre del objeto puede
contener cualquier carcter vlido de fichero; los caracteres no permitidos son \, /,:, *?, ", y |.
Explicacin
El bloque del objeto es una seccin del cdigo fuente que declara qu objetos se utilizan y los smbolos del objeto
que los representan. sta es un de las seis declaraciones especiales (CON, VAR, OBJ, PUB, PRI, y DAT) que
proporcionan la estructura inherente al lenguaje Spin.
Las declaraciones del objeto comienzan con OBJ en una lnea seguida por una o ms declaraciones. OBJ debe
comenzar en la columna 1 (la columna extrema izquierda) de la lnea en la que se encuentra y las lneas
siguientes se deben tabular por lo menos un espacio.
OBJ
Num : Numbers
Term : TV_Terminal
Este ejemplo define Num como smbolo de objeto de tipo "Numbers" y Term como smbolo de objeto de tipo
"TV_Terminal". Los mtodos pblicos y privados pueden entonces referirse a estos objetos usando los smbolos
del objeto como en el ejemplo siguiente.
PUB Print | S
S := Num.ToStr(LongVal, Num#DEC)
Term.Str(@S)
Este mtodo pblico, Print, llama al mtodo de ToStr de Numbers y tambin al mtodo Str de TV_Terminal. Esto
se hace usando los smbolos de Num y de Term del objeto seguido por la referencia del mtodo del Objeto (un
punto .') y finalmente el nombre del mtodo a llamar. Num.ToStr, por ejemplo, llama al mtodo pblico de ToStr
del objeto Numbers. Term.Str llama al mtodo pblico Str de TV_Terminal. En este caso el Num.ToStr tiene dos
parmetros, entre parntesis, y Term.Str tiene un parmetro.
El segundo parmetro de la llamada de Num.ToStr es Num#DEC. El smbolo # es el smbolo de referencia del
Objeto-Constante; da acceso a las constantes de un objeto. En este caso, Num#DEC se refiere a la constante
DEC (formato decimal) en el objeto Numbers.
Las instancias mltiples de un objeto se pueden declarar con el mismo smbolo de objeto usando la sintaxis del
array y pueden accedidos de manera similar al del array. Por ejemplo:
OBJ
PWM[2] : PWM
PUB GenPWM
PWM[0].Start
PWM[1].Stara
Este ejemplo declara PWM como un array de dos objetos (dos casos del mismo objeto). Al mismo objeto tambin
se le ha llamado "PWM". El mtodo pblico, GenPWM, llama al mtodo Start de cada caso usando los ndices 0 y
1 con el smbolo de objeto del array, PWM.
Ambas instancias del objeto PWM se compilan en la aplicacin como una copia de su cdigo de programa (PUBs,
PRIs, y DATs) y dos copias de sus bloques variables (VARs). Esto es porque, para cada instancia, el cdigo es
igual pero puede variar el espacio para operar independiente de la otra.
3-49
www.microcontroladores.com
info@microcontroladores.com
Unitaio/Binario
Normal/Asignado
Expresin constante y/o variable
Nivel de precedencia
3-50
www.microcontroladores.com
info@microcontroladores.com
Unitario / Binario
Cada operador es unitario o binario por naturaleza. Los operadores unitarios son los que funcionan en un nico
operando. Por ejemplo:
!Flag
3-51
www.microcontroladores.com
info@microcontroladores.com
Los operadores binarios son los que funcionan en dos operandos. Por ejemplo:
X+Y
Num << 4
suma X e Y
desplaza Num a la derecha 4 bits
Hay que observar que el trmino "operador binario" significa "dos operandos," y no tiene nada que ver con los
dgitos binarios. Para distinguir a los operadores cuya funcin se relaciona con los dgitos binarios, utilizaremos el
trmino "bitwise" o de tipo bit.
Normal / Asignacin
Los operadores normales, como Suma ` + ' y desplazamiento a la izquierda <<', operan
proporcionan el resultado para el uso del resto de expresiones, sin afectar al operando o
operadores de asignacin, sin embargo, escriben su resultado en a la variable sobre la
sobre la variable a su izquierda (binaria), adems de proporcionar el resultado para
expresiones.
A continuacin se muestra un ejemplo de operadores:
Count++
Data >>= 3
Los operadores binarios tienen formas especiales que terminan en igual ` = ' que los hace operadores de
asignacin. Los operadores unitarios no tienen forma especial de asignacin; algunos asignan siempre mientras
que otros asignan solamente en situaciones especiales.
Expresiones Constantes y/o Variables
Los operadores que tienen atributos de expresiones enteras constantes pueden ser utilizados en tiempo de
ejecucin en expresiones variables, y en de tiempo de compilacin en expresiones constantes. Los operadores
que tienen atributos de expresiones de punto flotante constante pueden ser utilizados en expresiones constantes
en tiempo de compilacin. Los operadores sin atributos de expresiones constantes pueden ser utilizados
solamente en tiempo de ejecucin en expresiones variables. La mayora de los operadores tienen una forma
normal, de no asignacin, que permite que se utilicen en expresiones constantes y variables.
Nivel de Precedencia
Cada operador tiene un nivel asignado de precedencia que se determina cuando tomar accin en relacin a otros
operadores dentro de la misma expresin. Por ejemplo, se sabe comnmente que las reglas algebraicas toman la
multiplicacin y la divisin como operaciones de mayor nivel de precedencia que las operaciones de suma y resta.
Adems, la multiplicacin y la divisin son conmutables; ambos estn en el mismo nivel de precedencia, as que
sus operaciones dan como resultado el mismo valor sin importar el orden en que se realizan. Los operadores
conmutativos siempre se avalan de izquierda a derecha a menos que haya un parntesis que elimine esa regla.
El chip del Propeller aplica las reglas de orden de operaciones igual que en lgebra.
Despus de estas reglas, el Propeller evaluar:
X = 20 + 8 * 4 6 / 2
... que dar como resultado 49; es decir, 8 * 4 = 32, 6/2 = 3, y 20 + 32 - 3 = 49. Si se quiere que la expresin se
evale de manera diferente, basta con utilizar parntesis para establecer un nivel superior de preferencia.
Por ejemplo:
X = (20 + 8) * 4 6 / 2
Este ejemplo, evaluar primero la expresin entre parntesis, 20 + 8, haciendo que ahora esta expresin de cmo
resultado 109, en vez de 49.
3-52
www.microcontroladores.com
info@microcontroladores.com
Los operadores con una precedencia ms alta se procesan antes que operadores de una precedencia ms baja.
La nica excepcin es cuando se incluyen parntesis; que eliminan cada nivel de precedencia.
Asignacin Intermedia
El motor de expresiones del chip Propeller permite, y procesa, operadores de asignacin en etapas intermedias.
Esto se llaman "asignaciones intermedias" y se pueden utilizar para realizar clculos complejos en menos cdigo.
Por ejemplo, la ecuacin siguiente depende de X, y X + 1.
X := X - 3 * (X + 1) / ||(X + 1)
La misma declaracin se poda rescribir, aprovechndose de la caracterstica de la asignacin intermedia del
operador del incremento:
X := X++ - 3 * X / ||X
Asumiendo que X comienza en -5, ambas declaraciones dan como resultado -2, y ambas almacenan ese valor en
X cuando acaban. La segunda declaracin, sin embargo, lo hace dependiendo de una asignacin intermedia (la
parte de X++) para simplificar el resto de la declaracin. El del operador del incremento ++ ' se evala en primer
lugar (precedencia ms alta) y lo incrementa X de -5 a -4. Puesto que esto es un " post incremento " primero
devuelve el valor original del X, -5, a la expresin y entonces escribe el nuevo valor, -4, en X. De esta forma:
5 3 * -4 / ||-4 . -5 3 * -4 / 4 . -5 3 * -1 . -5 -3 = -2
De vez en cuando, el uso de asignaciones intermedias puede comprimir mltiples lneas de expresiones en una
sola expresin, dando por resultado un tamao de cdigo levemente ms pequeo y una ejecucin ms rpida.
Asignacin Constante =
El operador de asignacin constante se usa dentro de bloques CON para declarar constantes en tiempo de
compilacin. Por ejemplo,
CON
_xinfreq = 4096000
WakeUp = %00110000
Este cdigo fija el smbolo _xinfreq a 4.096.000 y el smbolo wakeUp a %00110000. Durante el resto del programa
el compilador utilizar estos nmeros en lugar de sus respectivos smbolos.
Estas declaraciones son expresiones constantes, y pueden ser utilizadas por operadores normales para calcular
un valor constante final en tiempo de compilacin. Por ejemplo, puede estar ms claro rescribir el ejemplo anterior
como sigue:
CON
_xinfreq
Reset
Initialize
WakeUp
= 4096000
= %00100000
= %00010000
= Reset & Initialize
Aqu, wakeUp todava est fijado a %00110000 en tiempo de compilacin, pero es obvio que el smbolo del
wakeUp contiene los cdigos binarios Reset y Initialize para esa aplicacin particular.
Los ejemplos anteriores crean constantes de entero con signo de 32-bits; aunque, tambin es posible crear
constantes de 32-bits de punto flotante. Para ello, la expresin se debe expresar como valor de punto flotante en
una de las tres maneras siguientes1) como nmero entero seguido por un punto y por lo menos un dgito, 2) como
nmero entero con una E seguido por un valor del exponente, o 3) 1 y 2. Por ejemplo:
CON
OneHalf = 0.5
Ratio
=
Miles
= 10e5
2.0 / 5.0
3-53
www.microcontroladores.com
info@microcontroladores.com
El cdigo anterior crea tres constantes de punto flotante. OneHalf es igual a 0.5, el Ratio es igual a 0.4 y Miles es
igual a 1.000.000.
Se observa que si Ratio fuera definido como 2/5 en vez de 2.0/5.0, la expresin sera tratada como constante
entera y el resultado sera una constante entera igual a 0. Para las expresiones constantes de punto flotante, cada
valor dentro de la expresin debe ser un valor de punto flotante; no se pueden mezclar valores de nmero entero y
de punto flotante como en Ratio = 2/5.0. Se puede, sin embargo, utilizar la directiva FLOAT para convertir un valor
de nmero entero a un valor de punto flotante, como Ratio = FLOAT(2)/5.0.
El compilador del Propeller maneja constantes de punto flotante como nmeros reales de simple precisin segn
lo descrito por el estndar IEEE-754.
Asignacin Variable:=
El operador de asignacin variable se usa dentro de mtodos (los bloques PUB y PRI) para asignar un valor a una
variable. Por ejemplo,
Temp := 21
Triple := Temp * 3
En el tiempo de ejecucin este cdigo fijara la variable de Temp igual a 21 y fijara Triple a 21 * 3, que es 63.
Como con otros operadores de asignacin, el operador de asignacin variable puede ser utilizado dentro de
expresiones para asignar resultados intermedios, por ejemplo:
Triple := 1 + (Temp := 21) * 3
Este ejemplo primero fija Temp a 21, entonces multiplica Temp por 3 y le suma 1, finalmente asignando el
resultado, 64, a Triple.
Suma +, +=
El operador de la Suma, suma dos valores. Puede ser utilizado en expresiones variables y constantes. Ejemplo:
X := Y + 5
La Suma tiene una forma de asignacin, + =, que utiliza la variable de su izquierda como el primer operando y la
destino del resultado. Por ejemplo,
X += 10
Forma abreviada de X := X + 10
3-54
www.microcontroladores.com
info@microcontroladores.com
X -= 10
Forma abreviada de X := X - 10
Aqu, 10 se resta del valor de X y el resultado se almacena en X. La forma de la asignacin de la resta tambin se
puede utilizar dentro de expresiones para los resultados intermedios.
Negativo - (forma untara de Resta)
Negativo es la forma untara de la Resta. Negativo, activa el signo del valor que se encuentra a su derecha; un
valor positivo se convierte en negativo y un valor negativo en positivo. Por ejemplo:
Val := -2 + A
Negativo es un operador de asignacin cuando es el nico operador a la izquierda de una variable en una lnea.
Por ejemplo:
-A
Esto negara el valor de A y almacenara el resultado de nuevo en A.
Decremento, pre- o post- - -
El operador Decremento es un operador especial, un operador inmediato que decrementa, en uno, una variable y
asigna el nuevo valor a sa misma variable. Puede ser utilizada solamente en expresiones variables en tiempo de
ejecucin. El decremento tiene dos formas, pre-decremento y post-decremento, dependiendo del lado en el que
aparece variable. La forma del pre-decremento aparece a la izquierda de una variable y la forma del postdecremento aparece a la derecha de una variable. Esto es extremadamente til en la programacin puesto que
hay muchas situaciones que llaman al decremento de una variable justo antes o despus de el uso del valor de
esa varible. Por ejemplo:
Y := --X + 2
El ejemplo anterior muestra la forma de pre-decremento; significa "decrementar antes de proporcionar el valor
para la operacin siguiente". Decrementa el valor de X en uno, escribe que resultado en X y proporciona ese
resultado al resto de la expresin. Si X comenzase con el valor 5 en este ejemplo, --X almacenara 4 en X,
entonces se evala la expresin, 4 + 2, finalmente escribiendo el resultado, 6, en Y. Despus de esta declaracin,
X iguala 4 e Y es igual a 6.
Y := X-- + 2
El ejemplo anterior muestra la forma de post-decremento; significa "decrementar despus de proporcionar el valor
para la operacin siguiente". Proporciona el valor actual de X para la operacin siguiente en la expresin, despus
decrementa el valor de X en uno y escribe ese resultado a X. Si X comenzase con 5 en este ejemplo, X-proporcionara el valor actual para la expresin (5 + 2) y entonces almacenaran 4 en X. Se evala la expresin 5
+ 2 y el resultado, 7, se almacena en Y. Despus de esta sentencia, X es igual a 4 e Y es igual a 7.
Como el decremento es siempre un operador de asignacin, pueden aplicarse tambin las reglas de asignaciones
intermedias. Asumiendo que X comienza con 5 como los ejemplos siguientes.
Y := --X + X
Aqu, primero X se fija a 4, entonces se evala 4 + 4 e Y se fija a 8.
Y := X-- + X
Aqu, el valor actual del x, 5, se guarda para la operacin siguiente (la suma) y X se decrementa a 4, entonces se
evala 5 + 4 e Y se fija a 9.
Incremento, pre- o post- + +
El operador Incremento es un operador especial, un operador inmediato que incrementa, en uno, una variable y
asigna el nuevo valor a sa misma variable. Puede ser utilizada solamente en expresiones variables en tiempo de
3-55
www.microcontroladores.com
info@microcontroladores.com
ejecucin. El incremento tiene dos formas, pre-incremento y post-incremento, dependiendo del lado en el que
aparece variable. La forma del pre-incremento aparece a la izquierda de una variable y la forma del postincremento aparece a la derecha de una variable. Esto es extremadamente til en la programacin puesto que hay
muchas situaciones que llaman al incremento de una variable justo antes o despus de el uso del valor de esa
varible. Por ejemplo:
Y := ++X 4
El ejemplo anterior muestra la forma de pre-incremento; significa "incrementar antes de proporcionar el valor para
la operacin siguiente". Incrementa el valor de X en uno, escribe que resultado en X y proporciona ese resultado al
resto de la expresin. Si X comenzase con el valor 5 en este ejemplo, ++X almacenara 6 en X, entonces se
evala la expresin, 6 - 4, finalmente escribiendo el resultado, 2, en Y. Despus de esta declaracin, X iguala 6 e
Y es igual a 2.
Y := X++ - 4
El ejemplo anterior muestra la forma de post-incremento; significa "incrementar despus de proporcionar el valor
para la operacin siguiente". Proporciona el valor actual de X para la operacin siguiente en la expresin, despus
incrementa el valor de X en uno y escribe ese resultado a X. Si X comenzase con 5 en este ejemplo, X++
proporcionara el valor actual para la expresin (5 -4) y entonces almacenaran 4 en X. Se evala la expresin 5 4 y el resultado, 1, se almacena en Y. Despus de esta sentencia, X es igual a 4 e Y es igual a 1.
Como el incremento es siempre un operador de asignacin, pueden aplicarse tambin las reglas de asignaciones
intermedias. Asumiendo que X comienza con 5 como los ejemplos siguientes.
Y := ++X + X
Aqu, primero X se fija a 6, entonces se evala 6 + 6 e Y se fija a 12.
Y := X-- + X
Aqu, el valor actual del x, 5, se guarda para la operacin siguiente (la suma) y X se incrementa a 6, entonces se
evala 5 + 6 e Y se fija a 11.
Multiplicacin, devuelve bajo*, *=
A este operador tambin se le llama Multiply-Low. Puede ser utilizado en expresiones variables y constantes.
Cuando se utiliza con expresiones variables o expresiones de constante entera, este operando multiplica dos
valores y devuelve los 32 bits ms bajos del resultado de 64-bits. Cuando se usa con expresiones constantes de
punto flotante, Multiplicacin multiplica dos valores y devuelve el resultado de 32-bits de punto flotante de simple
precisin. Ejemplo:
X := Y * 8
La Multiplicacin tiene una forma de asignacin, * =, que utiliza la variable de su izquierda como el primer
operando y destino del resultado. Por ejemplo,
X *= 20
Forma abreviada de X := X * 20
Aqu, el valor de X es multiplicado por 20 y los 32 bits ms bajos del resultado se almacenan en X. La forma de la
asignacin tambin se puede utilizar con las expresiones para resultados intermedios.
Multiplicacin, devuelve alto **, **=
A este operador tambin se le llama Multiply-High. Puede ser utilizado en expresiones variables y constantes.
Cuando se utiliza con expresiones variables o expresiones de constante entera, este operando multiplica dos
valores y devuelve los 32 bits ms altos del resultado de 64-bits. Ejemplo:
3-56
www.microcontroladores.com
info@microcontroladores.com
X := Y ** 8
Si Y comenzase con el valor de 536.870.912 (229) entonces Y ** 8 es igual a 1; el valor sol los 32 bits superiores
del resultado. La Multiplicacin tiene una forma de asignacin, * =, que utiliza la variable de su izquierda como el
primer operando y destino del resultado. Por ejemplo,
X **= 20
Forma abreviada de X := X ** 20
Aqu, el valor de X es multiplicado por 20 y los 32 bits ms altos del resultado se almacenan en X. La forma de la
asignacin tambin se puede utilizar con las expresiones para resultados intermedios.
Divisin /, /=
Divisin puede ser utilizado en expresiones variables y constantes. Cuando se utiliza con expresiones variables o
expresiones de constante entera, este operando divide dos valores y devuelve el resultado de los 32 bits del
numero entero. Cuando se usa con expresiones constantes de punto flotante, divide dos valores y devuelve el
resultado de 32-bits de punto flotante de simple precisin. Ejemplo:
X := Y / 4
La divisin tiene una forma de asignacin, /=, que utiliza la variable de su izquierda como el primer operando y
destino del resultado. Por ejemplo,
X /= 20
Forma abreviada de X := X / 20
Aqu, el valor de X es dividido por 20 y el resultado del nmero entero se almacena en X. La forma de la
asignacin de la divisin tambin se puede utilizar en las expresiones para los resultados intermedios.
Resto //, //=
El Resto se puede utilizar en expresiones variables y constantes enteras, pero no en expresiones constantes de
punto flotante. El resto, divide un valor por otro y devuelve el resto de 32-bits de nmero entero. Ejemplo:
X := Y // 4
Si Y comenzase con el valor 5 entonces Y // 4 es igual a 1, significando que el resto es .
El Resto tiene una forma de asignacin, //=, que utiliza la variable de su izquierda como el primer operando y
destino del resultado. Por ejemplo,
X //= 20
Forma abreviada de X := X // 20
Aqu, el valor de X es dividido por 20 y el resto del nmero entero 32-bits se almacena en X. La forma de la
asignacin del resto tambin se puede utilizar en las expresiones para los resultados intermedios.
Limite Mnimo #>, #>=
El operador Limite Mnimo compara dos valores y devuelve el valor ms alto. El Limite Mnimo se puede utilizar en
expresiones variables y constantes. Ejemplo:
X := Y - 5 #> 100
3-57
www.microcontroladores.com
info@microcontroladores.com
El ejemplo anterior resta 5 de Y y limita el resultado a un valor mnimo a 100. Si Y fuera 120 entonces 120 - 5 =
115; seria mayor que 100 as que X se fija a 115. Si Y fuera 102 entonces 102 - 5 = 97; es menos de 100 as que
X se fija a 100.
El Limite Mnimo tiene una forma de asignacin, #>=, que utiliza la variable de su izquierda como el primer
operando y destino del resultado. Por ejemplo,
X #>= 50
Forma abreviada de X := X // 20
Valor Absoluto ||
El operador del valor absoluto, tambin llamado Absoluto, devuelve el valor absoluto (la forma positiva) de un
nmero. El valor absoluto se puede utilizar en expresiones variables y constantes. Cuando se utiliza con
expresiones variables o expresiones de constante entera, el valor absoluto devuelve el resultado de 32-bits de
nmero entero. Cuando se utiliza con expresiones constantes de punto flotante, el valor absoluto devuelve el
resultado de 32-bits de punto flotante de simple-precisin. Ejemplo:
X := ||Y
3-58
www.microcontroladores.com
info@microcontroladores.com
Si Y fuera -15, el valor absoluto, 15, se almacenara en X. El valor absoluto se convierte en un operador de
asignacin cuando es el nico operador a la izquierda de una variable en una lnea. Por ejemplo:
||Y
Esto almacenara el valor absoluto de Y nuevamente dentro de Y.
Extensin del signo 7 o Post-Clear~
Este operador es un operador especial, inmediato que tiene un propsito dual dependiendo del lado de la variable
en el que aparezca. Puede ser utilizado solamente en expresiones variables en tiempo de ejecucin. La forma del
la Extensin de Signo 7 del operador aparece a la izquierda de una variable y la forma Post-Clear aparece a la
derecha de una variable. Lo siguiente es un ejemplo de la forma del operador Extensin de Signo 7:
Y := ~X + 25
El operador Extensin de Signo 7 en este ejemplo extiende el signo del valor, X en este caso, del bit 7 hasta el bit
31. Un entero con signo de 32-bits se almacena en forma de complemento a dos y el bit ms significativo (31)
indica el valor del signo (positivo o negativo). Puede haber veces donde los clculos sobre datos simples dan lugar
a valores de tamao byte que se deben tratar como entero con signo en el rango de -128 a +127. Cuando se
necesita realizar otros clculos con esos valores de tamao byte, se debe utilizar el operador Extensin de Signo 7
para convertir el nmero en forma apropiada de 32-bits de entero con signo.
En el ejemplo anterior, si se asume que X representa el valor -20, que en forma de 8-bits en complemento a dos
es realmente el valor 236 (%11101100). La porcin de la expresin ~X extiende el signo de bit del bit 7 hasta el bit
31, convirtiendo el nmero a la forma 32-bits apropiada del complemento a dos de -20 (%11111111 11111111
11111111 11101100). Sumando 25 al valor de signo extendido el resultado seria 5, el resultado previsto, mientras
que habra dado lugar a 261 sin la extensin de signo apropiada. Lo siguiente es un ejemplo de la forma del
operador Post-Clear.
Y := X~ + 2
El operador Post-Clear en este ejemplo fija la variable a 0 (todos los bits a bajo) despus de proporcionar su valor
actual para la operacin siguiente. En este caso, si X fuera 5, el valor de la expresin seria (5 + 2) y se
almacenara 0 en X.
Extensin de Signo 15 o Post-Set ~~
Este operador es un operador especial, inmediato que tiene un propsito dual dependiendo en de el cual el lado
de la variable l aparezca. dependiendo del lado de la variable en el que aparezca. Puede ser utilizado solamente
en expresiones variables en tiempo de ejecucin. La forma del la Extensin de Signo 15 del operador aparece a la
izquierda de una variable y la forma Post-Set aparece a la derecha de una variable. Lo siguiente es un ejemplo de
la forma del operador Extensin de Signo 15:
Y := ~~X + 50
El operador Extensin de Signo 15 en este ejemplo extiende el signo del valor, X en este caso, del bit 15 hasta el
bit 31. Un entero con signo de 32-bits se almacena en forma de complemento a dos y el bit ms significativo (31)
indica el valor del signo (positivo o negativo). Puede haber veces donde los clculos sobre datos simples dan lugar
a valores de tamao word que se deben tratar como entero con signo en el rango de -32768 a +32767. Cuando se
necesita realizar otros clculos con esos valores de tamao byte, se debe utilizar el operador Extensin de Signo
15 para convertir el nmero en forma apropiada de 32-bits de entero con signo.
En el ejemplo anterior, si se asume que X representa el valor -300, que en forma de 16-bits en complemento a dos
es realmente el valor 65.236 (%11111110 11010100). La porcin de la expresin ~~X extiende el signo de bit del
bit 15 hasta el bit 31, convirtiendo el nmero a la forma 32-bits apropiada del complemento a dos de -300
(%11111111 11111111 11111110 11010100). Sumando 50 al valor de signo extendido el resultado seria -250, el
resultado previsto, mientras que habra dado lugar a 65.286 sin la extensin de signo apropiada. Lo siguiente es
un ejemplo de la forma del operador Post-Set.
3-59
www.microcontroladores.com
info@microcontroladores.com
Y := X~~ + 2
El operador Post-Set en este ejemplo fija la variable a -1(todos los bits a alto) despus de proporcionar su valor
actual para la operacin siguiente.
Desplazamiento Aritmtico a la Derecha ~>, ~>=
El operador Desplazamiento Aritmtico a la Derecha es como el operador de Desplazamiento a la derecha con la
excepcin de que este mantiene el signo, como una divisin de 2, 4, 8, el etc en un valor con signo. El
Desplazamiento Aritmtico a la derecha se puede utilizar en expresiones de constante entera y variables, pero no
en expresiones constantes de punto flotante. Ejemplo:
X := Y ~> 4
El ejemplo anterior desplaza Y la derecha por 4 bits, manteniendo el signo. Si Y fuera -3200 (%11111111
11111111 11110011 10000000) entonces el -3200 ~> 4 = -200 (%11111111 11111111 11111111 00111000). Si
se hubiera hecho la misma operacin con el operador de Desplazamiento a la Derecha, el resultado habra sido
268.435.256 (%00001111 11111111 11111111 00111000).
El operador Desplazamiento Aritmtico a la Derecha tiene una forma de asignacin, el ~>=, que utiliza la variable
de su izquierda como el primer operando y destino del resultado. Por ejemplo,
X ~>= 2
3-60
www.microcontroladores.com
info@microcontroladores.com
3-61
www.microcontroladores.com
info@microcontroladores.com
3-62
www.microcontroladores.com
info@microcontroladores.com
puede ser utilizada en expresiones de constante entera y de variable, pero no en expresiones constantes de punto
flotante. Ejemplo:
X := Y -> 5
Si Y comenzase como:
%10000000 01110000 11111111 00110101
el operador de Rotacin a la Izquierda rotara ese valor a la derecha por cinco bits, moviendo los cinco originales
LSBs a los cuatro MSBs nuevos, y fijando X a:
%10101100 00000011 10000111 11111001.
La Rotacin a la Derecha tiene una forma de asignacin,->=, que utiliza la variable a su izquierda como primer
operando y destino del resultado. Por ejemplo,
X ->= 3
Aqu, el valor de X se rota a la derecha tres bits y se almacena en X. La forma de asignacin de Rotacin a la
Derecha tambin se puede utilizar dentro de expresiones para resultados intermedios.
Reverso en modo bit ><, ><=
El operador Reverso devuelve los bits del primer operando en su orden reverso, el nmero total de bits que se
indique en el segundo operando. El resto de bits a la izquierda se ponen a cero. El Reverso se puede utilizar en
expresiones de constante entera y de variable, pero no en expresiones constantes de punto flotante. Ejemplo:
X := Y >< 6
Si Y comenzase como:
%10000000 01110000 11111111 00110101
... el operador Reverso devolveran los seis LSBs en orden reverso con el resto de los bits a cero, fijando X a:
%00000000 00000000 00000000 00101011.
Reverse tiene una forma de asignacin, ><=, que utiliza la variable a su izquierda como primer operando y destino
del resultado. Por ejemplo,
X ><= 8
Aqu, los ocho LSBs del valor de X se invierten, el resto de los bits se fijan a cero y el resultado se almacena en X.
La forma de asignacin de Reverso tambin se puede utilizar dentro de expresiones para resultados intermedios.
AND en modo bit &, &=
El operador AND en modo bit realiza un AND de los bits del primer operando con los bits del segundo operando.
AND se puede utilizar en expresiones de constante entera y de variable, pero no en expresiones constantes de
punto flotante. Cada bit de los dos operandos sigue la siguiente lgica:
3-63
www.microcontroladores.com
info@microcontroladores.com
Ejemplo:
X := %00101100 & %00001111
El ejemplo anterior realiza un AND con %00101100 y %00001111 y escribe el resultado, %00001100, sobre X.
AND tiene una forma de asignacin, &=, que utiliza la variable a su izquierda como primer operando y destino del
resultado. Por ejemplo,
X &= $F
Aqu, el valor de X realiza un AND con $F y el resultado se almacena en X. La forma de la asignacin AND se
puede utilizar tambin dentro de expresiones para resultados intermedios.
Hay que tener cuidado en no confundir el AND en modo bit con el AND Boleano. AND en modo bit es para la
manipulacin de bits mientras que el AND boleano es para propsitos de la comparacin.
OR en modo bit |, |=
El operador OR en modo bit realiza un OR de los bits del primer operando con los bits del segundo operando. OR
se puede utilizar en expresiones de constante entera y de variable y, pero no en expresiones constantes de punto
flotante. Cada bit de los dos operandos sigue la siguiente lgica:
Ejemplo:
X := %00101100 | %00001111
El ejemplo anterior realiza un OR entre %00101100 y %00001111 y escribe el resultado, %00101111, sobre X.
OR tiene una forma de asignacin, |=, que utiliza la variable a su izquierda como el primer operando y destino del
resultado. Por ejemplo,
X |= $F
Forma abreviada de X := X | $F
3-64
www.microcontroladores.com
info@microcontroladores.com
Hay que tener cuidado en no confundir el OR en modo bit con el OR Boleano. OR en modo bit es para la
manipulacin de bits mientras que el OR boleano es para propsitos de la comparacin.
Ejemplo:
X := %00101100 | %00001111
El ejemplo anterior hace un XOR entre %00101100 y %00001111 y escribe el resultado, %00100011, sobre X.
XOR tiene una forma de asignacin, ^ =, que utiliza la variable a su izquierda como el primer operando y destino
del resultado. Por ejemplo,
X ^= $F
Aqu, el valor de X hace un XOR con $F y el resultado se almacena en X. La forma de asignacin de XOR se
puede tambin utilizar dentro de expresiones para resultados intermedios.
NOT en modo bit !
Operador NOT `!' en modo bit realiza un NOT (lo contrario, o su-complemento) de los bits del operando que lo
sigue. NOT se puede utilizar en expresiones de constante entera y de variable, pero no en expresiones constantes
de punto flotante. Cada bit de los dos operandos sigue la lgica siguiente:
Ejemplo:
X := !%00101100
El ejemplo anterior hace un NOT en %00101100 y escribe el resultado, %11010011, sobre X.
NOT es un operador de asignacin cuando es el operador nico a la izquierda de una variable en una lnea. Por
ejemplo:
Flag
3-65
www.microcontroladores.com
info@microcontroladores.com
La forma de asignacin de AND boleano se puede tambin utilizar dentro de las expresiones para resultados
intermedios.
Hay que tener cuidado en no confundir el AND Boleano con el AND en modo bit. AND boleano es para propsitos
de comparacin mientras que el AND en modo bit es para la manipulacin de bits.
OR Booleano OR, OR=
El operador OR boleano compara dos operandos y devuelve verdadero (-1) si cualquier valor es verdadero
(diferente a cero), o devuelve (0) falso si ambos operandos son falsos (0). El OR boleano puede ser utilizado en
expresiones variables y constantes. Ejemplo:
X := Y OR Z
El ejemplo anterior compara el valor de Y con el valor de Z y fija X a: Verdadero (-1) si Y o Z es diferente a cero, o
(0) falso si Y y Z son cero.
Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo
siguiente.
IF (Y == 1) OR (Z > 50)
Este ejemplo evala el resultado de Y == 1 contra el de Z>50, y si sea verdadero, el operador OR boleano
devuelve verdadero (-1).
El OR boleano tiene una forma de asignacin, OR=, que utiliza la variable a su izquierda como el primer operando
y destino del resultado. Por ejemplo,
X OR= Y
La forma de asignacin del OR boleano se puede tambin utilizar dentro de expresiones para resultados
intermedios.
3-66
www.microcontroladores.com
info@microcontroladores.com
Hay que tener cuidado en no confundir el OR Boleano con el OR en modo bit. OR boleano es para propsitos de
comparacin mientras que el OR en modo bit es para la manipulacin de bits.
NOT Boleano NOT
Operador boleano devuelve verdadero (-1) si el operando es falso (0), o devuelve (0) falso si el operando es
verdadero (diferente a cero). El NOT boleano puede ser utilizado en expresiones variables y constantes. Ejemplo:
X := NOT Y
El ejemplo anterior devuelve el boleano contrario de Y; Verdadero (-1) si Y es cero, o (0) falso si Y es diferente a
cero.
Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo
siguiente.
IF NOT ( (Y > 9) AND (Y < 21) )
Este ejemplo evala el resultado de (Y> 9 AND Y < 21), y devuelve como resultado el valor boleano contrario;
Verdadero (-1) si Y est en el rango 10 a 20, en este caso.
El NOT boleano es un operador de asignacin cuando es el nico operador a la izquierda de una variable en una
lnea. Por ejemplo:
NOT Flag
Esto almacenara el boleano contrario de Flag nuevamente dentro de Flag.
Hay que tener cuidado en no confundir el NOT Boleano con el NOT en modo bit. NOT boleano es para propsitos
de comparacin mientras que el NOT en modo bit es para la manipulacin de bits.
Es igual a Boleano ==, ===
El operador boleano Es igual a compara dos operandos y devuelve verdadero (-1) si ambos valores son iguales, o
devuelve falso (0), si no. Es igual a puede ser utilizado en expresiones variables y constantes. Ejemplo:
X := Y == Z
El ejemplo anterior compara el valor de Y con el valor de Z y fija X a: Verdadero (-1) si Y tiene el mismo valor que
Z, o (0) falso si Y no tiene el mismo valor que Z.
Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo
siguiente.
IF (Y == 1)
Aqu, el operador Es igual a devuelve Verdadero si Y es igual a 1.
Es igual a tiene una forma de asignacin, ===, que utiliza la variable a su izquierda como el primer operando y
destino del resultado. Por ejemplo,
X === Y
Aqu, X se compara con Y, y si son iguales, X se fija a verdadero (-1), si no X se fija a falso (0).
La forma de asignacin de Es igual a se puede tambin utilizar dentro de expresiones para resultados intermedios.
3-67
www.microcontroladores.com
info@microcontroladores.com
El operador boleano No es igual a compara dos operandos y devuelve verdadero (-1) si los valores no son iguales,
o devuelve falso (0), si no. No es igual a puede ser utilizado en expresiones variables y constantes. Ejemplo:
X := Y <> Z
El ejemplo anterior compara el valor de Y con el valor de Z y fija X a: Verdadero (-1) si Y no tiene el mismo valor
que Z, o (0) falso si Y tiene el mismo valor que Z.
Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo
siguiente.
IF (Y <> 25)
Aqu, el operador No es igual a devuelve verdadero si Y no es 25.
No es igual a tiene una forma de asignacin, <>=, que utiliza la variable a su izquierda como el primer operando y
destino del resultado. Por ejemplo,
X <>= Y
Aqu, X se compara con Y, y si no son iguales, X se fija a verdadero (-1), si no X se fija a falso (0).
La forma de asignacin de No es igual a se tambin puede utilizar dentro de expresiones para resultados
intermedios.
Aqu, X se compara con Y, y si X es menor que Y, X se fija a verdadero (-1), si no X se fija a falso (0). La forma de
asignacin de Es menor que tambin puede ser utilizado dentro de expresiones para resultados intermedios.
Es Mayor que Boleano >, >=
El operador boleano Es mayor que comparan dos operandos y devuelve verdadero (-1) si el primer valor es mayor
que el segundo valor, o devuelve falso (0), si no. Es mayor que puede ser utilizado en expresiones variables y
constantes. Ejemplo:
X := Y > Z
El ejemplo anterior compara el valor de Y con el valor de Z y fija X a: Verdadero (-1) si Y es mayor que el valor de
Z, o (0) falso si Y es igual o menor que al valor de Z.
3-68
www.microcontroladores.com
info@microcontroladores.com
Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo
siguiente.
IF (Y > 50)
Aqu, el operador Es mayor que devuelve verdadero si Y es mayor que 50.
Es mayor que tiene una forma de asignacin, >=, que utiliza la variable a su izquierda como el primer operando y
destino del resultado. Por ejemplo,
X >= Y
Aqu, X se compara con Y, y si X es mayor que Y, X se fija a verdadero (-1), si no X se fija a falso (0). La forma de
la asignacin de Es mayor que tambin puede ser utilizado dentro de expresiones para resultados intermedios.
Es menor o igual Boleano =<, =<=
El operador boleano Es menor o igual compara dos operandos y devuelve verdadero (-1) si el primer valor es
menor o igual que al segundo valor, o devuelve falso (0), si no. Es menor o igual puede ser utilizado en
expresiones variables y constantes. Ejemplo:
X := Y =< Z
El ejemplo anterior compara el valor de Y con el valor de Z y fija X a: Verdadero (-1) si Y es menor o igual que el
valor de Z, o (0) falso si Y es mayor que el valor de Z.
Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo
siguiente.
IF (Y =< 75)
Aqu, el operador Es menor o igual devuelve verdadero si Y es menor o igual que 75.
Es menor o igual tiene una forma de asignacin, =<=, que utiliza la variable a su izquierda como el primer
operando y destino del resultado. Por ejemplo,
X =<= Y
Aqu, X se compara con Y, y si X es menor o igual que Y, X se fija a verdadero (-1), si no X se fija a falso (0). La
forma de la asignacin de Es menor o igual tambin puede ser utilizada dentro de expresiones para resultados
intermedios.
3-69
www.microcontroladores.com
info@microcontroladores.com
Es mayor o igual tiene una forma de asignacin, =>=, que utiliza la variable a su izquierda como el primer
operando y destino del resultado. Por ejemplo,
X =>= Y
Aqu, X se compara con Y, y si X es mayor o igual que Y, X se fija a verdadero (-1), si no X se fija a falso (0). La
forma de la asignacin de Es mayor o igual tambin puede ser utilizada dentro de expresiones para resultados
intermedios.
Direccin de Smbolo @
El operador direccin de Smbolo devuelve la direccin del smbolo que la sigue. La direccin del smbolo se
puede utilizar en expresiones de constante entera y de variable, pero no en expresiones constantes de punto
flotante. Ejemplo:
BYTE[@Str] := A
En el ejemplo anterior, el operador de la direccin del smbolo devuelve la direccin del smbolo Str, que es
utilizado por la referencia del array de memoria BYTE para almacenar el carcter "A" en esa direccin.
La direccin de smbolo se utiliza a menudo para pasar la direccin de secuencias y de estructuras de datos,
definida en un bloque de DAT, a los mtodos que operan sobre ellos.
Es importante observar que ste es un operador especial que se comporta de manera diferente en expresiones
variables o en expresiones constantes. En tiempo de ejecucin, como en el ejemplo, devuelve la direccin
absoluta del smbolo que la sigue. Esta direccin en tiempo de ejecucin, absoluta consiste en la direccin base
del programa objeto ms la direccin del smbolo.
En expresiones constantes, devuelve solamente el ajuste de direccin del smbolo en el objeto. No puede devolver
la direccin absoluta, eficaz en el tiempo de ejecucin, porque esa direccin cambia dependiendo de la direccin
real del objeto en el tiempo de ejecucin.
3-70
www.microcontroladores.com
info@microcontroladores.com
Esto crea una tabla de words, comenzando en StrAddr, donde cada word contiene la direccin de un nico string.
Desafortunadamente, para las constantes en tiempo de compilacin (como los de la tabla de StrAddr), la direccin
devuelta por @ es solamente la direccin de ajuste en tiempo de compilacin, ms que la direccin absoluta en
tiempo de ejecucin, del smbolo. Para conseguir la direccin real, en tiempo de ejecucin, necesitamos agregar la
direccin base del programa objeto a la direccin de ajuste del smbolo. Eso es lo que lo hace el operador de la
direccin de objeto ms smbolo. Ejemplo:
REPEAT Idx FROM 0 TO 2
PrintStr (@@StrAddr [Idx])
El ejemplo anterior incrementa Idx de 0 a 2. La declaracin de StrAddr [Idx] recupera el ajuste del string
almacenado en el elemento Idx de la tabla de StrAddr en tiempo de compilacin. El operador @@ que est
delante de la declaracin de StrAddr [Idx] suma la direccin base del objeto al valor de ajuste que fue recuperado
en tiempo de compilacin, dando por resultado una direccin vlida en tiempo de ejecucin. El mtodo de PrintStr,
cuyo cdigo no se muestra en este ejemplo, puede utilizar esa direccin para procesar cada carcter del string.
3.3.39. OUTA, OUTB
Registros de salida de 32-bits Puerto A y B.
OUTA <[Pin(s)]>
OUTB <[Pin(s)]>(Reservado para uso futuro)
Devuelve: Valor actual de los pins de salida de Puerto A o B.
Pin(s) es una expresin opcional, o una expresin de rango, que especifica el pin ,o pins, de E/S para
acceder al puerto A (0-31) o al puerto B (32-63). Si se da una expresin nica, solamente se tendr
acceso al pin especificado. Si se da una expresin de tipo rango (dos expresiones en un formato rango;
x..y) se tendr acceso a los pins contiguos desde el comienzo de la expresin hasta el fin.
Explicacin
OUTA y OUTB son uno de los seis registros (DIRA, DIRB, INA, INB, OUTA y OUTB) que afectan directamente los
pins de E/S. El registro OUTA contiene los estados de salida de cada uno de los 32 pins de E/S en el puerto A; los
bits 0 a 31 corresponden de P0 a P31. El registro de DIRB contiene los estados de salida de cada uno de los 32
pins de E/S en el puerto B; los bits 0 a 31 corresponden de P32 a P63.
NOTA: OUTB est reservado para el uso futuro; el Propeller P8X32A no incluye los pins de E/S del puerto B.
OUTA se usa tanto para fijar como para recoger el estado actual de salida de uno o mas pins E/S en el Puerto A.
Un bit bajo (0) indica que el pin correspondiente E/S est a tierra, y un bit alto (1) indica que el pin correspondiente
de E/S est a VDD (3.3 voltios). El registro OUTA est por defecto a cero, con todos los bits a 0, hasta el
arranque del cog.
Cada Cog tiene acceso a todos los pins de E/S en cualquier momento. Esencialmente, todos los pins de E/S estn
conectados directamente con cada Cog.
Esta configuracin se puede describir con las siguientes reglas:
A. Un pin es una entrada slo de Cogs no activos fijados a salida.
B. Un pin es una salida si cualquier Cog activo lo fija a salida.
Debido a la naturaleza "wired-OR" de los pins de E/S, no hay contencin elctrica entre los Cogs, y se puede tener
acceso a los pins de E/S simultneamente. Es funcin del desarrollador de la aplicacin asegurarse de que
ningunos de los Cogs causan contencin lgica en el mismo pin de E/S durante el tiempo de ejecucin.
Uso de OUTA
3-71
www.microcontroladores.com
info@microcontroladores.com
Fija o inicializa los bits en OUTA para afectar al estado de salida de los pins E/S deseados. Hay que asegurarse
tambin fijar los bits correspondientes de DIRA para hacer que ese pin sea una salida.
DIRA := %00000100_00110000_00000001_11110000
OUTA := %01000100_00110000_00000001_10010000
La lnea de arriba de DIRA fija los pins 25, 21, 20, 8, 7, 6, 5 y 4 de E/S a salida y el resto a entradas. La lnea de
OUTA fija los pins 30, 25, 21, 20, 8, 7, y 4 a alto, el resto de E/S a bajo. El resultado es que los pins de E/S 25, 21,
20, 8, 7, y 4 estn fijados como salida alta y los pins 6 y 5 de E/S como salida baja. El pin 30 de E/S se fija a una
direccin de entrada (segn DIRA) as que el estado alto en el bit 30 de OUTA se ignora y el pin se toma como
entrada de acuerdo con ese Cog.
Si se usa el campo opcional Pin(s), y los operadores unitarios post-clear (~) y post-set (~~), un Cog puede afectar
a un pin de E/S (un bit) a la vez. El campo Pin(s) trata los registros de pins de E/S como array de 32-bits. Por
ejemplo:
DIRA[10]~~
OUTA[10]~
OUTA[10]~~
La primera lnea del cdigo fija el pin 10 de E/S a salida. La segunda lnea hace un clear sobre el bit de salida
P10, haciendo que P10 sea una salida baja (tierra). La tercera lnea fija el bit de P10 , haciendo que P10 sea una
salida alta (VDD).
En Spin, el registro de OUTA soporta una forma especial de expresin, llamada una expresin de rango, que
permite que se lean un grupo de pins de E/S inmediatamente, sin leer los que quedan fuera del rango
especificado. Para leer los mltiples pins, contiguos de E/S, hay que utilizar una expresin de rango (como x..y) en
el campo de Pin(s).
DIRA[12..8]~~
OUTA[12..8] := %11001
La primera lnea, "DIRA...," fija P12, P11, P10, P9 y P8 a la salida; el resto de los pins permanecen en su estado
anterior. La segunda lnea, "OUTA...," fija P12, P11, y P8 como salida alta, y P10 y P9 como salida baja.
IMPORTANTE: El orden de los valores en una expresin de rango afecta a la utilizacin. Por ejemplo:
DIRA[8..12]~~
OUTA[8..12] := %11001
Aqu, los bits de 8 a 12 de DIRA se fijan a salida (como antes) pero los bits 8, 9, 10, 11 y 12 de OUTA se fijan igual
a 1, 1, 0, 0, y 1, respectivamente, haciendo que P8, P9 y P12 sean salidas altas y P10 y P11 salidas bajas.
sta es una caracterstica de gran alcance de expresiones de rango, pero si no se tiene cuidado puede tomar
resultados no esperados inintencionadamente.
OUTA normalmente solo de escritura pero tambin puede ser ledo para recuperar el estado de salida actual de
pins de E/S. Esto es SOLAMENTE los estados de cierre de la salida del Cog, no necesariamente los estados
reales de la salida de los pins de E/S del Propeller, pues pueden ser afectados ms adelante por otros Cogs o otro
hardware de E/S de este Cog (el generador video, Count A, etc.). El ejemplo siguiente asume que Temp una
variable creada en otra parte:
Temp := OUTA[15..13]
Lo anterior fija Temp. Igual a los bits 15, 14, y 13 de OUTA; es decir: los 3 bits ms bajos de Temp son iguales
ahora a OUTA15:13 y los otros bits de Temp se ponen a cero.
3-72
www.microcontroladores.com
info@microcontroladores.com
3.3.40. PAR
Registro de Parmetros de arranque del Cog.
PAR
Devuelve: El valor de direccin pasado durante arranque con COGINIT o COGNEW.
Explicacin
El registro PAR contiene el valor de direccin pasado en el campo Parameter de un comando de COGINIT o de
COGNEW. El contenido del registro PAR lo utiliza el cdigo Ensamblador Propeller para localizar y para ejecutar la
memoria compartida entre el cdigo Spin y el cdigo ensamblador .
Puesto que el registro PAR est pensado para contener una direccin de arranque del Cog, el valor almacena en
l a travs de COGINIT y COGNEW y se limita a 14-bits; un word de 16-bit con dos bits ms bajos puestos a cero.
Uso de PAR
PAR es afectado por cdigo Spin y utilizada por cdigo ensamblador como mecanismo de indicador de memoria
para apuntar a la memoria principal compartida entre los dos. El comando de COGINIT o COGNEW, al lanzar el
ensamblador Propeller sobre un Cog, afecta el registro PAR. Por ejemplo:
VAR
long Shared
Mem res 1
ValReg
org 0
mov Mem, PAR
<hacer algo>
wrlong ValReg, Mem
jmp :loop
jmp :loop
res 1
En el ejemplo de arriba, el mtodo principal lanza la rutina en ensamblador Process en un Cog nuevo con
COGNEW. El segundo parmetro de COGNEW es utilizado por Main para pasar la direccin de una variable,
Shared. La rutina de ensamblador, Process, recupera que valor de direccin de su registro PAR y lo almacena
localmente en Mem. Entonces realiza alguna tarea, actualizando su registro local ValReg (creado en el final del
bloque de DAT) y finalmente actualiza la variable Shared a travs de wrlong ValReg, Mem.
3.3.41. PHSA, PHSB
Contador A y Contador B de los Registros Phase Lock Loop (PLL).
PHSA
PHSB
Devuelve: Valor actual del Contador A o Contador B del registro PLL, si est utilizado como variable fuente.
Explicacin
3-73
www.microcontroladores.com
info@microcontroladores.com
PHSA y PHSB son dos de los seis registros (CTRA, CTRB, FRQA, FRQB, PHSA, y PHSB) que afectan el
comportamiento de los mdulos Contador de un Cog. Cada Cog tiene dos mdulos Contador idnticos (A y B) que
pueden realizar muchas tareas repetitivas. Los registros de PHSA y de PHSB contienen los valores que se pueden
leer o escribir directamente por el Cog, pero pueden tambin ser acumulados con el valor de FRQA y de FRQB,
respectivamente, en cada ciclo potencial de reloj del sistema.
Uso de PHSA and PHSB
PHSA y PHSB pueden ser leidos/escritos como otros registros o variables predefinidas. Por ejemplo:
PHSA := $1FFFFFFF
El cdigo anterior fija PHSA a $1FFFFFFF. Dependiendo del campo de CTRMODE del registro de CTRA, este
valor puede seguir siendo el mismo, o se puede incrementar automticamente por el valor en FRQA en una
frecuencia determinada por el reloj del sistema y los pins primarios y/o secundarios de E/S.
Hay que tener presente que la escritura a PHSA o a PHSB elimina directamente el valor actual acumulado y
cualquier acumulacin programada para el mismo momento que se realiza la escritura.
3.3.42. PRI
Declara un Bloque de mtodo Privado.
PRI Name <(Param<,Param>)> <:Rvalue> <|LocalVar<[Count]>> <,LocalVar <[Count]>>
SourceCodeStatements
Explicacin
PRI es el declaracin de un bloque de mtodo privado. Un mtodo privado es una seccin del cdigo fuente que
realiza una funcin especfica y devuelve un valor de resultado. sta es una de las seis declaraciones especiales
(CON, VAR, OBJ, PUB, PRI, y DAT) que proporcionan la estructura inherente a la lengua Spin.
Cada objeto puede contener un nmero de mtodos privados (PRI) y pblicos (PUB). Los mtodos privados se
pueden alcanzar o llamar solamente desde adentro del objeto y sirven para realizar funciones vitales, protegidas,
para el objeto. Los mtodos privados son como mtodos pblicos, excepto que estn declarados con PRI, en vez
de PUB, y no son accesibles desde fuera del objeto.
3-74
www.microcontroladores.com
info@microcontroladores.com
3.3.43. PUB
Declara un Bloque de mtodo Publico.
PUB Name <(Param <,Param>)> <:Rvalue> <|LocalVar<[Count]>> <,LocalVar <[Count]>>
SourceCodeStatements
Explicacin
PUB es el declaracin de un bloque de mtodo privado. Un mtodo publico es una seccin del cdigo fuente que
realiza una funcin especfica y devuelve un valor de resultado. sta es una de las seis declaraciones especiales
(CON, VAR, OBJ, PUB, PRI, y DAT) que proporcionan la estructura inherente a la lengua Spin.
Cada objeto puede contener un nmero de mtodos privados (PRI) y pblicos (PUB). Los mtodos privados se
pueden alcanzar o llamar solamente desde adentro del objeto y sirven para realizar funciones vitales, protegidas,
para el objeto. Los mtodos pblicos se pueden alcanzar fuera del objeto y sirven para crear el interfaz a un
objeto.
3-75
www.microcontroladores.com
info@microcontroladores.com
Todas las declaraciones ejecutables que pertenecen a un mtodo de PUB aparecen debajo de su declaracin,
tabulado por lo menos un espacio.
El valor de Retorno
Una declaracin de PUB especifique o no un RValue, hay siempre un valor de retorno implcito, que es cero (0)
por defecto. Hay un nombre predefinido para este valor de retorno dentro de cada mtodo de PUB, llamado
RESULT. En cualquier momento dentro de un mtodo, RESULT puede ser actualizado como cualquier otra
variable y, mientras exista el mtodo, el valor actual del RESULT se pasar de nuevo al llamador. Adems, si se
declara un RESULT para el mtodo, ese nombre se puede utilizar alternativamente con variable, incorporada por
defecto, RESULT.
Parameters and Local Variables
Los parmetros y las variables locales son todas long (cuatro bytes). De hecho, los parmetros son variables que
se inicializan a los valores correspondientes especificados por el llamador del mtodo.
Las variables locales, sin embargo, no se inicializan; contienen datos al azar cuando se llama el mtodo.
Todos los parmetros se pasan al mtodo por valor, no por referencia, as que los cambios de parmetros no se
reflejan fuera del mtodo. Por ejemplo, si llamamos a MoveMotor usando una variable llamadora Pos para el
primer parmetro, puede ser algo como esto:
Pos := 250
MoveMotor(Pos, 100)
Cuando se ejecuta el mtodo MoveMotor, recibe el valor de Pos en su parmetro Position, y el valor 100 en su
parmetro Speed. Dentro del mtodo MoveMotor, puede cambiar Position y Speed en cualquier momento, pero
sigue teniendo el valor de Pos (la variable del llamador) a 250.
Si una variable tiene que ser alterada por una rutina, el llamador debe pasar la variable por referencia; es decir,
que debe pasar la direccin de la variable en vez del valor de la variable, y la rutina debe tratar ese parmetro
como la direccin de una posicin de memoria en la cual operar. La direccin de una variable, u otro smbolo
basado en los registros, puede ser recuperada usando al operador de Direccin de smbolo, ` @ '. por ejemplo,
Pos := 250
MoveMotor(@Pos, 100)
El llamador pasa la direccin de Pos para el primer parmetro de MoveMotor. Lo que recibe MoveMotor en su
parmetro Position es la direccin de la variable llamadora Pos. La direccin es un nmero, como cualquier otro, y
el mtodo de MoveMotor tiene que estar diseado para que lo trate como direccin, el lugar de un valor. El mtodo
MoveMotor debera utilizar algo como:
PosIndex := LONG[Position]
... para recuperar el valor de la variable llamadora Pos, y ser algo como:
LONG[Position] := <some expression>
... para modificar la variable llamadora Pos, en caso de necesidad.
Salida de un mtodo
Se sale de un mtodo, tanto si ha llegado a la ultima sentencia del mtodo o cuando alcanza un comando de
RETURN o ABORT. Un mtodo puede tener solamente un punto de la salida (la ultima sentencia ejecutable), o
puede tener muchos puntos de la salida (cualquier comando RETURN o ABORT adems de la ultima sentencia
ejecutable). Los comandos RETURN y ABORT se pueden utilizar tambin para fijar el RESULT variable en la
salida.
3-76
www.microcontroladores.com
info@microcontroladores.com
3.3.43B. QUIT
Salida de un bucle REPEAT inmediatamente.
QUIT
Explicacin
QUIT es uno de los dos comandos (NEXT y QUIT) que afectan a los bucles de REPEAT. QUIT hace que un bucle
de REPEAT termine inmediatamente.
Uso de QUIT
QUIT se utiliza como un caso de excepcin, en una declaracin condicional, en los bucles REPEAT para terminar
el bucle prematuramente. Por ejemplo, se asume que DoMore y SystemOkay son mtodos creados en otra parte y
que cada uno devuelve valores boleanos:
repeat while DoMore
!outa[0]
<do something>
if !SystemOkay
quit
<more code here>
El cdigo anterior activa P0 y realiza otras tareas mientras que el mtodo de DoMore devuelva verdadero. Sin
embargo, si el mtodo de SystemOkay devuelve falso, la declaracin de IF ejecuta el comando de QUIT que hace
que el bucle termine inmediatamente. El comando de QUIT se puede utilizar solamente dentro de un bucle de
REPEAT; de otra manera, dara lugar a error.
3.3.44. REBOOT
Resetea el chip Propeller.
REBOOT
Explicacin
Esto es un reset controlado por software, pero acta como un reset hardware va el pin de RESn.
REBOOT sed utiliza si se quiere resetear el chip Propeller a su estado inicial. Como todo lo basado en hardware,
el encendido/reset crea un retraso, igual que el proceso de arranque, se utiliza como si el Propeller hubiera sido
reseteado va el pin de RESn o un ciclo de power.
3.3.45. REPEAT
Ejecuta un bloque de cdigo repetitivamente.
REPEAT <Count>
Statement(s)
REPEAT Variable FROM Start TO Finish <STEP Delta>
Statement(s)
REPEAT (( UNTIL. WHILE )) Condition(s)
Statement(s)
REPEAT
Statement(s)
((UNTIL. WHILE )) Condition(s)
3-77
www.microcontroladores.com
info@microcontroladores.com
Count es una expresin opcional que indica el nmero finito de veces a ejecutar Statement(s). Si se omite
Count, la sintaxis 1 crea un bucle infinito compuesto de Statement(s).
Statement(s) es un bloque opcional de una o ms lneas del cdigo a ejecutarse repetidamente. Omitir
Statement(s) es raro, pero puede ser til en la sintaxis 3 y 4 si Condition(s) alcanza los efectos necesarios.
Variable es una variable, generalmente definida por el usuario, que ser iterada de comienzo al final,
opcionalmente en unidades de Delta por iteracin. Variable se puede utilizar en Statement(s) para
determinar o para utilizar la cuenta de la iteracin.
Start es una expresin que determina el valor de inicio de Variable en la sintaxis 2. Si Start es menor
Finish, la variable ser incrementada cada iteracin; y decrementada de la otra manera.
Finish es una expresin que determina el valor final de Variable en la sintaxis 2. Si Finish es mayor que
Start, la variable ser incrementada cada iteracin; y decrementada de la otra manera.
Delta es una expresin opcional que determina las unidades en las cuales se quiere
incrementar/decrementar la Variable en cada iteracin (sintaxis 2). Si est omitida, la variable se
incrementara/decrementara en 1 cada iteracin.
Condition(s) es un o ms expresiones boleanas usadas por la sintaxis 3 y 4 para continuar o para
terminar el bucle. Cuando est precedido de UNTIL, Condition(s) termina el bucle cuando es verdadero.
Cuando est precedido de WHILE, Conditions(s) termina el bucle cuando es falso.
Explicacin
REPEAT es una estructura repetitiva muy flexible para el cdigo Spin. Puede ser utilizada para crear cualquier tipo
de bucle, incluyendo: infinito, finito, con o sin contador de bucle, y el de cero a N o de N a cero.
La Sangra es critica
IMPORTANTE: La sangra es crtica. El lenguaje Spin confa en la sangra (de un espacio o ms) en lneas que
siguen comandos condicionales para determinar si pertenecen a ese comando o no. Para que la herramienta
Propeller indique stos bloques de cdigo agrupados lgicamente en pantalla, se puede presionar Ctrl + I y
encender los indicadores de grupo . Presionando Ctrl + I otra vez esa caracterstica se desactivara.
Bucles Infinitos (Sintaxis 1)
Realmente, cualquiera de las cuatro formas de REPEAT se pueden hacer en bucles infinitos, pero la forma usada
para este propsito es la sintaxis 1 sin el campo Count. Por ejemplo:
repeat
!outa[25]
waitcnt(2_000 + cnt)
Este cdigo repite !outa[25 ] y waitcnt(2_000 + cnt) sin fin. Ambas lneas estn tabuladas de REPEAT as que
pertenecen al bucle REPEAT. Puesto que Statement(s) es realmente una parte opcional de REPEAT, el comando
de la REPEAT por s mismo se puede utilizar como bucle sin fin que no haga nada pero mantiene el Cog activo.
Esto puede ser intencional, pero es a veces inintencional debido a una sangra incorrecta. Por ejemplo:
repeat
!outa[25]
El ejemplo anterior es errneo; la lnea anterior nunca se ejecuta porque el REPEAT que hay sobre ella es un
bucle sin fin que no tiene ningn Statement(s); no hay nada tabulado inmediatamente debajo de l, as que el Cog
se queda simplemente en un lazo sin fin en la lnea REPEAT que no hace nada pero mantiene el Cog activo y
consumiendo energa.
Bucles finitos Simples (Sintaxis 1)
La mayora de los bucles son finitos por naturaleza; ejecutan solamente un nmero limitado de iteraciones. La
forma ms simple es la sintaxis 1 con el campo de Countt incluido.
Por ejemplo:
3-78
www.microcontroladores.com
info@microcontroladores.com
Repite 10 veces
Activa P25
Incrementa localizacin RAM $7000
El cdigo anterior activa P25 diez veces, y entonces incrementa el valor de la localizacin RAM $7000.
Bucles Finitos Contados (Sintaxis 2)
A menudo es absolutamente necesario contar las iteraciones del bucle para que el cdigo del bucle pueda
realizarse basado en esa cuenta. El comando REPEAT hace que esto sea fcil de hacer con la sintaxis 2. El
siguiente ejemplo asume que la variable Index fue creada previamente.
repeat Index from 0 to 9
byte[$7000][Index]++
Repite 10 veces
Incrementa localizacin RAM de $7000 a $7009
Como el ejemplo anterior, el cdigo repite el bucle 10 veces, pero cada vez ajusta la variable Index. La primera
vez a que se ejecute el bucle, el ndice ser 0 (segn lo indicado por " from 0") y cada iteracin siguiente ser 1
ms que el anterior (segn lo indicado por "to 9"): ..1. 2, 3... 9. Despus de la dcima iteracin, el ndice ser
incrementado a 10 y el bucle terminar, haciendo que se ejecuten las siguientes sentencias al bucle REPEAT, si
es que existen. El cdigo en el bucle utiliza Index como ajuste para afectar la memoria, byte[$7000][Index]++; en
este caso est incrementando cada uno de los valores de tamao byte en las localizaciones $7000 a $7009 del
RAM en 1, cada vez.
El comando REPEAT determina automticamente si el rango sugerido por Start y Finish es ascendente o
descendente. Como el ejemplo anterior utiliz 0 a 9, el rango es un Rango ascendente; ajustando Index en +1
cada vez. Para conseguir que la cuenta vaya al revs, simplemente habra que invertir los valores del Start y
Finish, como en:
repeat Index from 9 to 0
byte[$7000][Index]++
Repite 10 veces
Incrementa localizacin RAM
$7000
de $7009 hacia
Este ejemplo tambin repite el bucle 10 veces, pero cuenta con Index de 9 a 0; ajustando Index en -1 cada vez.
Como los campos de Start y Finish pueden ser expresiones, pueden contener variables. El ejemplo siguiente
asume que S y F son variables creadas previamente.
S := 0
F := 9
repeat 2
repeat Index from S to F
byte[$7000][Index]++
S := 9
F := 0
Repite 2 veces
Repite 10 veces
Incrementa localizacin RAM de 7000..$7009
El ejemplo anterior utiliza un bucle anidado. El bucle externo (primero) repite 2 veces. El bucle interno repite con
Index desde S a F, estas variables han sido fijadas previamente de 0 a 9, respectivamente. El bucle interno
incrementa el valor de las localizaciones $7000 a $7009 de la RAM, en ese orden, porque el bucle interno est
contando iteraciones a partir de la 0 a 9. Entonces, este bucle termina (con Index fijado a 10) y las ultimas dos
lneas ponen S a 9 y F a 0, intercambiando los valores de Start y Finish. Puesto que esto todava est dentro del
lazo externo, el lazo externo entonces ejecuta su contenido (para la segunda vez) que hace otra vez que el bucle
interno repita con Index desde 9 a 0 (en sentido contrario al bucle anterior).
Los bucles REPEAT no tienen por que ser limitados a incrementar o a decrementar en 1. Si el comando REPEAT
utiliza el sintaxis opcional Delta, incrementar o decrementara la variable en la cantidad que indique Delta. El
ejemplo siguiente incluye el valor opcional Delta, llamado Step, para incrementar por 2.
repeat Index from 0 to 8 step 2
byte[$7000][Index]++
Repite 5 veces
Incrementa la RAM $7000 a $7008
3-79
www.microcontroladores.com
info@microcontroladores.com
Aqu, REPEAT realiza el bucle cinco veces, con Index fijado a 0, 2, 4, 6, y 8, respectivamente. Este cdigo
incrementa las localizaciones RAM (las localizaciones numeradas) a partir de $7000 a $7008 y terminan con Index
igual a 10.
El campo Delta puede ser positivo o negativo, sin importar el rango natural de los valores Start y Finish, y se
puede incluso ajustar dentro del bucle para alcanzar efectos interesantes. Por ejemplo, asumiendo que Index y D
son variables definidas previamente, el cdigo siguiente fija Index a la siguiente secuencia: 5. 6, 6, 5, 3.
D := 2
repeat Index from 5 to 10 step D
--D
Este bucle comienza con Index a 5 y Delta (D) de +2. Pero cada iteracin decrementa D por uno, as que en el
final de la primera iteracin, Index = 5 y D = +1. la iteracin 2 tiene Index = 6 y D = 0. La iteracin 3 tiene Index = 6
y D = -1. la iteracin 4 tiene Index = 5 y D = -2. la iteracin 5 tiene Index = 3 y D = -3. El bucle termina entonces
porque Index ms Delta (3 + - 3) est fuera de el rango de Start y Finish (5 a 10).
Bucles Condicionales (Sintaxis 3 and 4)
Las formas finales de REPEAT, sintaxis 3 y 4, son bucles finitos con salidas condicionales. Estas dos formas de
REPEAT se refieren generalmente como "repeat while" o "repeat until".
La forma REPEAT de la sintaxis 3, consiste en el comando REPEAT seguido por WHILE o UNTIL entonces
Condition(s) y finalmente, en las lneas de abajo, Statement(s) opcionales. Por ejemplo, se asume que es X una
variable creada anteriormente:
X := 0
repeat while X < 10
byte[$7000][X] := 0
X++
Este ejemplo, primero fija X a 0 y repite el bucle mientras que X sea menor que 10. El cdigo del bucle inicializa a
0 las localizaciones RAM basadas en X (que comienza en la localizacin $7000) e incrementa X. Despus de la
dcima iteracin del bucle, X se iguala a 10, haciendo la condicin mientras que X < 10 sea falso y el bucle
termina.
Este bucle se dice que utiliza la lgica "positiva" porque contina "WHILE" o mientras que una condicin sea
verdad. Poda tambin escribirse con lgica "negativa" usando UNTIL, en su lugar. Por ejemplo:
X := 0
repeat until X > 9
byte[$7000][X] := 0
X++
Este ejemplo realiza la misma manera que el alo mismo que el anterior, pero utilizando lgica negativa porque
contina "UNTIL" o hasta que una condicin sea verdad; es decir: contina mientras que una condicin es falsa.
En cualquiera de los dos ejemplos, si X fuera igual a 10 o superior antes de que la primera iteracin del bucle
REPEAT, la condicin nunca llegara a ejecutarse.
La forma de la REPEAT descrita por el sintaxis 4 es muy similar al sintaxis 3, pero la condicin se prueba en el
final de cada iteracin, haciendo un bucle de uno a N. Por ejemplo:
3-80
www.microcontroladores.com
info@microcontroladores.com
Esto tambin funciona igual que los ejemplos anteriores, ejecutando el bucle 10 veces, aunque la condicin no se
prueba hasta el final de cada iteracin.
Otras opciones REPEAT
Hay otros dos comandos que afectan al comportamiento o a los bucles REPEAT: NEXT y QUIT.
3.3.46. RESULT
Es el valor variable de retorno de mtodos.
RESULT
Explicacin
La variable de RESULT es una variable local predefinida para cada mtodo de PUB y PRI. El RESULT contiene el
valor de retorno del mtodo; este valor se pasa al llamador del mtodo, cuando termina el mtodo.
Cuando se llama un mtodo pblico o privado, su variable RESULT se inicializa a cero (0). Si ese mtodo no
altera RESULT, ni llama RETURN o ABORT con un valor especifico, entonces el valor de retorno de la terminacin
de ese mtodo ser cero.
Uso de RESULT
En el ejemplo de abajo, el mtodo de DoSomething pone RESULT igual a 100 en su final. El mtodo principal
llama DoSomething y fija su variable local, Temp, igual al resultado; de modo que cuando DoSomething sale,
Temp se fija a 100.
PUB Main | Temp
Temp := DoSomething
PUB DoSomething
<do something here>
result := 100
tambin se puede proporcionar un nombre alias a la variable RESULT de un mtodo para hacerla ms clara. Por
ejemplo:
PUB GetChar : Char
<do something>
Char := < carcter recuperado>
El mtodo anterior, GetChar, declara Char como alias para su variable incorporada de RESULT. El mtodo de
GetChar realiza unas tareas para recoger un carcter y entonces fija Char con el carcter recuperado. tambin
podra haber utilizado "result: = ... " para fijar el valor de retorno si la declaracin afecta el valor de retorno del
mtodo.
Tanto la variable del RESULT, como el alias proporcionado para ello, se pueden modificar mltiples veces dentro
del mtodo antes de la salida del mtodo pero solo se devolver el ultimo valor de RESULT.
3-81
www.microcontroladores.com
info@microcontroladores.com
3.3.47. RETURN
Sale de un mtodo PUB/PRI con un valor de retorno opcional.
RETURN <Value>
Devuelve: El valor del RESULTADO actual o un valor (Value) si se provee.
Value es una expresin opcional que valor debe ser devuelto del mtodo PUB o PRI.
Explicacin
RETURN es uno de dos comandos (ABORT y RETURN) que terminan la ejecucin de un mtodo PUB o PRI.
RETURN causa un retorno de un mtodo PUB o PRI con estado normal; esto significa que realiza un solo pop de
la pila de llamadas y retorna al llamador de este mtodo, entregando un valor en el proceso.
Cada mtodo PUB o PRI tiene un RETURN implcito en su final, pero RETURN se puede tambin escribir
manualmente en uno o ms lugares dentro del mtodo para crear mltiples puntos de salida.
Cuando RETURN aparece sin valor opcional, devuelve el valor actual de la variable incorporada en el RESULT de
PUB/PRI. Si el campo valor fue incorporado, el PUB o el PRI devuelve ese valor.
Sobre la pila de llamadas (Call Stack)
Cuando los mtodos son llamados simplemente invocndoles de otros mtodos, debe haber un cierto mecanismo
para almacenar donde debe retornar una vez que se termine el mtodo llamado.
Este mecanismo es el llamado "stack" (pila) pero utilizaremos el trmino "call stack" aqu.
Este mecanismo es simplemente memoria RAM, usada para almacenar las direcciones y los valores de retorno,
los parmetros y los resultados intermedios.
La pila de llamadas va aumentando a medida que se van haciendo llamadas a mtodos y disminuye cuando los
mtodos terminan, ya sea va Return o alcanzando el final del mtodo.
La pila aumenta y disminuye de tamao con estas dos acciones:
1)"push" que introduce valores sobre la pila y
2) "pop" que saca los valores contenidos en la pila
El comando RETURN hace un pop de los datos ms recientes de la pila de llamadas devolviendo el dato al
llamador inmediato; quin llam directamente al mtodo que acaba de volver.
Uso de RETURN
El siguiente ejemplo muestra dos aplicaciones de RETURN. Se asume que DisplayDivByZeroError es un mtodo
definido en otra parte.
PUB Add(Num1, Num2)
Result := Num1 + Num2
return
PUB Divide(Dividend, Divisor)
if Divisor == 0
DisplayDivByZeroError
return 0
return Dividend / Divisor
Mira si Divisor = 0
Si es as, muestra error
y retorna con 0
sino, devuelve el resultado
El mtodo de la suma (Add) asigna su variable RESULT igual a Num1 ms Num2, entonces ejecuta RETURN. Las
causas de RETURN agregan para volver el valor de RESULT al llamador.
El mtodo Divide comprueba el valor Divisor. Si Divisor se iguala a cero, llama al mtodo de
DisplayDivByZeroError y despus ejecuta el return 0, que hace inmediatamente que el mtodo retorne con el valor
3-82
www.microcontroladores.com
info@microcontroladores.com
0. Si, sin embargo, Divisor no es igual a cero, ejecuta Dividend / Divisor y hace que el mtodo retorne con el
resultado de la divisin.
3.3.48. ROUND
Redondea una constante de coma flotante en el entero mas cercano.
ROUND ( FloatConstant )
Devuelve: El entero mas cercano al valor original de la constante de punto flotante.
Explicacin
ROUND es una de tres directivas (FLOAT, ROUND y TRUNC) usadas para las expresiones constantes de punto
flotante. ROUND devuelve una constante entera con el valor ms cercano del nmero entero a la expresin dada
en FloatConstant. Los valores fraccionarios de (.5) o superiores se redondean al siguiente nmero entero ms
cercano mientras que fracciones ms bajas se redondearan hacia abajo.
Uso de ROUND
ROUND se puede utilizar para redondear constantes de punto flotante hacia arriba o abajo al valor ms cercano
del nmero entero. Hay que tener en cuenta que esto es solo para expresiones constantes en tiempo de
compilacin, no para expresiones variables en tiempo de ejecucin. Por ejemplo:
CON
OneHalf
Smaller
Rnd1
Rnd2
Rnd3
= 0.5
= 0.4999
= round(OneHalf)
= round(Smaller)
= round(Smaller * 10.0) + 4
El cdigo anterior crea dos constantes, OneHalf y Smaller de punto flotante, igual a 0.5 y a 0.4999,
respectivamente. Las tres constantes siguientes, Rnd1, Rnd2 y Rnd3, son las constantes enteras que se basan en
OneHalf y Smaller usando la directiva ROUND. Rnd1 = 1, Rnd2 = 0, y Rnd3 = 9.
3-83
www.microcontroladores.com
info@microcontroladores.com
3.3.49. SPR
Registro Array de propsito especial; proporciona acceso indirecto a los registros especiales del Cog.
SPR [Index]
Devuelve: El valor del registro de propsito especial de ese ndice (Index).
Index (ndice) es una expresin que especifica el ndice (0-15) del registro de propsito especial a acceder
(desde PAR a VSCL).
Explicacin
SPR es un array de los 16 registros de propsito especial en el Cog. El elemento 0 es el registro PAR y el
elemento 15 es el registro de VSCL.
Ver la tabla 4-12 abajo. SPR proporciona un mtodo indirecto para tener acceso a los registros de propsito
especial del Cog.
Uso de SPR
SPR se puede utilizar como cualquier otro array de longs. Lo siguiente asume que Temp es una variable definida
en otra parte.
spr[4] := %11001010
Temp := spr[2]
Este ejemplo fija el registro de OUTA (ndice 4 de SPR) a %11001010 y despus fija Temp igual al registro de INA
(ndice 2 de SPR).
3-84
www.microcontroladores.com
info@microcontroladores.com
3.3.50. _STACK
Una constante predefinida, ajustable una sola vez para especificar el espacio libre de pila de la aplicacin.
CON
_STACK = Expression
Expression es una expresin de nmero entero que indica que el nmero de longs a reservar para el
espacio de pila.
Explicacin
_ STACK es Una constante predefinida, ajustable una sola vez para especificar el espacio libre de pila de la
aplicacin. Este valor se aade a _FREE si est especificado, para determinar la cantidad total de memoria
stack/free a reservar para una aplicacin Propeller.
Se debe usar _ STACK si una aplicacin requiere una cantidad mnima de espacio de pila para ejecutarse
correctamente. Si la aplicacin compilada resultante es demasiado grande para permitir el espacio especificado de
pila, se exhibir un mensaje de error. Por ejemplo:
CON
_STACK = 3000
La declaracin de _STACK en el bloque anterior de CON indica que la aplicacin necesita tener por lo menos
3.000 longs de espacio de pila despus de la compilacin en el caso de que eso no se cumpla, se mostrara un
mensaje de error, indicando cuanto se ha excedido. Esta es una buena manera de prevenir que compilaciones
satisfactorias fallen en tiempo de ejecucin por falta de memoria.
3.3.51. STRCOMP
Compara la igualdad de dos strings.
STRCOMP (StringAddress1, StringAddress2 )
Devuelve: Verdadero si los dos strings son iguales y falso en caso contrario.
StringAddress1 es una expresin que especifica la direccin de comienzo del primer string para
comparar.
StringAddress2 es una expresin que especifica la direccin de comienzo del segundo string para
comparar.
Explicacin
STRCOMP es uno de dos comandos (STRCOMP y STRSIZE) que recuperan la informacin sobre un string.
STRCOMP compara el contenido del string en StringAddress1 al contenido del string en StringAddress2, y
devuelve verdadero si ambas secuencias son equivalentes, falso en caso contrario. Esta comparacin es sensible
a maysculas y minsculas.
Uso de STRCOMP
El siguiente ejemplo asume que PrintStr es un mtodo creado a parte.
PUB Main
if strcomp(@Str1, @Str2)
PrintStr(string(Str1 y Str2 son iguales))
else
PrintStr(string(Str1 y Str2 son diferentes))
DAT
Str1 byte Hello World, 0
Str2 byte Testing., 0
3-85
www.microcontroladores.com
info@microcontroladores.com
El ejemplo anterior tiene dos strings en el bloque DAT, el Str1 y el Str2. El mtodo principal llama a STRCOMP
para comparar el contenido de cada string.
3.3.52. STRING
Declara constantes de tipo cadena (string) y recoge su direccin.
STRING (StringExpression )
Devuelve: La direccin de la constante string.
Explicacin
El bloque DAT se utiliza a menudo para crear strings o string buffers que son reutilizables para varios propsitos,
pero hay ocasiones cuando un string se necesita para propsitos temporales como eliminar errores o aplicaciones
de un solo uso de objeto. La directiva de STRING se utiliza para esas aplicaciones de una sola vez; compila un
string en lnea en memoria y devuelve la direccin de ese string.
Uso de STRING
STRING es muy bueno para crear strings de un solo uso y pasar la direccin de ese string a otros mtodos. Por
ejemplo:
PrintStr(string("Esto es un string de prueba."))
El ejemplo anterior utiliza el directorio de STRING para compilar el string, "Esto es un string de prueba", en
memoria y devuelve la direccin de ese string como el parmetro para el mtodo ficticio de PrintStr.
Si un string necesita ser utilizado en ms de un lugar en cdigo, es mejor definirlo en el bloque DAT y as la
direccin se puede utilizar mltiples veces.
3.3.53. STRSIZE
Recoge el tamao de un string.
STRSIZE ( StringAddress )
Devuelve: El tamao (en bytes) de strings.
StringAddress es una expresin que especifica la direccin de comienzo del string a medir.
Explicacin
STRSIZE es uno de dos comandos (STRCOMP y STRSIZE) que recuperan la informacin sobre un string.
STRSIZE mide la longitud de un string en StringAddress, en bytes, hasta un byte de terminacin cero.
Uso de STRSIZE
El ejemplo siguiente asume que Print es un mtodo creado a parte.
PUB Main
Print (strsize(@Str1))
Print (strsize(@Str2))
DAT
Str1 byte Hello World, 0
Str2 byte Testing., 0
3-86
www.microcontroladores.com
info@microcontroladores.com
El ejemplo anterior tiene dos strings terminados en cero, en el bloque de DAT, el Str1 y el Str2. El mtodo principal
llama a STRSIZE para conseguir la longitud de cada secuencia. Print es un mtodo que muestra un valor, en este
ejemplo imprime 11 y 8 en la pantalla.
Smbolos
Los smbolos en la tabla 4-13 responden a uno o ms propsitos especiales en cdigo Spin.
FloatConstant es la expresin constante con punto flotante que se truncar a un nmero entero.
3-87
www.microcontroladores.com
info@microcontroladores.com
Explicacin
TRUNC es una de las tres directivas (FLOAT, ROUND y TRUNC) usadas para las expresiones constantes de
punto flotante. TRUNC devuelve una constante entera que es la expresin constante dada en punto flotante sin la
porcin fraccionaria.
Uso de TRUNC
TRUNC se puede utilizar para recuperar la porcin del nmero entero de una constante en punto flotante. Por
ejemplo:
CON
OneHalf =
Bigger
=
Int1
=
Int2
=
Int3
=
0.5
1.4999
trunc(OneHalf)
trunc(Bigger)
trunc(Bigger * 10.0) + 4
El cdigo anterior crea dos constantes con punto flotante, OneHalf y Bigger, igual a 0.5 y a 1.4999,
respectivamente. Las tres constantes siguientes, Int1, Int2 e Int3, son las constantes enteras que se basan en
OneHalf y Bigger con la directiva TRUNC. Int1 = 0, Int2 = 1, e Int3 = 18.
Explicacin
VAR es el declaracin de un bloque variable. El bloque variable es una seccin de cdigo de fuente que declara
variables globales. sta es una de las seis declaraciones especiales (CON, VAR, OBJ, PUB, PRI, y DAT) que
proporcionan la estructura inherente a la lengua Spin.
Declaracin de Variables (Sintaxis 1)
La forma ms comn de declaracin de variables comienza con una lnea VAR seguido por una o ms
declaraciones. VAR debe comenzar en la columna 1 (la columna extrema izquierda) de la lnea en la que se
encuentra y las lneas siguientes tienen que ser tabuladas por lo menos un espacio.
3-88
www.microcontroladores.com
info@microcontroladores.com
Str[10]
Code
LargeNumber
Este ejemplo define Str como un array de bytes de 10 elementos, Code como word (dos bytes) y LargeNumber
como long (cuatro bytes). Los mtodos pblicos y privados se pueden referir a estas variables de las maneras
similares a la siguiente:
PUB SomeMethod
Code := 60000
LargeNumber := Code * 250
GetString(@Str)
if Str[0] == A
<more code here>
Hay que fijarse que Code y LargeNumber son utilizados directamente por expresiones. La referencia Str en la lista
de parmetros del mtodo de GetString parece diferente; tiene @, el operador del smbolo de direccin,
precedindolo. Esto es porque el mtodo ficticio de GetString necesita escribir de nuevo en la variable Str. Si
hubiera sido GetString(Str), entonces el primer byte de Str, el elemento 0, habra sido pasado a GetString. Usando
al operador del smbolo de direccin, @, se hace que la direccin del Str pase a GetString y as, se puede usar
esa direccin para escribir a elementos del Str. Por ultimo, se utiliza Str[0 ] en la condicin del IF para ver si el
primer byte es igual al carcter "A". Hay que recordar que, el primer elemento de un array es siempre cero (0).
Declaraciones de Variables (Sintaxis 2)
Una variacin en el sintaxis 1 permite variables delimitadas con comas del mismo tamao. A continuacin se
muestra un ejemplo, similar al ejemplo anterior, pero se declaran dos words, Code e Index.
VAR
byte Str[10]
word Code, Index
long LargeNumber
Alcance de Variables
Las variables definidas en bloques variables, son globales al objeto en el cual se definen pero no fuera de ese
objeto. Esto significa que estas variables se pueden acceder directamente en cualquier sitio dentro del .
Los mtodos pblicos y privados tienen la capacidad de declarar sus propias variables locales.
Las variables globales no son accesibles desde el exterior de un objeto a menos que la direccin de esa variable
se pase a otro objeto con una llamada de un mtodo.
3.3.56. VCFG
Registro de Configuracin de Video.
VCFG
Devuelve: El valor actual del registro de configuracin de video del Cog, si est utilizado como variable fuente.
Explicacin
VCFG es uno de dos registros (VCFG y VSCL) que afectan al comportamiento del generador video de un Cog.
Cada Cog tiene un mdulo generador de video que facilita la transmisin de datos de la imagen video en un ratio
3-89
www.microcontroladores.com
info@microcontroladores.com
constante. El registro de VCFG contiene los ajustes de la configuracin del generador de video, segn lo mostrado
en la tabla 4-14.
VMode
El campo de 2-bit VMode (modo video) selecciona el tipo y la orientacin de la salida de video, si la hay, segn la
tabla 4-15.
En ensamblador del Propeller, el campo de VMode se puede escribir convenientemente usando la instruccin de
MOVI a travs de los campos de ASubCar.
CMode
El campo de CMode (modo de color) selecciona modo de dos o cuatro colores. 0 = modo dos colores y 1 = modo
de cuatro colores.
En ensamblador del Propeller, el campo de VMode se puede escribir convenientemente usando la instruccin de
MOVI a travs de los campos de ASubCar.
BroadCma
El campo BroadCma (broadcast chroma) habilita o inhabilita el chroma (color) en la seal broadcast. 0 =
inhabilitado, 1 = habilitado.
BaseCma
El campo BaseCma (baseband chroma) habilita o inhabilita el chroma (color) en la seal de baseband. 0 =
inhabilitado, 1 = habilitado.
En ensamblador Propeller, el campo de Vmode se puede escribir convenientemente usando la instruccin de
MOVI a travs de los campos de ASubCar.
ASubCar
El campo ASubCar (aural sub-carrier) selecciona la frecuencia del sub-carrier de la fuente FM (audio) de para
modularla. La fuente es el PLLA de uno de los Cogs, identificado por el valor de ASubCar.
3-90
www.microcontroladores.com
info@microcontroladores.com
Uso de VCFG
VCFG puede ser leido/escrito como otros registros o variables predefinidas. Por ejemplo:
VCFG: = %0_10_1_0_1_000_00000000000_001_0_00001111
Esto fija la configuracin del registro de video para habilitar el modo compuesto de 1 con 4 colores, el chroma de
baseband (color), en el grupo 1 de pins que son los 4 pins ms bajos (los pins P11:8).
3-91
www.microcontroladores.com
info@microcontroladores.com
3.3.57. VSCL
Registro de la escala de Video
VSCL
Devuelve: El valor actual del Registro de escala de Video del Cog , si se usa como variable fuente.
Explicacin
VSCL es uno de dos registros (VCFG y VSCL) que afectan al comportamiento del generador de video de un Cog.
Cada Cog tiene un mdulo de generador de video que facilita la transmisin de datos de la imagen video en un
ratio constante. El registro de VSCL fija el ratio en la cual se generan los datos de video.
PixelRate
El campo 8-bit de PixelRate (tarifa del pxel) indica el nmero de relojes por el pixel; el nmero de los relojes que
deben transcurrir antes de que cada pixel sea cambiado de puesto hacia fuera por el mdulo video del generador.
Estos relojes son los relojes de PLLA, no el reloj del sistema.
FrameRate
El campo de 12-bit FrameRate (tarifa del marco) indica el nmero de relojes por marco; el nmero de los relojes
que deben transcurrir antes de que cada marco sea cambiado de puesto hacia fuera por el mdulo video del
generador. Estos relojes son los relojes de PLLA, no el reloj del sistema. Un marco es uno de largo de datos del
pixel (entregados va el comando de WAITVID). Puesto que los datos del pixel son 16-bits por 2-bits, o 32- bits por
1-bit (pxeles del significado 16 de par en par con 4 colores, o 32 pxeles de par en par con 2 colores,
respectivamente), el FrameRate es tpicamente 16 o 32 veces que del PixelRate valoran.
Uso de VSCL
VSCL puede ser leido/escrito como otros registros o variables predefinidas. Por ejemplo:
VSCL: = %000000000000_10100000_101000000000
Esto fija el registro video de la escala para 160 un reloj PixelRate y 2.560 un reloj FrameRate (para un 16-pixel por
el marco del color 2-bit). Por supuesto, la tarifa real en que los pxeles registra hacia fuera depende de la
frecuencia de PLLA conjuntamente con este factor de posicionamiento.
3.3.58. WAITCNT
Detiene la ejecucin de un Cog temporalmente.
WAITCNT ( Value )
Value es el valor de 32-bits que se desea que el contador del sistema espere.
Explicacin
WAITCNT, Wait for System Counter,es uno de cuatro comandos de espera (WAITCNT, WAITPEQ, WAITPNE, y
WAITVID) usados para detener la ejecucin de un Cog hasta que se resuelve una condicin. WAITCNT detiene el
Cog hasta que el contador global del sistema iguala Value.
Cuando est ejecutado, WAITCNT activa el hardware especial de "espera" en el Cog que evita que el reloj del
sistema cause la ejecucin adicional del cdigo dentro del Cog hasta el momento que los valores del contador del
3-92
www.microcontroladores.com
info@microcontroladores.com
sistema Value se igualan. El hardware de wait checkea el contador del sistema en cada ciclo del reloj y el
consumo de energa del Cog se reduce aproximadamente 7/8s durante este tiempo. En aplicaciones normales,
WAITCNT se puede utilizar estratgicamente para reducir el consumo de energa en cualquier sitio del programa
donde se pierda el tiempo esperando a eventos de banda estrecha.
Hay dos tipos de retrasos WAITCNT se puede utilizar para: retrasos fijos y retrasos sincronizados. Ambos se
explican abajo.
Retrasos Fijos
Los retrasos fijos son los que no tienen relacin con un punto especfico en tiempo y responden al propsito de
detener la ejecucin por una cantidad de tiempo fija. Un retraso fijo, por ejemplo, puede ser utilizado para esperar
10 milisegundos despus de que ocurra un acontecimiento, antes de proceder con otra accin. Por ejemplo:
CON
_clkfreq = xtal1
_xinfreq = 5_000_000
repeat
!outa[0]
waitcnt(50_000 + cnt)
Activa el pin 0
Espera 10 ms
Este cdigo activa el estado del pin P0 de E/S y espera 50.000 ciclos de reloj del sistema antes del loop de
repeticin.
IMPORTANTE: Desde que WAITCNT detiene el Cog hasta que el contador del sistema lo empareja al valor dado,
hay que tener cuidado para asegurarse que el valor dado no haya sobrepasado ya el contador del sistema
Retrasos Sincronizados
Los retrasos sincronizados son los que estn relacionados directamente con un punto especfico en el tiempo, un
tiempo base, y sirven a para alinear en el tiempo acontecimientos futuros, en relacin con ese punto. Los
retrasos sincronizados, por ejemplo, pueden utilizarse para hacer salir o entrar una seal en un intervalo
especfico. Para entender la diferencia con el retraso fijo, miremos el diagrama que mide el tiempo de ese ejemplo.
La figura anterior muestra la salida del ejemplo anterior de retraso fijo. Se puede ver como el pin P0 se activa cada
10 milisegundos, aunque no es exacto. De hecho, hay un error acumulativo que hace que el retraso sea cada vez
mayor.
Se puede usar WAITCNT de una manera levemente diferente, porque el retraso sincronizado, eliminar este error
de sincronizacin. El ejemplo siguiente asume que estamos utilizando un cristal externo de 5 Mhz.
CON
_clkfreq = xtal1
_xinfreq = 5_000_000
PUB Activa | Time
Time := cnt
repeat
waitcnt(Time += 50_000)
3-93
www.microcontroladores.com
info@microcontroladores.com
Activa pin 0
Este cdigo, primero recupera el valor del contador del sistema, entonces comienza el bucle Repeat donde espera
el contador de sistema alcance Time + 50.000, se activa del estado del pin P0 de E/S y repite bucle otra vez. La
declaracin Time + = 50_000 es realmente una declaracin de asignacin; que suma al valor Time 50.000,
almacena el resultado nuevamente dentro de Time y despus ejecuta el comando de WAITCNT usando ese
resultado.
Cada iteracin sucesiva, espera a que el contador del sistema sea a igual otro mltiplo de 50.000 a partir del
tiempo base. Este mtodo compensa automticamente el tiempo consumido arriba por las declaraciones del
bucle: repeat,!outa[0 ] y waitcnt. La salida que resulta parece la siguiente figura.
3.3.59. WAITPEQ
Detiene la ejecucin de un Cog hasta que los pins de E/S coincida con los estados designados.
WAITPEQ (State, Mask, Port )
State es el estado lgico para comparar los pins. Es un valor 32-bits que indica los estados altos o bajos
de hasta 32 pins de E/S. Solamente el estado de los bits que corresponden a los bits altos (1) de la Mask
(mscara) se utilizan para la comparacin.
Mask (mscara) es el/los pin(s) que se quieren supervisar. Mask es un valor 32-bits que contiene los bits
altos (1) para cada pin de E/S que deban ser supervisados; los bits bajos (0) indican los pins que deben
ser ignorados. Los pins supervisados se comparan con los bits correspondientes de State hasta que la
condicin se cumpla.
Port (puerto) es un valor de 1-bit que indica el puerto de E/S al monitor; 0 = Puerto A, 1 = Puerto B. Solo
existe el Puerto A en el chip Propeller actual (P8X32A).
Explicacin
WAITPEQ, " Wait for Pin(s) to Equal, " es uno de cuatro comandos de espera (WAITCNT, WAITPEQ, WAITPNE, y
WAITVID) usados para detener ejecucin de un Cog hasta que se resuelve una condicin. WAITPEQ detiene el
Cog hasta que por lo menos uno de los pins de E/S del puerto, indicado por alto (1) en la mscara, no coincide
con los bits correspondientes del estado.
Cuando est ejecutado, WAITPEQ activa el hardware especial "wait" en el Cog, que evita que el reloj del sistema
cause una ejecucin adicional de cdigo dentro del Cog, hasta el momento que el pin sealado, o el grupo de
pins, no coincida con los del estado. El hardware de wait chequea los pins de E/S en cada ciclo del reloj del
Sistema y el consumo de energa del Cog se reduce aproximadamente 7/8s durante este tiempo.
Uso de WAITPEQ
WAITPEQ es una gran manera de sincronizar cdigo a los acontecimientos externos. Por ejemplo:
waitpeq(%0100, %1100, 0)
outa[0] := 1
El cdigo detiene el Cog hasta que el pin 3 de E/S sea bajo y el pin 2 de E/S sea alto, despus fija el pin 0 de E/S
como alto.
Uso de Nmeros Variables de Pin
Para los objetos Propeller, es necesario que supervisen a menudo un solo pin cuyo nmero se especifique fuera
del mismo objeto. Una manera fcil de traducir ese nmero de pin al valor apropiado de 32-bits de la mscara es
3-94
www.microcontroladores.com
info@microcontroladores.com
usando el operador Decodificar en modo bit "|<". Por ejemplo, si el nmero de pin fue especificado por la variable
Pin, y se necesita esperar hasta que ese pin sea alto, se podra utilizar el siguiente cdigo:
waitpeq(-1, |< Pin, 0)
Esperar a la Transicin
Si necesitamos esperar a una transicin de un estado a otro (alto-a-bajo, por ejemplo) podramos utilizar el cdigo
siguiente:
waitpeq(1, 5, 0)
waitpeq(0, 5, 0)
Este primer ejemplo espera a P5 para pasar a ALTO, entonces lo espera para pasar a BAJO; una transicin altoa-baja. Si se hubiera utilizado la segunda lnea del cdigo, el Cog no se habra detenido si P5 hubiese sido bajo en
el comienzo.
3.3.60. WAITPNE
Detiene la ejecucin de un Cog hasta que los pins de E/S no sean igual a los estados designados.
WAITPNE (State, Mask, Port )
State es el estado lgico para comparar los pins. Es un valor 32-bits que indica los estados altos o bajos
de hasta 32 pins de E/S. Solamente el estado de los bits que corresponden a los bits altos (1) de la Mask
(mscara) se utilizan para la comparacin.
Mask (mscara) es el/los pin(s) que se quieren supervisar. Mask es un valor 32-bits que contiene los bits
altos (1) para cada pin de E/S que deban ser supervisados; los bits bajos (0) indican los pins que deben
serignorados. Los pins supervisados se comparan con los bits correspondientes de State hasta que la
condicin no se cumpla.
Port (puerto) es un valor de 1-bit que indica el puerto de E/S al monitor; 0 = Puerto A, 1 = Puerto B. Solo
existe el Puerto A en el chip Propeller actual (P8X32A).
Explicacin
WAITPNE, " Wait for Pin(s) to Not Equal, " es uno de cuatro comandos de espera (WAITCNT, WAITPEQ,
WAITPNE, y WAITVID) usados para detener ejecucin de un Cog hasta que se resuelve una condicin.
WAITPNE es la forma complementaria de WAITPEQ; detiene el Cog hasta que por lo menos uno de los pins de
E/S del puerto, indicado por alto (1) en la mscara, no coincide con los bits correspondientes del estado.
Cuando est ejecutado, WAITPNE activa el hardware especial "wait" en el Cog, que evita que el reloj del sistema
cause una ejecucin adicional de cdigo dentro del Cog, hasta el momento que el pin sealado, o el grupo de
pins, no coincida con los del estado. El hardware de wait chequea los pins de E/S en cada ciclo del reloj del
Sistema y el consumo de energa del Cog se reduce aproximadamente 7/8s durante este tiempo.
Uso de WAITPNE
WAITPNE es una gran manera de sincronizar cdigo a los acontecimientos externos. Por ejemplo:
waitpeq(%0100, %1100, 0)
waitpne(%0100, %1100, 0)
outa[0] := 1
El cdigo anterior detiene el Cog hasta que P3 sea bajo y P2 sea alto, despus detiene el Cog otra vez hasta que
uno o ambos pins cambien los estados, entonces se fija P0 alto.
3-95
www.microcontroladores.com
info@microcontroladores.com
3.3.61. WAITVID
Detiene la ejecucin de un cog hasta que su Generador de Video est disponible para recoger los datos pxel.
WAITVID (Colors, Pixels )
Colors (colores) es un Long conteniendo cuatro valores del color de tamao Byte, cada uno describe los
cuatro colores posibles de los patrones del pixel en Pixels .
Pixels (pixeles) son los siguientes 16-pixel entre 2 bit (o 32-pixel entre 1 bit )al lado por 1-bit) patrn del
pixel a mostrar.
Explicacin
WAITVID, " Wait for Video Generador, es uno de cuatro comandos de espera (WAITCNT, WAITPEQ, WAITPNE,
y WAITVID) usados para detener la ejecucin de un Cog hasta que se resuelve una condicin. WAITVID detiene
el Cog hasta que su hardware del Generador de Video este listo para los siguientes datos del pixel, despus el
Generador de Video acepta los datos y el Cog contina la ejecucin con la siguiente lnea de cdigo.
Cuando est ejecutado, WAITVID activa el hardware especial "wait" en el Cog, que evita que el reloj del sistema
cause una ejecucin adicional de cdigo dentro del Cog, hasta el momento que el generador de video este listo. El
hardware de wait chequea el estado del Generador de Video en cada ciclo del reloj del Sistema y el consumo de
energa del Cog se reduce perceptiblemente durante este tiempo.
Uso de WAITVID
WAITVID es simplemente un mecanismo de entrega de datos al hardware del Generador de video del Cog.
Puesto que el funcionamiento del Generador de Video es independientemente del Cog en s mismo, los dos se
deben sincronizar cada vez que los datos son necesarios para el mecanismo de exhibicin de datos. La frecuencia
en la cual esto ocurre depende del mecanismo de exhibicin y de los ajustes correspondientes para el Generador
de Video, pero en cada caso, el Cog debe tener nuevos datos disponibles el momento que el Generador de Video
este listo para l. El Cog utiliza el comando de WAITVID para esperar el tiempo adecuado y entonces hacer
entrega de estos datos al Generador de Video.
El parmetro de Color es un valor 32-bits que contiene cuatro valores de color de 8-bit. Los 6 bits superiores del
valor del color son 2-bit el rojo, 2-bit el verde, y 2-bit el azul que describen el color deseado. Los ltimos dos bits
no se utilizan.
Cada uno de los valores de color corresponde a uno de los cuatro colores posibles por el patrn 16x2 o 32x1.
Los pixeles describen el patrn del pixel a exhibir, 16 pixeles o 32 pixeles dependiendo de la configuracin de la
profundidad de color del Generador de Video.
3.3.62. WORD
Declara smbolos o datos tamao-word, o lectura / escritura de words en memoria principal.
WORD Symbol <[Count]>
WORD Data
WORD [BaseAddress] <[Offset]>
3-96
www.microcontroladores.com
info@microcontroladores.com
Explicacin
WORD es uno de tres declaraciones multiusos (BYTE, WORD, y LONG) que declaran o operan en memoria.
WORD se puede utilizar para:
1) declarar un smbolo tamao-word o un array de simbolos de elementos tamao-word en un bloque del VAR, o
2) declarar datos de tipo alineacin de words, y/o tamao-word, en un bloque de DAT, o
3) leer o escribir una word de la memoria principal en una base de direccin con un ajuste opcional.
Declaracin de la Variable Word (Sintaxis 1)
En bloques VAR, sintaxis 1 de WORD se utiliza para declarar las variables globales, variables simblicas tanto
tamao-word como cualquier array de words. Por ejemplo:
VAR
word Temp
word List[25]
El ejemplo declara dos variables; Temp y List. Temp es simplemente una variable tamao-word. La siguiente
lnea utiliza el campo opcional Count para crear un array de elementos de 25 words llamado List. Temp y List
pueden ser accedidos desde cualquier mtodo PUB o PRI que tenga el mismo objeto que este bloque VAR;
porque son globales al objeto. A continuacin un ejemplo de esto.
PUB SomeMethod
Temp := 25_000
List[0] := 500
List[1] := 9_000
List[24] := 60_000
El ejemplo declara dos smbolos de datos, MyData y MyList. MyData seala al comienzo de datos word-alineados
y tamao-word, en memoria principal. Los valores de MyData, en memoria principal, son 640, $AAAA y 5.500,
respectivamente. MyList utiliza una sintaxis especial del bloque DAT de WORD que crea un sistema de datos bytealineado pero de tamao-word en memoria principal. Los valores de MyList, en memoria principal, son $FF99 y
1.000, respectivamente. Cuando se accede a un byte a la vez, MyList contiene $99, $FF, 232 y 768 puesto que los
datos se almacenan en formato endian-pequeo.
Estos datos se compilan en el objeto y en la aplicacin resultante como parte del cdigo ejecutable y se pueden
acceder usando la forma de lectura / escritura, sintaxis 3, de WORD .
Lectura / escritura de Words en Memoria Principal (Sintaxis 3)
En los bloques PUB y PRI, la sintaxis 3 de WORD se utiliza para leer o para escribir valores de tamao-word de la
memoria principal. Si se asume que nuestro objeto contiene el bloque DAT del ejemplo arriba, se poda utilizar el
siguiente para tener acceso a esos datos.
PUB GetData | Index, Temp
Temp := WORD[MyData]
Lee la primera word de MyData a Temp
<do something with Temp>
Realizar una tarea con Temp
repeat Index from 0 to 1
Repetir dos veces
Temp := WORD[MyList][Index]
Lee el dato a Temp 1 word por vez
<do something with Temp> Realizar una tarea con valor Temp
3-97
www.microcontroladores.com
info@microcontroladores.com
La primera lnea dentro del mtodo de GetData, arriba, utiliza la declaracin de WORD para leer una word de la
memoria principal en la localizacin MyData y lo almacena en Temp, en este caso, el valor 640. Mas abajo, en el
loop del REPEAT, la declaracin de WORD lee una word de la memoria principal de la localizacin MyList + ndice
y la almacena en Temp. Puesto que la primera iteracin del loop tiene ndice fijado a 0, la primera word de MyList
se lee, en $FF99. La prxima vez que pasa por el loop lee la siguiente word, efectivamente, MyList + 1 (1.000).
Usando una sintaxis similar, las words de la memoria principal se pueden escribir a tambin, mientras son
localizaciones del RAM. Por ejemplo:
WORD[MyList][0] := 8_192
StartAddress (direccin de comienzo) es una expresin que indica la localizacin de la primera word de
memoria para llenar con Value.
Value (valor) es una expresin que indica el valor con el que rellenar las words.
Count (contador) es una expresin que indica el nmero de words, comenzando con StartAddress.
Explicacin
WORDFILL es uno de tres comandos (BYTEFILL, WORDFILL, y LONGFILL) usados para llenar bloques de la
memoria principal con un valor especfico. WORDFILL rellena Count words de la memoria principal con Value,
comenzando en la localizacin StartAddress.
Uso de WORDFILL
WORDFILL es una gran manera de limpiar grandes bloques de memoria tamao-word. Por ejemplo:
VAR
word Buff[100]
PUB Main
wordfill(@Buff, 0, 100)
Limpia Buff a 0s
La primera lnea del mtodo principal, limpia el array entero de 100-words (200-byte) a todos los ceros.
WORDFILL es ms rpido realizando esta tarea que un loop REPEAT dedicado.
3.3.64. WORDMOVE
Copia words (palabras) de una regin a otra en memoria principal.
WORDMOVE (DestAddress, SrcAddress, Count )
DestAddress (direccin de destino) es una expresin que especifica la localizacin de memoria principal
donde copiar la primera word fuente.
SrcAddress (direccin fuente) es una expresin que especifica la localizacin de memoria principal de la
primera word de la fuente para copiar.
Count (Contador) es una expresin que indica el nmero de las words fuente para copiar al destino.
Explicacin
3-98
www.microcontroladores.com
info@microcontroladores.com
WORDMOVE es uno de tres comandos (BYTEMOVE, WORDMOVE, y LONGMOVE) usados para copiar bloques
de la memoria principal a partir de una rea a otra. WORDMOVE copia Count words de la memoria principal que
empiezan desde SrcAddress a la memoria principal que comienza en DestAddress.
Uso de WORDMOVE
WORDMOVE es una gran manera de copiar bloques grandes de memoria tamao-word. Por ejemplo:
VAR
word Buff1[100]
word Buff2[100]
PUB Main
wordmove(@Buff2, @Buff1, 100)
La primera lnea del mtodo principal, copia el array entero Buff1 de 100-words (200-byte) al array Buff2.
WORDMOVE es ms rpido desempeando esta tarea que si se codificase lo mismo en un loop de REPEAT.
3.3.65. _XINFREQ
Constante predefinida y ajustable una vez para especificar la frecuencia del cristal externo.
CON
_XINFREQ = Expresin
Expresin es un nmero entero que indica la frecuencia del cristal externo; la frecuencia en el pin XI. Este
valor se utiliza para el arranque de la aplicacin.
Explicacin
_ XINFREQ especifica la frecuencia del cristal externo, que se utiliza junto con el modo de reloj para determinar la
frecuencia de reloj del sistema en el arranque. Es un smbolo constante predefinido que valor es determinado por
el fichero objeto superior dela aplicacin. _ XINFREQ se ajusta directamente por la misma aplicacin, o se ajusta
indirectamente como resultado de los ajustes _ CLKMODE y _ CLKFREQ.
El fichero objeto superior en una aplicacin (donde empieza la compilacin) puede especificar un ajuste para _
XINFREQ en su bloque CON. Esto, junto con el modo de reloj, define la frecuencia que a la que cambiara el reloj,
tan pronto como se arranque la aplicacin y comience la ejecucin.
La aplicacin puede especificar tanto _ XINFREQ como _ CLKFREQ en el bloque CON; son mutuamente
exclusivos y el no-especificado se calcula y se fija automticamente como resultado de especificar el otro.
Los siguientes ejemplos asumen que estn contenidos dentro del fichero objeto superior. Cualesquier ajuste de
_XINFREQ en objetos hijo son simplemente ignorados por el copilador.
Por ejemplo:
CON
_CLKMODE = XTAL1 + PLL8X
_XINFREQ = 4_000_000
La primera declaracin en este bloque CON fija el modo de reloj para un cristal externo de poca velocidad y un
multiplicador del reloj PLL de 8. La segunda declaracin indica la frecuencia del cristal externo es 4 Mhz, que
significa que la frecuencia de reloj del sistema ser 32 Mhz porque 4 Mhz * 8 = 32 Mhz. El valor de _ CLKFREQ se
fija automticamente a 32 Mhz debido a estas declaraciones.
CON
_CLKMODE = XTAL2
_XINFREQ = 10_000_000
Estas dos declaraciones fijan el modo de reloj para un cristal externo de velocidad media, ningn multiplicador del
reloj PLL, y una frecuencia del cristal externo de 10 Mhz. El valor de _ CLKFREQ, y tambin la frecuencia de reloj
del sistema, se fijan automticamente a 10 Mhz, debido a estas declaraciones.
3-99
3-100
www.microcontroladores.com
info@microcontroladores.com