Anda di halaman 1dari 149

PROPELLER: El gigante

de 8 cabezas
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
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

PROPELLER: EL GIGANTE DE 8 CABEZAS
Indice general

www.microcontroladores.com
info@microcontroladores.com
i-1


Un documento en castellano basado en la documentacin del fabricante Parallax destinado a los
clientes de Ingeniera de Microsistemas Programados S.L. distribuidor de Parallax en Espaa

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


CAPITULO 2: MANEJO Y DESARROLLO DE APLICACIONES

2.1. La concepcin del software
2.2. Organizacin de la pantalla

2.2.1. Panel 1: Panel de visualizacin de objetos
2.2.2. Panel 2: Campo de carpetas recientes y lista de carpetas
2.2.3. Panel 3: La lista de archivos y filtro de archivos
2.2.4. Panel 4: Panel del editor

2.3. Componentes del men
2.4. Tabla de caracteres (CARCTER CHART)
2.5. Modos de visin, bookmarks y nmeros de lnea
2.6. Seleccin de bloques y movimiento de seleccin
2.7. Identing y Outdenting
2.8. Indicadores de bloque-grupo
2.9. Teclas de acceso rpido





PROPELLER: EL GIGANTE DE 8 CABEZAS
Indice general

www.microcontroladores.com
info@microcontroladores.com
i-2

CAPITULO 3: EL LENGUAJE SPIN

3.1. Introduccin
3.2. Listado por categoras del lenguaje Spin del Propeller
3.3. Descripcin de los elementos del lenguaje Spin
3.3.1. ABORT
3.3.2. BYTE
3.3.3. BYTEFILL
3.3.4. BYTEMOVE
3.3.5. CASE
3.3.6. CHIPVER
3.3.7. CLKFREQ
3.3.8. _CLKFREQ
3.3.9. CLKMODE
3.3.10. _CLKMODE
3.3.11. CLKSET
3.3.12. CNT
3.3.13. COGID
3.3.14. COGINIT
3.3.15. COGNEW
3.3.16. COGSTOP
3.3.17. CON
3.3.18. CONSTANT
3.3.19. CTRA, CTRB
3.3.20. DAT
3.3.21. DIRA, DIRB
3.3.22. FILE
3.3.23. FLOAT
3.3.24. _FREE
3.3.25. FRQA, FRQB
3.3.26. IF
3.3.27. INA, INB
3.3.28. LOCKCLR
3.3.29. LOCKNEW
3.3.30. LOCKRET
3.3.31. LOCKSET
3.3.32. LONG
3.3.33. LONGFILL
3.3.34. LONGMOVE
3.3.35. LOOKDOWN, LOOKDOWNZ
3.3.36. LOOKUP, LOOKUPZ
3.3.37. NEXT
3.3.38. OBJ
3.3.39. OPERADORES
3.3.39. OUTA, OUTB
3.3.40. PAR
3.3.41. PHSA, PHSB
3.3.42. PRI
3.3.43. PUB
3.3.43B. QUIT
3.3.44. REBOOT
3.3.45. REPEAT
3.3.46. RESULT
3.3.47. RETURN
3.3.48. ROUND


PROPELLER: EL GIGANTE DE 8 CABEZAS
Indice general

www.microcontroladores.com
info@microcontroladores.com
i-3

3.3.49. SPR
3.3.50. _STACK
3.3.51. STRCOMP
3.3.52. STRING
3.3.53. STRSIZE
3.3.54. TRUNC
3.3.55. VAR
3.3.56. VCFG
3.3.57. VSCL
3.3.58. WAITCNT
3.3.59. WAITPEQ
3.3.60. WAITPNE
3.3.61. WAITVID
3.3.62. WORD
3.3.63. WORDFILL
3.3.64. WORDMOVE
3.3.65. _XINFREQ




PROPELLER: EL GIGANTE DE 8 CABEZAS
Indice general

www.microcontroladores.com
info@microcontroladores.com
i-4



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-1

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 de aplicaciones de las complejidades tpicas de la
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.

1.2. Tipos de encapsulado

El chip Propeller est disponible en los
encapsulados mostrados en la Figura
1-1.






Figura1-1.-Encapsulados del
Propeller.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-2

Descripciones de patitas o pines


Nombre de PIN Direccin Descripcin
P0-P31 E/S (E/S) 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.
VDD -- 2.7 3.3 VDC
VSS -- Tierra. 0 VDC
BOEn I 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 Reset (activa con nivel bajo)
Cuando es baja, resetea el chip Propeller; deshabilita todos
los cogs y los pines de E/S. El Propeller se resetea 50 ms
despus de las transiciones de RESn de
baja a alta cuando Vdd/Vss es suficiente.
XI I Entrada del Cristal.
Puede conectarse a la salida del cristal/oscilador (con XO
izquierdo desconectado), o con una pata de cristal (con XO
conectado con la otra patita del cristal o del resonador)
dependiendo de los ajustes del registro de CLK. No se
requiere ninguna resistencia o condensador externos.
XO O Salida del Cristal.
Proporciona la regeneracin para un cristal externo, o puede
ser desconectado dependiendo de ajustes del registro de
CLK. No se requiere ninguna resistencia o condensador
externos.


El Propeller (P8X32A) tiene 32 patitas de E/S (Puerto A, pines P0 a P31). Los ltimos cuatro pines de E/S, P28-
P31 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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-3

Especificaciones


Modelo P8X32A
Requerimientos de arranque 3.3 VDC
Velocidad de Reloj Externo DC a 80 MHz (4 MHz a 8 MHz con el Reloj PLL en ejecucion)
Velocidad de Reloj del
sistema
DC a 80 MHz
Oscilador RC Interno


12 MHz o 20 kHz
(aprox. rango de 8 MHz 20 MHz, o
13 kHz 33 kHz, respectivamente)
RAM/ROM Global 64 K bytes; 32 K RAM / 32 K ROM
Cog RAM 2 K bytes cada Cog
Organizacion RAM/ROM 32 bits (4 bytes)
Pines E/S 32, CMOS, VDC, VDD umbral lgico de 1.65 V.
Fuente/ Sumidero actual por
E/S
50 mA
Fuente/ Sumidero actual por
chip
TBD mA
Current Draw @ 3.3 vdc,
70 F
500 uA por MIPS (MIPS = Freq en MHz / 4 * Nmero de Cogs
Activos)


1.3. Diagrama de conexionado

La Figura 1-3 muestra un ejemplo del diagrama que conecta el host y el acceso a la EEPROM al chip Propeller.
En este ejemplo el acceso al host se consigue a travs del servicio Clip Propeller (conversor USB a serie TTL).



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.




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-4

1.4. El arranque o reset

El proceso de encendido o reset se divide en las siguientes fases:

1. El oscilador interno RC del Propeller comienza a funcionar a 12 MHz aproximadamente; entonces, tras un
retraso de reset de 50 ms, el primer procesador (Cog 0) carga el programa embebido del Boot Loader y
arranca.

2. El Boot Loader realiza una o ms de las siguientes tareas, en este orden:

a. Detecta la comunicacin de un host, por ejemplo un PC, en los pines P30 y P31. Si se detecta la
comunicacin de un host, el Boot Loader conversa con el host para identificar el chip Propeller y
posiblemente para descargar un programa en RAM global y opcionalmente en la EEPROM externa
32 KB.

b. Si no se detect ninguna comunicacin del host, el Boot Loader busca la EEPROM externa 32 KB en
los pines P28 y P29. Si se detecta una EEPROM, se cargan los 32 KB en el RAM global del Propeller.


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




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-5

1.7. Diagrama por bloques de la arquitectura interna



Figura 1-4.- Arquitectura interna del Propeller.

La arquitectura del Propeller se basa en 8 procesadores, denominados Cogs, unos recursos propios de cada
procesador y otros compartidos por todos ellos, y un controlador principal, llamado Hub, que se encarga de
mantener la integridad del sistema y asignar el funcionamiento de los Cogs y el reparto de los recursos comunes.

La interaccin Cog/Hub es crtica para el chip Propeller. El Hub controla que el cog pueda tener acceso a los
recursos comunes-exclusivos (mutuo-exclusivos), tales como RAM/ROM principal, registros de configuracin, etc.
El Hub proporciona el acceso exclusivo a un cog cada vez siguiendo el procedimiento "round robin", desde el
Cog 0 a el Cog 7 y volviendo al Cog 0 otra vez, sin importar cuntos cogs estn funcionando, en lugar de
mantener el criterio de sincronizacin.

1.8. Los recursos compartidos

Hay dos tipos de recursos compartidos, o "recursos," en el Propeller: 1) comn, y 2) mutuo-exclusivo. Los recursos
comunes se pueden emplear en cualquier momento por cualquier nmero de Cogs.

Los recursos mutuo-exclusivos se pueden alcanzar por cualquier Cog, pero solamente un Cog a la vez. Los
recursos comunes son los pines de E/S y el contador del sistema. El resto de los recursos compartidos son mutuo-
exclusivos por naturaleza y el acceso a ellos es controlado por el Hub.

1.9. El reloj del sistema

El reloj del sistema es el oscilador principal o central para casi todos los componentes del Propeller. La seal del
reloj del sistema se proporciona a partir de una de las tres posibles fuentes:

1) El oscilador interno de RC
2) El circuito PLL
3) 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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-6

1.10. Cogs (Procesadores)

El Propeller contiene ocho procesadores, llamados Cogs, numerados del 0 al 7. Cada Cog contiene los siguientes
componentes: un procesador, RAM local de 2 KB configurados como 512 registros (512 x 32 bits), dos Asistentes
de E/S y PLLs, un generador video, registro de salida de E/S, registro de direccin de E/S, y otros registros no
mostrados en el diagrama.

Cada Cog puede ejecutar tareas independientes. Los ocho Cogs se manejan desde la misma fuente de reloj, el
reloj del sistema, as pueden mantener la misma referencia del tiempo y los Cogs activos pueden ejecutar
instrucciones simultneamente.

Tambin pueden tener acceso a los mismos recursos compartidos, como los pines de E/S, la RAM global, y el
contador del sistema. Los Cogs se pueden arrancar y parar en el tiempo de ejecucin y se pueden programar para
realizar tareas simultneamente, independientemente o con la coordinacin de otros Cogs a travs de la RAM
principal. Sin importar la naturaleza de su uso, un diseador de Aplicaciones Propeller tiene un control completo
sobre cmo y cundo se utiliza cada Cog. Este mtodo autoriza al desarrollador para delegar la sincronizacin, el
consumo de energa, y la respuesta de su aplicacin embebida.

Cada Cog tiene su propia RAM, llamada Cog RAM, que contiene 512 registros de 32 bits cada uno. La Cog RAM
se compone de RAM de propsito general, a excepcin de los 16 ltimos registros, que son registros de propsito
especial, segn lo expuesto en la Tabla 1-2. La Cog RAM se utiliza para cdigo ejecutable, datos, variables, y las
16 ltimas localizaciones sirven como interfaz al contador del sistema, a los pines de E/S, y a los perifrico locales
del Cog.

Cuando un Cog arranca, las posiciones comprendidas entre la 0 ($000) y la 495 ($1EF) se cargan
secuencialmente de la RAM principal/ROM mientras que sus posiciones de propsito especial, desde 496 ($1F0)
a 511 ($1FF), se inicializan a cero. Despus de la carga, el Cog comienza a ejecutar las instrucciones,
comenzando por la posicin 0 de la Cog RAM. Contina ejecutando cdigo hasta que se pare o se reinicie por s
mismo u otro Cog, o se ejecute un reset.




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-7

Nota 1: Slo accesible como Registro Fuente (ej: MOV DEST,FUENTE)
Nota 2: Reservado para uso futuro.

Cada registro de propsito especial se puede acceder por los siguientes mtodos:

1) Por su registro fsico de direcciones
2) Por sus sus nombres predefinidos
3) Indirectamente, en lenguaje Spin, a travs de una variable de array de registros, SPR, con un ndice
de 0 a de 15 o PAR a VSCL.

Los siguientes son ejemplos de ensamblador para el Propeller:

MOV $1F4, #$FFFF 'Poner OUTA todo a unos
MOV OUTA, #$FFFF 'Lo mismo que arriba

Los siguientes son ejemplos en lenguaje Spin:

SPR[$1F4] := $FFFF 'Poner OUTA todo a unos
OUTA := $FFFF 'Lo mismo que arriba
SPR[OUTA] := $FFFF 'Lo mismo que arriba


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 mutuo-
exclusivos, 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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-8

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.



Figura 1-6.- Interaccin Cog/Hub en el escenario del peor caso.

Hay que tener presente que una instruccin del Cog en el Hub en particular, no interfiere, de ninguna manera, con
las instrucciones de otro Cog gracias el mecanismo del Hub. El Cog 1, por ejemplo, puede comenzar una
instruccin Hub durante el ciclo de reloj del sistema 2, solapando posiblemente su ejecucin con el Cog 0 sin
ningn efecto perjudicial. Mientras tanto, el resto de los Cogs pueden continuar ejecutando instrucciones del no-
Hub, o aguardando sus Ventanas individuales de Acceso del Hub sin importar lo que estn haciendo los otros.


1.12 Pines de E/S

El Propeller tiene 32 pines de E/S, 28 de los cuales estn destinados para fines de propsito general. Cuatro pines
de E/S (28 - 31) son de propsito especial durante el arranque y luego estn disponibles para usos generales.
Despus del arranque, cualquier pin de E/S se puede utilizar por cualquier Cog en cualquier momento puesto que
el conjunto de pines de E/S es un recurso comn. Es tarea del desarrollador de la aplicacin asegurarse que dos
Cogs no coincidan utilizando el mismo pin de E/S durante el tiempo de ejecucin.

Cada Cog tiene su propio registro direcciones de E/S de 32 bits y su registro salida de E/S de la misma longitud.

El resultado para la configuracin de un pin de E/S sigue las siguientes reglas simples:


1. Un pin es una entrada solo de Cog no activos que lo fija a una salida.
2. Un pin tiene salida a nivel bajo slo si todos los Cogs activos que se fijan como salida estn tambin a
nivel bajo.
3. Un pin tiene salida a nivel alto si algn Cog activo que se fija como salida est tambin a nivel alto.

La Tabla 1-3 muestra algunas combinaciones posibles de la influencia de los Cogs en un pin particular de E/S, en
este ejemplo es el P12. Para la simplificacin, estos ejemplos asumen que es el bit 12 del hardware de E/S de
cada Cog, con excepcin de su registro de la salida de E/S, estn inicializados a cero (0).





PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-9


Cualquier Cog al ser desactivado deja su registro de direcciones y sus estados de salida puestos a cero, no
influenciando al estado final de los pines de E/S que los restantes Cogs activos estn controlando. Cada Cog
tambin tiene su propio registro de 32 bits de entrada. Este registro de entrada es realmente un pseudo-registro;
cada vez que se lee, los estados reales de los pines de E/S se leen, sin importar su direccin de entrada o de
salida.

1.13 Contador del Sistema

El contador del sistema es un contador global de 32 bits, que se incrementa cada ciclo de reloj del sistema. Los
Cogs pueden leer el contador del sistema (va su registro CNT) para realizar clculos de sincronizacin y pueden
utilizar el comando de WAITCNT para crear retrasos eficaces dentro de su proceso. El contador del sistema es un
recurso comn; los Cogs pueden leerlo simultneamente. El contador del sistema no se inicia a cero en el
arranque puesto que su uso prctico es para la sincronizacin diferenciada. Si un Cog necesita controlar el tiempo
a partir de un momento especfico, simplemente necesita leer y salvar el contador inicial en ese momento, y
comparar los ltimos valores del contador con ese valor inicial.

1.14 Registro CLK

El registro de CLK es el de control de configuracin del reloj del sistema; determina la fuente y las caractersticas
del Reloj del Sistema. Ms exactamente, el registro de CLK configura el oscilador RC, el reloj PLL, el oscilador de
cristal, y los circuitos del selector del reloj. (Ver la Figura 1-4). Es configurado en el tiempo de compilacin por la
declaracin CLKMODE y es escribible en el tiempo de ejecucin con el comando CLKSET. Siempre que se
escriba el registro de CLK ocurre un retraso global de unos 100 s.

Siempre que se modifica este registro, una copia del valor escrito se debe poner en la posicin del valor del Modo
Reloj (que es BYTE[4 ] en RAM principal) y la frecuencia de reloj principal resultante se debe escribir en la
posicin del valor de la frecuencia de reloj (que es LONG[0 ] en RAM principal), de modo que los objetos que se
refieren a estos datos tengan informacin actual para sus clculos de la sincronizacin. (ver CLKMODE y _
XINFREQ) Cuando es posible, se recomienda utilizar el comando de CLKSET, que actualiza automticamente
todas las posiciones mencionadas con la informacin apropiada.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-10








PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-11





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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-12
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.



Figura 1-6.- Estructura de la memoria ROM principal.

1.17. RAM Principal

La primera mitad de la memoria principal es tipo RAM. Este espacio se utiliza para almacenar el programa, datos,
variables y pila(s); todo lo cual se conoce como la Aplicacin Propeller.

Cuando un programa se carga en el chip, desde un host o desde una EEPROM externa, se escribe en todo el
espacio de esta memoria. Las primeras 16 localizaciones, $0000 - $000F, contienen datos de la inicializacin
usados por el intrprete. El cdigo ejecutable y los datos de su programa comenzarn en $0010 y se extendern
un cierto nmero de long. El rea despus del cdigo ejecutable, que se extiende hasta $7FFF, se utiliza como
lugar dedicado a contener variables y espacio de pila.

Hay dos valores interesantes almacenados en el rea de la inicializacin para el programa: el long en $0000
contiene la frecuencia de reloj principal inicial, en Hercios, y el siguiente byte $0004 contiene el valor inicial escrito
en el registro CLK. Estos dos valores pueden ser de ledos/escritos usando sus direcciones fsicas (LONG[$0 ] y
BYTE[$4 ]) y tambin pueden ser ledos usando sus nombres predefinidos (CLKFREQ y CLKMODE). Si se cambia
el registro de CLK sin usar el comando de CLOCKSET, tambin se necesitar poner al da estas dos posiciones
de modo que los objetos que se refieren a ellas tengan informacin actual.


1.18 ROM Principal

La segunda mitad de la memoria principal es tipo ROM. Este espacio se utiliza para almacenar la definicin de
caracteres, funciones matemticas, el Boot Loader y el intrprete Spin.

1.19 Definicin de caracteres

La primera mitad de la ROM contiene un sistema de 256 definiciones de carcter. Cada definicin de carcter
corresponde a 16 pxeles de ancho y 32 pxeles de alto. Estas definiciones de carcter se pueden utilizar para las
presentaciones de vdeo, LCD grfico, impresin, etc. El juego de caracteres se basa en una norma
norteamericana/europea, adems existe un juego de caracteres especiales. Los caracteres especiales los
forman conectores en forma de onda y bloques de constructores, smbolos griegos usados comnmente en
electrnica, y varias flechas. Figura 1-7.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-13



Figura 1-7.- Caracteres fuente del Propeller.

Las definiciones de caracteres se numeran de 0 a 255, de izquierda a derecha, de arriba a abajo en la Figura 1-7.
En la ROM, se ordenan con cada par de caracteres adyacentes par-impar combinados juntos para formar 32
longs. El primer par de caracteres est situado en los octetos $8000-$807F. El segundo par ocupa los octetos
$8080-$80FF, etctera, hasta que el ltimo par llena $BF80-$BFFF. La herramienta Propeller incluye una tabla
interactiva de caracteres que tiene una ROM Bitmap (mapa de bits) que muestra donde reside cada carcter en la
ROM.

Los pares de caracteres estn combinados fila-por-fila de tal forma que los 16 pxeles horizontales de cada
carcter se espacian y se interpolan con sus vecinos y as al carcter par le corresponden los bits 0, 2, 4... 30, y el
carcter impar los bits 1, 3, 5... 31.
Los pxeles extremos izquierdos estn en los bits ms bajos, mientras que los pxeles derechos estn en los bits
ms altos, segn lo mostrado en la Figura 1-8. Esto forma un long (4 octetos) para cada fila de pxeles para el par
del carcter. Todo esto se combina con la seleccin de color para exhibir el carcter par o el impar.



Figura 1-8.- Interpolacin de caracteres en el Propeller.

Algunos cdigos de carcter tienen significados concretos, como 9 para el tabulador, 10 para avance de lnea, y
13 para el retorno del carro. Estos cdigos de carcter invocan acciones y no se comparan a las definiciones
estticas del carcter. La Figura 1-9 se muestra un ejemplo de un botn con los bordes biselados 3D hechos de
algunos de estos caracteres.



Figura 1-9.- Ejemplo de un botn
con los bordes biselados 3D.







PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 1: Arquitectura y funcionamiento

www.microcontroladores.com
info@microcontroladores.com
1-14

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.




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-1

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.





PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-2


Figura 2-1.- Esquemas realizados con los caracteres especiales.

Despus de arrancar la herramienta Propeller al menos una vez, esta fuente est disponible para otros programas
de esa computadora de modo que se pueden ver estos diagramas especiales usando otros editores de texto, tales
como Notepad, o en el software para email, con tal que soporte el texto Unicode-encoded (requisito de los
caracteres especiales). Cada objeto que se crea para el proyecto tambin ser almacenado en el mismo formato
que los archivos de biblioteca (con una extensin del "spin") pero en el directorio de trabajo que se seleccione.
Todo esto est diseado para incitar a que se comparta y se aprenda de objetos existentes, ya sean diseados
por nosotros o por otros usuarios de los productos Propeller.

2.2. ORGANIZACIN DE LA PANTALLA

La ventana principal del software de la herramienta Propeller est partida en cuatro secciones, llamadas "paneles"
cada uno de ellos tiene una funcin especfica. Figura 2-2.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-3

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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-4

2.2.2 Panel 2: Campo de carpetas recientes y lista de carpetas

El panel 2 contiene dos componentes: 1) el campo de carpetas recientes, y 2) la lista de carpetas. Estos dos
componentes trabajan juntos para proporcionar el acceso de navegacin a las unidades de disco disponibles en
la computadora. La lista de carpetas exhibe una vista jerrquica de carpetas dentro de cada unidad de disco y se
puede manipular de manera similar al del panel izquierdo del explorador de Windows. El campo de carpetas
recientes (sobre la lista de la carpeta) proporciona una lista desplegable de carpetas especiales as como de
carpetas ms recientes.
El primer tem en la lista de carpetas recientes es la "biblioteca Propeller" y la "biblioteca Demo Propeller." Esos
archivos se incluyen al instalar la herramienta Propeller.
Seleccionar el modo de mostrar carpetas recientes es una manera de navegar de forma rpida a las carpetas
mas comnmente usadas del proyecto Propeller entre un sistema grande de carpetas sin relacin.

2.2.3. Panel 3: La lista archivos y filtro de archivos

El panel 3 contiene dos componentes: 1) la lista archivos, y 2) el campo del filtro. La lista de archivos muestra
todos los archivos contenidos en la carpeta seleccionada de la lista de la carpeta que emparejan los criterios del
filtro del campo del filtro. La lista de archivos se puede utilizar de una manera similar al del panel derecho del
explorador de Windows.

El campo del filtro (debajo de la lista de archivos) proporciona una lista desplegable de las extensiones de archivo,
llamados filtros, para mostrar la lista de archivos. Por defecto, slo se pueden ver los archivos Spin (con
extensiones de archivo "spin") pero tambin se puede elegir que se muestren los archivos de texto o cualquier
archivo. Si se navega a una carpeta y no se ven los archivos esperados, se recomienda revisar el campo filtro.

Los archivos en la lista de archivos se pueden abrir en el editor de las siguientes formas: 1) haciendo doble-click
sobre ellos, 2) seleccionndolos y arrastrndolos al panel del editor o 3) clickando con el botn derecho y
seleccionando Open del men rpido.

2.2.4. Panel 4: Panel del editor

El panel 4 es el panel del editor que proporciona una vista de los archivos de cdigo fuente Spin que se hayan
abierto y esta rea es donde se puede repasar, corregir, o manipular todos los objetos de cdigo fuente del
proyecto. Cada archivo (objeto del cdigo de fuente) abierto se organiza dentro del panel del editor como una
pestaa individual con el nombre del archivo que contiene. La pestaa activa del editor destaca de forma
diferentemente que el resto. Se puede tener tantos archivos abiertos a la vez como se quiera, el lmite slo lo
determina la capacidad de la memoria.

Se puede cambiar entre pestaas abiertas de las siguientes formas: 1) clickando en la etiqueta deseada con el
ratn, 2) presionando Alt+CrsrLeft o Alt+CrsrRight, o 3) presionando Ctrl+Tab o Ctrl+Shift+Tab. Si se deja el cursor
del ratn sobre una pestaa bastante tiempo se mostrar un mensaje con la ubicacin completa y el nombre del
archivo que representa.



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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-5
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.








Paso 1: Para ver ms detalles del cdigo fuente del objeto,
mantener clickado el ratn y arrastrar una pestaa del editor
a una parte ms baja del panel del editor.
















Paso 2: Soltar el botn para dejar la pestaa del editor. La
pestaa y su contenido aparecen ahora en la nueva
regin.



















PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-6








Paso 3: Repetir los pasos 1 y 2 para otras pestaas y
reajustar el tamao de ambas regiones usando el divisor
horizontal entre ellas.







Figura 2-4: Viendo y arreglando objetos

El tamao vertical de estas dos regiones se puede cambiar arrastrando el divisor horizontal que las separa. Por
supuesto, los objetos que se estn interconectando pueden ser vistos en cualquier modo, mientras que el objeto
que se est desarrollando requiere la vista del fuente completa (la nica visin editable).

El panel del editor permite incluso que sus pestaas sean arrastradas totalmente fuera de la herramienta del
Propeller. Cuando se hace esto, las nuevas pestaas ocupan una ventana nueva y se pueden manipular
independientemente de la ventana de aplicacin de la herramienta del Propeller. Esto es particularmente til para
el desarrollo en los ordenadores con ms de un monitor; las pestaas se pueden arrastrar de la aplicacin que se
muestra en un monitor y dejarla sobre el escritorio de un segundo monitor.









Paso 1: Si el espacio de escritorio lo permite, se puede
incluso arrastrar las pestaas del editor fuera de la misma
aplicacin; clickando el ratn y arrastrando una pestaa del
editor a una regin fuera de la herramienta del Propeller.


















PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-7







Paso 2: Soltar el botn para dejar la pestaa del editor;
se convertir en una ventana independiente de la
herramienta del Propeller. Se pueden arrastrar ms
pestaas de esta nueva forma.








Figura 2-5: Arreglando objetos

La barra de estado que se encuentra en la parte inferior de la herramienta Propeller, se divide en seis paneles,
cada uno de ellos muestra la informacin til de las distintas etapas del proceso del desarrollo. El panel 1 de la
barra de estado muestra siempre la posicin de la fila y columna del cursor activo del editor.



Figura 2.6: Barra de estado

Lo que se muestra en el panel 2 es el estado modificado del editor actual: 1) en blanco, que significa no
modificado, 2) modificado, o 3) slo lectura.

El panel 3 muestra el modo actual de escritura: 1) alineado (por defecto para el cdigo Spin), 2) Insert (por defecto
para cdigo no-Spin) o 3) sobre escribir. El modo de escritura puede ser cambiado presionando la tecla Insert.

El panel 4 muestra el estado de compilacin del editor actual: 1) en blanco significa
no-compilado, o 2) compilado. Este panel indica si el cdigo fuente que representa todava est en la forma en la
que fue compilado por ltima vez. Si el cdigo no se ha cambiado, este panel dir "Compiled."

El panel 5 contiene la informacin de contexto sobre el cdigo fuente del panel actual en el caso de que ese
cdigo no haya cambiado desde la ltima vez que se compil. Moviendo el cursor dentro de los bloques PUB/PRI
se puede ver la informacin perteneciente a esta regin.

El panel 6 muestra mensajes temporales sobre la operacin mas reciente.
En este rea de la barra de estado se exhibe el mensaje de error, si lo hay, de la ltima compilacin realizada. En
dicha rea tambin se indica las compilaciones satisfactorias, los cambios del tamao del fuente y otros estados.









PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-8

2.3. COMPONENTES DEL MEN

Men archivo

New Crea una nueva pestaa que contiene un editor vaci. Las pestaas existentes no
se ven afectadas.
Open... Abre un archivo en un nuevo editor.

Open From... Abre un archivo en un nuevo editor de la carpeta mas recientemente utilizada.

Save Salva el contenido de la pestaa actual usando el nombre del archivo existente, si
es aplicable.
Save As... Salva el contenido de la pestaa actual con un nuevo nombre.
Save To... Salva el contenido de la pestaa en disco en la carpeta mas recientemente
utilizada usando el dialogo Save As
Save All Salva todo lo no guardado en disco usando sus nombres existentes, si son
aplicables.
Close Cierra la pestaa actual.
Close All Cierra todas las pestaas del editor.

Select Top Object File Selecciona el fichero objeto superior del proyecto actual.
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.
Proyect + Propeller Tool... Realiza la misma tarea que la anterior pero agrega la herramienta Propeller
ejecutable al archivo comprimido.

Hide/Show Explorer Muestra o esconde los paneles integrados del explorador (lado izquierdo de la
ventana del editor).

Print Preview... Muestra una vista preliminar de la salida antes de imprimir.

Print... Imprime el contenido actual de la pestaa.

<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 Cierra la herramienta Propeller.










PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-9

Men Edit

Undo Deshace la ltima accin editable en la pestaa. Cada pestaa editable tiene su
propio buffer de histricos de Undo. Estn permitidas muchas acciones de Undo,
limitado solamente por memoria.

Redo Rehace la accin deshecha en la pestaa actual. Cada editor tiene su propio
buffer de histricos de Redo. Estn permitidas muchas acciones de Redo, limitado
solamente por memoria.

Cut Borra el texto seleccionado del editor actual y lo copia al portapapeles de
Windows.

Copy Copia el texto seleccionado del editor al portapapeles de Windows.

Paste Pega el texto del portapapeles de Windows y lo pega en el editor actual en la
posicin en la que se encuentre el cursor.

Select All Selecciona todo el texto del editor actual.

Find/Replace... Abre el dilogo de Buscar/Reemplazar (Find/Replace)

Find Next Busca la siguiente ocurrencia de la ultima secuencia de caracteres introducida en
el dialogo Find/Replace.

Replace Sustituye la seleccin actual por la secuencia de caracteres introducida en el
campo del reemplazar (Replace) del dilogo de Find/Replace.

Go To Bookmark Va al bookmark 1, 2, 3... (visible solamente cuando se muestran los bookmarks).


Text Bigger I Incrementa el tamao de la fuente de todos los editores.

Text Smaller Decrementa el tamao de la fuente de todos los editores.

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... Compila el cdigo de fuente del editor actual y si la compilacin es satisfactoria,
muestra el formulario de Object Info con los resultados. El formulario de Object
Info exhibe muchos detalles sobre el objeto incluyendo la estructura del objeto, el
tamao de cdigo, el espacio variable, el espacio libre y optimizaciones de la
redundancia.

Update Status El estado de la actualizacin compila cdigo de fuente de la pestaa actual y si es
satisfactoria, pone al da el estado Info en la barra de estado para cada objeto del
proyecto.

Load RAM +Run Compila cdigo de fuente del editor actual y si es satisfactoria, descarga la
aplicacin resultante en el RAM del chip Propeller y lo ejecuta.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-10
Load EEPROM +Run Compila cdigo de fuente del editor actual y si es satisfactoria, descarga la
aplicacin resultante en la EEPROM ( y RAM) del chip Propeller y lo ejecuta.

Load EEPROM Compila cdigo de fuente del editor actual y si es satisfactoria, descarga la
aplicacin resultante en la EEPROM del chip Propeller pero no lo ejecuta. El
siguiente reset del chip Propeller hara que se ejecute desde la 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... Escanea los puertos disponibles para el chip Propeller y si encuentra, muestra el
numero de puerto al que se conecta y la versin hardware.

Help Menu

Propeller Tool... Muestra la ayuda on-line sobre la herramienta Propeller.

Spin Languaje... Muestra la ayuda on-line sobre el lenguaje Spin.

Assembly Lenguaje... Muestra la ayuda on-line sobre el lenguaje ensamblador del Propeller.

Example Projects... Muestra la ayuda on-line que contiene proyectos del Propeller del ejemplo.

View Carcter Chart... Muestra la Tabla de caracteres interactiva de Parallax. Esta Tabla de caracteres
muestra el juego de caracteres fuente de Parallax en tres visiones posibles: Orden
estndar, BITMAP de la ROM y orden simblica. La orden estndar es la orden
estndar del ANSI. La BITMAP de la ROM muestra cmo los datos de carcter se
organizan en la ROM del chip Propeller. La orden simblica enumera los
caracteres en una orden categrica (es decir: los caracteres de la alfa, los
caracteres numricos, puntuacin, los smbolos esquemticos, etc).

View Parallax Website... Abre el Web site de Parallax usando el navegador web por defecto de la
computadora.

E-mail Parallax Support... Abre el software del email por defecto de la computadora y abre un nuevo mensaje
dirigido al soporte Parallax.

About... Muestra la ventana About que contiene los detalles de la herramienta Propeller.




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-11

Dilogo Find/Replace

Este dilogo se usa para buscar o reemplazar texto en el editor de la pestaa actual.


Figura 2-7: Dialogo Find/Replace

Find:
Es el campo donde se introduce la secuencia de caracteres que se desea buscar. Si se selecciona una palabra o
frase del editor, esta se introducir automticamente en el campo Find al abrir este dialogo. Este campo recuerda
las ltimas diez bsquedas realizadas.

Replace:
Es el campo donde se introduce la secuencia de caracteres que se quieren sustituir por la secuencia del campo
Find. El campo Replace recuerda las diez ltimas cadenas de caracteres introducidas en el.

Match
Agrupa controles de cmo debera buscarse la secuencia introducida en el campo Find. Las opciones Match son:
1) Whole Words palabras enteras, 2) Case sensible a maysculas y minsculas, y 3) With Wildcards con
comodines.

Origin
Agrupa controles que indican desde donde se desea comenzar la busqueda; si desde el principio del archivo (Top)
o desde la posicin del cursor (Cursor). Nota: La opcin "Top" cambia al "Bottom" (abajo) si fija el grupo de
Direction a Backwards (al revs).

Scope
Agrupa controles que indican el alcance de la bsqueda; si se quiere buscar el todo el archivo () o solo en la parte
seleccionada. Por defecto se realiza la bsqueda en todo el archivo y solo se habilitan estas opciones cuando
existe una regin seleccionada en el archivo. En este caso Scope tomara automticamente el valor Selection.

Direction
Agrupa los controles que indican la direccin de la bsqueda; Fordward (hacia delante) o Backward (hacia detrs).
Si se elige la opcin Backward la opcin Top (arriba) del campo Origin cambia a Bottom (abajo), que significa que
el origen de la bsqueda es el final del archivo.

Boton Find
El botn de Find inicia el proceso de bsqueda basado en todos los ajustes realizados en el dilogo Find/Replace.
Si el texto del editor empareja los criterios, se selecciona y el texto del botn Find cambia a Find Next (Buscar
Siguiente). Tambin se puede utilizar la tecla F3, con o sin el dilogo de Find/Replace abierto, para realizar ms
bsquedas.






PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-12
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.





PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-13
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

Figura 2-9: Pasando el ratn sobre un objeto se
Ver pestaas con informacin adicional

La Figura 2-9b demuestra la etiqueta para el objeto Numbers: 1) es un fichero objeto (es decir: un objeto
secundario), 2) l est en la carpeta de librera, y 3) su path y nombre de archivo: C:\Program Files\Parallax
Inc\Propeller\Numbers.spin. De esta informacin se puede tambin deducir que la carpeta librera para este
proyecto es:

C:\Program Files\Parallax Inc\Propeller.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-14

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


Info Object View

La vista del Objet Info funciona exactamente como la vista del objeto con algunas excepciones:

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.
El panel del uso RAM

El panel del uso RAM muestra la estadstica sobre la asignacin del RAM al objeto seleccionado actualmente en la
vista del Objet Info. La barra horizontal da una visin global del RAM con su leyenda sobre los colores y detalles
numricos.

Por ejemplo, la figura 2-10 muestra que el objeto del producto ABC consume 524 longs (2096 octetos) de espacio
de programa y 12 longs (48 octetos) de espacio variable, dejando alrededor de 7k longs (los octetos del excedente
30k) libres.

Reloj del Panel

El panel del reloj, bajo del panel del uso del RAM, muestra los ajustes de reloj/oscilador del objeto seleccionado
actualmente en la vista del Objet Info.

Por ejemplo, la figura 2-10 muestra que el objeto del producto ABC configur el reloj para RCFAST,
aproximadamente 12 megaciclos y ninguna frecuencia de XIN.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-15

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.



Figura 2-11: Ejemplo de ventana del objeto Info

Los botones bajo el display de la vista hexadecimal permiten descargar y cargar los datos actualmente exhibidos.

Los primeros tres botones, Load RAM + Run, Load EEPROM + Run, y Load EEPROM, realizan la misma funcin
que los tems del men Compile Current /Top de mismo nombre. Es importante observar que utilizan el objeto
actual (el que est seleccionado en la vista del Objet Info) como la fuente a descargar.

Los dos siguientes botones Save Binary File, y Save EEPROM File, guardan los datos hexadecimales del objeto
actualmente seleccionado a un archivo en disco. Save Binary File guarda solamente la porcin usada realmente
por el objeto; los datos del programa, pero no el espacio variable o stack/free. Save EEPROM File salva la imagen
entera de EEPROM, incluyendo el espacio variable y de stack/free. Se debe usar Save EEPROM File si se desea
tener un archivo que se pueda cargar en un programador EEPROM para los propsitos de produccin.

2.4. TABLA DE CARACTERES (CHARACTER CHART)

La ventana de Tabla de caracteres esta disponible en Help View Character Chart
Muestra el juego de caracteres para la fuente de Parallax que es utilizada por la herramienta Propeller y tambin
construida en la ROM del chip Propeller. Hay tres vistas en la tabla de caracteres: 1) orden estndar, 2) BITMAP
de la ROM, y 3) orden simblica.

Orden Estndar

El orden estndar, mostrado en el cuadro 2-12, muestra los caracteres en el orden que sigue el ANSI y es el
usado tpicamente por las computadoras modernas del da.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-16

Figura 2-12: Tabla de caracteres fuente Parallax en orden estndar

La informacin de la parte de abajo de la ventana muestra el tamao de fuente, en puntos, y la localizacin del
carcter en el juego de caracteres en decimal, hexadecimal, y Unicode.

Nota: El valor de Unicode es la direccin del carcter en el archivo de fuente verdadero de Type que es utilizado
por la herramienta del Propeller. Los valores decimales y hexadecimales son las direcciones lgicas del carcter
en el juego de caracteres dentro del la chip Propeller y corresponden a esa localizacin en el juego de caracteres
de ANSI usado por la mayora de las computadoras.
Bitmap ROM

La figura 2-13, muestra los caracteres en una manera representativa de cmo se almacenan en la ROM del
Propeller. Esta visin utiliza cuatro colores, blanco, gris claro, gris oscuro, y negro, para representar la
configuracin de bits de cada carcter.



Cada carcter, en la ROM del Propeller, se
define con dos bits del color. Las filas de cada
par de caracteres adyacentes se solapan en
memoria con el fin de crear caracteres en
tiempo de ejecucin para dibujar botones 3D. La
informacin en la parte de abajo de la ventana
muestra el tamao de fuente, en puntos, y el
rango de direccin de los datos del pxel del
carcter seleccionado en la ROM del Propeller.









Figura 2-13: Tabla de caracteres fuente Parallax en Bitmap ROM


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-17

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 2-
14





Figura 2-14.- Caracteres para la orden
simblica.









2.5. MODOS DE VISIN, BOOKMARKS Y NMEROS DE LNEA

Hay una serie de caractersticas construidas en la herramienta Propeller para poder navegar ms
rpidamente a ciertas regiones de cdigo como pueden ser los modos de visin, los bookmarks y los
nmeros de lnea.

Los modos de visin

Cada editor puede mostrar la fuente de un objeto en uno de cuatro modos de la visin, 1) fuente completa, 2)
condensado, 3) resumen, y 4) documentacin

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.












PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-18





















No puedes encontrar una rutina en un objeto?







Paso 1: Selecciona el modo
Resumen

Paso2: Clicka la lnea de la
rutina.




















PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-19






Paso 3: Selecciona el modo de fuente
completa otra vez; el cdigo se
reampla alrededor de la lnea del
cursor, -o-
Doble-click en la lnea deseada del
paso 2.



Figura 2-15: Ejemplo de Modos de visin

Bookmarks

Tambin se pueden fijar bookmarks en varias lneas en cada editor para saltar rpidamente a las localizaciones
deseadas. La figura 2-16 muestra un ejemplo de dos bookmarks fijados en el margen del editor. Para activar
bookmarks, se debe presionar Ctrl+B y clickar en el margen junto a la lnea a la que se quiere poder navegar. De
esta forma, desde cualquier sitio del cdigo se puede navegar directamente a un Bookmark pulsando Ctrl+#,
donde # es el nmero del bookmark al que se desea ir.

Se pueden fijar hasta 9 bookmarks (1 9) en cada editor. Los bookmarks no se salvan con el cdigo fuente; sin
embargo, la herramienta Propeller recuerda los bookmark de los 10 ltimos archivos accedidos.



Figura 2-16: Ejemplo del editor con los bookmarks habilitados y dos bookmarks fijados.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-20

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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-21

Modos Insertar y Sobrescribir (Insert y Overwrite)

Los modos insertar y sobrescribir son modos similares a muchos otros editores de textos. stos son los nicos dos
modos disponibles en el editor si este contiene un cdigo no-spin.

Modo Alinear (Align)

El modo del alinear es una versin especial del modo de insertar diseado especficamente para cdigo de fuente.
Para entender este modo, primero hay considerar tcnicas de programacin comunes. Hay dos prcticas muy
comunes usadas al escribir cdigo de fuente moderno: tabulacin del cdigo y alineacin de comentarios a la
derecha del cdigo. Tambin es comn que el cdigo de fuente se lea y se edite usando ms de un editor de
programa. Histricamente, los programadores han utilizado tabulacines o espacios con propsitos de alineacin,
y pueden resultar un problema ya que cada editor puede tener una fijacin del tabulador distinta. Aqu hay algunos
ejemplos; la Figura 2-19 es nuestro cdigo original.

Figura 2-19: Alineacin Comn - Cdigo Original.

Si el cdigo original utiliz caracteres tabuladores para alinear los comentarios, al cambiar "Delay" por "BtnDelay"
har que un comentario cambie de posicin a la derecha si el texto modificado cruza el lmite del tabulador.



Figura 2-20: Alineacin Comn Tab Alineado.

Si el cdigo original utiliz caracteres de espacio para alinear los comentarios, al cambiar "Delay" por "BtnDelay"
har que los comentarios cambien de posicin a la derecha tres caracteres.










PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-22



Figura 2-21: Alineacin Comn Espacio Alineado.

Para el cdigo Spin, la herramienta Propeller soluciona este problema primero rechazando caracteres de tabulador
(al pulsar el tabulador se emiten el nmero apropiado de caracteres de espacio), y segundo proporcionando el
modo de edicin Align. En el modo Aling, los caracteres insertados en una lnea afectan los caracteres vecinos
pero no los caracteres separados por ms de un espacio. El resultado es que los comentarios y otros tems
separados por ms de un espacio mantienen su alineacin prevista, segn lo demostrado en la Figura 2-22.


Figura 2-22: Efectos del modo Align

Con el modo Align, cambiando "Delay" por "BtnDelay deja todos los comentarios en su localizacin original,
alineada. No es necesario la realineacin de comentarios.

Puesto que el modo alinear mantiene alineaciones existentes, se pierde mucho menos tiempo realineando los
elementos en los posibles futuros cambios que realice el programador. Adems, puesto que se utilizan los
espacios en vez de caracteres de tabulacin, el cdigo mantiene el mismo aspecto y sensacin en cualquier
editor.

Sin embargo, el modo Align no es perfecto para todas las situaciones. Se recomienda usar el modo Insert para la
mayora de la escritura del cdigo y cambiar brevemente a este modo para alinear y mantener cdigo existente.

La tecla Insert rota de modo en este orden: InsertAlignOverwrite . Las teclas rpidas Ctrl+Insert cambian
solamente entre los modos Insert y Aling. Con la practica de estos dos modos el programador ahorrara tiempo de
programacin.

Hay que tener el cuenta que el cdigo no-Spin no permite el modo Align. Esto es porque, para cdigo no-Spin, la
herramienta Propeller est diseado para mantener cualquier carcter de tabulacin existente e insertar
caracteres de tabulacin cuando el tabulador se pulsa y as mantener el aspecto original del archivo.


2.6. SELECCIN DE BLOQUES Y MOVIMIENTO DE SELECCIN

Adems de las selecciones normales del texto hechas con el ratn, la herramienta del Propeller permite las
selecciones de bloque (regiones rectangulares de texto). Para hacer una seleccin del bloque, primero hay que
mantener presionada la tecla Alt, pulsar el botn izquierdo del ratn y arrastrar el ratn hasta seleccionar la regin
de texto que se desea. Despus de la seleccin, las operaciones de cortar y copiar se hacen como con cualquier
otra seleccin de texto. La Figura 2-23 muestra la seleccin del bloque y el movimiento del bloque de texto con el
ratn.




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-23

Figura 2-23: seleccin de bloque y el movimiento de seleccin.




Cdigo original. Quisiramos mover los comentarios de LCD
Screen Addr a la derecha de la rutina de PrintMode.






Primero hay que mantener presionada la tecla Alt, pulsar el botn
izquierdo del ratn y arrastrar el ratn para hacer la seleccin.



Finalmente, el clickar y desplazar (dentro del bloque seleccionado)
y dejar la seleccin en la localizacin deseada.


2.7. INDENTING Y OUTDENTING.
Una prctica comn de programacin es tabular los bloques del cdigo que estn en bucles o bloques
condicionales para hacer ese cdigo ms fcil leer. A esto se llama "indenting." Llamaremos la accin opuesta,
cambiando la posicin del cdigo a la izquierda, "outdenting." Lenguaje Spin requiere esta clase de formato para
indicar que lneas pertenecen a bucles y que lneas son de bloques condicionales. La herramienta Propeller
incluye las siguientes caractersticas para facilitar esto, mientras se crea o se mantiene cdigo.

Lneas independientes

Para el cdigo Spin, la herramienta Propeller utiliza conjunto fijo que tabulaciones que se pueden cambiar en
Edit Preferences menu. Cada bloque Spin (CON, VAR, OBJ, publicacin, PRI, y DAT) tiene sus propias
posiciones del tabulador fijas.
La tecla del tabulador mueve el cursor a la posicin siguiente de tabulacin (a la derecha) y las teclas Shift + Tab
mueve el cursor a la posicin de tabulacin anterior (a la izquierda). Adems, la tecla de retroceso (Backspace) se
mueve a la posicin de tabulacin anterior dependiendo del texto alrededor de ella.
Las fijaciones del tabulador por defecto para los bloques PUB y PRI incluyen posiciones de tabulacin cada dos
caracteres, para apoyar sangras comunes del cdigo. Por ejemplo, la Figura 2-24, abajo, muestra un mtodo
pblico, FSqr, conteniendo varios niveles la sangra, cada dos caracteres.










Figura 2-24: Tabulacin ajustada para los bloques PUB y PRI


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-24

Usando el tabulador, este cdigo se habra podido introducir rpidamente con la secuencia siguiente en el teclado:

Tipo: PUB FSqr <Enter>
Tipo: <Tab> repeat 31 <Enter>
Tipo: "<Tab> result |= root <Enter>, etc.

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.





Figura 2-27: Ejemplo de Bloque de Cdigo. Deseamos hacer las
primeras cuatro lneas se repitan 31 veces.




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.












PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-25

Figura 2-28: Indenting en un bloque de cdigo

Paso1: Insertar la instruccin repeat 31 sobre el bloque.

Paso 2: Con un ratn, seleccionar las cuatro lneas para
tabular a la derecha (Indenting).

Paso 3: Presionar el tabulador para tabular las lneas
seleccionadas.
Las cuatro lneas que seleccionadas en el segundo paso
ahora estn tabuladas a la siguiente posicin fija de
tabulacin (dos espacios a la derecha del comienzo del
"repeat") y a la seleccin ha cambiado a una sola columna
que contiene los primeros caracteres de las lneas. La
seleccin cambia para indicar que se ha realizado una
tabulacin de lneas mltiples.


El segundo tipo de seleccin, la seleccin de bloques, se puede tambin utilizar para tabular hacia fuera o hacia
dentro los grupos de lneas. Por ejemplo, la Figura 2-29 muestra un ejemplo con comentarios a la derecha de las
lneas.


Figura 2-29: Muestra de cdigo con comentarios a la derecha

Si se realiza una seleccin de bloque sobre los primeros caracteres de los comentarios (Alt + botn izquierdo de
ratn y arrastrar, figura 2-30), podemos presionar el tabulador para tabularlos a la siguiente posicin fijada.
Presionando Shift + Tab se realiza la accin inversa (outdent) tabulndolos hacia la izquierda, como mximo hasta
que se topen con cualquier carcter a ese lado, como ocurre en la Figura 2-30.

Paso 1: Seleccionar al bloque de las lneas de comentarios (Alt + botn izquierdo y arrastrar con el ratn).



Paso 2: Presione Tab para tabular los comentarios.



Figura 2-30: Seleccin de bloque a los comentarios de Outdent.




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-26

2.8 INDICADORES DE BLOQUE-GRUPO

A veces puede ser difcil ver exactamente cmo los grupos del cdigo se arreglan lgicamente simplemente por su
nivel de sangra. La herramienta Propeller puede sealar los bloques-grupos lgicos de bloques condicionales o
de bloques de repetitivas como se muestra en la Figura 2-31. Para activar/desactivar esta caracterstica, presionar
a Ctrl + I.




Figura 2-31: Indicadores Bloque-Grupo.


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
completa
Alt + S
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
ejecutar
F10
Compilar fichero actual, Cargar EEPROM y
ejecutar
F11


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-27
Compilar fichero actual y Cargar EEPROM
solo
F12
Compilar fichero raz y ver informacin Ctrl + F8
Compilar fichero raz y actualizar el estado Ctrl + F9
Compilar fichero raz, Cargar RAM y ejecutar Ctrl + F10
Compilar fichero raz, Cargar EEPROM y
ejecutar
Ctrl + F11
Compilar fichero raz y Cargar EEPROM solo Ctrl + F12
Seleccionar pestaa de editor siguiente Alt + Drcha-o- Ctrl + Tab
Seleccionar pestaa de editor anterior Alt + Izda -o- Ctrl + Sift + Tab
Ir a pagina anterior Re Pag
Ir a pagina siguiente Av Pag
Ir al comienzo de la siguiente palabra Ctrl + Drcha
Ir al comienzo de la palabra anterior Ctrl + Izda
Saltar al comienzo de lnea Inicio
Saltar al fin de lnea Fin
Saltar al inicio de pagina Ctrl + Re Pg
Saltar al fin de pagina Ctrl + Av Pg
Saltar al inicio de archivo Ctrl + Inicio
Saltar al final de archivo Ctrl + Fin
Seleccionar palabra Doble Click
Seleccionar lnea Triple Click
Seleccionar hasta el principio de la siguiente
palabra
Ctrl + Shift + Drcha
Seleccionar hasta el principio de la palabra
anterior
Ctrl + Shift + Izda
Seleccionar hasta el comienzo de lnea Shift + Inicio
Seleccionar hasta fin de lnea Shift + Fin
Seleccionar hasta inicio de pagina Ctrl + Shift + Re Pg
Seleccionar hasta fin de pagina Ctrl + Shift + Av Pg
Seleccionar hasta pagina anterior Shift + Re Pg
Seleccionar hasta pagina siguiente Shift + Av Pg
Seleccionar hasta inicio de fichero Ctrl + Shift + Inicio
Seleccionar hasta fin de fichero Ctrl + Shift + Fin
Edicin
Deshacer Ctrl + Z
Rehacer Ctrl + Shift + Z
Seleccionar Todo Ctrl + A
Copiar Ctrl + C
Cortar Ctrl + X
Pegar Ctrl + V
Buscar/Reemplazar Ctrl + F
Buscar siguiente F3
Reemplazar F4
Reemplazar y buscar siguiente Ctrl + F4
Cambiar el modo de edicin Insert
Cambiar el modo de edicin entre Insert /Align Ctrl + Insert
Tabulacin Tab
Borrar espacios hasta la tabulacin anterior Shift + Tab
Borrar lnea actual Ctrl + Y
Borrar hasta fin de lnea Ctrl + Shift + Y
Renombrar fichero/archivo F2
Smbolos
Insertar el carcter superndice de menos uno
()
Ctrl + Alt + 1


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-28
Insertar carcter de superndice uno( ) Ctrl + Shift + 1
Insertar carcter de superndice dos ( ) Ctrl + Shift + 2
Insertar carcter de superndice tres ( ) Ctrl + Shift + 3
Insertar carcter ( ) Ctrl + Shift + .
Insertar un carcter de rectngulo ( ) Ctrl + Alt + .
Insertar carcter ( ) Ctrl + Shift + Alt + <
Insertar carcter ( ) Ctrl + Shift + Alt + >
Insertar carcter de flecha hacia abajo ( ) Ctrl + Shift + Alt + Izda
Insertar carcter de flecha hacia la izda ( ) Ctrl + Shift + Alt + Drcha
Insertar carcter de flecha hacia la drcha ( ) Ctrl + Shift + Alt + Arriba
Insertar carcter de flecha hacia arriba ( ) Ctrl + Shift + Alt + Abajo
Insertar carcter de Euro ( ) Ctrl + Shift + $
Insertar carcter de Yen ( ) Ctrl + Alt + $
Insertar carcter ( ) Ctrl + Shift + Alt + $
Insertar carcter de flecha hacia la izda ( ) Ctrl + Alt + Izda
Insertar carcter de flecha hacia la drcha ( ) Ctrl + Alt + Drcha
Insertar carcter de flecha hacia arriba ( ) Ctrl + Alt + Arriba
Insertar carcter de flecha hacia abajo ( ) Ctrl + Alt + Abajo
Insertar carcter de grado ( ) Ctrl + Shift + %
Insertar carcter de mas/menos ( ) Ctrl + Shift + -
Insertar carcter de multiplicacin ( ) Ctrl + Shift + *
Insertar carcter de divisin ( ) Ctrl + Shift + /
Insertar carcter de Radical ( ) Ctrl + Shift + R
Insertar carcter de infinito ( ) Ctrl + Shift + I
Insertar carcter de Delta ( ) Ctrl + Shift + D
Insertar carcter de Mu ( ) Ctrl + Shift + M
Insertar carcter de Omega ( ) Ctrl + Shift + O
Insertar carcter de Pi ( ) Ctrl + Shift + P
Insertar carcter de Sigma ( ) Ctrl + Shift + S


Tabla 2-2: Teclas de acceso rpido
Teclas o Ratn Funcin
F2 Renombrar carpeta/fichero
F3 Buscar siguiente ; Find Next
F4 Reemplazar ; Replace
F7 Identificar Hardware
F8 Compilar fichero actual y ver informacin
F9 Compilar fichero actual y actualizar el estado
F10 Compilar fichero actual , Cargar RAM y ejecutar
F11 Compilar fichero actual, Cargar EEPROM y ejecutar
F12 Compilar fichero actual y Cargar EEPROM solo
Fin Saltar al final de lnea
Esc Seleccionar la vista de fuente completa
Inicio Saltar al comienzo de lnea
Insert Cambiar el modo de edicin
Av Pg Saltar a la siguiente pagina
Re Pg Saltar a la pagina anterior
Tab Tabular
Doble Click Seleccionar una palabra
Triple Click Seleccionar una lnea
Ctrl +
Ctrl + A Seleccionar todo
Ctrl + B Mostrar/Ocultar Bookmarks
Ctrl + C Copiar


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-29
Ctrl + E Mostrar/Ocultar el explotador
Ctrl + F Buscar/ Remplazar ; Find / Replace
Ctrl + I Indicadores de la sangra de bloque
Ctrl + N Mostrar/Ocultar Numero de Lnea
Ctrl + O Abrir
Ctrl + S Guardar
Ctrl + P Imprimir
Ctrl + T Seleccionar el fichero raz
Ctrl + V Pegar
Ctrl + X Cortar
Ctrl + Y Borrar lnea actual
Ctrl + Z Deshacer
Ctrl + F4 Reemplazar y Buscar siguiente
Ctrl + F8 Compilar fichero raz y ver informacin
Ctrl + F9 Compilar fichero raz y actualizar el estado
Ctrl + F10 Compilar fichero raz, Cargar RAM y ejecutar
Ctrl + F11 Compilar fichero raz, Cargar EEPROM y ejecutar
Ctrl + F12 Compilar fichero raz y Cargar EEPROM solo
Ctrl + Abajo Decrementar el tamao de fuente
Ctrl + Fin Saltar al final del archivo
Ctrl + Inicio Saltar al comienzo de archivo
Ctrl + Insert Cambiar el modo de edicin entre Insert / Align
Ctrl + Izda Saltar hasta el comienzo de la siguiente palabra
Ctrl + Av pg Saltar hasta fin de pgina
Ctrl + Rueda ratn abajo Decrementar el tamao de fuente
Ctrl + Rueda ratn arriba Incrementar el tamao de fuente
Alt +
Alt + C Seleccionar el modo de visin Condensado
Alt + D Seleccionar el modo de visin Documentacin
Alt + S Seleccionar el modo de visin Fuente completa
Alt + Q Cerrar
Alt + U Seleccionar el modo de visin Resumen
Alt + Abajo Seleccionar el modo de visin alternos
Alt + Izda Seleccionar la pestaa del editor anterior
Alt + Rueda ratn abajo Seleccionar el modo de visin alternos (desde
Documentacin)
Alt + Rueda ratn arriba Seleccionar el modo de visin alternos (desde fuente
completa)
Alt + Drcha Seleccionar la siquiente pestaa del editor
Alt + Arriba Seleccionar el modo de visin alternos (desde fuente
completa)
Shift +
Shift + Fin Seleccionar hasta fin de lnea
Shift + Inicio Seleccionar hasta principio de lnea
Shift + Av Pg Seleccionar hasta la siguiente pagina
Shift + Re Pg Seleccionar hasta la pagina anterior
Shift + Tab Borrar espacios hasta la tabulacin anterior
Ctrl + Alt +
Ctrl + Alt + . Insertar un carcter de rectngulo ( )
Ctrl + Alt + $ Insertar un carcter Yen ( )
Ctrl + Alt + 1 Insertar el carcter superndice de manos uno ()
Ctrl + Alt + S Guardar todo
Ctrl + Alt + Abajo Insertar carcter de flecha hacia abajo ( )
Ctrl + Alt + Izda Insertar carcter de flecha hacia la izda ( )
Ctrl + Alt + Drcha Insertar carcter de flecha hacia la drcha ( )


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 2: Manejo y desarrollo de aplicaciones

www.microcontroladores.com
info@microcontroladores.com
2-30
Ctrl + Alt + Arriba Insertar carcter de flecha hacia arriba ( )
Ctrl + Shift +
Ctrl + Shift + $ Insertar carcter de Euro ( )
Ctrl + Shift + % Insertar carcter de grado ( )
Ctrl + Shift + * Insertar carcter de multiplicacin ( )
Ctrl + Shift + - Insertar carcter de mas/menos( )
Ctrl + Shift + . Insertar carcter ( )
Ctrl + Shift + / Insertar carcter de divisin ( )
Ctrl + Shift + = Insertar carcter de aproximacin ( )
Ctrl + Shift + 1 Insertar carcter de superndice uno( )
Ctrl + Shift + 2 Insertar carcter de superndice dos ( )
Ctrl + Shift + 3 Insertar carcter de superndice tres ( )
Ctrl + Shift + B Bookmark de la lnea actual
Ctrl + Shift + D Insertar carcter de Delta ( )
Ctrl + Shift + I Insertar carcter de infinito ( )
Ctrl + Shift + M Insertar carcter de Mu ( )
Ctrl + Shift + O Insertar carcter de Omega ( )
Ctrl + Shift + P Insertar carcter de Pi ( )
Ctrl + Shift + R Insertar carcter de Radical ( )
Ctrl + Shift + S Insertar carcter de Sigma ( )
Ctrl + Shift + Y Borrar hasta fin de lnea
Ctrl + Shift + Z Rehacer
Ctrl + Shift + Fin Seleccionar hasta fin de archive
Ctrl + Shift + Inicio Seleccionar hasta principio de archivo
Ctrl + Shift + Izda Seleccionar hasta la palabra anterior
Ctrl + Shift + Av Pg Seleccionar hasta fin de pagina
Ctrl + Shift + Re Pg Seleccionar hasta principio de pagina
Ctrl + Shift + Drcha Seleccionar hasta siguiente palabra
Ctrl + Shift + Tab Seleccionar hasta siguiente tabulacin
Ctrl + Shift + Alt
Ctrl + Shift + Alt + $ Insertar carcter ( )
Ctrl + Shift + Alt + < Insertar carcter ( )
Ctrl + Shift + Alt + > Insertar carcter ( )
Ctrl + Shift + Alt + Abajo Insertar carcter ( )
Ctrl + Shift + Alt + Izda Insertar carcter ( )
Ctrl + Shift + Alt + Drcha Insertar carcter ( )
Ctrl + Shift + Alt + Arriba Insertar carcter ( )




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-1

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 Declaracin de constantes
VAR Declaracin de variables
OBJ Declaracin de referencias de objetos
PUB Declaracin de mtodos pblicos
PRI Declaracin de mtodos privados
DAT Declaracin de datos

Configuracin

CHIPVER Obtener el numero de versin del chip Propeller
CLKMODE Obtener el modo de configuracin actual de reloj
_CLKMODEa Modo de reloj definido por la aplicacin (solo lectura)
CLKFREQ Obtener el modo actual de frecuencia
_CLKFREQa Frecuencia definido por la aplicacin (solo lectura)
CLKSETa Poner el modo y frecuencia de reloj
_XINFREQa Frecuencia de reloj externo definido por la aplicacin (solo lectura)
_STACKa Espacio de pila reservado por la aplicacin (solo lectura)
_FREEa Espacio libre reservado por la aplicacin (solo lectura)
RCFASTa Constante para _CLKMODE: oscilador rpido interno
RCSLOWa Constante para _CLKMODE: oscilador lento interno
XINPUTa Constante para _CLKMODE: oscilador/reloj externo
XTAL1a Constante para _CLKMODE: cristal externo de velocidad baja
XTAL2a Constante para _CLKMODE: cristal externo de velocidad media
XTAL3a Constante para _CLKMODE: cristal externo de velocidad alta
PLL1Xa Constante para _CLKMODE: valor de frecuencia externa 1
PLL2Xa Constante para _CLKMODE: valor de frecuencia externa 2
PLL4Xa Constante para _CLKMODE: valor de frecuencia externa 4
PLL8Xa Constante para _CLKMODE: valor de frecuencia externa 8
PLL16X Constante para _CLKMODE: valor de frecuencia externa 16


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-2

Control de Cog

COGIDa Obtener el Id de Cog actual (0-7)
COGNEW Iniciar el siguiente Cog disponible
COGINITa Iniciar o reiniciar un cog por su Id
COGSTOPa Detener un cog por su Id
REBOOT Resetear el chip Propeller

Control de Proceso

LOCKNEWa Comprobar un nuevo semforo
LOCKRETa Devolver un semforo
LOCKCLRa Poner un semforo a ceros por Id
LOCKSETa Fijar un semforo por Id
WAITCNTa Esperar a que el Contador del Sistema alcance el valor
WAITPEQa Esperar a que el/los pin(es) se igualen a un valor
WAITPNEa Esperar a que el/los pin(es) no sean igual a un valor
WAITVIDa Esperar a la sincronizacin de video y repartir el siguiente grupo color/pixel

Control de Flujo

IF Ejecuta condicionalmente uno o ms bloques de cdigo
ELSEIF
ELSE

CASE Evala una expresin y ejecuta el bloque de cdigo que satisface la
OTHER condicin

REPEAT Ejecuta un bloque de cdigo repetidamente un numero de veces
FROM finito o infinito, opcionalmente con un contador, intervalos,
TO condiciones de salida y continuidad
STEP
UNTIL
WHILE

NEXT Salta el resto del bloque REPEAT y va la siguiente iteracin del bucle
QUIT Sale del bucle REPEAT
RETURN Sale de PUB/PRI con estado normal y opcionalmente con un valor de retorno
ABORT Sale de PUB/PRI con estado de abort y opcionalmente con un valor de retorno

Memoria

BYTE Declarar un smbolo de tamao byte o acceso byte de la memoria principal
WORD Declarar un smbolo de tamao word o acceso word de la memoria principal
LONG Declarar un smbolo de tamao long o acceso long de la memoria principal
BYTEFILL Rellena bytes de la memoria principal con un valor
WORDFILL Rellena words de la memoria principal con un valor
LONGFILL Rellena longs de la memoria principal con un valor
BYTEMOVE Copia bytes de una regin a otra de la memoria principal
WORDMOVE Copia words de una regin a otra de la memoria principal
LONGMOVE Copia longs de una regin a otra de la memoria principal
LOOKUP Recupera el valor de una posicin (1..N) de una lista
LOOKUPZ Recupera el valor de una posicin de base cero (0..N-1) de una lista
LOOKDOWN Recupera el ndice (1..N) del valor que coincida en una lista
LOOKDOWNZ Recupera el ndice de base cero (0..N-1) del valor que coincida en una lista
STRSIZE Recupera el tamao en bytes de un string
STRCOMP Compara un string de bytes con otro string de bytes


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-3

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 Variable por defecto para el resultado de mtodo PUB/PRI
Operadores Unitarios

+ Positivo (+X); forma unitaria de suma
- Negativo (-X); forma unitaria de resta
-- Pre-decremento (--X) o post-decremento (X--) y asignacin
++ Pre-incremento (++X) o post-incremento (X++) y asignacin
^^ Raz cuadrada
|| Valor absoluto
~ Signo extendido desde el bit 7 (~X) o post-asignacin de 0 (X~)
~~ Signo extendido desde el bit 15 (~~X) o post-asignacin de 0(X~~)
? Random de un numero hacia delante (?X) o hacia detrs (X?)
|< Descifra un valor (0-31) en un long single-high-bit
>| Cifra un long en valores (0-32) como prioridad de high-bit
! Modo bit: NOT


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-4
NOT Boleado: NOT
@ Direccin de smbolo
@@ Valor de smbolo y direccin de Objeto
Operadores Binarios

= --y-- = asignacin constante (bloques CON)
:= --y-- := asignacin variable (bloques PUB/PRI)
+ --o-- += Suma
- --o-- -= Resta
* --o-- *= Multiplicacin y resultado menor de 32 bits (con signo)
** --o-- **= Multiplicacin y resultado mayor que 32 bits (con signo)
/ --o-- /= Divisin (con signo)
// --o-- //= Resto (con signo)
#> --o-- #>= Limite mnimo (con signo)
<# --o-- <#= Limite mximo (con signo)
~> --o-- ~>= Desplazamiento aritmtico a la derecha
<< --o-- <<= Modo bit: Desplazamiento a la izquierda
>> --o-- >>= Modo bit: Desplazamiento a la derecha
<- --o-- <-= Modo bit: Rotacin izquierda
-> --o-- ->= Modo bit: Rotacin derecha
>< --o-- ><= Modo bit: Reverso
& --o-- &= Modo bit: AND
| --o-- |= Modo bit: OR
^ --o-- ^= Modo bit: XOR
AND --o-- AND= Boleado: AND
OR --o-- OR= Boleado: OR
== --o-- === Boleado: Es igual
<> --o-- <>= Boleado: NO es igual
< --o-- <= Boleado: es menor que (con signo)
> --o-- >= Boleado: es mayor que (con signo)
=< --o-- =<= Boleado: es menor o igual (con signo)
=> --o-- =>= Boleado: es mayor o igual (con signo)
Sintaxis de Smbolos

# Referencia a Constante de Objeto: Ej. obj#constant
. Referencia a mtodo de Objeto: Ej. obj.mtodo(param)
.. Indicador de rango: Ej. 0..7
: Separador de resultado: Ej. mtodo PUB:sym o asignacin a object
| Separador de variable local: Ej. mtodo PUB | temp, str
\ Barra de abort: Ej. \mtodo(params)
, Delimitador de lista: Ej. en mtodo (param1, param2)
( ) Signo de parmetros de una lista: Ej. en mtodo (params)
[ ] Signo de ndices de array: Ej. INA[2]
{} Signo de comentarios de cdigo lnea o multilnea
{{}} Signo de comentarios de documento lnea o multilnea
Signo de comentario de cdigo
Signo de comentario de documento



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-5
3.3. DESCRIPCIN DE LOS ELEMENTOS DEL LENGUAJE SPIN

El resto de este captulo describe, en orden alfabtico, los elementos del lenguaje Spin mostrados arriba.
Algunos se explican dentro del contexto de otros para mayor claridad. Muchos de los elementos estn disponibles
en Spin y ensamblador del Propeller.

Reglas de Smbolos

Los smbolos son nombres alfanumricos creados por el compilador (words reservadas) o por el desarrollador del
cdigo (words definidas por el usuario). Se utilizan para representar valores (constantes o variables) y para hacer
el cdigo de fuente ms fcil entender y mantener. Los nombres de smbolo no son sensibles a maysculas o
minsculas. Los smbolos definidos por el usuario deben seguir las siguientes reglas:
1) Comienzan con una letra (a - z) o un guin bajo _ .
2) Contienen solamente letras, nmeros, y guiones bajos (a - z, 0 - 9, _); no se permiten espacios.
3) deben ser 32 caracteres o menos.
4) debe ser nico al objeto; no una word reservada o un smbolo previamente definido por el usuario.

Representaciones del Valor

Los valores se pueden introducir en formatos decimales, binarios, hexadecimales, o carcter. Los valores
numricos pueden tambin utilizar guiones, _ , como separador de grupo. A continuacin se muestran ejemplos
de estos formatos.

1024 nmero decimal.
2_147_483_647 nmero decimal con separadores en los millares.
%1010 nmero binario.
%11110000_10101100 nmero binario con separadores en los bytes.
$1AF nmero del hexadecimal.
$FFAF_126D_8755_1CE9 nmero hexadecimal con separadores en las words.
A 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 Los tem en mayscula en negrita se deben mecanografiados de esta misma forma.

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, | \ [ ] ( ) la
raya vertical, la barra, los corchetes y parntesis deben ser
mecanografiados de esta manera.
<> Los corchetes angulosos contienen tem opcionales.

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






PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-6
Lnea nica: Separa varias opciones de la estructura del sintaxis.

Lnea doble: Separa la instruccin del valor que devuelve.

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.

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. El comando de la ABORT, sin
embargo, realiza pops repetidamente de la pila de llamadas hasta que encuentra un llamador con un Abort trap
(ver abajo); devolviendo a algn llamador de alto nivel .

Uso de ABORT
Cualquier mtodo puede elegir utilizar un comando ABORT. Es labor del cdigo de alto nivel comprobar si hay un
estado Abort y tratarlo. Este cdigo puede ser cualquier cdigo de alto nivel que llame a un mtodo que aborte
directamente, o va otro sistema de mtodos. Para utilizar un comando ABORT, se debe seguir el ejemplo
siguiente:

if <condicin mala >
abort Si se ha encontrado una mala condicin, Abortar

o


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-7

if <condicin mala >
abort <valor > Si se ha encontrado una mala condicin, Abortar devolviendo un valor

... 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 Llamada a MayAbort con abort trap
abort <value> Proceso abort


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 Main | Direction
Direction :=None
repeat
case CheckSensors Recoger el sensor activo
Left : Direction :=Right Objecto en izda? Ve a la drcha
Right : Direction :=Left Objecto en drcha? Ve a la izda
Front : Direction :=Back Objecto delante? Ve hacia atrs
Back : Direction :=Front Objecto atras? Ve hacia delante
other : Direction :=None Otro caso, mantente quieto
if not \Move(Direction) Mueve robot
Beep Pitar

PUB Move(Direction)
result :=True se entiende que va bien
if Direction ==None
return Retornar si no hay direccin
repeat 1000
DriveMotors(Direction) Conducir motor 1000 veces

PUB DriveMotors(Direction)
<code to drive motors>
if MotorStuck
abort False Si el motor esta bloqueado, abort
<more code>



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-8

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]>

Symbol es el nombre deseado para la variable.
Count es una expresin opcional que indica el nmero de elementos de tamao byte, dispuestos en un
array desde el elemento 0 al elemento Count-1.
Data es una expresin constante o una lista de expresiones constantes. Tambin se permiten strings de
caracteres; se tratan como una lista de caracteres.
BaseAddress es una expresin que describe la direccin en memoria principal para leer o para escribir.
Si se omite Offset, BaseAddress es la direccin real a operar. Si se especifica Offset, BaseAddress +
Offset seria la direccin real.
Offset una expresin opcional que indica un ajuste sobre la direccin que especifica BaseAddress.
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 'Temp es un byte
byte Str[25] '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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-9
Temp := 250 Fija Temp a 250
Str[0] := "A" Fija el primer elemento de Str a "A"
Str[1] := "B" Fija el segundo elemento de Str a "B"
Str[24] := "C" Fija el ultimo elemento de Str a "C"

Declaracin de Datos Byte (Sintaxis 2)
En bloques de DAT, la sintaxis 2 del BYTE se utiliza para declarar datos byte que se compilan como valores
constantes en memoria principal.
Por ejemplo:

DAT
MyData byte 64, $AA, 55 datos de tamao y alineacin byte
MyString byte "Hello",0 Un string de bytes (caracteres)


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.



PUB GetData | Index, Temp
Temp :=BYTE[MyData] Lee el primer byte de MyData
a Temp
<do something with Temp> Realiza una tarea con Temp
Index :=0
repeat
Temp :=BYTE[MyString][Index++] Lee un dato string a Temp,
un carcter por vez
<do something with Temp> Realiza una tarea con caracter
en Temp
while Temp >0 Bucle hasta el final

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" Escribe M al primer carcter de MyString

Esta lnea escribe el carcter "M" al primer byte de datos de la secuencia en MyString, cambiando la secuencia
para ser "Mello", 0.




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-10
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) 'Copia Buff1 a Buff2

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.





PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-11
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) >

CaseExpression es la expresin a comparar.
MatchExpression es una expresin, o una expresin de rango a comparar con CaseExpression. Cada
MatchExpression debe seguir por dos puntos (:).
Statement(s) es un bloque de una o ms lneas de cdigo a ejecutarse cuando CaseExpression empareja con
el MatchExpression asociado. La primera, o nica, declaracin en Statement(s) puede aparecer a la derecha
de los dos puntos en la lnea de MatchExpression, o debajo de ella y tabulado levemente sobre
MatchExpression.

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 Testea X+Y
10 : !outa[0] X =10? Activar P0
A*2 : !outa[1] X =A*2? Activar P1
30..40 : !outa[2] X en 30 a 40? Activar P2
X +=5 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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-12

Uso de OTHER
El componente opcional OTHER del CASE es similar al componente OTHER opcional de la estructura IF. Por
ejemplo:

case X+Y 'Testea X+Y
10 : !outa[0] 'X =10? Activar P0
25 : !outa[1] 'X =25? Activar P1
20..30 : !outa[2] 'X en 20 a 30? Activar P2
OTHER : !outa[3] Si no, Activar P3
X +=5 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 Testea X+Y
10 : !outa[0] X =10? Activar P0
20..30: !outa[2] X en 20 a 30? Activar P2
25 : !outa[1] X =25? Activar P1 <-- ESTE CODIGO NO SE EJ ECUTARA 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 Testea A
4 : !outa[0] A =4? Activar P0
Z+1 : !outa[1] A =Z+1? Activar P1
!outa[2] Y Activar P2
10..15: !outa[3] A en 10 a 15? Activar P3


case A Testea A
4: A =4?
!outa[0] Activar P0
Z+1: A =Z+1?
!outa[1] Activar P1
!outa[2] Y Activar P2
10..15: A en 10 a 15?
!outa[3] Activar P3



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-13
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) ' esperar, 1 segundos (100ms).

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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-14
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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-15
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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-16


1. Todas las constantes estn tambin disponibles en ensamblador del Propeller.
2. Todos los resistores/capacitadores necesarios se incluyen en chip Propeller.

El fichero objeto superior en una aplicacin (donde empieza la compilacin) puede especificar un ajuste para
_CLKMODE en su bloque CON. Esto define el modo de reloj inicial para la aplicacin y es el modo al que
cambiara el reloj del sistema, tan pronto como se arranque la aplicacin y comience la ejecucin.
Los siguientes ejemplos asumen que estn contenidos dentro del fichero objeto superior. Cualesquier ajuste de _
CLKMODE en objetos hijo son simplemente ignorados por el copilador.

Por ejemplo:

CON
_CLKMODE =RCFAST

Esto fija el modo de reloj para el circuito interno, RC rpido de Clock/Oscillator en el que el reloj del sistema
funcionara en aproximadamente 12 Mhz con este ajuste. El ajuste de RCFAST es el ajuste por defecto, as que si
no se definiera ningn _CLKMODE, ste sera el ajuste utilizado. Observe que el reloj PLL no se puede utilizar con
el RC interno Clock/Oscillator. Aqu hay un ejemplo con un reloj externo:

CON
_ CLKMODE =XTAL1 +PLL8X

Esto fija el modo de reloj para un cristal externo de poca velocidad (XTAL1), que activa el circuito del reloj PLL y
fija el reloj del sistema para utilizar el 8x del reloj PLL (PLL8X). Si se uniese un cristal externo de 4 Mhz a XI y XO,
por ejemplo, su seal sera multiplicada por 16 (el reloj PLL se multiplica siempre por 16) pero se utilizara el
resultado 8x; el reloj del sistema sera 4 Mhz * 8 =32 Mhz.

CON
_ CLKMODE =XINPUT +PLL2X

Esto fija el modo de reloj para un reloj-oscilador externo, conectado solamente con XI, y activa el circuito del reloj
PLL y fija el reloj del sistema para utilizar el resultado 2x.
Observe que el reloj PLL no est requerido y puede ser inhabilitado simplemente no especificando ningn ajuste
del multiplicador, por ejemplo:

CON
_ CLKMODE =XTAL1


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-17

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 cristal de baja velocidad x 8
_XINFREQ =4_000_000 cristal externo 4 MHz

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.




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-18
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) Espera a 3 millones de ciclos de reloj

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


PUB Activa | TimeBase, OneMS
dira[0]~~ Fija P0 como salida
OneMS :=clkfreq / 1000 Calcula ciclos para 1 milisegundo
TimeBase :=cnt Recoge el contador actual
repeat bucle infinito
waitcnt(TimeBase +=OneMS) Espera al comienzo del siguiente milisegundo
!outa[0] Activar P0



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



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-19
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 )

CogID es la identificacin (0 - 7) del Cog a arrancar, o reanudar.
SpinMethod es el mtodo Spin de PUB o PRI que debe ejecutar el Cog afectado. 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
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) Lanza el cuadrado en Cog 1

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)



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-20
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] Espacio de pila para Square cog

PUB Main | X
X :=2 Inicializa X
cognew(Square(@X), @SqStack) Lanza Square en cog
<check X here> Bucle y chequea X

PUB Square(XAddr)
Cuadrado del valor en XAddr
repeat Repite lo siguiente de forma infinita
long[XAddr] *=long[XAddr] Cuadrado del valor y lo reasigna
waitcnt(2_000_000 +cnt) Espera 2 millones de ciclos


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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-21
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 Usado para almacenar el ID del nuevo cog ejecutar

PUB Start(Pos) : Pass
Arranca un nuevo cog para ejecutar Update con Pos,
devuelve Verdadero si es correcto
Pass :=(Cog :=cognew(@Update, Pos) +1) >0

PUB Stop
Detiene el cog que arrancamos anteriormente, si lo hubiera.
if Cog
cogstop(Cog~- 1)

Este ejemplo muestra dos mtodos, Start y Stop, dentro de un objeto hipottico. El diseo de ese objeto necesita
lanzar otro Cog para ejecutar una rutina en ensamblador , llamada Update (no mostrada), y le pasa un parmetro,
Pos. Puede necesitar ms adelante parar ese nuevo Cog.

El mtodo Start toma un solo parmetro, Pos, y devuelve verdadero o falso para indicar si un nuevo Cog fue
arrancado con xito. Primero, llama COGNEW, "cognew(@Update, Pos)" con la direccin de la rutina Update
como primer parmetro y Pos como el segundo parmetro. Adems, toma el valor devuelto por COGNEW, que es
el ID del Cog nuevo, o -1 si no hay ninguno disponible, suma 1 y almacena el resultado en la variable Cog; "Cog: =
cognew(@Update, Pos) +1 ". Por ultimo, si el Cog es mayor que (0) la fija su valor de retorno, Pass, a verdadero;
si no se fija a falso. En este punto, si un Cog nuevo se arranca con xito, ese nuevo Cog comienza a cargar el
cdigo ensamblador del Propeller llamado Update, y lo ejecuta. Mientras tanto la variable Cog de este objeto (en el
Cog original) estar en el rango 1 a 8, representando el nuevo ID del Cog, 0 a 7. Si no se arranc ningn Cog, Cog
ser 0.

Ms adelante, si se llama el mtodo Stop, primero chequea la condicin, "if Cog". Esta condicin es verdadera
solamente si el Cog es diferente a cero. Si es verdad era (es decir: un Cog se ha arrancado con xito por la rutina
Start) entonces se ejecuta la lnea siguiente, "cogstop(Cog~- 1)", y se pasa el ID del Cog para que este se
detenga. La expresin Cog~- 1 devuelve el resultado del Cog - 1 para el parmetro COGSTOP, y inicializa la
variable del Cog a cero (0).

Este ejemplo se puede mejorar haciendo que la llamada al mtodo Stop est en el mtodo Start. Por ejemplo:

PUB Start(Pos) : Pass
Arranca un nuevo cog para ejecutar Update con Pos,
devuelve verdadero si es correcto
Stop
Pass :=(Cog :=cognew(@Update, Pos) +1) >0



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-22
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 Usado para almacenar el ID del nuevo cog ejecutar

PUB Start(Pos) : Pass
Arranca un nuevo cog para ejecutar Update con Pos,
devuelve verdadero si es correcto
Pass :=(Cog :=cognew(@Update, Pos) +1) >0

PUB Stop
Detiene el cog arrancado antes, si lo hubiera.
if Cog
cogstop(Cog~- 1)

Este ejemplo, de la descripcin de COGNEW, utiliza COGSTOP en el mtodo PUB Stop para detener el Cog que
fue arrancado previamente por el mtodo Start.

3.3.17. CON

Declara un bloque de Constantes.

CON
Symbol = Expression <((, | )) Symbol = Expresin>
CON
#Expression (( ,| ))Symbol <((,.| )) Symbol>
CON
Symbol <(( ,| )) Symbol>

Symbol es el nombre deseado para la constante.
Expression es cualquier nmero vlido entero, o con punto flotante, o una expresin algebraica constante.
Expression puede incluir otros smbolos constantes si estos fueron definidos previamente.

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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-23
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

-o-

CON
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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-24
3.14 valor de punto flotante
1e16 valor de punto flotante
51.025e5 valor de punto flotante
3 +4 expresin entera
3.0 +4.0 expresin de punto flotante
3.0 +4 expresin invalida; causa error de compilacin
3.0 +FLOAT(4) expresin de punto flotante

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



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-25

case Mode
RunTest : <test code here>
RunVerbose : <verbose code here>
RunBrief : <brief code here>
RunFull : <full code here>

-o-

if Mode >RunVerbose
<brief and run mode code here>


Lo siguiente tambin funciona y deja sitio para comentarios sobre cada modo.


CON Declara los modos de operacin
#0
RunTest Ejecuta en modo test
RunVerbose Ejecuta en modo verbose
RunBrief Ejecuta en modo brief
RunFull Ejecuta en modo full


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 Fija Format a la constante Decimal de Numbers

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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-26
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) expresin estndar en tiempo de ejecucin
!outa[0]
waitcnt((X+Y)/2 +cnt) expresin estndar en tiempo de ejecucin

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) Uso de expresin en tiempo de ejecucin

CONSTANT
!outa[0]
waitcnt(constant((X+Y)/2) +cnt) Uso de expresin en tiempo de ejecucin
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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-27
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 Verdadero lgico: -1 ($FFFFFFFF)
FALSE Falso lgico: 0 ($00000000)
POSX Entero positivo mximo: 2,147,483,647 ($7FFFFFFF)
NEGX Entero negativo mximo: -2,147,483,648 ($80000000)
PI Valor Float para PI: ~3.141593 ($40490FDB)
RCFAST Oscilador interno rpido: $00000001 (%00000000001)
RCSLOW Oscilador interno lento: $00000002 (%00000000010)
XINPUT Reloj/Oscilador externo: $00000004 (%00000000100)
XTAL1 Cristal externo de baja velocidad: $00000008 (%00000001000)
XTAL2 Cristal externo de media velocidad: $00000010 (%00000010000)
XTAL3 Cristal externo de alta velocidad: $00000020 (%00000100000)
PLL1X Frecuencia externa 1: $00000040 (%00001000000)
PLL2X Frecuencia externa 2: $00000080 (%00010000000)
PLL4X Frecuencia externa 4: $00000100 (%00100000000)
PLL8X Frecuencia externa 8: $00000200 (%01000000000)
PLL16X Frecuencia externa 16: $00000400 (%10000000000)

(Todas estas constantes estn tambin disponibles en el ensamblador del Propeller)

TRUE y FALSE
TRUE y FALSE se usan normalmente con propsito de comparacin Boleana:
if (X =TRUE) or (Y =FALSE)
<cdigo a ejecutar si la condicin total se da>

POSX y NEGX
POSX y NEGX se usan tpicamente con propsito de comparacin o como un flag de un evento especifico:
if Z >NEGX
<cdigo a ejecutar si Z no ha alcanzado el menor negativo>

-o-

PUB FindListItem(Item) : Index
Index :=NEGX Por defecto se fija a no encontrado
<cdigo para buscar un Item en la lista>
if <se ha encontrado tem >
Index :=<ndice del tem>

PI
PI se puede utilizar para clculos de punto flotante, o constantes de punto flotante o valores variables de punto
flotante que usan el objeto FloatMath.

De RCFAST a PLL16X
De RCFAST a PLL16X son constantes de ajusts del modo de reloj. Se explican en detalle en la seccin de
_CLKMODE.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-28
3.3.19. CTRA, CTRB

Registros de Control Contador A y Contador B

CTRA
CTRB

Devuelve: El valor actual del contador A o contador de B del registro de control, si se usan como variable fuente.

Explicacin
CTRA y CTRB son dos de los seis registros (CTRA, CTRB, FRQA, FRQB, PHSA, y PHSB) que afectan al
comportamiento de los mdulos del Contador de un Cog. Cada Cog tiene dos mdulos contadores idnticos (A y
B) que puede realizar muchas tareas repetitivas. Los registros de CTRA y de CTRB contienen los ajustes de la
configuracin del contador A y del contador B, respectivamente.

La siguiente discusin utiliza CTRx, FRQx y PHSx para referirse a ambos pares de A y de B de cada registro.

Cada uno de los dos mdulos de contadores puede controlar o supervisar hasta dos pins de E/S y realizar la
acumulacin condicional de 32-bits del valor del registro de FRQx al registro de PHSx, en cada ciclo de reloj. Los
mdulos de contadores tienen su propio bucle de fase-bloqueada (PLLx) que se pueda utilizar para sintetizar
frecuencias desde 64 Mhz a 128 Mhz.

Con una pequea configuracin y en algunos casos un poco mantenimiento del Cog, los mdulos de contadores
se puede utilizar para:

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.


Campos del Registro de Control
Cada registro CTRA y el CTRB contienen cuatro campos mostrados en la tabla abajo.

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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-29
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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-30

* Debe fijar el correspondiente bit de DIR para afectar al pin

A1 =Entrada APIN retrasada por 1 reloj
A2 =Entrada APIN retrasada por 2 relojes
B1 =Entrada BPIN retrasada por 1 reloj

3.3.20. DAT

Declara un Bloque de Dato.

DAT
<Symbol>Size <Data><, <Size>Data>

DAT
<Symbol><Condition>Instruction <Operand(s)><Effect(s)>

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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-31
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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-32
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 byte $FF, 25, %1010

PUB GetData | Temp
Temp :=BYTE[MyData][0] Recoge el primer byte de la tabla de datos


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
org resetea el puntero de direccin
Loop rdlong t1, par WZ espera a comando
if_z jmp #loop salto de cero
movd :arg, #arg0 recoge 8 argumentos
:arg mov 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)



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-33
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~ Fija a 0 el registro DIRA (todas las E/S son entradas)
--y--
DIRA~~ Fija a 1 el registro DIRA (todas las E/S son salidas)

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]~~ Fija a 1 el bit 5 de DIRA (P5 a salida)

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]~~ Fija a 1 desde el bit 5 al 3de DIRA (P5-P3 a salida)

Esto fija P5, P4 y P3 a salida; todos los dems bits de DIRA recuerdan su estado previo. A contignacin se
muestra otro ejemplo:


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-34
DIRA[5..3] :=%110 Fija P5 y P4 a salida y P3 a entrada

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 This is a data string., 0
Data file Datafile.dat

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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-35
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 = 2.0 / 5.0
Miles = 10e5

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 = 2
Ratio = 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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-36
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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-37
ElseStatement(s) >

Condition(s) es una o ms expresiones boleanas a probar.
IfStatement(s) es un bloque de una o ms lneas del cdigo para ejecutarse cuando si Condition(s) es
verdadero.
ElseIfStatement(s) es un bloque opcional de una o ms lneas del cdigo para ejecutarse cuando todo el
Condition(s) anterior es falso y el Condition(s) del ELSEIF es verdadero.
ElseStatement(s) es un bloque opcional de una o ms lneas del cdigo para ejecutarse cuando todos los
Condition(s) anteriores son falsos.

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 Si X es mayor que 10
!outa[0] Activa P0
!outa[1] 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 Si X es mayor que 10
!outa[0] Activa P0
!outa[1] Activa P1
waitcnt(2_000 +cnt) 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)).


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-38
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) Si X es mayor que 10 y menor que 100

Usando IF con ELSE
La segunda forma comn del comando condicional IF realiza una accin si una condicin es verdad o una diversa
accin si esa condicin es falsa. Esto se escribe como una declaracin IF seguida por su bloque de IfStatement(s),
despus un ELSE seguido por su bloque de ElseStatement(s), segn lo mostrado abajo:

If X >100 Si X es mayor que 100
!outa[0] Activa P0
else Si no, X <=100
!outa[1] Activa P1

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 Si X es mayor que 100
!outa[0] Activa P0
elseif X ==90 Si no, si X =90
!outa[1] Activa P1

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 Si X es mayor que 100
!outa[0] Activa P0
else Si no,
if X ==90 Si X =90
!outa[1] Activa P1

Ambos ejemplos realizan las mismas acciones, pero el primero es ms corto y generalmente se considera ms
fcil leer.

if X >100 Si X es mayor que 100
!outa[0] Activa P0
elseif X ==90 Si no, si X =90
!outa[1] Activa P1
elseif X >50 Si no, si X >50
!outa[2] Activa P2




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-39
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 Si X es mayor que 100
!outa[0] Activa P0
elseif X >50 Si no, si X >50
!outa[2] Activa P2
elseif X ==90 Si no, si X =90 <-- ERROR DE COND.
!outa[1] Activa P1 <-- ESTE CODIGO NO SE ALCAZARIA
NUNCA

Uso de IF with ELSEIF and ENDIF
La forma final del comando condicional del IF realiza una de varias acciones si una de esas condiciones fuera
verdadera, o una accin alternativa si ningunas de las condiciones anteriores se cumpliera. Esto se escribe con un
IF, uno o ms ELSEIF, y finalmente un ELSE. Aqu hay un ejemplo:

if X >100 Si X es mayor que 100
!outa[0] Activa P0
elseif X ==90 Si no, si X =90
!outa[1] Activa P1
elseif X >50 Si no, si X >50
!outa[2] Activa P2
else Si no,
!outa[3] Activa P3

3.3.27. INA, INB

Registros de entrada de 32-bits Puerto A y B.

INA <[Pin(s)]>
INB <[Pin(s)]>(Reservado para uso futuro)

Devuelve: Estado actual de los pins E/S 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
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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-40
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 Recoge el estado de P0 a P31

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] Recoge el estado de P16

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] Recoge los estados de P18:P15

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] Recoge los estados de P15:P18

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

ID es el ID (0 7) del semforo que se quiere poner a falso.

Explicacin


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-41
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) espera hasta que bloqueemos el recurso
repeat Idx from 0 to 9 leer todos los longs (10) del array
LocalData[Idx] :=long[Idx]
lockclr(SemID) desbloquea el recurso

PUB WriteResource | Idx
repeat until not lockset(SemID) espera hasta que bloqueemos el recurso
repeat Idx from 0 to 9 escribe todos los longs (10) del array al recurso
long[Idx] :=LocalData[Idx]
lockclr(SemID) desbloquea el recurso

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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-42
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 )
ID es el identificativo ID (0 7) del semforo que se devuelve al pool de semforos.

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:


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-43

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

ID es el ID (0 7) del semforo que se quiere poner a verdadero.

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) espera hasta que bloqueemos el recurso
repeat Idx from 0 to 9 leer todos los longs (10) del array
LocalData[Idx] :=long[Idx]
lockclr(SemID) desbloquea el recurso

PUB WriteResource | Idx
repeat until not lockset(SemID) espera hasta que bloqueemos el recurso
repeat Idx from 0 to 9 escribe todos los longs (10) del array al recurso
long[Idx] :=LocalData[Idx]
lockclr(SemID) desbloquea el recurso

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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-44
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]>

Symbol es el nombre deseado para la variable.
Count es una expresin opcional que indica el nmero de elementos de tamao long para Symbol,
dispuestos en un array del elemento 0 al elemento Count-1.
Data son una expresin constante o una lista separada por comas de expresiones constantes.
BaseAddress es una expresin que describe la direccin en memoria principal para leer o para escribir.
Si se omite Offset, BaseAddress es la direccin real a operar. Si se especifica Offset, BaseAddress +
Offset seria la direccin real.
Offset una expresin opcional que indica un ajuste sobre la direccin que especifica BaseAddress.
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 'Temp es un long
long List[25] '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 Fija Temp a 250,000,000
Str[0] := 500_000 Fija el primer elemento a 500,000
Str[1] := 9_000 Fija el segundo elemento a 9,000
Str[24] := 60 Fija el ultimo elemento de List a 60

Declaracin de Datos Long (Sintaxis 2)
En bloques de DAT, la sintaxis 2 del LONG se utiliza para declarar datos long que se compilan como valores
constantes en memoria principal.
Por ejemplo:

DAT
MyData long 640_000, $BB50 datos de tamao y alineacin long
MyList byte long $FF995544, 1_000 datos de tamao long y alineacin byte


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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-45
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] Lee el primer byte de MyData
a Temp
<do something with Temp> 'Realiza una tarea con Temp

repeat Index from 0 to 1 Repite dos veces
Temp :=LONG[MyList][Index] Lee los datos a Temp,
un long por vez
<do something with Temp> 'Realiza una tarea con valor
en 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 Escribe 2 mil millones al primer long de MyList

Esta lnea escribe el valor 2,000,000,000 al primer long de datos de MyList.

3.3.33. LONGFILL

Rellena la memoria principal con un valor.

LONGFILL (StartAddress, Value, Count )
StartAddress es una expresin que indica la localizacin del primer long en memoria a llenar del valor Value.
Value es una expresin que indica el valor de los long con los que se quiere rellenar.
Count es una expresin que indica el nmero de longs a rellenar, comenzando con StartAddress.

Explicacin
LONGFILL es uno de tres comandos (BYTEFILL, WORDFILL, y LONGFILL) usados para llenar bloques de
memoria principal de un valor especfico. LONGFILL rellena Count long de memoria principal con valor,
comenzando en la localizacin StartAddress.

Uso de LONGFILL
LONGFILL es una gran manera de inicializar grandes bloques de la memoria. Por ejemplo:

VAR
long Buff[100]
PUB Main
longfill(@Buff, 0, 100) Inicializar Buff a 0



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-46
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) 'Copia Buff1 a Buff2

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.

Value es una expresin que indica el valor a buscar en ExpressionList.
ExpressionList es una lista de expresiones separadas por comas. Tambin se permiten los strings
acotados de caracteres; se tratan como lista de caracteres separadas por comas.
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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-47
Uso de LOOKDOWN o LOOKDOWNZ
LOOKDOWN y LOOKDOWNZ son tiles para mapear un sistema de nmeros no-contiguos (25, -103, 18, de etc.)
a un sistema de nmeros contiguos (1, 2, 3, etc. - o 0, 1, 2, etc.) . El ejemplo siguiente asume que Print es un
mtodo creado en otra parte.

PUB ShowList | Index
Print(GetIndex(25))
Print(GetIndex(300))
Print(GetIndex(2510))
Print(GetIndex(163))
Print(GetIndex(17))
Print(GetIndex(8000))
Print(GetIndex(3))

PUB GetIndex(Value): Index
Index :=lookdown(Value, 25, 300, 2_510, 163, 17, 8_000, 3)

El mtodo de GetIndex en este ejemplo utiliza LOOKDOWN para encontrar Value y devuelve el ndice donde se
encuentra en el ExpressionList, o 0 si no lo encuentra. El mtodo de ShowList llama a GetIndex en varias
ocasiones con diversos valores visualiza el ndice resultante.
Asumiendo que Print es un mtodo que visualiza o imprime un valor, este ejemplo visualizara 1, 2, 3, 4, 5, 6 y 7.

Si se utilizase LOOKDOWNZ en vez de LOOKDOWN este ejemplo mostrara 0, 1, 2, 3, 4, 5, y 6.

Si el valor no se encontrase, LOOKDOWN, o LOOKDOWNZ, devolveran 0.

Si se usa LOOKDOWNZ, hay que tener muy en cuenta que puede volver 0 si o el valor no fue encontrado o si el
valor est en el ndice 0; esto podra causar un error en el cdigo y si fuera el caso seria as conveniente usar
LOOKDOWN .

3.3.36. LOOKUP, LOOKUPZ

Recoge el valor de una posicin de una lista indexada.

LOOKUP ( Index : ExpressionList )
LOOKUPZ ( Index : ExpressionList )

Devuelve: El valor en la posicin de ndice de base-uno (LOOKUP) o la posicin de ndice de base-cero
(LOOKUPZ) de ExpressionList, o 0 si es est fuera de rango.

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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-48
repeat Index from 1 to 7
Temp :=lookup(Index, 25, 300, 2_510, 163, 17, 8_000, 3)
Print(Temp)

Este ejemplo busca todos los valores en ExpressionList de LOOKUP y los muestra. El bucle de REPEAT cuenta
con ndice de 1 a 7. Cada iteracin del bucle, LOOKUP utiliza Index para recuperar un valor de su lista. Si Index se
iguala a 1, se devuelve el valor 25. Si Index se iguala a 2, se devuelve el valor 300. Asumiendo que Print es un
mtodo que muestra o visualiza el valor de Temp, este ejemplo mostrara 25, 300, 2510, 163, 17, 8000 y 3.

Si se utiliza LOOKUPZ, la lista con base-cero (0..N-1) en vez de con base-uno; Index de 0 devuelve 25, Index de 1
devuelve 300, etc.

Si Index est fuera de rango se devuelve 0. Lo mismo, para LOOKUP, si la declaracin de REPEAT fuera de 0 a
8, en vez de 1 a 7, este ejemplo mostrara 0, 25, 300, 2510, 163, 17, 8000, 3 y 0.

3.3.37. NEXT

Salta las declaraciones restantes del bucle de REPEAT y contina con la siguiente iteracin del bucle.
NEXT
Explicacin
NEXT es uno de los dos comandos (NEXT y QUIT) que afectan los bucles de REPEAT. NEXT hace que se salte
cualquier declaracin siguiente el bucle REPEAT y que comience la siguiente iteracin del bucle.

Uso de NEXT
NEXT se utiliza normalmente como caso de excepcin, en una declaracin condicional, en los bucles de REPEAT
para ir inmediatamente a la siguiente iteracin del bucle. Por ejemplo, se asume que X es una variable creada
anteriormente y Print() es un mtodo creado en otra parte que muestra un valor:

repeat X from 0 to 9 Repite 10 veces
if X ==4
next Salta si X =4
byte[$7000][X] :=0 Limpia o fija a cero las localizaciones de RAM
Print(X) 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 >

Symbol es el nombre deseado para el smbolo del objeto.
Count es una expresin opcional, incluida entre parntesis, que indica que ste es un array de objetos,
con el nmero Count de elementos. Para referirse a estos elementos, comienzan con el elemento 0 y
terminan con el elemento Count-1.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-49
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.




PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-50
Alcance de smbolos de objeto
Los smbolos de objeto definidos en bloques de objeto son globales al objeto en el que se definen pero no son
disponibles desde el exterior de ese objeto. Esto significa que estos smbolos de objeto se pueden alcanzar
directamente desde cualquier sitio dentro del objeto pero su nombre no estar en conflicto con los smbolos
definidos en otros objetos padre o hijo.

Operadores

El chip Propeller ofrece un sistema de gran alcance de operadores matemticos y lgicos. Un subconjunto de
estos operadores es soportado por el lenguaje ensamblador del Propeller; sin embargo, como el lenguaje Spin
tiene un uso para cada forma de operador apoyado por el Propeller, esta seccin describe a cada operador
detalladamente.

Espacio de Trabajo de Expresiones
El Propeller es un dispositivo de 32-bits y, a menos que se indique lo contrario, las expresiones se evalan
siempre usando un entero con signo de 32-bits. Esto incluye tambin resultados intermedios. Si cualquier
resultado intermedio desborda por arriba o por abajo (overflow o underflow) del entero con signo de 32-bits (sobre
2.147.483.647 o debajo de -2.147.483.648), el resultado final de la expresin no ser el esperado. El espacio de
trabajo de 32 bits proporciona mucho espacio para resultados intermedios, aunque hay que tener presente las
posibilidades de que ocurra un overflow/underflow.

Atributos de los Operadores
Los operadores tienen las siguientes atributos o cualidades importantes, cada una de las cuales se muestra en las
dos tablas siguientes y se explican mas adelante:

Unitaio/Binario
Normal/Asignado
Expresin constante y/o variable
Nivel de precedencia



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-51


Unitario / Binario
Cada operador es unitario o binario por naturaleza. Los operadores unitarios son los que funcionan en un nico
operando. Por ejemplo:

!Flag NOT tipo bit de Flag


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-52
^^Total raz cuadrada de Total

Los operadores binarios son los que funcionan en dos operandos. Por ejemplo:

X +Y suma X e Y
Num <<4 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 sobre sus operandos y
proporcionan el resultado para el uso del resto de expresiones, sin afectar al operando o operandos mismos. Los
operadores de asignacin, sin embargo, escriben su resultado en a la variable sobre la que operan (unitario), o
sobre la variable a su izquierda (binaria), adems de proporcionar el resultado para el uso por el resto de
expresiones.
A continuacin se muestra un ejemplo de operadores:

Count++ (Unitario) evala Count +1
y escribe el resultado a Count
Data >>=3 (Binario) desplaza Data 3 bits a la derecha
y escribe el resultado en Data

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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-53
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 = 4096000
Reset = %00100000
Initialize = %00010000
WakeUp = 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 = 2.0 / 5.0
Miles = 10e5


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-54

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

Aqu, el valor de X se suma a 10 y el resultado se almacena en X. La forma de la asignacin de la suma tambin
se puede utilizar dentro de expresiones para los resultados intermedios.

Positivo + (forma untara de la Suma)
Positivo es la forma untara de la suma y puede ser usado de manera similar a Negativo excepto que este nunca
ser un operador de asignacin. El compilador esencialmente lo ignora, pero es prctico cuando es importante
acentuar el signo de operandos. Por ejemplo:
Val :=+2 A

Resta -, -=
El operador Resta, resta dos valores. Puede ser utilizado en expresiones variables y constantes. Ejemplo:

X :=Y 5

La Resta, tiene una forma de asignacin, -=, que utiliza la variable de su izquierda como el primer operando y la
destino del resultado. Por ejemplo,


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-55
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 post-
decremento 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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-56
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 post-
incremento 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:


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-57

X :=Y ** 8

Si Y comenzase con el valor de 536.870.912 (2
29
) 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



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-58
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

Aqu, el valor de X se limita a un valor mnimo de 50 y el resultado se almacena en X. La forma de la asignacin
del resto tambin se puede utilizar en las expresiones para los resultados intermedios.

Limite mximo <#, <#=
El operador Limite mximo compara dos valores y devuelve el valor ms bajo. El Limite mximo se puede utilizar
en expresiones variables y constantes. Ejemplo:

X :=Y +21 <#250

El ejemplo anterior suma 21 a Y y limita el resultado a un valor mximo a 250. Si Y fuese 200 entonces 200 +21 =
221; es menor de 250 as que X se fijara a 221. Si Y fuera 240 entonces 240 +21 =261; es mayor que 250 as
que X se fijara a 250.

El Limite mximo 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 <#50

Aqu, el valor de X se limita a un valor mximo de 50 y el resultado se almacena en X. La forma de la asignacin
del Limite mximo se puede utilizar en las expresiones para los resultados intermedios.

Raz Cuadrada ^^
El operador de la raz cuadrada devuelve la raz cuadrada de un valor. La raz cuadrada se puede utilizar en
expresiones variables y constantes. Cuando se utiliza con expresiones variables o expresiones de constante
entera, la raz cuadrada devuelve un resultado de 32-bits de nmero entero. Cuando se utiliza con expresiones
constantes de punto flotante, la raz cuadrada devuelve el resultado de 32-bits de punto flotante de simple-
precisin. Ejemplo:

X :=^^Y

La raz cuadrada 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 la raz cuadrada del valor de Y nuevamente dentro de Y.


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



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-59
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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-60
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 Forma abreviada de X :=X ~>2

Aqu, el valor de X se desplaza 2 bits a la derecha, manteniendo el signo, y el resultado se almacena en X. La
forma de la asignacin del Desplazamiento Aritmtico a la Derecha se puede utilizar en las expresiones para los
resultados intermedios.

Random ?
El operador Random es un operador especial, inmediato que utiliza el valor de una variable como semilla para
crear un pseudo nmero al azar y asigna ese nmero a la misma variable. Puede ser utilizada solamente en
expresiones variables run-time. Random tiene dos formas, hacia delante y hacia atrs, dependiendo del lado de la
variable en la que aparece. La forma del Random hacia delante aparece a la izquierda de la variable y la forma
reversa aparece a la derecha de la variable.

Random genera los nmeros pseudo-aleatorios de rango desde -2.147.483.648 a +2.147.483.647. Se llama
"pseudo-aleatorio" porque los nmeros aparecen de forma aleatoria, pero realmente se generan mediante una
operacin lgica que utiliza un valor "semilla" como base de una secuencia de 4 mil millones de nmeros. Si se
utilizase otra vez el mismo valor semilla, se generara la misma secuencia de nmeros. Aqu hay un ejemplo:

?X

El ejemplo anterior muestra la forma de Random hacia delante; utiliza el valor actual del X para recuperar el
siguiente nmero pseudo-aleatorio hacia delante y lo almacena en X. Si se ejecutase ?X otra vez dara como
resultado otro numero diferente, almacenado nuevamente dentro de X.

X?

El ejemplo anterior muestra la forma de Random hacia atrs; utiliza el valor actual del X para recuperar el
siguiente nmero pseudo-aleatorio hacia atrs y lo almacena en X. Si se ejecutase ?X otra vez dara como
resultado otro numero diferente, almacenado nuevamente dentro de X.

Random es siempre un operador de asignacin y se puede utilizar en las expresiones para los resultados
intermedios.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-61
Decodificar modo bit |<
El operador en modo bit de Decodificar decodifica un valor (0 - 31) en un valor long de 32-bits. Decodificar puede
ser utilizado en expresiones de constante entera y en expresiones variables pero no en expresiones constantes
de punto flotante. Ejemplo:

P :=|<PinNum

El ejemplo anterior fija P igual al valor de 32-bits cuyo bit alto corresponde a la posicin indicada por PinNum. Si
PinNum fuese 3, P se fijara a %00000000 00000000 00000000 00001000. Si PinNum fuese 31, se fijara a
%10000000 00000000 00000000 00000000.

Hay muchos usos para Decodificar, pero uno de los mas tiles consiste en convertir un nmero de pin de E/S al
patrn de 32-bits que describe el nmero de pin en relacin a los registros de E/S. Decodificar por ejemplo, es
muy prctico para el parmetro de la mscara de los comandos de WAITPEQ y de WAITPNE.

Descifrar es un operador de asignacin cuando es el nico operador a la izquierda de una variable en una lnea.
Por ejemplo:

|<PinNum

Esto almacenara el valor decodificado de PinNum nuevamente dentro de PinNum.

Codificar en modo bit >|
El operador en modo bit de Codificar codifica un valor 32-bits en el valor (0 - 32) que representa el sistema ms
alto de bits, ms 1. Codificar puede ser utilizado en expresiones de constante entera y de variable, pero no en
expresiones constantes de punto flotante. Ejemplo:

PinNum :=>|P

El ejemplo anterior fija PinNum igual al nmero del bit ms alto fijado en P, ms 1. Si P fuera %00000000
00000000 00000000 00000000, PinNum se fijara a 0; no se fijara ningn bit. Si P fuese %00000000 00000000
00000000 10000000, PinNum se fijara a 8; se fija el bit 7. Si P fuese %10000000 00000000 00000000 00000000,
PinNum se fijara a 32; se fijara el bit 31.

Desplazamiento a la Izquierda en modo bit <<, <<=
El operador Desplazamiento a la Izquierda desplaza los bits del primer operando a la izquierda por el nmero de
los bits indicados en el segundo operando. El Desplazamiento a la Izquierda se puede utilizar en expresiones de
constante entera y de variable, pero no en expresiones constantes de punto flotante. Ejemplo:
X :=Y <<2

Si Y comenzase como:

%10000000 01110000 11111111 00110101

... el operador Desplazamiento a la Izquierda cambiara de puesto ese valor a la izquierda por dos bits, fijando X a:

%00000001 11000011 11111100 11010100.

Puesto que la naturaleza del binario es base-2, desplazar un valor a la izquierda es como multiplicar ese valor por
potencias de dos, 2
b
, donde b es el nmero de los bits cambiados de puesto.

El operador Desplazamiento a la Izquierda tiene una forma de asignacin, <<=, que utiliza la variable de su
izquierda como el primer operando y destino del resultado. Por ejemplo,

X <<=4 Forma abreviada de X :=X <<4



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-62
Aqu, el valor de X se desplaza cuatro bits a la izquierda y se almacena en X. La forma de asignacin de
Desplazamiento a la izquierda tambin se puede utilizar dentro de expresiones para los resultados intermedios.

Desplazamiento a la derecha en modo bit >>, >>=
El operador Desplazamiento a la Derecha desplaza los bits del primer operando a la izquierda por el nmero de
los bits indicados en el segundo operando. El Desplazamiento a la Derecha se puede utilizar en expresiones de
constante entera y de variable, pero no en expresiones constantes de punto flotante. Ejemplo:
X :=Y >>3

Si Y comenzase como:

%10000000 01110000 11111111 00110101

... el operador Desplazamiento a la Derecha cambiara de puesto ese valor a la Derecha por dos bits, fijando X a:

%00010000 00001110 00011111 11100110.

Puesto que la naturaleza del binario es base-2, desplazar un valor a la derecha es como dividir ese valor por
potencias de dos, 2
b
, donde b es el nmero de los bits cambiados de puesto.

El operador Desplazamiento a la Derecha tiene una forma de asignacin, >>=, que utiliza la variable de su
izquierda como el primer operando y destino del resultado. Por ejemplo,

X >>=2 Forma abreviada de X :=X >>2

Aqu, el valor de X se desplaza cuatro bits a la derecha y se almacena en X. La forma de asignacin de
Desplazamiento a la derecha tambin se puede utilizar dentro de expresiones para los resultados intermedios.

Rotacin a la Izquierda de modo bit <-, <-=
El operador de Rotacin a la Izquierda en modo bit es similar al operador de Desplazamiento a la Izquierda,
excepto que los MSBs (bits extremos izquierdos) se rotan con los LSBs (bits de derecha). La Rotacin a la
Izquierda puede ser utilizada en expresiones de constante entera y de variable, pero no en expresiones
constantes de punto flotante. Ejemplo:

X :=Y <- 4

Si Y comenzase como:

%10000000 01110000 11111111 00110101

el operador de Rotacin a la Izquierda rotara ese valor a la izquierda por cuatro bits, moviendo los cuatro
originales MSBs a los cuatro LSBs nuevos, y fijando X a:

%00000111 00001111 11110011 01011000

La Rotacin a la Izquierda tiene una forma de asignacin,<-=, que utiliza la variable a su izquierda como primer
operando y destino del resultado. Por ejemplo,

X <-=1 Forma abreviada de X :=X <- 1

Aqu, el valor de X se rota a la izquierda un bit y se almacena en X. La forma de asignacin de Rotacin a la
Izquierda tambin se puede utilizar dentro de expresiones para resultados intermedios.

Rotacin a la Derecha en modo bit ->, ->=
El operador de Rotacin a la Derecha en modo bit es similar al operador de Desplazamiento a la Derecha, excepto
que los LSBs (bits extremos derechos) se rotan con los MSBs (bits de la izquierda). La Rotacin a la Derecha


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-63
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 Forma abreviada de X :=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 Forma abreviada de X :=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:



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-64


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 Forma abreviada de X :=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

Aqu, el valor de X realiza un OR con $F y el resultado se almacena en X. La forma de la asignacin OR tambin
se puede utilizar dentro de expresiones para resultados intermedios.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-65
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.

XOR en modo bit ^, ^=
El operador de XOR en modo bit realiza un XOR de los bits del primer operando con los bits del segundo
operando. XOR 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:


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 Forma abreviada deX :=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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-66

Esto almacenara el valor invertido de Flag nuevamente dentro Flag.

Hay que tener cuidado en no confundir el NOT en modo bit con el NOT Boleano. NOT en modo bit es para la
manipulacin de bits mientras que el NOT boleano es para propsitos de la comparacin.

AND Booleano AND, AND=
El operador boleano AND compara dos operandos y devuelve verdadero (-1) si ambos valores son ciertos
(diferente a cero), o devuelve (0) falso si uno o ambos operandos son falsos (0). AND Boleano puede ser utilizado
en expresiones variables y constantes. Ejemplo:

X :=Y AND Z

El ejemplo anterior compara el valor de Y con el valor de Z y fija X a: Verdadero (-1) si Y y Z son diferentes a cero,
o (0) falso si Y o Z son cero. Esta expresin se convertira en: "si Y es verdadero y Z es verdad.ero.."

Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo
siguiente.

IF (Y ==20) AND (Z ==100)

Este ejemplo evala el resultado de Y==20 con el de Z==100, y si ambos son verdadero, el operador AND
devuelve verdadero (-1). El AND Boleano tiene una forma de asignacin, AND=, que utiliza la variable a su
izquierda como el primer operando y destino del resultado. Por ejemplo,

X AND=True Forma abreviada deX :=X AND True

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 Forma abreviada deX :=X OR Y

La forma de asignacin del OR boleano se puede tambin utilizar dentro de expresiones para resultados
intermedios.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-67

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 Forma abreviada deX :=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.


No es igual a Boleano <>, <>=


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-68
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 Forma abreviada de X :=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.


Es Menor que Boleano <, <=
El operador boleano Es menor que compara dos operandos y devuelve verdadero (-1) si el primer valor es menor
que el segundo valor, o devuelve falso (0), si no. Es menor 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 menor que el valor de
Z, o (0) falso si Y es igual o 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 <32)

Aqu, el operador Es menor que devuelve verdadero si Y es menor que 32.

Es menor que una forma de la asignacin,<=, que utiliza la variable a su izquierda como el primer operando y
destino del resultado. Por ejemplo,

X <=Y Forma abreviada deX :=X <Y

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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-69
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 Forma abreviada deX :=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 Forma abreviada deX :=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.


Es mayor o igual Boleano =>, =>=
El operador boleano Es mayor o igual compara dos operandos y devuelve verdadero (-1) si el primer valor es
mayor o igual que el segundo valor, o devuelve falso (0), si no. Es mayor 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: Verdad (-1) si Y es mayor o igual que el valor
de Z, o (0) falso si Y es menor 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 =>100)

Aqu, el operador Es mayor o igual devuelve verdadero si Y es mayor o igual que 100.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-70
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 Forma abreviada deX :=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.

Direccin de Objeto y Smbolo @@
El operador de Direccin de objeto ms smbolo devuelve el valor del smbolo que lo sigue ms la direccin base
actual del programa objeto. La direccin del objeto ms smbolo se puede utilizar solamente en expresiones
variables.

Este operador es til para crear una tabla de las direcciones de ajuste, y en tiempo de ejecucin, usar esos ajustes
para referirse a direcciones absolutas que representan en tiempo de ejecucin. Por ejemplo, un bloque DAT puede
contener un nmero de strings de las que se quiere tener acceso directo e indirecto. Aqu hay un bloque DAT de
ejemplo.

DAT
Str1 byte Hello., 0
Str2 byte This is an example, 0
Str3 byte of strings in a DAT block.,0

En tiempo de ejecucin podemos tener acceso a esas secuencias directamente, usando @Str1, @Str2, y @Str3,
pero tener acceso indirecto es molesto porque cada secuencia es de una longitud distinta; hacindolo difcil de
utilizar.

La solucin podra ser simplemente hacer otra tabla de las direcciones mismas, como en:

DAT
StrAddr word @Str1, @Str2, @Str3



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-71
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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-72
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]~~ Fija P10 a salida
OUTA[10]~ Pone P10 a bajo
OUTA[10]~~ Pone P10 a alto

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]~~ Fija DIRA12:8 (P12-P8 a salida)
OUTA[12..8] :=%11001 Fija P12:8 a 1, 1, 0, 0, y 1

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]~~ Fija DIRA8:12 (P8-P12 a salida)
OUTA[8..12] :=%11001 Fija OUTA8:12 a 1, 1, 0, 0, y 1

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] Recoge los estados de salida finales de P15 a P13

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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-73

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 Variable Shared (Spin & Ens)

PUB Main | Temp
cognew(@Process, @Shared)
repeat
<hacer algo con Shared vars>

DAT
org 0
Process mov Mem, PAR
:loop <hacer algo>
wrlong ValReg, Mem Mueve el valor ValReg a Shared
jmp :loop
jmp :loop
Mem res 1
ValReg 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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-74
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

Name es el nombre deseado para el mtodo privado.
Param es un nombre del parmetro (opcional). Los mtodos pueden contener cero o ms parmetros
delimitados con comas, incluidos entre parntesis. Param debe ser globalmente nico, pero otros mtodos
pueden tambin utilizar el mismo nombre de smbolo. Cada parmetro es esencialmente una variable long
y se puede tratar como tal.
RValue es un nombre para el valor de retorno del mtodo (opcional). Esto se convierte en un alias a la
variable incorporada RESULT del mtodo. RValue debe ser globalmente nico, pero otros mtodos
pueden tambin utilizar el mismo nombre de smbolo. El RValue (y/o la variable RESULT) se inicializa a
cero (0) en cada llamada al mtodo.
LocalVar es un nombre para una variable local (opcional). LocalVar debe ser globalmente nico, pero
otros mtodos pueden tambin utilizar el mismo nombre de smbolo. Todas las variables locales son de
tamao long (cuatro bytes) y no se inicializan en cada llamada al mtodo. Los mtodos pueden contener
cero o ms variables locales delimitadas por comas.
Count es una expresin opcional, incluida entre corchetes, que indica que es una variable local de array,
con el nmero de Count elementos; cada uno es de tamao long. Al referirse a estos elementos,
comienzan con el elemento 0 y terminan con el elemento Count-1.
SourceCodeStatements es una o ms lneas del cdigo fuente ejecutable, tabuladas por lo menos un
espacio, que realizan la funcin del mtodo.

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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-75
3.3.43. PUB

Declara un Bloque de mtodo Publico.

PUB Name <(Param <,Param>)> <:Rvalue> <|LocalVar<[Count]>> <,LocalVar <[Count]>>
SourceCodeStatements

Name es el nombre deseado para el mtodo publico.
Param es un nombre del parmetro (opcional). Los mtodos pueden contener cero o ms parmetros
delimitados con comas, incluidos entre parntesis. Param debe ser globalmente nico, pero otros mtodos
pueden tambin utilizar el mismo nombre de smbolo. Cada parmetro es esencialmente una variable long
y se puede tratar como tal.
RValue es un nombre para el valor de retorno del mtodo (opcional). Esto se convierte en un alias a la
variable incorporada RESULT del mtodo. RValue debe ser globalmente nico, pero otros mtodos
pueden tambin utilizar el mismo nombre de smbolo. El RValue (y/o la variable RESULT) se inicializa a
cero (0) en cada llamada al mtodo.
LocalVar es un nombre para una variable local (opcional). LocalVar debe ser globalmente nico, pero
otros mtodos pueden tambin utilizar el mismo nombre de smbolo. Todas las variables locales son de
tamao long (cuatro bytes) y no se inicializan en cada llamada al mtodo. Los mtodos pueden contener
cero o ms variables locales delimitadas por comas.
Count es una expresin opcional, incluida entre corchetes, que indica que es una variable local de array,
con el nmero de Count elementos; cada uno es de tamao long. Al referirse a estos elementos,
comienzan con el elemento 0 y terminan con el elemento Count-1.
SourceCodeStatements es una o ms lneas del cdigo fuente ejecutable, tabuladas por lo menos un
espacio, que realizan la funcin del mtodo.


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.


Declaracin de mtodos Pblicos
Las declaraciones de mtodos pblicos comienzan con PUB, en la columna 1 de una lnea, seguidas por un
nombre nico y opcionalmente de un sistema de parmetros, de una variable del resultado, y de variables locales.

Ejemplo:
PUB Init
<initialization code>

PUB MotorPos : Position
Position :=<code to retrieve motor position>

PUB MoveMotor(Position, Speed) : Success | PosIndex
<code that moves motor to Position at Speed and returns True/False>

Este ejemplo contiene tres mtodos pblicos, Init, MotorPos y MoveMotor. El mtodo de Init no tiene ningn
parmetro y no declara ningn valor de retorno o variable local. El mtodo MotorPos no tiene ningn parmetro
pero declara un valor de retorno llamado Position. El mtodo MoveMotor tiene dos parmetros, Position y Speed,
un valor de retorno, Success, y una variable local, PosIndex.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-76
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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-77
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 Repetir mientras haya DoMore
!outa[0] Activa el Pin 0
<do something> Realiza alguna tarea
if !SystemOkay
quit Si hay fallo en System, salir
<more code here> Realiza otras tareas

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)



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-78
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 Repite sin fin
!outa[25] Activa P25
waitcnt(2_000 +cnt) Pausa en 2,000 ciclos

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 Repite sin fin
!outa[25] Activa P25 <-- Esto no se ejecutara

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:


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-79
repeat 10 Repite 10 veces
!outa[25] Activa P25
byte[$7000]++ 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 Repite 10 veces
byte[$7000][Index]++ 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 Repite 10 veces
byte[$7000][Index]++ Incrementa localizacin RAM de $7009 hacia
$7000

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 Repite 2 veces
repeat Index from S to F Repite 10 veces
byte[$7000][Index]++ Incrementa localizacin RAM de 7000..$7009
S :=9
F :=0

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 Repite 5 veces
byte[$7000][Index]++ Incrementa la RAM $7000 a $7008


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-80

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 Repite mientras X es menor que 10
byte[$7000][X] :=0 Incrementa el valor de RAM
X++ Incrementa 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 Repite hasta que X sea mayor que 9
byte[$7000][X] :=0 Incrementa el valor de RAM
X++ Incrementa 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:



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-81
X :=0
repeat
byte[$7000][X] :=0 Incrementa el valor de RAM
X++ Incrementa X
while X <10 Repite mientras X sea menor que 10

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 Llama a DoSomething, fija Temp con el valor de retorno

PUB DoSomething
<do something here>
result :=100 Fija result a 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> Fija Char (result) al carcter

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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-82
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 Suma Num1 +Num2
return

PUB Divide(Dividend, Divisor)
if Divisor ==0 Mira si Divisor =0
DisplayDivByZeroError Si es as, muestra error
return 0 y retorna con 0
return Dividend / Divisor 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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-83
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.

FloatConstant es la expresin constante de punto flotante que se redondear al nmero entero ms
cercano.

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 = 0.5
Smaller = 0.4999
Rnd1 = round(OneHalf)
Rnd2 = round(Smaller)
Rnd3 = 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.

Sobre el punto flotante
El compilador del Propeller maneja constantes con punto flotante como nmeros reales de simple-precisin segn
lo descrito por el estndar IEEE-754. los nmeros reales de simple -precisin se almacenan en 32-bits, con una
muestra de 1-bit, un exponente de 8-bit, y una mantisa de 23-bit (la parte fraccionaria). Esto da lugar a
aproximadamente 7.2 dgitos decimales significativos.

Las expresiones de punto flotante se pueden definir y utilizar para muchos propsitos en tiempo de compilacin,
pero para operaciones en tiempo de ejecucin de punto flotante, los objetos de FloatMath y de FloatString proveen
de las funciones de la matemticas compatibles nmeros de simple-precisin.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-84
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.

Nota 1: Reservado para uso futuro.

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 Fijar el registro de salida
Temp :=spr[2] Recoger el valor de entrada

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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-85
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



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-86
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.

StringExpression es la expresin string que se utilizar temporalmente.

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



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-87
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.

Tabla 4-13: smbolos
Smbolo propsito


#
1) referencia Objeto-Constante: usado para referirse a las constantes de un
secundario-objeto.
2) Enumeracin: utilizado en un bloque CON para fijar el comienzo de un sistema
enumerado de smbolos.
3) Literal del Ensamblador : usado para indicar una expresin o un smbolo es un
valor literal ms que una direccin de registro.

.
1) referencia al mtodo de un Objeto: se refiere a los mtodos de un objeto
secundario.
2) punto decimal: usado en expresiones constantes con punto flotante.
. . Indicador de rango: indica un rango a partir de una expresin a otra para las
declaraciones de CASE o de ndice de registro de E/S.



:
1) separador de retorno del valor: aparece inmediatamente antes del retorno de un
valor simblico en una declaracin PUB o PRI.
2) asignacin del objeto: aparece en una declaracin de un objeto en un bloque de
OBJ .
3) separador de la instruccin CASE: aparece inmediatamente despus de las
expresiones en una estructura CASE.

|
1) separador variable local: aparece inmediatamente antes de una lista de variables
locales en una declaracin PUB o PRI.
2) Modo bit OR: utilizado en expresiones.
\ Abort Trap (interrupcin): aparece inmediatamente antes de una llamada a un
mtodo que potencialmente podra abortar.
, Delimitador de la lista: separaban artculos en listas.
( ) Designadores de lista de parmetros: rodean parmetros del mtodo.
[ ] Designadores de ndice de Array: usado para rodear ndices en arraysde variables o
referencias a memoria principal.


Signo del comentario de cdigo: para incorporar los comentarios de cdigo de lnea
(texto no-compilado) para los propsitos de visin del cdigo.


Signo del comentario de documento: para incorporar comentarios de documento de
lnea (texto no-compilado) para propsitos de visin de la documentacin.

{}
Signo del comentario de cdigo multi-lnea: para incorporar comentarios multilnea de
cdigo (texto no-compilado) para propsitos de visin del cdigo.

{{}}
Signo del comentario de documento multi-lnea: para incorporar comentarios
multilnea del documento (texto no-compilado) para propsitos de visin de la
documentacin.

3.3.54. TRUNC

Quita o Trunca la porcin fraccional de una constante de punto flotante.

TRUNC ( FloatConstant )

Devuelve: El nmero entero que es el valor constante dado en punto flotante truncado a decimal.

FloatConstant es la expresin constante con punto flotante que se truncar a un nmero entero.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-88
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 = 0.5
Bigger = 1.4999
Int1 = trunc(OneHalf)
Int2 = trunc(Bigger)
Int3 = 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.

Sobre el punto flotante
El compilador del Propeller maneja constantes con punto flotante como nmeros reales de simple-precisin segn
lo descrito por el estndar IEEE-754. los nmeros reales de simple -precisin se almacenan en 32-bits, con una
muestra de 1-bit, un exponente de 8-bit, y una mantisa de 23-bit (la parte fraccionaria). Esto da lugar a
aproximadamente 7.2 dgitos decimales significativos.

Las expresiones de punto flotante se pueden definir y utilizar para muchos propsitos en tiempo de compilacin,
pero para operaciones en tiempo de ejecucin de punto flotante, los objetos de FloatMath y de FloatString proveen
de las funciones de la matemticas compatibles nmeros de simple-precisin.

3.3.55. VAR

Declara un bloque de variables.

VAR
Size Symbol <[Count ]> < Size Symbol <[Count ]>>...
Size Symbol <[Count ]> <Symbol <[Count ]>>...

Size es el tamao deseado de la variable, del BYTE, del WORD o LONG.
Symbol es el nombre deseado para la variable.
Count es una expresin opcional, incluida entre corchetes, que indica que esto es una variable de array,
con el nmero Count de elementos; siendo cada uno del tamao byte, word o long. Estos elementos,
comienzan con el elemento 0 y terminan con el elemento Count-1.

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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-89
VAR
byte Str[10]
word Code
long 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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-90
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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-91


En ensamblador Propeller, el campo de VMode se puede escribir convenientemente usando la instruccin de
MOVI a travs de los campos de ASubCar.

VGroup
El campo de VGroup (video output pin group) selecciona el grupo de 8 pins de E/S para fijar el vdeo de salida.

En ensamblador Propeller, el campo de VGroup se puede escribir convenientemente usando la instruccin de
MOVD.

VPins
El campo de VPins (video output pins) es una mscara aplicada a los pins de VGroup que indica qu pins son la
salida de las seales de video.


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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-92
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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-93
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 Fija a cristal lento
_xinfreq =5_000_000 Usa cristal 5 MHz

repeat
!outa[0] Activa el pin 0
waitcnt(50_000 +cnt) 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 Se fija un cristal lento
_xinfreq =5_000_000 Usa 5 MHz cristal

PUB Activa | Time
Time :=cnt Recoge el valor actual del contador de Sis
repeat
waitcnt(Time +=50_000) Espera 10 ms


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-94
!outa[0] 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) Espera a que P3 & P2 sean bajo & alto
outa[0] :=1 Fija P0 a alto

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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-95
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) Espera a que los pins sean alto


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) Espera al Pin 5 que sea alto
waitpeq(0, 5, 0) Entonces espera a que el Pin 5 sea bajo


Este primer ejemplo espera a P5 para pasar a ALTO, entonces lo espera para pasar a BAJ O; una transicin alto-
a-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) Espera a que P3 & P2 sean & y alto
waitpne(%0100, %1100, 0) Espera a que P3 & P2 no coincida con el estado prev
outa[0] :=1 Fija P0 a alto

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.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-96
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]>

Symbol (smbolo) es el nombre que se le quiere poner a la variable.
Count (contador) es una expresin opcional que indica el nmero de elementos tamao-word para
Symbol, dispuestos en un array del elemento 0 al elemento Count-1.
Data (datos) son una expresin constante o una lista separada por comas, de expresiones constantes.
BaseAddress (direccin base) es una expresin que indica la direccin de la memoria principal para leer
o escribir. Si se omite la Offset, BaseAddress es la direccin real donde operar. Si se especifica la Offset,
la direccin real seria BaseAddress +Offset .
Offset (ajuste) es una expresin opcional que indica el ajuste de BaseAddress.



PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-97
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 Temp es una word(2 bytes)
word List[25] List es un array de words

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 Fija Temp a 25,000
List[0] :=500 Fija el primer elemento de List a 500
List[1] :=9_000 Fija el Segundo elemento de List a 9,000
List[24] :=60_000 Fija el ultimo elemento de List a 60,000


Declaracin de Datos Word (Sintaxis 2)
En bloques DAT, se utiliza esta sintaxis 2 para declarar los datos Word (word) que se compilan como valores
constantes en memoria principal. Los bloques DAT permiten que esta declaracin tenga un smbolo opcional el
precedindole, que se puede utilizar para una referencia posterior. Por ejemplo:

DAT
MyData word 640, $AAAA, 5_500 Datos alineados y de tamao word
MyList byte word $FF99, 1_000 Datos tamao word pero alineacin byte

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 byte-
alineado 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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-98

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 Escribe 8,192 a la primera word de MyList

Esta lnea escribe 8,192 a la primera word de MyList.

3.3.63. WORDFILL

Rellena la memoria principal con un valor.

WORDFILL (StartAddress, Value, Count )

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


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-99
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) Copia Buff1 a Buff2

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.


PROPELLER: EL GIGANTE DE 8 CABEZAS
Captulo 3: El lenguaje SPIN

www.microcontroladores.com
info@microcontroladores.com
3-100

Anda mungkin juga menyukai