Você está na página 1de 149

PROPELLER: El gigante de 8 cabezas

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

INGENIERIA DE MICROSISTEMAS PROGRAMADOS S.L.


C/ Alda. Mazarredo N 47 - 1 Dpto. 2 48009 BILBAO - BIZKAIA Tel/Fax: 94 4230651 email: info@microcontroladores.com www.microcontroladores.com

PROPELLER: EL GIGANTE DE 8 CABEZAS Indice general

www.microcontroladores.com info@microcontroladores.com

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

i-1

PROPELLER: EL GIGANTE DE 8 CABEZAS Indice general


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

www.microcontroladores.com info@microcontroladores.com

i-2

PROPELLER: EL GIGANTE DE 8 CABEZAS Indice general


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

www.microcontroladores.com info@microcontroladores.com

i-3

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

CAPITULO 1: ARQUITECTURA, FUNCIONAMIENTO Y CARACTERISTICAS DEL PROPELLER


1.1 QU ES EL PROPELLER? El procesador Propeller est diseado para proporcionar un elevadsimo rendimiento para los sistemas embebidos mientras mantiene un bajo consumo de energa y ocupa una superficie de instalacin pequea. Adems de ser rpido, el Propeller proporciona flexibilidad y potencia a travs de sus ocho procesadores, llamados Cogs, que pueden realizar simultneamente tareas independientes o cooperativas, todo esto mientras soporta una arquitectura relativamente simple que es fcil de aprender y de utilizar. El diseo resultante del Propeller libera al desarrollador programacin de sistemas embebidos. Por ejemplo: de aplicaciones de las complejidades tpicas de la

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.

1-1

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


Descripciones de patitas o pines

www.microcontroladores.com info@microcontroladores.com

Nombre de PIN P0-P31

Direccin E/S (E/S)

VDD VSS BOEn

--I

Descripcin Puerto A de E/S de propsito general. Los pines mostrados a continuacin tienen un propsito especial sobre encendido/reset pero son de propsito general E/S de todas formas. P28 Conexin opcional de I2C LCC a EEPROM externa. P29 Conexin opcional de I2C SDA a EEPROM externa. P30 - Tx al host. P31 - Rx del host. 2.7 3.3 VDC Tierra. 0 VDC Brown Out Enable. Debe conectarse con Vdd o el Vss. Si es baja, RESn se convierte en una salida dbil (que entrega Vdd con 5 K ) para monitorizar, pero puede todava utilizarse para crear un reset. Si es alta, RESn acta como entrada de CMOS con Schmitt Trigger.

RESn

E/S

XI

XO

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. 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. 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, P28P31 son de propsito especial para encendido/reset. En encendido/reset, los pines P30 y P31 se comunican con un host para programar y los pines P28 y P29 interactan con una EEPROM (24LC256) de 32 KB externa.

1-2

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


Especificaciones

www.microcontroladores.com info@microcontroladores.com

Modelo Requerimientos de arranque Velocidad de Reloj Externo Velocidad de Reloj del sistema Oscilador RC Interno

P8X32A 3.3 VDC DC a 80 MHz (4 MHz a 8 MHz con el Reloj PLL en ejecucion) DC a 80 MHz 12 MHz o 20 kHz (aprox. rango de 8 MHz 20 MHz, o 13 kHz 33 kHz, respectivamente) 64 K bytes; 32 K RAM / 32 K ROM 2 K bytes cada Cog 32 bits (4 bytes) 32, CMOS, VDC, VDD umbral lgico de 1.65 V. 50 mA TBD mA 500 uA por MIPS (MIPS = Freq en MHz / 4 * Nmero de Cogs Activos)

RAM/ROM Global Cog RAM Organizacion RAM/ROM Pines E/S Fuente/ Sumidero actual por E/S Fuente/ Sumidero actual por chip Current Draw @ 3.3 vdc, 70 F

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.

1-3

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


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

www.microcontroladores.com info@microcontroladores.com

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.

1-4

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


1.7. Diagrama por bloques de la arquitectura interna

www.microcontroladores.com info@microcontroladores.com

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 mutuoexclusivos 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) 2) 3) El oscilador interno de RC El circuito PLL El oscilador de cristal (un circuito interno que es alimentado por un cristal externo). La fuente se determina en los ajustes del registro CLK, que es seleccionable en tiempo de ejecucin. Los nicos componentes que no utilizan el reloj del sistema directamente son el Hub y el Bus, que dividen por 2 el reloj del sistema.

1-5

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


1.10. Cogs (Procesadores)

www.microcontroladores.com info@microcontroladores.com

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.

1-6

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


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:

www.microcontroladores.com info@microcontroladores.com

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 MOV OUTA, #$FFFF 'Poner OUTA todo a unos 'Lo mismo que arriba

Los siguientes son ejemplos en lenguaje Spin: SPR[$1F4] := $FFFF OUTA := $FFFF SPR[OUTA] := $FFFF 'Poner OUTA todo a unos 'Lo mismo que arriba '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 mutuoexclusivos, requieren 7 ciclos para ejecutarse, pero primero necesitan ser sincronizadas en el comienzo de la Ventana de Acceso del Hub. Necesita como mximo 15 ciclos (16 menos 1, si acabamos de perderlo) para sincronizarse a la Ventana de Acceso del Hub, ms 7 ciclos para ejecutar la instruccin del Hub, as que las instrucciones del Hub consumen de 7 a 22 ciclos para completarse. Las Figuras 1-5 y 1-6 muestran ejemplos donde el Cog 0 tiene una instruccin Hub para ejecutar. La Figura 1-5 muestra el escenario del mejor-caso; la instruccin Hub est lista justo en el comienzo de la Ventana de Acceso de ese Cog. La instruccin Hub se ejecuta inmediatamente (7 ciclos) dejando los 9 ciclos adicionales para otras instrucciones antes de que llegue la siguiente Ventana de Acceso del Hub.

Figura 1-5.- Interaccin entre Cog/Hub en el escenario del caso mejor, cuando la instruccin Hub est lista justo al comienzo de la Ventana de Acceso al Cog 0.

1-7

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

www.microcontroladores.com info@microcontroladores.com

La Figura 1-6 muestra el peor caso; la instruccin Hub est lista justo en el siguiente ciclo antes del comienzo de la Ventana de Acceso del Cog 0; justo acaba de perderlo. El Cog espera hasta que la siguiente Ventana de Acceso del Hub (15 ciclos ms adelante) entonces la instruccin del Hub se ejecuta (7 ciclos), sumando un total de 22 ciclos para esa instruccin del Hub. Una vez ms, hay 9 ciclos adicionales despus de que llegue la instruccin del Hub para que otras instrucciones se ejecuten antes de la siguiente Ventana de Acceso del Hub. Para conseguir la mayor eficacia en las rutinas de ensamblaje del Propeller que tienen acceso frecuente a recursos mutuo-exclusivos, puede ser beneficioso interpolar instrucciones del no-Hub con instrucciones del Hub con el fin de disminuir el nmero de los ciclos que esperan la siguiente Ventana de Acceso del Hub. Como la mayora de las instrucciones de ensamblador del Propeller necesitan 4 ciclos, se podran ejecutar dos de estas instrucciones entre instrucciones contiguas de Hub.

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

1-8

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

www.microcontroladores.com info@microcontroladores.com

Cualquier Cog al ser desactivado deja su registro de direcciones y sus estados influenciando al estado final de los pines de E/S que los restantes Cogs activos tambin tiene su propio registro de 32 bits de entrada. Este registro de entrada es cada vez que se lee, los estados reales de los pines de E/S se leen, sin importar salida. 1.13 Contador del Sistema

de salida puestos a cero, no estn controlando. Cada Cog realmente un pseudo-registro; su direccin de entrada o de

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.

1-9

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.15. Semforos Hay ocho semforos disponibles para facilitar el acceso exclusivo a los recursos definidos por el usuario entre los mltiples Cogs. Si un bloque de memoria va a ser utilizado por dos o ms Cogs inmediatamente y ese bloque tiene ms de un long (cuatro octetos), cada Cog tendr que realizar mltiples lecturas y escrituras para recuperar o actualizar ese bloque de memoria. Esto conduce a la posibilidad de contencin de lectura/escritura en ese bloque de memoria donde un Cog puede escribir mientras que otro est leyendo, dando por resultado malas interpretaciones y/o prdidas de escritura. Los semforos son bits globales accedidos a travs del Hub con las siguientes instrucciones: LOCKNEW, LOCKRET, LOCKSET y LOCKCLR. Porque los semforos solo pueden ser accedidos a travs del Hub, slo un Cog a la vez puede afectarlos, conformando todo esto un mecanismo eficaz de control. El Hub mantiene un inventario de los semforos que estn en uso y sus estados actuales y de los Cogs que pueden comprobar, devolver, fijar, y resetear los semforos, segn lo que se precise durante tiempo de ejecucin. 1.16 Memoria Principal La memoria principal es un bloque de 64 K bytes (16 K longs) que es accesible por todos los Cogs como recurso mutuo-exclusivo a travs del Hub. Est formada por 32 KB de RAM y 32 KB de ROM. Los 32 KB de RAM principal son de propsito general y constituyen el destino de una aplicacin Propeller, que puede ser descargada de un host o cargada de los 32 KB de EEPROM externa.

1-11

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

www.microcontroladores.com info@microcontroladores.com

Los 32 KB de la ROM principal contienen todos los recursos del cdigo y los datos vitales para la funcin del Propeller: definiciones del carcter, registro, funciones de contra-registro y de seno, el Boot Loader y el intrprete Spin. La organizacin de la memoria principal se muestra en la Figura 1-6.

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.

1-12

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

www.microcontroladores.com info@microcontroladores.com

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.

1-13

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

www.microcontroladores.com info@microcontroladores.com

La herramienta del Propeller incluye y usa la fuente True Type de Parallax que sigue el diseo de la fuente Propeller embebida en hardware. Con esta fuente, y la herramienta del Propeller, se pueden incluir diagramas esquemticos, diagramas de coordinacin y otros diagramas en cdigo fuente de la aplicacin. 1.20 Tablas de registro y contra-registro Las tablas de registro y de contra-registro son tiles para convertir valores entre formato numrico y formato exponencial. Cuando los nmeros se codifican en forma exponencial, las operaciones simples matemticas adquieren efectos ms complejos. Por ejemplo ' add ' y ' subtract' se convierten en ' multiply ' y ' divde'. Shift left' se convierte en ' square' y la ' Shift right ' se convierte en square-root '. 'Divide by 3 ' (dividir entre 3) se convertir en ' cube root ' (raz cbica). Una vez que el exponente s e convierta de nuevo a un nmero, el resultado ser evidente. 1.21 Tabla del seno La tabla del seno proporciona 2.049 muestras de seno de 16 bits que van de 0 hasta el 90 inclusive (resolucin de 0.0439). Los valores del seno para el resto de los cuadrantes que cubren de 91 a 359 se pueden calcular a partir de transformaciones en esta tabla del seno de un cuadrante. La tabla del seno se puede utilizar para los clculos relacionados con los fenmenos angulares. 1.22 Boot Loader e Intrprete Spin La ltima seccin de la ROM principal contiene el Boot Loader del Propeller y los programas del intrprete Spin. El Boot Loader es responsable de inicializar el Propeller en el encendido/reset. Cuando comienza el proceso de arranque, el Boot Loader se carga en el Cog 0 de la RAM y el Cog ejecuta el cdigo que comienza en la posicin 0. El programa del Boot Loader primero chequea el host y los pines de comunicacin desde code/data a download/upload de la EEPROM, procesa dicha informacin y finalmente lanza el programa del Intrprete Spin en el Cog 0 de la RAM (que se sobreescribe) para ejecutar la aplicacin Propeller del usuario, o para poner el Propeller en modo parada. El programa del Intrprete Spin recupera y ejecuta la aplicacin Propeller de la RAM Principal. Esto puede precisar lanzar Cogs adicionales para ejecutar ms cdigo Spin o cdigo ensamblador del Propeller, si lo solicita la aplicacin.

1-14

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

www.microcontroladores.com info@microcontroladores.com

CAPITULO 2: MANEJO Y DESARROLLO DE APLICACIONES


2.1. LA CONCEPCIN DEL SOFTWARE Este captulo describe las caractersticas del software que utiliza el Propeller, comenzando por su gestacin y su estructura, pasando por la organizacin y el propsito de la pantalla del software, los detalles de las funciones del men y las caractersticas avanzadas, para terminar con las teclas rpidas. Los ingenieros de desarrollo de Parallax han utilizado muchos ambientes durante ms de 20 aos. En bastantes ocasiones han tenido que resolver preguntas tales como: Sera ms amigable el sistema haciendo que la caracterstica "x" fuera ms fcil de buscar/invocar?. Dnde se colocan los archivos del proyecto y por qu hay tantos? Se podr instalar/recompilar/mantener este sistema en otra computadora, en los prximos aos? No hay una solucin ms econmica?

Estas dudas han conducido a tomar la determinacin de crear herramientas sencillas y baratas para los productos Parallax. La herramienta para el Propeller fue diseada con la idea de proporcionar muchas funciones tiles mientras se mantiene un sencillo y constante ambiente de trabajo que anima al desarrollo rpido y fcil de los objetos de los programas para el Propeller. El software del Propeller consta de: a) un archivo ejecutable, b) unos archivos de ayuda on-line y c) archivos de la biblioteca del Propeller, todo ello almacenado en la misma carpeta por el instalador, que por defecto es: C:\Program Files\Parallax Inc\Propeller. El fichero ejecutable "Propeller.exe" puede ser copiado y ejecutado desde cualquier carpeta en la computadora. Cada archivo de la biblioteca (archivos con extensin "spin") es un objeto independiente, disponible para utilizar en los proyectos Propeller, con cdigo fuente y documentacin incorporado. Son realmente archivos de texto, tipo ANSI o Unicode-encoded, que pueden ser corregidos en cualquier editor de texto que soporte dicho tipo de codificacin; incluso el Notepad de Windows 2000 (y posteriores) soporta el ANSI y los archivos de texto Unicode-encoded. Es posible escribir la documentacin de usuario para un objeto dentro del archivo fuente del objeto. Esto significa que habr menos archivos para mantener y una probabilidad ms alta que la documentacin permanezca en armona con la revisin del cdigo fuente. Para permitir este proceso, se han creado: Dos tipos de comentarios en el fuente: 1) los comentarios del cdigo, y 2) comentarios de documento (dentro del cdigo, pero pensado para SER LEDO con la opcin de "vista de documentacin". El modo de vista de la documentacin" que extrae la documentacin del cdigo fuente de un objeto para los propsitos de visualizacin. Una fuente especial, la fuente Parallax, que contiene caracteres especiales para elementos como diagramas esquemticos, diagramas de tiempo y tablas que hay en la documentacin del objeto.

La fuente Parallax es una fuente True Type construida en la Herramienta del Propeller ejecutable. Fue diseada en el mismo estilo que la fuente construida en la ROM del chip Propeller. Usando los caracteres especiales de la fuente, la documentacin del objeto puede incluir los diagramas interesantes en ingeniera tales como los de la Figura 2-1.

2-1

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

www.microcontroladores.com info@microcontroladores.com

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.

2-2

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

www.microcontroladores.com info@microcontroladores.com

Figura 2-2.- La ventana principal del software de la herramienta Propeller contiene cuatro secciones importantes llamados "paneles." Los paneles uno, dos y tres de la Figura 2-2 corresponden a la parte del explorador integrado. El explorador integrado est situado en el panel 4, que proporciona las vistas del proyecto que se est trabajando as como carpetas y archivos en disco. Una barra alta vertical separa al explorador integrado del panel del editor, que se puede reajustar su tamao con el ratn en cualquier momento. El explorador integrado puede incluso ser ocultado reajustando su tamao hasta cero, seleccionando File Hide Explorer, o pulsando Ctrl+E. Las opciones del men y las teclas rpidas cambian el modo del Explorador Integrado entre visible e invisible.

Figura 2-3.- El Explorador integrado y sus componentes pueden ser reajustados en tamao con las barras de divisin. 2.2.1. Panel 1: Panel de visualizacin de objetos. El lenguaje Spin est basado en objetos y un proyecto Propeller se puede componer de mltiples objetos. La pantalla del visor de objetos muestra la vista jerrquica del proyecto que se compil con xito por ltima vez. Usando la vista del objeto, se puede determinar qu objetos se utilizan, cmo encajan con otros objetos, su localizacin fsica en disco (carpeta del trabajo, carpeta de biblioteca o editor), optimizacin de la redundancia (si hubiera) y cualquier potencial de colisin entre objetos.

2-3

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


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

www.microcontroladores.com info@microcontroladores.com

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

2-4

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

www.microcontroladores.com info@microcontroladores.com

botn respectivo con el ratn, 2) presionando Alt+Up o Alt+Down, 3) presionando Alt+<letra>; donde <letra> es la letra de acceso rpido de visin deseada, o 4) presionando Alt y moviendo la rueda del ratn para arriba o abajo. No se podr acceder a la vista de documentacin si el objeto no se puede compilar completamente en ese momento. Puesto que un proyecto puede consistir en muchos objetos, desarrollar un proyecto puede ser costoso a menos que se puedan ver el objeto en el que se est trabajando y el objeto sobre el que se est interactuando. El panel del editor ofrece ayuda permitiendo que cada editor pueda ser arrastrado y desplegado en distintas localizaciones. Por ejemplo, una vez que los objetos estn abiertos, se puede utilizar el botn izquierdo del ratn para seleccionar y para arrastrar la pestaa de un objeto hacia la mitad inferior del panel del editor y dejarlo all.

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.

2-5

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

www.microcontroladores.com info@microcontroladores.com

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.

2-6

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

www.microcontroladores.com info@microcontroladores.com

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.

2-7

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


2.3. COMPONENTES DEL MEN

www.microcontroladores.com info@microcontroladores.com

Men archivo New Open... Open From... Save Save As... Save To... Save All Close Close All Select Top Object File 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. Realiza la misma tarea que la anterior pero agrega la herramienta Propeller ejecutable al archivo comprimido. Muestra o esconde los paneles integrados del explorador (lado izquierdo de la ventana del editor). Muestra una vista preliminar de la salida antes de imprimir. Imprime el contenido actual de la pestaa. 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. Cierra la herramienta Propeller. Crea una nueva pestaa que contiene un editor vaci. Las pestaas existentes no se ven afectadas. Abre un archivo en un nuevo editor. Abre un archivo en un nuevo editor de la carpeta mas recientemente utilizada. Salva el contenido de la pestaa actual usando el nombre del archivo existente, si es aplicable. Salva el contenido de la pestaa actual con un nuevo nombre. Salva el contenido de la pestaa en disco en la carpeta mas recientemente utilizada usando el dialogo Save As Salva todo lo no guardado en disco usando sus nombres existentes, si son aplicables. Cierra la pestaa actual. Cierra todas las pestaas del editor. Selecciona el fichero objeto superior del proyecto actual.

Proyect + Propeller Tool...

Hide/Show Explorer Print Preview... Print... <recent files>

Exit

2-8

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


Men Edit Undo

www.microcontroladores.com info@microcontroladores.com

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. 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. Borra el texto seleccionado del editor actual y lo copia al portapapeles de Windows. Copia el texto seleccionado del editor al portapapeles de Windows. Pega el texto del portapapeles de Windows y lo pega en el editor actual en la posicin en la que se encuentre el cursor. Selecciona todo el texto del editor actual. Abre el dilogo de Buscar/Reemplazar (Find/Replace) Busca la siguiente ocurrencia de la ultima secuencia de caracteres introducida en el dialogo Find/Replace. Sustituye la seleccin actual por la secuencia de caracteres introducida en el campo del reemplazar (Replace) del dilogo de Find/Replace. Va al bookmark 1, 2, 3... (visible solamente cuando se muestran los bookmarks). I Incrementa el tamao de la fuente de todos los editores. Decrementa el tamao de la fuente de todos los editores. Abre la ventana de preferencias. Los usuarios pueden modificar los ajustes para requisitos particulares dentro de la herramienta Propeller usando esta caracterstica.

Redo

Cut Copy Paste Select All Find/Replace... Find Next Replace Go To Bookmark Text Bigger Text Smaller Preferences...

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. 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. Compila cdigo de fuente del editor actual y si es satisfactoria, descarga la aplicacin resultante en el RAM del chip Propeller y lo ejecuta.

Update Status

Load RAM +Run

2-9

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


Load EEPROM +Run Load EEPROM

www.microcontroladores.com info@microcontroladores.com

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. 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. Este men es igual que Compile Current, excepto que la compilacin comienza del archivo designado como el "fichero objeto superior" (Top Object File.)

Compile Top 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... Spin Languaje... Assembly Lenguaje... Example Projects... View Carcter Chart... Muestra la ayuda on-line sobre la herramienta Propeller. Muestra la ayuda on-line sobre el lenguaje Spin. Muestra la ayuda on-line sobre el lenguaje ensamblador del Propeller. Muestra la ayuda on-line que contiene proyectos del Propeller del ejemplo. 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). Abre el Web site de Parallax usando el navegador web por defecto de la computadora. Abre el software del email por defecto de la computadora y abre un nuevo mensaje dirigido al soporte Parallax. Muestra la ventana About que contiene los detalles de la herramienta Propeller.

View Parallax Website... E-mail Parallax Support... About...

2-10

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


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

www.microcontroladores.com info@microcontroladores.com

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.

2-11

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


Boton Replace

www.microcontroladores.com info@microcontroladores.com

Este botn se muestra activo nicamente si se ha introducido una secuencia de caracteres en el campo Replace y permite sustituir en contenido del ese por la secuencia del campo Find en el caso de que exista una coincidencia en el texto. Para sustituir se pueden utilizar tanto el botn Replace como la tecla F4. Despus de realizar una sustitucin es necesario pulsar el botn Find Next o F3 para poder realizar de nuevo un Replace. Si se mantiene presionada la tecla control (Ctrl) el botn Replace cambia a Find/Replace, que realiza las dos acciones, bsqueda y sustitucin, a la vez. Para esto tambin se puede utilizar la combinacin Ctrl+F4. Boton Replace All Este botn se muestra activo nicamente si se ha introducido una secuencia de caracteres en el campo Replace y permite sustituir todas las coincidencias encontradas en el texto. Al pulsar este botn, el dialogo se cierra y se muestra otro dialogo con el numero de ocurrencias encontradas y sustituidas. Boton Close Cierra el dilogo de Find/Replace. Vista de Objetos (Object View) El visor de objetos muestra una vista jerrquica del proyecto que se ms recientemente compil de forma satisfactoria. Hay dos vistas de objetos en la herramienta Propeller: 1) la vista de objetos en la parte superior del explorador integrado en la ventana de la aplicacin principal y la vista de informacin de objetos en la parte superior izquierda del formulario del Object Info (se detalla mas adelante). Ambas vistas de objetos funcionan de una manera similar. La vista de objetos proporciona un feedback visual de la estructura de ltima compilacin realizada con xito as como la informacin para cada objeto dentro del proyecto compilado.

Figure 2-8: Ejemplo del visor de Objetos mostrando la estructura de la compilacin del Producto ABC En la Figura 2-8 arriba, la vista del objeto indica la estructura de la aplicacin de producto ABC. En este ejemplo, el objeto del producto ABC es el fichero objeto superior. Los nombres de objeto que se muestran son los nombres reales de los archivos sin la extensin. El nombre incluye su extensin solamente si es un archivo de datos y este nombre se mostrara en cursiva. Los iconos a la izquierda de cada nombre de objeto indican la carpeta en la cual reside el objeto. A continuacin se muestran las cuatro posibilidades: (amarilla): El objeto est dentro de la carpeta del trabajo (azul): El objeto est dentro de la carpeta de la biblioteca (rayada): El objeto est en la carpeta del trabajo pero hay otro objeto con el mismo nombre que tambin se est utilizando de la carpeta de la biblioteca (hueca): El objeto no est en ninguna carpeta porque nunca no se ha salvado. Carpeta de trabajo La carpeta del trabajo (amarilla) es la carpeta donde existe el fichero objeto superior. Cada proyecto tiene una, y solamente una, carpeta del trabajo.

2-12

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


Carpeta Librera

www.microcontroladores.com info@microcontroladores.com

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.

2-13

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


Object Info

www.microcontroladores.com info@microcontroladores.com

La ventana del objeto Info muestra los detalles sobre el proyecto que se acaba de compilar con xito usando la funcin Current/Top View 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.

2-14

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


Vista Hex

www.microcontroladores.com info@microcontroladores.com

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.

2-15

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

www.microcontroladores.com info@microcontroladores.com

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

2-16

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


Orden Simblica La orden simblica muestra los caracteres dispuestos categricamente. Esto es til para encontrar los caracteres especiales en la fuente Parallax para representar lneas, flechas, y diagramas esquemticos. Figura 214

www.microcontroladores.com info@microcontroladores.com

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.

2-17

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

www.microcontroladores.com info@microcontroladores.com

No puedes encontrar una rutina en un objeto?

Paso 1: Selecciona el modo Resumen Paso2: Clicka la lnea de la rutina.

2-18

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

www.microcontroladores.com info@microcontroladores.com

Paso 3: Selecciona el modo de fuente completa otra vez; el cdigo se reampla alrededor de la lnea del cursor, -oDoble-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.

2-19

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


Nmeros de Lnea

www.microcontroladores.com info@microcontroladores.com

Puede resultar fcil recordar una regin de cdigo por su nmero de lnea. En cualquier momento, se pueden habilitar o deshabilitar los nmeros de lnea del editor. Las lneas se numeran automticamente mientras se crean; son slo un artculo visual y no se almacenan en el cdigo de fuente. Aunque los nmeros de lnea compartan espacio con los bookmarks, son independientes el uno del otro y se pueden habilitar o deshabilitar individualmente. Los nmeros de lnea pueden ser impresos, si se quiere.

Figura 2-17: Ejemplo de un editor con los bookmarks y los nmeros de lnea habilitados Modos Edit Hay tres modos proporcionados por el panel del editor: 1) insertar (defecto), 2) alinear (disponible para el cdigo de la vuelta solamente), y 3) sobrescribir. Se puede cambiar entre cada modo usando la tecla Insert. El modo actual se observa en la forma del cursor y en el tercer panel de la barra de estado. Figura 2-18: Modos Edit Modo Insertar.

Modo Alinear.

Modo Sobrescribir.

2-20

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


Modos Insertar y Sobrescribir (Insert y Overwrite)

www.microcontroladores.com info@microcontroladores.com

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.

2-21

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

www.microcontroladores.com info@microcontroladores.com

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: Insert Align Overwrite . 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.

2-22

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


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

www.microcontroladores.com info@microcontroladores.com

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

2-23

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

www.microcontroladores.com info@microcontroladores.com

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.

2-24

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

www.microcontroladores.com info@microcontroladores.com

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.

2-25

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


2.8 INDICADORES DE BLOQUE-GRUPO

www.microcontroladores.com info@microcontroladores.com

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 Alt + S completa Seleccionar el modo de visin Condensado Alt + C Seleccionar el modo de visin Resumen Alt + U Seleccionar el modo de visin Documentacin Alt + D Seleccionar modo de visin alterna Alt + Arriba Seleccionar modo de visin alterna Alt + Abajo -o- Alt + Rueda ratn abajo Seleccionar la edicin activa Esc Hardware F7 Compilar fichero actual y ver informacin F8 Compilar fichero actual y actualizar el estado F9 Compilar fichero actual , Cargar RAM y F10 ejecutar Compilar fichero actual, Cargar EEPROM y F11 ejecutar

2-26

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


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

www.microcontroladores.com info@microcontroladores.com

2-27

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


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

www.microcontroladores.com info@microcontroladores.com

Tabla 2-2: Teclas de acceso rpido Teclas o Ratn F2 F3 F4 F7 F8 F9 F10 F11 F12 Fin Esc Inicio Insert Av Pg Re Pg Tab Doble Click Triple Click Ctrl + Ctrl + A Ctrl + B Ctrl + C

Funcin Renombrar carpeta/fichero Buscar siguiente ; Find Next Reemplazar ; Replace Identificar Hardware Compilar fichero actual y ver informacin Compilar fichero actual y actualizar el estado Compilar fichero actual , Cargar RAM y ejecutar Compilar fichero actual, Cargar EEPROM y ejecutar Compilar fichero actual y Cargar EEPROM solo Saltar al final de lnea Seleccionar la vista de fuente completa Saltar al comienzo de lnea Cambiar el modo de edicin Saltar a la siguiente pagina Saltar a la pagina anterior Tabular Seleccionar una palabra Seleccionar una lnea Seleccionar todo Mostrar/Ocultar Bookmarks Copiar

2-28

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


Ctrl + E Ctrl + F Ctrl + I Ctrl + N Ctrl + O Ctrl + S Ctrl + P Ctrl + T Ctrl + V Ctrl + X Ctrl + Y Ctrl + Z Ctrl + F4 Ctrl + F8 Ctrl + F9 Ctrl + F10 Ctrl + F11 Ctrl + F12 Ctrl + Abajo Ctrl + Fin Ctrl + Inicio Ctrl + Insert Ctrl + Izda Ctrl + Av pg Ctrl + Rueda ratn abajo Ctrl + Rueda ratn arriba Alt + Alt + C Alt + D Alt + S Alt + Q Alt + U Alt + Abajo Alt + Izda Alt + Rueda ratn abajo Alt + Rueda ratn arriba Alt + Drcha Alt + Arriba Shift + Shift + Fin Shift + Inicio Shift + Av Pg Shift + Re Pg Shift + Tab Ctrl + Alt + Ctrl + Alt + . Ctrl + Alt + $ Ctrl + Alt + 1 Ctrl + Alt + S Ctrl + Alt + Abajo Ctrl + Alt + Izda Ctrl + Alt + Drcha

www.microcontroladores.com info@microcontroladores.com

Mostrar/Ocultar el explotador Buscar/ Remplazar ; Find / Replace Indicadores de la sangra de bloque Mostrar/Ocultar Numero de Lnea Abrir Guardar Imprimir Seleccionar el fichero raz Pegar Cortar Borrar lnea actual Deshacer Reemplazar y Buscar siguiente Compilar fichero raz y ver informacin Compilar fichero raz y actualizar el estado Compilar fichero raz, Cargar RAM y ejecutar Compilar fichero raz, Cargar EEPROM y ejecutar Compilar fichero raz y Cargar EEPROM solo Decrementar el tamao de fuente Saltar al final del archivo Saltar al comienzo de archivo Cambiar el modo de edicin entre Insert / Align Saltar hasta el comienzo de la siguiente palabra Saltar hasta fin de pgina Decrementar el tamao de fuente Incrementar el tamao de fuente Seleccionar el modo de visin Condensado Seleccionar el modo de visin Documentacin Seleccionar el modo de visin Fuente completa Cerrar Seleccionar el modo de visin Resumen Seleccionar el modo de visin alternos Seleccionar la pestaa del editor anterior Seleccionar el modo de visin alternos (desde Documentacin) Seleccionar el modo de visin alternos (desde fuente completa) Seleccionar la siquiente pestaa del editor Seleccionar el modo de visin alternos (desde fuente completa) Seleccionar hasta fin de lnea Seleccionar hasta principio de lnea Seleccionar hasta la siguiente pagina Seleccionar hasta la pagina anterior Borrar espacios hasta la tabulacin anterior Insertar un carcter de rectngulo ( ) Insertar un carcter Yen ( ) Insertar el carcter superndice de manos uno () Guardar todo Insertar carcter de flecha hacia abajo ( ) Insertar carcter de flecha hacia la izda ( ) Insertar carcter de flecha hacia la drcha ( )

2-29

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


Ctrl + Alt + Arriba Ctrl + Shift + Ctrl + Shift + $ Ctrl + Shift + % Ctrl + Shift + * Ctrl + Shift + Ctrl + Shift + . Ctrl + Shift + / Ctrl + Shift + = Ctrl + Shift + 1 Ctrl + Shift + 2 Ctrl + Shift + 3 Ctrl + Shift + B Ctrl + Shift + D Ctrl + Shift + I Ctrl + Shift + M Ctrl + Shift + O Ctrl + Shift + P Ctrl + Shift + R Ctrl + Shift + S Ctrl + Shift + Y Ctrl + Shift + Z Ctrl + Shift + Fin Ctrl + Shift + Inicio Ctrl + Shift + Izda Ctrl + Shift + Av Pg Ctrl + Shift + Re Pg Ctrl + Shift + Drcha Ctrl + Shift + Tab Ctrl + Shift + Alt Ctrl + Shift + Alt + $ Ctrl + Shift + Alt + < Ctrl + Shift + Alt + > Ctrl + Shift + Alt + Abajo Ctrl + Shift + Alt + Izda Ctrl + Shift + Alt + Drcha Ctrl + Shift + Alt + Arriba

www.microcontroladores.com info@microcontroladores.com

Insertar carcter de flecha hacia arriba ( ) Insertar carcter de Euro ( ) Insertar carcter de grado ( ) Insertar carcter de multiplicacin ( ) Insertar carcter de mas/menos( ) Insertar carcter ( ) Insertar carcter de divisin ( ) Insertar carcter de aproximacin ( ) Insertar carcter de superndice uno( ) Insertar carcter de superndice dos ( ) Insertar carcter de superndice tres ( ) Bookmark de la lnea actual Insertar carcter de Delta ( ) Insertar carcter de infinito ( ) Insertar carcter de Mu ( ) Insertar carcter de Omega ( ) Insertar carcter de Pi ( ) Insertar carcter de Radical ( ) Insertar carcter de Sigma ( ) Borrar hasta fin de lnea Rehacer Seleccionar hasta fin de archive Seleccionar hasta principio de archivo Seleccionar hasta la palabra anterior Seleccionar hasta fin de pagina Seleccionar hasta principio de pagina Seleccionar hasta siguiente palabra Seleccionar hasta siguiente tabulacin Insertar carcter Insertar carcter Insertar carcter Insertar carcter Insertar carcter Insertar carcter Insertar carcter () () () () () () ()

2-30

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

www.microcontroladores.com info@microcontroladores.com

CAPITULO 3: EL LENGUAJE SPIN


3.1. INTRODUCCIN Este captulo describe los elementos del lenguaje Spin del Propeller y se divide en dos secciones principales: 1) El listado por categoras de todos los elementos del lenguaje Spin del Propeller. Todos ellos, incluyendo operadores y smbolos de la sintaxis, estn agrupados por la funcin relacionada. Esto es una manera de localizar rpidamente la amplitud del lenguaje y qu caractersticas estn disponibles para las aplicaciones especficas. Algunos de los elementos mencionados estn marcados con un exponente a que indica que estn tambin disponibles en ensamblador del Propeller, aunque la sintaxis puede variar. 2) La descripcin de los elementos del lenguaje Spin. La mayora de los elementos tienen su propia subdivisin, dispuesta alfabticamente para facilitar su bsqueda. Los elementos individuales sin subdivisin, tales como operadores, smbolos y algunas constantes, se agrupan dentro de otras subdivisiones relacionadas. 3.2. LISTADO POR CATEGORAS DEL LENGUAJE SPIN DEL PROPELLER Los elementos marcados con un subndice a estn tambin disponibles en ensamblador del Propeller. Declaraciones de Bloque CON VAR OBJ PUB PRI DAT Configuracin CHIPVER CLKMODE _CLKMODEa CLKFREQ _CLKFREQa CLKSETa _XINFREQa _STACKa _FREEa RCFASTa RCSLOWa XINPUTa XTAL1a XTAL2a XTAL3a PLL1Xa PLL2Xa PLL4Xa PLL8Xa PLL16X Obtener el numero de versin del chip Propeller Obtener el modo de configuracin actual de reloj Modo de reloj definido por la aplicacin (solo lectura) Obtener el modo actual de frecuencia Frecuencia definido por la aplicacin (solo lectura) Poner el modo y frecuencia de reloj Frecuencia de reloj externo definido por la aplicacin (solo lectura) Espacio de pila reservado por la aplicacin (solo lectura) Espacio libre reservado por la aplicacin (solo lectura) Constante para _CLKMODE: oscilador rpido interno Constante para _CLKMODE: oscilador lento interno Constante para _CLKMODE: oscilador/reloj externo Constante para _CLKMODE: cristal externo de velocidad baja Constante para _CLKMODE: cristal externo de velocidad media Constante para _CLKMODE: cristal externo de velocidad alta Constante para _CLKMODE: valor de frecuencia externa 1 Constante para _CLKMODE: valor de frecuencia externa 2 Constante para _CLKMODE: valor de frecuencia externa 4 Constante para _CLKMODE: valor de frecuencia externa 8 Constante para _CLKMODE: valor de frecuencia externa 16 Declaracin de constantes Declaracin de variables Declaracin de referencias de objetos Declaracin de mtodos pblicos Declaracin de mtodos privados Declaracin de datos

3-1

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


Control de Cog COGIDa COGNEW COGINITa COGSTOPa REBOOT Control de Proceso LOCKNEWa LOCKRETa LOCKCLRa LOCKSETa WAITCNTa WAITPEQa WAITPNEa WAITVIDa Control de Flujo IF ELSEIF ELSE CASE OTHER REPEAT FROM TO STEP UNTIL WHILE NEXT QUIT RETURN ABORT Memoria BYTE WORD LONG BYTEFILL WORDFILL LONGFILL BYTEMOVE WORDMOVE LONGMOVE LOOKUP LOOKUPZ LOOKDOWN LOOKDOWNZ STRSIZE STRCOMP Ejecuta condicionalmente uno o ms bloques de cdigo Obtener el Id de Cog actual (0-7) Iniciar el siguiente Cog disponible Iniciar o reiniciar un cog por su Id Detener un cog por su Id Resetear el chip Propeller

www.microcontroladores.com info@microcontroladores.com

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

Evala una expresin y ejecuta el bloque de cdigo que satisface la condicin Ejecuta un bloque de cdigo repetidamente un numero de veces finito o infinito, opcionalmente con un contador, intervalos, condiciones de salida y continuidad

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

Declarar un smbolo de tamao byte o acceso byte de la memoria principal Declarar un smbolo de tamao word o acceso word de la memoria principal Declarar un smbolo de tamao long o acceso long de la memoria principal Rellena bytes de la memoria principal con un valor Rellena words de la memoria principal con un valor Rellena longs de la memoria principal con un valor Copia bytes de una regin a otra de la memoria principal Copia words de una regin a otra de la memoria principal Copia longs de una regin a otra de la memoria principal Recupera el valor de una posicin (1..N) de una lista Recupera el valor de una posicin de base cero (0..N-1) de una lista Recupera el ndice (1..N) del valor que coincida en una lista Recupera el ndice de base cero (0..N-1) del valor que coincida en una lista Recupera el tamao en bytes de un string Compara un string de bytes con otro string de bytes

3-2

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


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

www.microcontroladores.com info@microcontroladores.com

DIRAa Registro de Direcciones de 32-bits del puerto A DIRBa Registro de Direcciones de 32-bits del puerto B (uso futuro) INAa Registro de Entrada de 32-bits del puerto A INBa Registro de Entrada de 32-bits del puerto B (uso futuro) OUTAa Registro de Salida de 32-bits del puerto A OUTBa Registro de Salida de 32-bits del puerto B (uso futuro) CNTa Registro de Contador del Sistema de 32-bits CTRAa Contador A del Registro de Control CTRBa Contador B del Registro de Control FRQAa Contador A del Registro de Frecuencia FRQBa Contador B del Registro de Frecuencia PHSAa Contador A del Registro de PLL PHSBa Contador B del Registro de PLL VCFGa Registro de Configuracin de Video VSCLa Registro de Escala de Video PARa Registro de Parmetros de Arranque del Cog SPR Array de Registros de Propsito especial; acceso indirecto de registros cog Constantes TRUEa True (verdadero) lgico: -1 ($FFFFFFFF) FALSEa False (falso) lgico: 0 ($00000000) POSXa Valor entero mximo positivo: 2,147,483,647 ($7FFFFFFF) NEGXa Valor entero mximo negativo: -2,147,483,648 ($80000000) PIa Valor de punto flotante PI: ~3.141593 ($40490FDB)

Variables RESULT Operadores Unitarios + -++ ^^ || ~ ~~ ? |< >| ! 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 Variable por defecto para el resultado de mtodo PUB/PRI

3-3

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


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

www.microcontroladores.com info@microcontroladores.com

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

3-4

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


3.3. DESCRIPCIN DE LOS ELEMENTOS DEL LENGUAJE SPIN

www.microcontroladores.com info@microcontroladores.com

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 2_147_483_647 %1010 %11110000_10101100 $1AF $FFAF_126D_8755_1CE9 A Definiciones De Sintaxis Adems de descripciones detalladas, las siguientes pginas contienen las definiciones sintcticas para los elementos que describen las opciones de ese elemento. Las definiciones sintcticas utilizan smbolos especiales para indicar cuando y cmo deben ser utilizadas ciertas caractersticas del elemento. BOLDCAPS Bold Italics Los tem en mayscula en negrita se deben mecanografiados de esta misma forma. Los tem en negrita y cursiva deben ser sustituidos por el texto del usuario; smbolos, operadores, expresiones, etc.. | \ [] () la nmero decimal. nmero decimal con separadores en los millares. nmero binario. nmero binario con separadores en los bytes. nmero del hexadecimal. nmero hexadecimal con separadores en las words. Carcter.

. ... : , # Los puntos, los doble-puntos, los dos puntos, las comas, la almohadilla, raya vertical, la barra, los corchetes y parntesis deben ser mecanografiados de esta manera. <> Los corchetes angulosos contienen tem opcionales. (( | )) ...

El smbolo de dobles parntesis incluye los tem mutuo-exclusivos, separados por una barra. El smbolo de la repeticin indica que el tem anterior, o el grupo de tem, se puede repetir las numerosas veces. El smbolo de nueva lnea y de la tabulacin indica que los puntos siguientes deben aparecer en la lnea siguiente y tabulados por lo menos un espacio. El smbolo de la tabulacin indica que los puntos siguientes se deben tabular por lo menos un espacio.

3-5

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


Lnea nica: Lnea doble: 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. Separa varias opciones de la estructura del sintaxis. Separa la instruccin del valor que devuelve.

www.microcontroladores.com info@microcontroladores.com

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 o

Si se ha encontrado una mala condicin, Abortar

3-6

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


if < condicin mala > abort <valor >

www.microcontroladores.com info@microcontroladores.com

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 abort <value>

Llamada a MayAbort con abort trap 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 PUB Main | Direction Direction := None repeat case CheckSensors Left : Direction := Right Right : Direction := Left Front : Direction := Back Back : Direction := Front other : Direction := None if not \Move(Direction) Beep PUB Move(Direction) result := True if Direction == None return repeat 1000 DriveMotors(Direction) PUB DriveMotors(Direction) <code to drive motors> if MotorStuck abort False <more code>

Enumeracion de Direcciones

Recoger el sensor activo Objecto en izda? Ve a la drcha Objecto en drcha? Ve a la izda Objecto delante? Ve hacia atrs Objecto atras? Ve hacia delante Otro caso, mantente quieto Mueve robot Pitar

se entiende que va bien Retornar si no hay direccin Conducir motor 1000 veces

Si el motor esta bloqueado, abort

3-7

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

www.microcontroladores.com info@microcontroladores.com

El ejemplo anterior muestra tres mtodos de varios niveles lgicos, Main ("de alto nivel"), Move ("nivel medio") y DriveMotors ("bajo nivel"). El mtodo de alto nivel, Main, es el que toma las decisiones de la aplicacin ; decidiendo cmo responder a los acontecimientos como activaciones del sensor y movimientos del motor. El mtodo de nivel medio, Move, es responsable de mover el robot una distancia corta. El mtodo de bajo nivel, DriveMotors, maneja los detalles de conducir los motores correctamente y de verificar que es correcto. En una aplicacin como esta, los acontecimientos crticos podran ocurrir en el cdigo de bajo nivel que necesitaran ser tratados por cdigo de alto nivel. El mtodo principal recoge entradas del sensor y decide a qu direccin mover el robot con la declaracin de CASE. Entonces llama a Move de una manera especial, precedindola con \. El mtodo Move fija su RESULT a verdadero y despus llama a DriveMotors en un bucle finito. Si termina con xito, Move devuelve verdadero. El mtodo de DriveMotors maneja la complicacin de mover los motores del robot para alcanzar la direccin deseada, pero si determina estn boqueados y no puede moverlos; aborta con un valor falso. Si no retorna normalmente. 3.3.2. BYTE Declaracin de smbolos o datos tamao-byte, o lectura / escritura de bytes en memoria principal. BYTE Symbol <[Count]> BYTE Data BYTE [BaseAddress] <[Offset]> 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 byte Str[25]

'Temp es un byte 'Str es un array de byte

El ejemplo anterior declara dos variables, Temp y Str. Temp es simplemente una variable de tamao byte. La lnea siguiente utiliza el campo de Count opcional para crear un array de 25 elementos variables llamado Str. Temp y str se pueden alcanzar desde cualquier mtodo PUB o PRI dentro del mismo objeto que este bloque del VAR. Un ejemplo: PUB SomeMethod

3-8

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


Temp := 250 Str[0] := "A" Str[1] := "B" Str[24] := "C" Fija Temp a 250 Fija el primer elemento de Str a "A" Fija el segundo elemento de Str a "B" Fija el ultimo elemento de Str a "C"

www.microcontroladores.com info@microcontroladores.com

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 MyString

byte byte

64, $AA, 55 "Hello",0

datos de tamao y alineacin byte 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] <do something with Temp> Index := 0 repeat Temp := BYTE[MyString][Index++] <do something with Temp> while Temp > 0

Lee el primer byte de MyData a Temp Realiza una tarea con Temp

Lee un dato string a Temp, un carcter por vez Realiza una tarea con caracter en Temp 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.

3-9

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


3.3.3. BYTEFILL Rellena la memoria principal con un valor.

www.microcontroladores.com info@microcontroladores.com

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.

3-10

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


3.3.5. CASE

www.microcontroladores.com info@microcontroladores.com

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 10 : !outa[0] A*2 : !outa[1] 30..40 : !outa[2] X += 5

Testea X+Y X = 10? Activar P0 X = A*2? Activar P1 X en 30 a 40? Activar P2 Suma 5 a X

Puesto que las lneas de MatchExpression estn tabuladas de la lnea de CASE, pertenecen a la estructura del CASE y se ejecutan basadas en los resultados de la comparacin de CaseExpression. La lnea siguiente, X + = 5, no est tabulada de CASE, as que se ejecuta sin importar los resultados del CASE. Este ejemplo compara el valor de X + Y con 10, A*2 y el rango 30 a 40. Si X + Y es igual a 10, se activa P0. Si X + Y es igual a A*2, se activa P1. Si X + Y est en el rango 30 a 40, inclusivo, entonces P2 se activa. Si o no ningn fsforo fue encontrado, X + = la lnea 5 se ejecuta despus.

3-11

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

www.microcontroladores.com info@microcontroladores.com

Uso de OTHER El componente opcional OTHER del CASE es similar al componente OTHER opcional de la estructura IF. Por ejemplo: case X+Y 10 : !outa[0] 25 : !outa[1] 20..30 : !outa[2] OTHER : !outa[3] X += 5 'Testea X+Y 'X = 10? Activar P0 'X = 25? Activar P1 'X en 20 a 30? Activar P2 Si no, Activar P3 Suma 5 a X

Este ejemplo es similar el anterior excepto que se el tercer MatchStatement comprueba el rango 20 a 30 y hay un componente OTHER. Si X + Y no es igual a 10, ni 25, ni est en el rango 20 a 30, el bloque OTHER de Statement(s) siguiente se ejecuta. Siguiendo eso, se ejecuta la lnea X + = 5. Hay un concepto importante a observar sobre este ejemplo. Si X + Y es 10, se activa P0, o si X + Y es 25, se activa P1, o si X + Y es 20 a 30, P2, etc. Esto es porque el MatchExpressions se comprueba uno por vez, en el orden en el que se enumeran y solamente se ejecuta el cdigo de la primera expresin que se iguale esta. No se comprueban el resto de expresiones. Esto significa que si hubiramos cambiado las lneas 25 y 20..30, para comprobar el rango de 20..30 primero, habra un fallo en nuestro cdigo. Se hizo esto abajo:

case X+Y 10 : !outa[0] 20..30: !outa[2] 25 : !outa[1]

Testea X+Y X = 10? Activar P0 X en 20 a 30? Activar P2 X = 25? Activar P1 <-- ESTE CODIGO NO SE EJECUTARA NUNCA

El ejemplo anterior contiene un error porque, mientras que X + Y podra ser igual a 25, esa expresin nunca sera probada desde la anterior, porque se probara 20..30 primero, y puesto que es verdad, se ejecutara su bloque y no se aria ninguna comprobacin posterior. Variaciones en Statement(s) Los ejemplos anteriores solo usan una lnea como bloque de Statement(s), pero cada bloque puede tener varias lneas. Adems, el bloque de Statement(s) puede tambin aparecer abajo, y tabulado levemente MatchExpression. Los dos ejemplos siguientes demuestran estas variaciones. case A 4 Z+1 : : !outa[0] !outa[1] !outa[2] !outa[3] Testea A A = 4? Activar P0 A = Z+1? Activar P1 Y Activar P2 A en 10 a 15? Activar P3

10..15:

case A 4: !outa[0] Z+1: !outa[1] !outa[2] 10..15: !outa[3]

Testea A A = 4? Activar P0 A = Z+1? Activar P1 Y Activar P2 A en 10 a 15? Activar P3

3-12

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


3.3.6. CHIPVER Recoge el nmero de versin del chip del Propeller. CHIPVER Devuelve: El numero de versin del chip Propeller.

www.microcontroladores.com info@microcontroladores.com

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.

3-13

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


3.3.8. _CLKFREQ

www.microcontroladores.com info@microcontroladores.com

Constante predefinida, ajustable una sola vez para especificar la frecuencia de reloj del sistema. CON _CLKFREQ = Expression Expression es una expresin del nmero entero que indica la frecuencia de reloj del sistema en el arranque de la aplicacin.

Explicacin _CLKFREQ especifica la frecuencia de reloj del sistema para el arranque. Es un smbolo constante predefinido cuyo valor es determinado por el fichero objeto superior de una aplicacin. _CLKFREQ se puede ajustar directamente por la misma aplicacin, o indirectamente como resultado de los ajustes de _CLKMODE y _XINFREQ. El fichero objeto superior en una aplicacin (donde empieza la compilacin) puede especificar un ajuste para _CLKFREQ en su bloque CON. Esto define la frecuencia de reloj inicial del sistema para la aplicacin y es la frecuencia a la cual el reloj del sistema cambiar tan pronto como la aplicacin arranque y la ejecucin comience. La aplicacin puede especificar tanto _CLKFREQ como _XINFREQ en el bloque CON; son mutuamente exclusivos y el no especificado se calcula y se fija automticamente como resultado de la otra especificacin. Los siguientes ejemplos asumen que estn contenidos dentro del fichero objeto superior. Cualquier ajuste de _CLKFREQ en objetos hijo son simplemente ignorados por el compilador. Por ejemplo: CON _CLKMODE = XTAL1 + PLL8X _CLKFREQ = 32_000_000 La primera declaracin en el bloque CON anterior, fija el modo de reloj para un cristal externo de poca velocidad y un PLL del reloj mltiplo de 8. La segunda declaracin fija la frecuencia de reloj del sistema a 32 Mhz, que significa que la frecuencia del cristal externo debe ser 4 Mhz, porque 4 Mhz * 8 = 32 Mhz. El valor de _XINFREQ se fija automticamente a 4 Mhz debido a estas declaraciones. CON _CLKMODE = XTAL2 _CLKFREQ = 10_000_000 Estas dos declaraciones fijaron el modo de reloj para un cristal externo de velocidad media, ningn multiplicador del reloj PLL, y una frecuencia de reloj del sistema de 10 Mhz. El valor de _XINFREQ se fija automticamente a 10 Mhz, tambin, debido a estas declaraciones. _ CLKFREQ Vs CLKFREQ _CLKFREQ est relacionado con CLKFREQ, pero no iguales. _CLKFREQ contiene la frecuencia de reloj del sistema de la aplicacin en el arranque mientras que CLKFREQ es un comando que devuelve la frecuencia de reloj actual del sistema. Es decir, _CLKFREQ es la frecuencia de reloj original del sistema y CLKFREQ es la frecuencia de reloj actual del sistema; ambos pueden tener el mismo valor pero ciertamente pueden ser diferentes.

3-14

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


3.3.9. CLKMODE Recoge el modo actual del reloj.

www.microcontroladores.com info@microcontroladores.com

CLKMODE Devuelve: Modo actual del reloj.

Explicacin El ajuste del modo de reloj es un valor de tamao byte, fijado normalmente en tiempo en compilacin, que es una combinacin de las constantes de RCxxxx, de XINPUT, de XTALx y de PLLxx. Por ejemplo: Mode: = clkmode Esta declaracin se puede utilizar para fijar una variable, Mode, al ajuste actual del modo de reloj. Muchas aplicaciones mantienen un ajuste esttico del modo de reloj; sin embargo, algunas aplicaciones cambian el modo de reloj y lo fijan durante el tiempo de ejecucin para ajustes de la velocidad de reloj, los modos de baja potencia, el etc. Puede ser necesario que algunos objetos presten la atencin a los modos de reloj dinmicos para mantener la sincronizacin y la funcionalidad apropiadas. CLKMODE vs _CLKMODE CLKMODE est relacionado con _CLKMODE, pero no son iguales. CLKMODE es un comando que devuelve el modo de reloj actual mientras que _CLKMODE es una constante definida por la aplicacin que contiene el modo de reloj solicitado por la aplicacin en el arranque. Es decir, CLKMODE es el modo de reloj actual y _CLKMODE es el modo de reloj original; ambos pueden suceder tener el mismo valor pero ciertamente pueden ser diferentes. 3.3.10. _CLKMODE Constante predefinida, ajustable una sola vez para especificar ajustes del modo de reloj a nivel de aplicacin. CON _CLKMODE = Expression Expression es una expresin de nmero entero cuyo resultado es un valor 8-bit del modo reloj. ste ser el modo de reloj en el arranque de la aplicacin.

Explicacin _CLKMODE se utiliza para especificar la naturaleza deseada del reloj del sistema. Es un smbolo constante predefinido cuyo valor es determinado por el fichero objeto superior de una aplicacin. El ajuste del modo de reloj es un valor de tamao byte que es una combinacin de las constantes de RCxxxx, de XINPUT, de XTALx y de PLLxx. La tabla 4-1 ilustra el modo de reloj que fija constantes.

3-15

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

www.microcontroladores.com info@microcontroladores.com

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

3-16

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

www.microcontroladores.com info@microcontroladores.com

Esto fija el modo de reloj para un cristal externo de poca velocidad pero con las hojas del reloj PLL inhabilitadas; el reloj del sistema ser igual a la frecuencia del cristal externo. Los ajustes de _CLKFREQ y _XINFREQ Para la simplicidad, los ejemplos de arriba solamente muestran ajustes de _CLKMODE, pero se requieren tanto ajustes de _CLKFREQ como de _XINFREQ para continuar, de modo que los objetos puedan determinar su frecuencia de reloj actual del sistema. Lo siguiente es el segundo ejemplo con una frecuencia de cristal externa (_ XINFREQ) de 4 Mhz. CON _CLKMODE = XTAL1 + PLL8X _XINFREQ = 4_000_000

cristal de baja velocidad x 8 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.

3-17

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


3.3.12. CNT Registro Contador del Sistema. CNT Devuelve: El valor actual de 32-bits del Contador del Sistema.

www.microcontroladores.com info@microcontroladores.com

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]~~ OneMS := clkfreq / 1000 TimeBase := cnt repeat waitcnt(TimeBase += OneMS) !outa[0]

Fija P0 como salida Calcula ciclos para 1 milisegundo Recoge el contador actual bucle infinito Espera al comienzo del siguiente milisegundo 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).

3-18

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

www.microcontroladores.com info@microcontroladores.com

Explicacin El valor devuelto por COGID es el identificador del Cog que ejecut el comando. Normalmente, el cdigo del Cog actual que se est ejecutando no importa, sin embargo, para algunos objetos puede que sea importante no perderlo de vista. Por ejemplo: PUB StopMyself Detiene el cog que se est ejecutando cogstop(cogid) El mtodo del ejemplo, StopMyself, tiene una lnea de cdigo que llama simplemente COGSTOP con COGID como parmetro. Como COGID devuelve la identificacin del Cog en ejecucin, esta rutina causa que el Cog se detenga. 3.3.14. COGINIT Arranca o reanuda un cog por su ID para ejecutar el cdigo Spin o el cdigo ensamblador del Propeller. COGINIT (CogID, SpinMethod <(ParameterList)>, StackPointer ) COGINIT (CogID, AsmAddress, Parameter ) 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)

3-19

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

www.microcontroladores.com info@microcontroladores.com

Este ejemplo lanza la rutina del ensamblador del Propeller, Update, en el Cog 2 con la direccin de Pos en PAR del Cog 2. 3.3.15. COGNEW Arranca el siguiente Cog disponible para ejecutar el cdigo Spin o cdigo ensamblador del Propeller. COGNEW (SpinMethod <(ParameterList)>, StackPointer ) COGNEW (AsmAddress, Parameter ) Devuelve: El ID del nuevamente arrancado Cog (0-7) si es correcto, o -1 si es falso. SpinMethod es el mtodo Spin de PUB o PRI que debe ejecutar el nuevo Cog. Opcionalmente, puede seguirle una lista de parmetros incluida entre parntesis. ParameterList es una lista opcional, de unos o varios parmetros limitados por comas para SpinMethod. Debe ser incluido solamente si SpinMethod requiere parmetros. StackPointer es un indicador de memoria, como un array de longs, reservado para el espacio en pila del Cog afectado. El Cog afectado utiliza este espacio para almacenar datos temporales durante futuras llamadas y evaluaciones de expresiones. Si se asigna poco espacio, la aplicacin no podr ejecutarse o se ejecutar con extraos resultados. AsmAddress es la direccin de una rutina del ensamblador Propeller de un bloque de DAT. Parameter se utiliza para pasar opcionalmente un valor al Cog nuevo. Este valor termina en el registro de solo lectura (PAR) del cog. Parameter se puede utilizar para pasar un valor de 14-bit o la direccin de un bloque de memoria que se utilizar por la rutina del ensamblador . Parameter es requerido por COGINIT, pero si se necesita para su rutina simplemente se fija a un valor inofensivo como cero (0).

Explicacin COGNEW arranca un Cog nuevo y ejecuta un mtodo Spin o una rutina de ensamblador del Propeller. Si es correcto, COGNEW devuelve el ID del Cog arrancado. Si no haba Cogs disponibles, COGNEW devuelve -1. Cdigo Spin (Sintaxis 1) Para ejecutar un mtodo Spin en otro Cog, el comando COGNEW necesita el nombre del mtodo, sus parmetros, y un puntero a un espacio de pila. Por ejemplo: VAR long SqStack[6] PUB Main | X X := 2 cognew(Square(@X), @SqStack) <check X here> PUB Square(XAddr) Cuadrado del valor en XAddr repeat long[XAddr] *= long[XAddr] waitcnt(2_000_000 + cnt)

Espacio de pila para Square cog

Inicializa X Lanza Square en cog Bucle y chequea X

Repite lo siguiente de forma infinita Cuadrado del valor y lo reasigna 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

3-20

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

www.microcontroladores.com info@microcontroladores.com

variable X. El segundo parmetro de COGNEW, @SqStack, es la direccin del espacio de pila reservado para el nuevo Cog. Cuando un Cog se arranca para ejecutar cdigo Spin, necesita un cierto espacio donde pueda almacenar datos temporales tales como pila de llamadas, parmetros de pila y la expresin resultante intermedia. Este ejemplo requiere solamente 6 longs de espacio de pila para operacin apropiada. Despus de que se ejecute el comando de COGNEW, se estn ejecutando dos Cogs; el primero todava est ejecutando el mtodo principal y el segundo est comenzando a ejecutar el mtodo Square. A pesar del hecho de que estn utilizando cdigo del mismo objeto Spin, se estn ejecutando independientemente. La lnea <check X here> se puede sustituir por cdigo que utiliza el valor de X de alguna manera. Cdigo Ensamblador del Propeller (Sintaxis 2) Para ejecutar cdigo ensamblador del Propeller en otro Cog, el comando de COGNEW necesita la direccin de la rutina del ensamblador y un valor que se pueden utilizar opcionalmente por la rutina del ensamblador . Por ejemplo:

VAR byte Cog

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

3-21

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

www.microcontroladores.com info@microcontroladores.com

Es importante observar que el campo Parameter est pensado para pasar una direccin larga, y solamente 14-bits (bits de 2 a 15) se pasan en el registro PAR del Cog. 3.3.16. COGSTOP Detiene un cog por su ID. COGSTOP (CogID ) CogID es el ID (0 7) del cog a detener. Explicacin COGSTOP detiene un Cog cuya ID sea CogID y pone ese Cog en un estado inactivo. En el estado inactivo, el Cog deja de recibir pulsos del reloj del sistema para reducir notablemente el consumo de energa. Para detener un Cog, hay que utilizar el comando COGSTOP con el ID del Cog a parar. Por ejemplo:

VAR byte Cog

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.

3-22

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

www.microcontroladores.com info@microcontroladores.com

El bloque Constante es un rea de cdigo usada especficamente para asignar smbolos (nombres tiles) a las constantes, para poder utilizar los smbolos en cualquier parte del cdigo donde sea necesario usar ese valor constante. Esto hace que el cdigo sea ms legible y ms fcil mantener, si ms adelante hubiese que cambiar el valor de una constante a la que se haga referencia en varios lugares. Estas constantes son globales al objeto, de modo que cualquier mtodo dentro de l puede utilizarlas. Hay muchas maneras de definir las constantes, que se describen abajo. Declaraciones Comunes de Constantes (Sintaxis 1) Las formas ms comunes de declaracin de constantes comienzan con CON en una lnea, seguida por una o ms declaraciones. CON debe comenzar en la columna 1 (la columna extrema izquierda) de la lnea actual y las lneas siguientes se deben tabular por lo menos un espacio. Las expresiones pueden ser combinaciones de nmeros, operadores, parntesis, y caracteres acotados. Ejemplo: CON Delay = 500 Baud = 9600 Achar = A -oCON Delay = 500, Baud = 9600, AChar = A Ambos ejemplos crean un smbolo llamado Delay que es igual a 500, un smbolo llamado Baud que es igual a 9600, y un smbolo llamado AChar que es igual al carcter "A". Para la declaracin Delay, por ejemplo, se podra tambin haber utilizado una expresin algebraica, por ejemplo: Delay = 250 * 2 La declaracin anterior da como resultado un valor igual a 500, como antes, pero la expresin puede hacer que el cdigo sea ms fcil de entender. El bloque CON tambin se utiliza para especificar ajustes globales, como ajustes del reloj del sistema. El ejemplo de abajo se muestra cmo fijar el modo de reloj a cristal de poca velocidad, al reloj PLL a 8x, y especificar que el pin frecuencia de XIN es 4 Mhz. CON _CLKMODE = XTAL1 + PLL8X _XINFREQ = 4_000_000

Los valores de punto flotante tambin se pueden definir como constantes. Los valores de punto flotante son nmeros reales (con los componentes fraccionarios) y estn codificados en 32-bits. Para especificar una constante de punto flotante, se debe especificar que el valor es un valor de punto flotante; la expresin debe ser un valor de punto flotante o estar compuesto enteramente de valores de punto flotante (ningn nmero entero). Los valores de punto flotante se deben escribir de la siguiente forma: 1) dgitos decimales seguidos por un punto decimal y por un dgito decimal ms por lo menos, 2) dgitos decimales seguidos por "e" (para el exponente) y un valor entero del exponente, o, 3) una combinacin de 1 y 2. Los siguientes son ejemplos de constantes vlidas: 0.5 valor de punto flotante 1.0 valor de punto flotante

3-23

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


3.14 1e16 51.025e5 3+4 3.0 + 4.0 3.0 + 4 3.0 + FLOAT(4) valor de punto flotante valor de punto flotante valor de punto flotante expresin entera expresin de punto flotante expresin invalida; causa error de compilacin expresin de punto flotante

www.microcontroladores.com info@microcontroladores.com

A continuaron se muestra un ejemplo que declara una constante entera y dos constantes de punto flotante. CON Num1 = 20 Num2 = 127.38 Num3 = 32.05 * 18.1 - Num2 / float(Num1) El cdigo anterior fija Num1, Num2 y Num3 a 20, a 127.38 y a 573.736, respectivamente. Hay que tener en cuenta que la expresin anterior de Num1 tiene que ser incluida en la declaracin FLOAT de modo que el compilador lo trate como valor de punto flotante. El compilador del Propeller maneja constantes de punto flotante como nmeros reales de simple precisin segn lo descrito por el estndar IEEE-754. Enumeraciones (Sintaxis 2 y 3) Los bloques constantes pueden tambin declarar smbolos constantes enumerados. Las enumeraciones son smbolos agrupados lgicamente que tienen asignado un valor entero incremental nico para el grupo. Por ejemplo, un objeto puede tener la necesidad de ciertos modos de operacin. Cada uno de estos modos se puede identificar por un nmero, un 0, un 1, 2 y 3, por ejemplo. Los nmeros por si mismos no son importantes para nuestro propsito; solo necesitan ser nicos dentro del contexto del modo de operacin. Por ejemplo: CON Declara los modos de operacin RunTest = 0 RunVerbose = 1 RunBrief = 2 RunFull = 3 El ejemplo anterior sera suficiente para nuestro propsito; porque los usuarios de este objeto pueden indicar "RunFull" en vez de "3" para especificar el modo de operacin deseado. El problema esta en que, definir un grupo lgico de tems de esta manera puede causar fallos y problemas de mantenimiento porque si se altera algn valor (a propsito o por accidente) sin cambiar el resto por consiguiente, puede causar fallos en el programa. Tambin, se puede imaginar un caso en el que haya 20 modos de operacin. se sera un sistema mucho ms largo de constantes y de ms posibilidades de incidencias en el mantenimiento. Las enumeraciones solucionan este problema automticamente incrementando el valor para los smbolos. Podemos rescribir el ejemplo anterior con sintaxis de enumeracin: CON Declara los modos de operacin #0, RunTest, RunVerbose, RunBrief, RunFull Aqu, # 0, dice a compilador que comience a contar desde el nmero 0 y que fije el smbolo siguiente a ese valor. Entonces, cualquier smbolo adicional que no especifique su propio valor se asigna automticamente el valor anterior ms 1. El resultado es que RunTest es igual a 0, RunVerbose es igual a 1, RunBrief es igual a 2 y RunFull es igual a 3. Definir valores enumerados de esta manera tiene las ventajas de asegurar que los valores asignados sean nicos y contiguos dentro del grupo. Usando el ejemplo anterior, los mtodos que los utilizan pueden hacer cosas como la siguiente (se asume que Mode es un smbolo fijado por un objeto llamador):

3-24

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


case Mode RunTest : <test code here> RunVerbose : <verbose code here> RunBrief : <brief code here> RunFull : <full code here> -oif Mode > RunVerbose <brief and run mode code here>

www.microcontroladores.com info@microcontroladores.com

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.

3-25

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


3.3.18. CONSTANT

www.microcontroladores.com info@microcontroladores.com

Declara expresiones constantes en lnea para ser totalmente resueltas en tiempo de compilacin. CONSTANT (ConstantExpression ) Devuelve: El valor resuelto de la expresin constante. ConstantExpression es la expresin constante deseada.

Explicacin El bloque CON se puede utilizar para crear constantes de expresiones que se referencian desde mltiples lugares en el cdigo, pero hay ocasiones en las que una expresin constante se necesita con propsitos temporales. Sin el uso de la directiva CONSTANT, las expresiones en lnea de un mtodo se resuelven en el tiempo de ejecucin, incluso si la expresin es un valor constante. Uso de CONSTANT La directiva CONSTANT puede crear expresiones constantes de un solo uso que guardan espacio de cdigo y aumentan la velocidad de ejecucin en tiempo de ejecucin. Se muestran dos ejemplos abajo: Ejemplo 1, usando expresiones estndares en tiempo de ejecucin: CON X = 500 Y = 2500 PUB Blink !outa[0] waitcnt(X+200 + cnt) !outa[0] waitcnt((X+Y)/2 + cnt)

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

Uso de expresin en tiempo de ejecucin

Uso de expresin en tiempo de ejecucin

Los dos ejemplos anteriores hacen exactamente lo mismo: su mtodo Blink activa P0, espera X+200 ciclos, activa de nuevo P0 y espera (X+Y)/2 ciclos antes de volver. Mientras que los smbolos de X y de Y del bloque CON pueden que necesiten usarse en mltiples lugares dentro del objeto, las expresiones de WAITCNT usadas en el mtodo Blink solamente deberan necesitarse en ese lugar. Por esta razn, no tiene sentido definir constantes adicionales en el bloque CON para cosas como X+200 y (X+Y)/2. La directiva CONSTANT es perfecta para esta situacin, porque resuelve cada expresin constante de un solo uso a un valor nico, esttico, guardando espacio de cdigo y velocidad de ejecucin. En el ejemplo 1, el mtodo Blink consume 33 bytes de espacio de cdigo mientras que mtodo Blink del ejemplo 2, con la adicin de la directiva CONSTANT, slo requiere 23 bytes de espacio. Hay que observar que la porcin de las expresiones de "+ cnt" no

3-26

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

www.microcontroladores.com info@microcontroladores.com

est incluida dentro del parntesis de la directiva CONSTANT; esto es porque cnt es una variable (variable del contador del sistema; vear CNT) as que su valor no puede resolverse en tiempo de compilacin. Si una constante necesita utilizarse en ms de un lugar del cdigo, es mejor definirlo en el bloque CON, definindola solamente una vez y el smbolo que la representa se puede utilizarse mltiples veces. Constantes (pre-definidas) Las siguientes constantes estn predefinidas por el compilador: TRUE FALSE POSX NEGX PI RCFAST RCSLOW XINPUT XTAL1 XTAL2 XTAL3 PLL1X PLL2X PLL4X PLL8X PLL16X Verdadero lgico: -1 ($FFFFFFFF) Falso lgico: 0 ($00000000) Entero positivo mximo: 2,147,483,647 ($7FFFFFFF) Entero negativo mximo: -2,147,483,648 ($80000000) Valor Float para PI: ~3.141593 ($40490FDB) Oscilador interno rpido: $00000001 (%00000000001) Oscilador interno lento: $00000002 (%00000000010) Reloj/Oscilador externo: $00000004 (%00000000100) Cristal externo de baja velocidad: $00000008 (%00000001000) Cristal externo de media velocidad: $00000010 (%00000010000) Cristal externo de alta velocidad: $00000020 (%00000100000) Frecuencia externa 1: $00000040 (%00001000000) Frecuencia externa 2: $00000080 (%00010000000) Frecuencia externa 4: $00000100 (%00100000000) Frecuencia externa 8: $00000200 (%01000000000) Frecuencia externa 16: $00000400 (%10000000000)

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

3-27

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


3.3.19. CTRA, CTRB Registros de Control Contador A y Contador B CTRA CTRB

www.microcontroladores.com info@microcontroladores.com

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.

3-28

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

www.microcontroladores.com info@microcontroladores.com

BPIN El campo de BPIN de CTRx selecciona un pin secundario de E/S para ese contador. Este campo puede ser ignorado si no se utiliza. %0xxxxx = puerto A, %1xxxxx = puerto B (reservado para uso futuro). En ensamblador del Propeller, el campo BPIN se puede escribir usando la instruccin MOVD. PLLDIV El campo de PLLDIV de CTRx selecciona una salida para PLLx. Esto determina qu energa de las dos divisiones de la frecuencia del VCO se utilizara como la salida final de PLLx (un rango de 500 KHz a 128 Mhz). Este campo puede ser ignorado si no se utiliza. En ensamblador del Propeller, el campo de PLLDIV se puede escribir, junto con CTRMODE, usando la instruccin MOVI.

CTRMODE El campo de CTRMODE de CTRA y de CTRB selecciona uno de los 32 modos de funcionamiento para el contador correspondiente A o B. En ensamblador del Propeller, el campo de CTRMODE se puede escribir, junto con PLLDIV, usando la instruccin MOVI. Los modos de %00001 a %00011 causan FRQx-a-PHSx, una acumulacin que se da cada ciclo de reloj. Esto crea un oscilador controlado numricamente (NCO) en PHSx[31], que alimenta la entrada de referencia del PLLx. El PLLx multiplicar esta frecuencia por 16 usando el controlado de voltaje del oscilador (VCO). Para operaciones estables, se recomienda que la frecuencia de VCO est entre 64 Mhz y 128 Mhz. Esto se traduce a una frecuencia NCO de 4 Mhz a 8 Mhz. Uso de CTRA and CTRB En Spin, CTRx puede ser leido/escrito como cualquier otro registro o variable predefinida. En cuanto se escribe en este registro, el nuevo modo de funcionamiento entra en efecto para el contador. Por ejemplo: CTRA := %00100 << 26 El cdigo anterior fija el campo CTRA de CTRMODE al modo NCO (%00100) y al resto de bits a cero.

3-29

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

www.microcontroladores.com info@microcontroladores.com

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

3-30

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


www.microcontroladores.com info@microcontroladores.com

Operand(s) es/son uno o dos operandos separados por comas en lenguaje ensamblador, "# valor", "x, # 8", etc. Effect(s) es/son uno, dos o tres efectos en lenguaje ensamblador, que causan que el resultado de la instruccin sea escrito o no, NR, WR, WC, o WZ.

Explicacin Un bloque de datos es una seccin de cdigo fuente que contiene datos predefinidos, memoria reservada para el uso en tiempo de ejecucin y el cdigo ensamblador del Propeller. sta es una de las seis declaraciones especiales (CON, VAR, OBJ, PUB, PRI, y DAT) que proporcionan la estructura inherente al lenguaje Spin. Los bloques de datos son secciones multiusos de cdigo fuente, que se utilizan para las tablas de datos, el espacio de trabajo en tiempo de ejecucin, y cdigo ensamblador del Propeller. El cdigo y los datos de ensamblador se pueden entremezclar, en caso de necesidad, para cargar datos en un Cog junto con el cdigo ensamblador . Declaring Data (Sintaxis 1) Los datos se declaran con una alineacin y un tamao especficos (BYTE, WORD, o LONG) para indicar cmo deben almacenarse en memoria. La localizacin en la que estn actualmente almacenados los datos depende de la estructura del objeto y de la aplicacin en la que se compila, si los datos estn incluidos como parte del cdigo compilado. Por ejemplo: DAT byte 64, A, String, 0 word $FFC2, 75000 long $44332211, 32 Lo primero que hay en la lnea dos de este ejemplo, BYTE, indica que los datos que la siguen, deben ser de tamao y alineacin byte. En tiempo de compilacin, los datos BYTE, 64, "A", etc., se almacenan en memoria de programa en el siguiente byte disponible. La lnea tres especifica datos de tamao y alineacin word. Sus datos, $FFC2 y 75000, comenzarn en la siguiente posicin al lmite de word. La cuarta lnea especifica datos long. La tabla 4-5 muestra lo que contendra la memoria (mostrada en hexadecimal).

Los primeros nueve bytes (0 - 8) son los datos del byte de la lnea uno; $40 = 64 (decimal), $41 = "A", $53 = "S", etc. El byte 9 se rellena con ceros para alinear la primera palabra de datos word, $FFC2, en el byte 10. Los Bytes 10 y 11 (word 5) contienen el primer valor de tamao word, $FFC2, almacenado en el formato byte-bajo-primero como $C2 y $FF. Los Bytes 12 y 13 (word 6) toman el valor de la palabra ms baja de 75000; que se comentara mas adelante. Los Bytes 14 y 15 (word 7) se rellena a ceros para alinear el primer long de datos, $44332211. Los Bytes 16 a 19 (long 5) contienen ese valor en el formato byte-bajo-primero. Finalmente, los bytes 20 a 23 (long 6) contiene el segundo long de datos, 32, en el formato byte-bajo-primero. Se puede notar que el valor 75000 fue especificado como word. El nmero 75000 en hexadecimal es $124F8, pero como es mayor que un word, slo se almaceno el valor del word mas bajo ($24F8). Esto da lugar al word 6 (bytes 12 y 13) que contiene $F8 y $24, y word 7 (bytes 14 y 15) que contiene $00 y $00 debido al relleno para los valores long siguientes.

3-31

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


Este fenmeno, intencionado o no , ocurre tambin para los datos byte, por ejemplo: DAT Byte

www.microcontroladores.com info@microcontroladores.com

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

Este ejemplo contiene smbolos opcionales, "loop" y ":arg", un condicional, "IF_Z", el campo de la instruccin, ORG, RDLONG, etc, seguidos por operandos y una declaracin, "wz." 3.3.21. DIRA, DIRB Registro de Direcciones para los puertos A y B de 32 bits. DIRA <[Pin(s)]> DIRB <[Pin(s)]>(Reservado para uso futuro)

3-32

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

www.microcontroladores.com info@microcontroladores.com

Devuelve: Valor actual de los bits de direccin de E/S de Pin(s) en los puertos A o B, si est utilizado como variable fuente. Pin(s) es una expresin opcional, o una expresin de rango, que especifica el pin ,o pins, de E/S para acceder al puerto A (0-31) o al puerto B (32-63). Si se da una expresin nica, solamente se tendr acceso al pin especificado. Si se da una expresin de tipo rango (dos expresiones en un formato rango; x..y) se tendr acceso a los pins contiguos desde el comienzo de la expresin hasta el fin. Explicacin DIRA y DIRB son uno de los seis registros (DIRA, DIRB, INA, INB, OUTA y OUTB) que afectan directamente los pins de E/S. El registro DIRA contiene los estados de la direccin de cada uno de los 32 pins de E/S en el puerto A; los bits 0 a 31 corresponden de P0 a P31. El registro de DIRB contiene los estados de la direccin de cada uno de los 32 pins de E/S en el puerto B; los bits 0 a 31 corresponden de P32 a P63. NOTA: DIRB est reservado para el uso futuro; el Propeller P8X32A no incluye los pins de E/S del puerto B. DIRA se utiliza para fijar y recoger los estados de la direccin actual de uno o ms pins de E/S en el puerto A. Un bit bajo (0) fija el pin correspondiente de E/S a una direccin de entrada. Un bit alto (1) fija el pin correspondiente de E/S a una direccin de salida. El registro de DIRA es cero por defecto, en el arranque del Cog; todos los pins de E/S estn fijados como entradas por ese Cog hasta que el cdigo diga lo contrario. Cada Cog tiene acceso a todos los pins de E/S en cualquier momento. Esencialmente, todos los pins de E/S estn conectados directamente con cada Cog. Esta configuracin se puede describir con las siguientes reglas: A. Un pin es una entrada slo de Cogs no activos fijados a salida. B. Un pin es una salida si cualquier Cog activo lo fija a salida.

Uso de DIRA Fija a uno o a cero los bits en DIRA para afectar a la direccin de los pins de E/S segn lo deseado. Por ejemplo: DIRA := %00000000_00000000_10110000_11110011 El cdigo anterior fija el registro completo de DIRA (los 32-bits de una vez) a un valor que hace los pins de E/S 15, 13, 12, 7, 6, 5, 4, 1 y 0 a salidas y al resto a entradas. Usando los operadores unitarios post-clear (~) y post-set (~~), el Cog puede fijar todos los pins de E/S a entradas, o a salidas, respectivamente; aunque generalmente no es deseable fijar todos los pins de E/S a salidas. Por ejemplo: DIRA~ --y-DIRA~~ Fija a 0 el registro DIRA (todas las E/S son entradas) 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:

3-33

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


DIRA[5..3] := %110 Fija P5 y P4 a salida y P3 a entrada

www.microcontroladores.com info@microcontroladores.com

El ejemplo anterior fija los bits 5, 4 y 3 de DIRA a 1, 1, y 0, respectivamente, dejando el resto de los bits en su estado anterior. Por lo tanto, P5 y P4 ahora son salidas y P3 es una entrada.

Normalmente DIRA se escribe pero tambin se puede leer para recuperar el pin de direcciones de E/S actual. El ejemplo siguiente asume que Temp es una variable creada en otra parte:

Temp := DIRA[7..4]

Recoge la direccin de P7 a P4

Lo anterior fija Temp a los bits 7, 6, 5, y 4 de DIRA; es decir: los 4 bits ms bajos de Temp son iguales ahora DIRA7:4 y los otros bits de Temp se aclararon a cero. 3.3.22. FILE Importa un fichero externo como datos. FILE FileName FileName es el nombre, sin la extensin, del fichero de datos. FileName puede contener cualquier carcter vlido de fichero; los caracteres no permitidos son \, /,:, *?, ", y |.

Explicacin El directorio FILE se utiliza para importar un fichero de datos externo (generalmente un archivo binario) en el bloque de DAT de un objeto. De esta manera los datos se pueden alcanzar por el objeto, como cualquier dato normal del bloque de DAT. Uso de FILE FILE se utiliza en los bloques de DAT de manera similar a como se usan BYTE, WORD o LONG excepto que lo que sigue es un nombre de fichero en vez de valores de los datos. Por ejemplo: DAT Str byte Data file

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

3-34

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


3.3.23. FLOAT Convierta una expresin entera a un valor de punto flotante en tiempo de compilacin. FLOAT (IntegerConstant)

www.microcontroladores.com info@microcontroladores.com

Devuelve: El valor resuelto de la expresin de la constante entera como nmero de punto flotante. IntegerConstant es la expresin deseada de la constante entera que se utilizar como valor constante de punto flotante.

Explicacin El FLOAT es una de las tres directivas (FLOAT, ROUND and TRUNC) usadas para las expresiones constantes de punto flotante. La directiva FLOAT convierte un valor constante entero a un valor constante de punto flotante. Uso de FLOAT Mientras que la mayora de las constantes son valores enteros de 32-bits, el compilador del Propeller soporta valores de 32-bits de punto flotante y expresiones constantes para el uso en tiempo de compilacin. Hay que tener en cuenta que esto es nicamente para expresiones constantes, no para expresiones variables en tiempo de ejecucin. Para declaraciones constantes de punto flotante, la expresin se debe mostrar como valor de punto flotante en una de estas tres maneras siguientes: 1) como nmero entero seguido por un punto y por lo menos un dgito, 2) como nmero entero con una E seguido por un valor del exponente, o 3) 1 y 2. Por ejemplo: CON OneHalf = 0.5 Ratio = Miles = 10e5

2.0 / 5.0

El cdigo anterior crea tres constantes de punto flotante. OneHalf es igual a 0.5, el Ratio es igual a 0.4 y Miles es igual a 1.000.000. Se aprecia que en el ejemplo anterior, cada componente de cada expresin est mostrado como un valor de punto flotante. Ahora se muestra el ejemplo siguiente: CON Two Ratio

= =

2 Two / 5.0

Aqu, Two se define como una constante entera y Ratio aparece definida como constante de punto flotante. Esto causa un error en la lnea Ratio porque, para las expresiones constantes de punto flotante, cada valor dentro de la expresin debe ser un valor de punto flotante; no se puede mezclar valores de nmero entero y de punto flotante como en Ratio = 2/5.0. Se puede, sin embargo, utilizar la directiva FLOAT para convertir un valor de nmero entero a un valor de punto flotante, por ejemplo en el siguiente: CON Two = 2 Ratio = float(Two) / 5.0 La directiva FLOAT en este ejemplo convierte la constante entera, Two, en la forma de punto flotante de ese valor para poderlo utilizarlo en la expresin de punto flotante. Sobre el Punto Flotante El compilador del Propeller maneja constantes de punto flotante como nmeros reales de simple precisin segn lo descrito por el estndar IEEE-754.

3-35

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


3.3.24. _FREE

www.microcontroladores.com info@microcontroladores.com

Constante predefinida, ajustable una sola vez para especificar el tamao del espacio libre de una aplicacin. CON _FREE = Expression Expression es un nmero entero que indica que el nmero de longs a reservar para el espacio libre. Explicacin _FREE es una constante opcional predefinida, ajustable una sola vez que especifica la memoria libre requerida de una aplicacin. Este valor se agrega a _STACK, si est especificado, para determinar la cantidad total de memoria de free/stack a reservar para una aplicacin Propeller. Se utiliza _FREE si una aplicacin requiere una cantidad mnima de memoria libre para ejecutarse correctamente. Si la aplicacin compilada resultante es demasiado grande para permitir la memoria libre especificada, se mostrara un mensaje de error. Por ejemplo: CON _FREE = 1000 La declaracin de _FREE en el bloque CON anterior indica que la aplicacin necesita tener por lo menos 1.000 longs de memoria libre despus de la compilacin. 3.3.25. FRQA, FRQB Contador A y B del Registro de Frecuencia. FRQA FRQB Devuelve: Valor actual del contador A o del contador B del registro de frecuencia, si est utilizado como variable de fuente. Explicacin FRQA y FRQB son dos de los seis registros (CTRA, CTRB, FRQA, FRQB, PHSA, y PHSB) que afectan el comportamiento de los mdulos del Contador de un Cog. Cada Cog tiene dos mdulos Contador idnticos (A y B) que puede realizar muchas tareas repetitivas. El registro de FRQA contiene el valor que se acumula en el registro de PHSA. El registro de FRQB contiene el valor que se acumula en el registro de PHSB. Uso de FRQA and FRQB FRQA y FRQB pueden ser leidos/escritos como cualquier otro registro o variable predefinida. Por ejemplo: FRQA := $00001AFF El cdigo anterior fija FRQA a $00001AFF. Dependiendo del campo de CTRMODE del registro de CTRA, este valor en FRQA se puede sumar en el registro de PHSA en una frecuencia determinada por el reloj del sistema y los pins primarios y/o secundarios de E/S. 3.3.26. IF Comprueba una o varias condiciones y ejecuta un bloque de cdigo en el aso de que sean verdadero. IF Condition(s) IfStatement(s) <ELSEIF Condition(s) ElseIfStatement(s) > <ELSE

3-36

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


ElseStatement(s) >

www.microcontroladores.com info@microcontroladores.com

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 !outa[0] !outa[1] Si X es mayor que 10 Activa P0 Activa P1

Este ejemplo comprueba si X es mayor que 10; si es as, se activa el pin 0 de E/S. Sea o no verdadera la condicin IF, el pin P1 de E/S se activara despus. Como la lnea !outa[0] est tabulada desde la lnea IF, pertenece al bloque de IfStatement(s) y ejecutada solamente si la condicin IF es verdadera. La lnea siguiente, !outa[1 ], no est tabulada desde la lnea IF, as que esta se ejecuta despus Condition(s) sea o no verdad. Aqu hay otra versin del mismo ejemplo: if X > 10 !outa[0] !outa[1] waitcnt(2_000 + cnt) Si X es mayor que 10 Activa P0 Activa P1 Espera a 2,000 ciclos

Este ejemplo es muy similar al primero, excepto que ahora haya dos lneas de cdigo tabuladas de declaracin IF. En este caso, si X es mayor que 10, se activa P0 entonces se activa P1 y finalmente se ejecuta la lnea del waitcnt. Si, por el contrario, X no era mayor que 10, se saltaran las lneas de !outa[0] y !outa[1] (puesto que estn tabuladas y son parte del bloque de IfStatement(s)) y se ejecuta la lnea de waitcnt (puesto que no est tabulada; no es parte del bloque de IfStatement(s)).

3-37

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

www.microcontroladores.com info@microcontroladores.com

Combinando Condiciones El campo Condition(s) se evala como una sola condicin boleana, pero se puede componer de ms de una expresin boleana combinando con los operadores AND y OR. Por ejemplo: if X > 10 AND X < 100 Si X es mayor que 10 y menor que 100 Esta declaracin del IF sera verdadera si, y solo si, X es mayor que 10 y X es tambin menor que 100. Es decir, X es verdadero si est en el rango de 11 a 99. Para hacer ms fcil leer este tipo de condiciones, se pueden utilizar parntesis para agrupar cada subcondicin, por ejemplo como el siguiente. if (X > 10) AND (X < 100) 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 !outa[0] else !outa[1] Si X es mayor que 100 Activa P0 Si no, X <= 100 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 !outa[0] elseif X == 90 !outa[1] Si X es mayor que 100 Activa P0 Si no, si X = 90 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 !outa[0] else if X == 90 !outa[1] Si X es mayor que 100 Activa P0 Si no, Si X = 90 Activa P1

Ambos ejemplos realizan las mismas acciones, pero el primero es ms corto y generalmente se considera ms fcil leer. if X > 100 !outa[0] elseif X == 90 !outa[1] elseif X > 50 !outa[2] Si X es mayor que 100 Activa P0 Si no, si X = 90 Activa P1 Si no, si X > 50 Activa P2

3-38

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

www.microcontroladores.com info@microcontroladores.com

En este ejemplo, tenemos tres condiciones y tres acciones posibles. Como el ejemplo anterior, si X es mayor que 100, se activa P0, si no, si X es igual a 90, se activa P1, pero si no se cumplen ninguna de las condiciones y X es mayor que 50, se activa P2. Si no se cumple ninguna condicin, no se ejecuta ninguna accin. Hay un concepto importante a observar sobre este ejemplo. Si X es 101 o superior, se activa P0, si X es 90, se activa P1, y si X es de 51 a 89, o 91 a 100, P2. Esto es porque las condiciones del IF y de ELSEIF se comprueban de forma secuencial y solo se ejecuta el cdigo de la primera condicin que resulte verdadera. Esto significa que si hubiramos cambiado de orden los dos ELSEIFs, de modo que se comprobase primero "X > 50", tendramos un fallo en nuestro cdigo. Por ejemplo: if X > 100 !outa[0] elseif X > 50 !outa[2] elseif X == 90 !outa[1]

Si X es mayor que 100 Activa P0 Si no, si X > 50 Activa P2 Si no, si X = 90 <-- ERROR DE COND. 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 !outa[0] elseif X == 90 !outa[1] elseif X > 50 !outa[2] else !outa[3] 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. Si X es mayor que 100 Activa P0 Si no, si X = 90 Activa P1 Si no, si X > 50 Activa P2 Si no, Activa P3

Explicacin INA e INB son uno de los seis registros (DIRA, DIRB, INA, INB, OUTA y OUTB) que afectan directamente los pins de E/S. El registro INA contiene los estados actuales de cada uno de los 32 pins de E/S en el puerto A; los bits 0 a 31 corresponden de P0 a P31. El registro de DIRB contiene los estados actuales de cada uno de los 32 pins de E/S en el puerto B; los bits 0 a 31 corresponden de P32 a P63. NOTA: INB est reservado para el uso futuro; el Propeller P8X32A no incluye los pins de E/S del puerto B.

3-39

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

www.microcontroladores.com info@microcontroladores.com

INA es de solo-lectura y no est realmente implementado como un registro es mas como una direccin que, lee los pins del puerto A E/S en el momento en el que es accedida. El resultado puede mostrar, un bit bajo (0) que indica que el pin correspondiente E/S est a tierra, y un bit alto (1) que indica que el pin correspondiente de E/S est a VDD (3.3 voltios). Cada Cog tiene acceso a todos los pins de E/S en cualquier momento. Esencialmente, todos los pins de E/S estn conectados directamente con cada Cog. Debido a la naturaleza "wired-OR" de los pins de E/S, no hay contencin elctrica entre los Cogs, y se puede tener acceso a los pins de E/S simultneamente. Es funcin del desarrollador de la aplicacin asegurarse de que ningunos de los Cogs causan contencin lgica en el mismo pin de E/S durante el tiempo de ejecucin. Uso de INA Lee INA para conseguir el estado de los pins de E/S en ese momento. El ejemplo siguiente asume que Temp fue creado en otra parte.

Temp := INA

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

3-40

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

www.microcontroladores.com info@microcontroladores.com

LOCKCLR es uno de los cuatro comandos del semforo (LOCKNEW, LOCKRET, LOCKSET, y LOCKCLR) usados para manejar los recursos que son definidos por el usuario y de uso mutuo-exclusivo. LOCKCLR fija a falso el semforo de identificador ID semforo y recupera el estado anterior de ese semforo (verdadero o falso). Lo siguiente asume que un Cog (ste u otro) ya ha comprobado un semforo usando LOCKNEW y ha compartido ya el ID con este Cog, que se guarda como SemID. Tambin asume que este Cog tiene un array de longs llamado LocalData. PUB ReadResource | Idx repeat until not lockset(SemID) repeat Idx from 0 to 9 LocalData[Idx] := long[Idx] lockclr(SemID) PUB WriteResource | Idx repeat until not lockset(SemID) repeat Idx from 0 to 9 long[Idx] := LocalData[Idx] lockclr(SemID)

espera hasta que bloqueemos el recurso leer todos los longs (10) del array desbloquea el recurso

espera hasta que bloqueemos el recurso escribe todos los longs (10) del array al recurso 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).

3-41

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

www.microcontroladores.com info@microcontroladores.com

Los semforos sirven como flags que notifican a cada Cog cundo un bloque de memoria es seguro para manipular o no. Uso de LOCKNEW Un recurso definido por el usuario, mutuo-exclusivo se debe instalar inicialmente por un Cog, entonces ese mismo Cog debe comprobar un semforo nico en el que manejar ese recurso, utilizando LOCKNEW y pasar la identificacin de ese semforo a cualquier otro Cog que la requiera. Por ejemplo: VAR byte SemID PUB SetupSharedResource <cdigo para instalar recursos definidos por el usuario, recursos compartidos> if (SemID := locknew) == -1 <error, no hay semforos disponibles> else <comparte el valor de SemID con otros cogs> El ejemplo llama a LOCKNEW y almacena el resultado en SemID. Si ese resultado es -1, es que ha ocurrido un error. Si SemID no es -1, es que se ha chequeado un semforo valido y ese SemID necesita ser compartido con otros Cogs junto con la direccin del recurso que SemID est utilizado. El mtodo usado para comunicar la direccin de SemID y del recurso depende de la aplicacin, pero normalmente se pasan como parmetros al mtodo Spin que se lanza en un Cog, o como el parmetro PAR al lanzar una rutina de ensamblador en un Cog. Sugerencia de reglas para semforos Lo siguiente son reglas sugeridas para el uso de semforos. Los objetos que necesitan un semforo para manejar un recurso definido por el usuario, mutuo-exclusivo deben comprobar un semforo usando LOCKNEW y guardar la identificacin de retorno, la llamamos aqu SemID. Solamente un Cog debe comprobar este semforo. El Cog que comprob el semforo debe comunicar SemID a el resto de los Cogs que utilicen el recurso. Cualquier Cog que necesite tener acceso al recurso debe primero fijar con xito el semforo SemID. Se fija con xito cuando LOCKSET(SemID) devuelve falso. Si LOCKSET devuelve verdadero, entonces otro Cog debe tener acceso al recurso; por lo que se debe esperar e intentar otra vez ms adelante conseguir fijarlo con xito. El Cog que ha conseguido fijar un semforo con xito puede manipular el recurso como sea necesario. Cuando haya finalizado, debe despejar el semforo con LOCKCLR(SemID) para que otro Cog pueda tener acceso al recurso. Si un recurso ya no es necesario, o llega a ser no-exclusivo, el semforo asociado se debe volver al pool de semforos con LOCKRET(SemID). Normalmente esto lo el mismo Cog que comprueba originalmente el semforo. Las aplicaciones deben ser escritas para que los semforos no se accedan con LOCKSET o LOCKCLR a menos que sea para una comprobacin. 3.3.30. LOCKRET Libera el semforo al pool de semforos, hacindolo disponible otra vez para futuras peticiones LOCKNEW.

LOCKRET ( ID ) 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:

3-42

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


LOCKRET(2)

www.microcontroladores.com info@microcontroladores.com

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) repeat Idx from 0 to 9 LocalData[Idx] := long[Idx] lockclr(SemID) PUB WriteResource | Idx repeat until not lockset(SemID) repeat Idx from 0 to 9 long[Idx] := LocalData[Idx] lockclr(SemID)

espera hasta que bloqueemos el recurso leer todos los longs (10) del array desbloquea el recurso

espera hasta que bloqueemos el recurso escribe todos los longs (10) del array al recurso 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-43

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


3.3.32. LONG

www.microcontroladores.com info@microcontroladores.com

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 long List[25]

'Temp es un long 'Str es un array de long

El ejemplo anterior declara dos variables, Temp y Str. Temp es simplemente una variable de tamao long. La lnea siguiente utiliza el campo de Count opcional para crear un array de 25 elementos variables llamado List. Temp y List se pueden alcanzar desde cualquier mtodo PUB o PRI dentro del mismo objeto que este bloque del VAR. Un ejemplo: PUB SomeMethod Temp := 25_000_000 Str[0] := 500_000 Str[1] := 9_000 Str[24] := 60

Fija Temp a 250,000,000 Fija el primer elemento a 500,000 Fija el segundo elemento a 9,000 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.

3-44

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

www.microcontroladores.com info@microcontroladores.com

Cuando se accede un byte cada vez, MyList contiene $44, $55, $99, $FF, 232 y 768, 0 y 0 puesto que los datos se almacenan en formato little-endian. Estos datos se compilan en el objeto y en la aplicacin resultante como parte de la seccin ejecutable de cdigo y se pueden alcanzar usando la forma de lectura / escritura, sintaxis 3, del LONG (ver abajo). Lectura / escritura de Longs en memoria principal (Sintaxis 3) En bloques PUB y PRI, la sintaxis 3 del LONG se utiliza para leer o para escribir valores long en memoria principal. Si se asume que el objeto contiene el bloque DAT del ejemplo de arriba, se poda utilizar el siguiente ejemplo para tener acceso a esos datos. PUB GetData | Index, Temp Temp := LONG[MyData] <do something with Temp> repeat Index from 0 to 1 Temp := LONG[MyList][Index] <do something with Temp>

Lee el primer byte de MyData a Temp 'Realiza una tarea con Temp Repite dos veces Lee los datos a Temp, un long por vez '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

3-45

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

www.microcontroladores.com info@microcontroladores.com

La primera lnea del mtodo principal, arriba, fija el array entero Buff de 100-longs a ceros. LONGFILL es ms rpido en esta tarea que es un bucle dedicado de la REPEAT. 3.3.34. LONGMOVE Copia longs de una regin a otra en memoria principal. LONGMOVE (DestAddress, SrcAddress, Count ) DestAddress es una expresin que especifica la localizacin destino en memoria principal para copiar el primer long. SrcAddress es una expresin que especifica la localizacin en memoria principal del primer long fuente para copiar. Count es una expresin que indica el nmero de longs fuente para copiar al destino.

Explicacin LONGMOVE es uno de tres comandos (BYTEMOVE, WORDMOVE, y LONGMOVE) usados para copiar bloques de memoria principal a partir de una rea a otra. LONGMOVE copia Count longs de memoria principal que empiezan con SrcAddress a la memoria principal que comienza en DestAddress.

Uso de LONGMOVE LONGMOVE es una gran manera de copiar grandes bloques de memoria long. Por ejemplo: VAR long Buff1[100] long Buff2[100] PUB Main longmove(@Buff2, @Buff1, 100) '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.

3-46

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

www.microcontroladores.com info@microcontroladores.com

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

3-47

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


repeat Index from 1 to 7 Temp := lookup(Index, 25, 300, 2_510, 163, 17, 8_000, 3) Print(Temp)

www.microcontroladores.com info@microcontroladores.com

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

El cdigo anterior limpia iterativamene las localizaciones RAM y muestra el valor de X por pantalla, pero con una excepcin. Si X es igual a 4, la declaracin IF ejecuta el comando NEXT Esto tiene el efecto de limpiar (fijar a 0) las localizaciones de la RAM de $7000 a $7003 y de $7005 a $7009 y de mostrar 0, 1, 2, 3, 5, 6, 7, 8, 9 por pantalla. El comando NEXT se puede utilizar solamente dentro de un bucle REPEAT; si no, ocurrira un error. 3.3.38. OBJ Declara un Bloque Objeto. OBJ Symbol <[Count]>: ObjectName < Symbol <[Count]>: ObjectName> 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.

3-48

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

www.microcontroladores.com info@microcontroladores.com

ObjectName es el nombre de fichero, sin la extensin, del objeto deseado. El nombre del objeto puede contener cualquier carcter vlido de fichero; los caracteres no permitidos son \, /,:, *?, ", y |.

Explicacin El bloque del objeto es una seccin del cdigo fuente que declara qu objetos se utilizan y los smbolos del objeto que los representan. sta es un de las seis declaraciones especiales (CON, VAR, OBJ, PUB, PRI, y DAT) que proporcionan la estructura inherente al lenguaje Spin. Las declaraciones del objeto comienzan con OBJ en una lnea seguida por una o ms declaraciones. OBJ debe comenzar en la columna 1 (la columna extrema izquierda) de la lnea en la que se encuentra y las lneas siguientes se deben tabular por lo menos un espacio. OBJ Num : Numbers Term : TV_Terminal Este ejemplo define Num como smbolo de objeto de tipo "Numbers" y Term como smbolo de objeto de tipo "TV_Terminal". Los mtodos pblicos y privados pueden entonces referirse a estos objetos usando los smbolos del objeto como en el ejemplo siguiente. PUB Print | S S := Num.ToStr(LongVal, Num#DEC) Term.Str(@S) Este mtodo pblico, Print, llama al mtodo de ToStr de Numbers y tambin al mtodo Str de TV_Terminal. Esto se hace usando los smbolos de Num y de Term del objeto seguido por la referencia del mtodo del Objeto (un punto .') y finalmente el nombre del mtodo a llamar. Num.ToStr, por ejemplo, llama al mtodo pblico de ToStr del objeto Numbers. Term.Str llama al mtodo pblico Str de TV_Terminal. En este caso el Num.ToStr tiene dos parmetros, entre parntesis, y Term.Str tiene un parmetro. El segundo parmetro de la llamada de Num.ToStr es Num#DEC. El smbolo # es el smbolo de referencia del Objeto-Constante; da acceso a las constantes de un objeto. En este caso, Num#DEC se refiere a la constante DEC (formato decimal) en el objeto Numbers. Las instancias mltiples de un objeto se pueden declarar con el mismo smbolo de objeto usando la sintaxis del array y pueden accedidos de manera similar al del array. Por ejemplo: OBJ PWM[2] : PWM PUB GenPWM PWM[0].Start PWM[1].Stara Este ejemplo declara PWM como un array de dos objetos (dos casos del mismo objeto). Al mismo objeto tambin se le ha llamado "PWM". El mtodo pblico, GenPWM, llama al mtodo Start de cada caso usando los ndices 0 y 1 con el smbolo de objeto del array, PWM. Ambas instancias del objeto PWM se compilan en la aplicacin como una copia de su cdigo de programa (PUBs, PRIs, y DATs) y dos copias de sus bloques variables (VARs). Esto es porque, para cada instancia, el cdigo es igual pero puede variar el espacio para operar independiente de la otra.

3-49

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

www.microcontroladores.com info@microcontroladores.com

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

3-50

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

www.microcontroladores.com info@microcontroladores.com

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

3-51

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


^^Total raz cuadrada de Total Los operadores binarios son los que funcionan en dos operandos. Por ejemplo: X+Y Num << 4 suma X e Y desplaza Num a la derecha 4 bits

www.microcontroladores.com info@microcontroladores.com

Hay que observar que el trmino "operador binario" significa "dos operandos," y no tiene nada que ver con los dgitos binarios. Para distinguir a los operadores cuya funcin se relaciona con los dgitos binarios, utilizaremos el trmino "bitwise" o de tipo bit. Normal / Asignacin Los operadores normales, como Suma ` + ' y desplazamiento a la izquierda <<', operan proporcionan el resultado para el uso del resto de expresiones, sin afectar al operando o operadores de asignacin, sin embargo, escriben su resultado en a la variable sobre la sobre la variable a su izquierda (binaria), adems de proporcionar el resultado para expresiones. A continuacin se muestra un ejemplo de operadores: Count++ Data >>= 3 (Unitario) evala Count + 1 y escribe el resultado a Count (Binario) desplaza Data 3 bits a la derecha y escribe el resultado en Data

sobre sus operandos y operandos mismos. Los que operan (unitario), o el uso por el resto de

Los operadores binarios tienen formas especiales que terminan en igual ` = ' que los hace operadores de asignacin. Los operadores unitarios no tienen forma especial de asignacin; algunos asignan siempre mientras que otros asignan solamente en situaciones especiales. Expresiones Constantes y/o Variables Los operadores que tienen atributos de expresiones enteras constantes pueden ser utilizados en tiempo de ejecucin en expresiones variables, y en de tiempo de compilacin en expresiones constantes. Los operadores que tienen atributos de expresiones de punto flotante constante pueden ser utilizados en expresiones constantes en tiempo de compilacin. Los operadores sin atributos de expresiones constantes pueden ser utilizados solamente en tiempo de ejecucin en expresiones variables. La mayora de los operadores tienen una forma normal, de no asignacin, que permite que se utilicen en expresiones constantes y variables. Nivel de Precedencia Cada operador tiene un nivel asignado de precedencia que se determina cuando tomar accin en relacin a otros operadores dentro de la misma expresin. Por ejemplo, se sabe comnmente que las reglas algebraicas toman la multiplicacin y la divisin como operaciones de mayor nivel de precedencia que las operaciones de suma y resta. Adems, la multiplicacin y la divisin son conmutables; ambos estn en el mismo nivel de precedencia, as que sus operaciones dan como resultado el mismo valor sin importar el orden en que se realizan. Los operadores conmutativos siempre se avalan de izquierda a derecha a menos que haya un parntesis que elimine esa regla. El chip del Propeller aplica las reglas de orden de operaciones igual que en lgebra. Despus de estas reglas, el Propeller evaluar: X = 20 + 8 * 4 6 / 2 ... que dar como resultado 49; es decir, 8 * 4 = 32, 6/2 = 3, y 20 + 32 - 3 = 49. Si se quiere que la expresin se evale de manera diferente, basta con utilizar parntesis para establecer un nivel superior de preferencia. Por ejemplo: X = (20 + 8) * 4 6 / 2 Este ejemplo, evaluar primero la expresin entre parntesis, 20 + 8, haciendo que ahora esta expresin de cmo resultado 109, en vez de 49.

3-52

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

www.microcontroladores.com info@microcontroladores.com

Los operadores con una precedencia ms alta se procesan antes que operadores de una precedencia ms baja. La nica excepcin es cuando se incluyen parntesis; que eliminan cada nivel de precedencia. Asignacin Intermedia El motor de expresiones del chip Propeller permite, y procesa, operadores de asignacin en etapas intermedias. Esto se llaman "asignaciones intermedias" y se pueden utilizar para realizar clculos complejos en menos cdigo. Por ejemplo, la ecuacin siguiente depende de X, y X + 1. X := X - 3 * (X + 1) / ||(X + 1) La misma declaracin se poda rescribir, aprovechndose de la caracterstica de la asignacin intermedia del operador del incremento: X := X++ - 3 * X / ||X Asumiendo que X comienza en -5, ambas declaraciones dan como resultado -2, y ambas almacenan ese valor en X cuando acaban. La segunda declaracin, sin embargo, lo hace dependiendo de una asignacin intermedia (la parte de X++) para simplificar el resto de la declaracin. El del operador del incremento ++ ' se evala en primer lugar (precedencia ms alta) y lo incrementa X de -5 a -4. Puesto que esto es un " post incremento " primero devuelve el valor original del X, -5, a la expresin y entonces escribe el nuevo valor, -4, en X. De esta forma: 5 3 * -4 / ||-4 . -5 3 * -4 / 4 . -5 3 * -1 . -5 -3 = -2 De vez en cuando, el uso de asignaciones intermedias puede comprimir mltiples lneas de expresiones en una sola expresin, dando por resultado un tamao de cdigo levemente ms pequeo y una ejecucin ms rpida. Asignacin Constante = El operador de asignacin constante se usa dentro de bloques CON para declarar constantes en tiempo de compilacin. Por ejemplo, CON _xinfreq = 4096000 WakeUp = %00110000 Este cdigo fija el smbolo _xinfreq a 4.096.000 y el smbolo wakeUp a %00110000. Durante el resto del programa el compilador utilizar estos nmeros en lugar de sus respectivos smbolos. Estas declaraciones son expresiones constantes, y pueden ser utilizadas por operadores normales para calcular un valor constante final en tiempo de compilacin. Por ejemplo, puede estar ms claro rescribir el ejemplo anterior como sigue: CON _xinfreq Reset Initialize WakeUp

= 4096000 = %00100000 = %00010000 = Reset & Initialize

Aqu, wakeUp todava est fijado a %00110000 en tiempo de compilacin, pero es obvio que el smbolo del wakeUp contiene los cdigos binarios Reset y Initialize para esa aplicacin particular. Los ejemplos anteriores crean constantes de entero con signo de 32-bits; aunque, tambin es posible crear constantes de 32-bits de punto flotante. Para ello, la expresin se debe expresar como valor de punto flotante en una de las tres maneras siguientes1) como nmero entero seguido por un punto y por lo menos un dgito, 2) como nmero entero con una E seguido por un valor del exponente, o 3) 1 y 2. Por ejemplo: CON OneHalf = 0.5 Ratio = Miles = 10e5

2.0 / 5.0

3-53

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

www.microcontroladores.com info@microcontroladores.com

El cdigo anterior crea tres constantes de punto flotante. OneHalf es igual a 0.5, el Ratio es igual a 0.4 y Miles es igual a 1.000.000. Se observa que si Ratio fuera definido como 2/5 en vez de 2.0/5.0, la expresin sera tratada como constante entera y el resultado sera una constante entera igual a 0. Para las expresiones constantes de punto flotante, cada valor dentro de la expresin debe ser un valor de punto flotante; no se pueden mezclar valores de nmero entero y de punto flotante como en Ratio = 2/5.0. Se puede, sin embargo, utilizar la directiva FLOAT para convertir un valor de nmero entero a un valor de punto flotante, como Ratio = FLOAT(2)/5.0.

El compilador del Propeller maneja constantes de punto flotante como nmeros reales de simple precisin segn lo descrito por el estndar IEEE-754. Asignacin Variable:= El operador de asignacin variable se usa dentro de mtodos (los bloques PUB y PRI) para asignar un valor a una variable. Por ejemplo, Temp := 21 Triple := Temp * 3 En el tiempo de ejecucin este cdigo fijara la variable de Temp igual a 21 y fijara Triple a 21 * 3, que es 63. Como con otros operadores de asignacin, el operador de asignacin variable puede ser utilizado dentro de expresiones para asignar resultados intermedios, por ejemplo: Triple := 1 + (Temp := 21) * 3 Este ejemplo primero fija Temp a 21, entonces multiplica Temp por 3 y le suma 1, finalmente asignando el resultado, 64, a Triple. Suma +, += El operador de la Suma, suma dos valores. Puede ser utilizado en expresiones variables y constantes. Ejemplo: X := Y + 5 La Suma tiene una forma de asignacin, + =, que utiliza la variable de su izquierda como el primer operando y la destino del resultado. Por ejemplo, X += 10 Forma abreviada de X := X + 10

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,

3-54

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

www.microcontroladores.com info@microcontroladores.com

X -= 10 Forma abreviada de X := X - 10 Aqu, 10 se resta del valor de X y el resultado se almacena en X. La forma de la asignacin de la resta tambin se puede utilizar dentro de expresiones para los resultados intermedios. Negativo - (forma untara de Resta) Negativo es la forma untara de la Resta. Negativo, activa el signo del valor que se encuentra a su derecha; un valor positivo se convierte en negativo y un valor negativo en positivo. Por ejemplo: Val := -2 + A Negativo es un operador de asignacin cuando es el nico operador a la izquierda de una variable en una lnea. Por ejemplo: -A Esto negara el valor de A y almacenara el resultado de nuevo en A. Decremento, pre- o post- - - El operador Decremento es un operador especial, un operador inmediato que decrementa, en uno, una variable y asigna el nuevo valor a sa misma variable. Puede ser utilizada solamente en expresiones variables en tiempo de ejecucin. El decremento tiene dos formas, pre-decremento y post-decremento, dependiendo del lado en el que aparece variable. La forma del pre-decremento aparece a la izquierda de una variable y la forma del postdecremento aparece a la derecha de una variable. Esto es extremadamente til en la programacin puesto que hay muchas situaciones que llaman al decremento de una variable justo antes o despus de el uso del valor de esa varible. Por ejemplo: Y := --X + 2 El ejemplo anterior muestra la forma de pre-decremento; significa "decrementar antes de proporcionar el valor para la operacin siguiente". Decrementa el valor de X en uno, escribe que resultado en X y proporciona ese resultado al resto de la expresin. Si X comenzase con el valor 5 en este ejemplo, --X almacenara 4 en X, entonces se evala la expresin, 4 + 2, finalmente escribiendo el resultado, 6, en Y. Despus de esta declaracin, X iguala 4 e Y es igual a 6. Y := X-- + 2 El ejemplo anterior muestra la forma de post-decremento; significa "decrementar despus de proporcionar el valor para la operacin siguiente". Proporciona el valor actual de X para la operacin siguiente en la expresin, despus decrementa el valor de X en uno y escribe ese resultado a X. Si X comenzase con 5 en este ejemplo, X-proporcionara el valor actual para la expresin (5 + 2) y entonces almacenaran 4 en X. Se evala la expresin 5 + 2 y el resultado, 7, se almacena en Y. Despus de esta sentencia, X es igual a 4 e Y es igual a 7. Como el decremento es siempre un operador de asignacin, pueden aplicarse tambin las reglas de asignaciones intermedias. Asumiendo que X comienza con 5 como los ejemplos siguientes. Y := --X + X Aqu, primero X se fija a 4, entonces se evala 4 + 4 e Y se fija a 8. Y := X-- + X Aqu, el valor actual del x, 5, se guarda para la operacin siguiente (la suma) y X se decrementa a 4, entonces se evala 5 + 4 e Y se fija a 9. Incremento, pre- o post- + + El operador Incremento es un operador especial, un operador inmediato que incrementa, en uno, una variable y asigna el nuevo valor a sa misma variable. Puede ser utilizada solamente en expresiones variables en tiempo de

3-55

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

www.microcontroladores.com info@microcontroladores.com

ejecucin. El incremento tiene dos formas, pre-incremento y post-incremento, dependiendo del lado en el que aparece variable. La forma del pre-incremento aparece a la izquierda de una variable y la forma del postincremento aparece a la derecha de una variable. Esto es extremadamente til en la programacin puesto que hay muchas situaciones que llaman al incremento de una variable justo antes o despus de el uso del valor de esa varible. Por ejemplo: Y := ++X 4 El ejemplo anterior muestra la forma de pre-incremento; significa "incrementar antes de proporcionar el valor para la operacin siguiente". Incrementa el valor de X en uno, escribe que resultado en X y proporciona ese resultado al resto de la expresin. Si X comenzase con el valor 5 en este ejemplo, ++X almacenara 6 en X, entonces se evala la expresin, 6 - 4, finalmente escribiendo el resultado, 2, en Y. Despus de esta declaracin, X iguala 6 e Y es igual a 2. Y := X++ - 4 El ejemplo anterior muestra la forma de post-incremento; significa "incrementar despus de proporcionar el valor para la operacin siguiente". Proporciona el valor actual de X para la operacin siguiente en la expresin, despus incrementa el valor de X en uno y escribe ese resultado a X. Si X comenzase con 5 en este ejemplo, X++ proporcionara el valor actual para la expresin (5 -4) y entonces almacenaran 4 en X. Se evala la expresin 5 4 y el resultado, 1, se almacena en Y. Despus de esta sentencia, X es igual a 4 e Y es igual a 1. Como el incremento es siempre un operador de asignacin, pueden aplicarse tambin las reglas de asignaciones intermedias. Asumiendo que X comienza con 5 como los ejemplos siguientes. Y := ++X + X Aqu, primero X se fija a 6, entonces se evala 6 + 6 e Y se fija a 12. Y := X-- + X Aqu, el valor actual del x, 5, se guarda para la operacin siguiente (la suma) y X se incrementa a 6, entonces se evala 5 + 6 e Y se fija a 11. Multiplicacin, devuelve bajo*, *= A este operador tambin se le llama Multiply-Low. Puede ser utilizado en expresiones variables y constantes. Cuando se utiliza con expresiones variables o expresiones de constante entera, este operando multiplica dos valores y devuelve los 32 bits ms bajos del resultado de 64-bits. Cuando se usa con expresiones constantes de punto flotante, Multiplicacin multiplica dos valores y devuelve el resultado de 32-bits de punto flotante de simple precisin. Ejemplo: X := Y * 8 La Multiplicacin tiene una forma de asignacin, * =, que utiliza la variable de su izquierda como el primer operando y destino del resultado. Por ejemplo,

X *= 20

Forma abreviada de X := X * 20

Aqu, el valor de X es multiplicado por 20 y los 32 bits ms bajos del resultado se almacenan en X. La forma de la asignacin tambin se puede utilizar con las expresiones para resultados intermedios. Multiplicacin, devuelve alto **, **= A este operador tambin se le llama Multiply-High. Puede ser utilizado en expresiones variables y constantes. Cuando se utiliza con expresiones variables o expresiones de constante entera, este operando multiplica dos valores y devuelve los 32 bits ms altos del resultado de 64-bits. Ejemplo:

3-56

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


X := Y ** 8

www.microcontroladores.com info@microcontroladores.com

Si Y comenzase con el valor de 536.870.912 (229) entonces Y ** 8 es igual a 1; el valor sol los 32 bits superiores del resultado. La Multiplicacin tiene una forma de asignacin, * =, que utiliza la variable de su izquierda como el primer operando y destino del resultado. Por ejemplo, X **= 20 Forma abreviada de X := X ** 20

Aqu, el valor de X es multiplicado por 20 y los 32 bits ms altos del resultado se almacenan en X. La forma de la asignacin tambin se puede utilizar con las expresiones para resultados intermedios. Divisin /, /= Divisin puede ser utilizado en expresiones variables y constantes. Cuando se utiliza con expresiones variables o expresiones de constante entera, este operando divide dos valores y devuelve el resultado de los 32 bits del numero entero. Cuando se usa con expresiones constantes de punto flotante, divide dos valores y devuelve el resultado de 32-bits de punto flotante de simple precisin. Ejemplo: X := Y / 4 La divisin tiene una forma de asignacin, /=, que utiliza la variable de su izquierda como el primer operando y destino del resultado. Por ejemplo,

X /= 20

Forma abreviada de X := X / 20

Aqu, el valor de X es dividido por 20 y el resultado del nmero entero se almacena en X. La forma de la asignacin de la divisin tambin se puede utilizar en las expresiones para los resultados intermedios. Resto //, //= El Resto se puede utilizar en expresiones variables y constantes enteras, pero no en expresiones constantes de punto flotante. El resto, divide un valor por otro y devuelve el resto de 32-bits de nmero entero. Ejemplo: X := Y // 4 Si Y comenzase con el valor 5 entonces Y // 4 es igual a 1, significando que el resto es . El Resto tiene una forma de asignacin, //=, que utiliza la variable de su izquierda como el primer operando y destino del resultado. Por ejemplo,

X //= 20

Forma abreviada de X := X // 20

Aqu, el valor de X es dividido por 20 y el resto del nmero entero 32-bits se almacena en X. La forma de la asignacin del resto tambin se puede utilizar en las expresiones para los resultados intermedios. Limite Mnimo #>, #>= El operador Limite Mnimo compara dos valores y devuelve el valor ms alto. El Limite Mnimo se puede utilizar en expresiones variables y constantes. Ejemplo: X := Y - 5 #> 100

3-57

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

www.microcontroladores.com info@microcontroladores.com

El ejemplo anterior resta 5 de Y y limita el resultado a un valor mnimo a 100. Si Y fuera 120 entonces 120 - 5 = 115; seria mayor que 100 as que X se fija a 115. Si Y fuera 102 entonces 102 - 5 = 97; es menos de 100 as que X se fija a 100. El Limite Mnimo tiene una forma de asignacin, #>=, que utiliza la variable de su izquierda como el primer operando y destino del resultado. Por ejemplo, X #>= 50 Forma abreviada de X := X // 20

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

3-58

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

www.microcontroladores.com info@microcontroladores.com

Si Y fuera -15, el valor absoluto, 15, se almacenara en X. El valor absoluto se convierte en un operador de asignacin cuando es el nico operador a la izquierda de una variable en una lnea. Por ejemplo: ||Y Esto almacenara el valor absoluto de Y nuevamente dentro de Y. Extensin del signo 7 o Post-Clear~ Este operador es un operador especial, inmediato que tiene un propsito dual dependiendo del lado de la variable en el que aparezca. Puede ser utilizado solamente en expresiones variables en tiempo de ejecucin. La forma del la Extensin de Signo 7 del operador aparece a la izquierda de una variable y la forma Post-Clear aparece a la derecha de una variable. Lo siguiente es un ejemplo de la forma del operador Extensin de Signo 7: Y := ~X + 25 El operador Extensin de Signo 7 en este ejemplo extiende el signo del valor, X en este caso, del bit 7 hasta el bit 31. Un entero con signo de 32-bits se almacena en forma de complemento a dos y el bit ms significativo (31) indica el valor del signo (positivo o negativo). Puede haber veces donde los clculos sobre datos simples dan lugar a valores de tamao byte que se deben tratar como entero con signo en el rango de -128 a +127. Cuando se necesita realizar otros clculos con esos valores de tamao byte, se debe utilizar el operador Extensin de Signo 7 para convertir el nmero en forma apropiada de 32-bits de entero con signo. En el ejemplo anterior, si se asume que X representa el valor -20, que en forma de 8-bits en complemento a dos es realmente el valor 236 (%11101100). La porcin de la expresin ~X extiende el signo de bit del bit 7 hasta el bit 31, convirtiendo el nmero a la forma 32-bits apropiada del complemento a dos de -20 (%11111111 11111111 11111111 11101100). Sumando 25 al valor de signo extendido el resultado seria 5, el resultado previsto, mientras que habra dado lugar a 261 sin la extensin de signo apropiada. Lo siguiente es un ejemplo de la forma del operador Post-Clear. Y := X~ + 2 El operador Post-Clear en este ejemplo fija la variable a 0 (todos los bits a bajo) despus de proporcionar su valor actual para la operacin siguiente. En este caso, si X fuera 5, el valor de la expresin seria (5 + 2) y se almacenara 0 en X. Extensin de Signo 15 o Post-Set ~~ Este operador es un operador especial, inmediato que tiene un propsito dual dependiendo en de el cual el lado de la variable l aparezca. dependiendo del lado de la variable en el que aparezca. Puede ser utilizado solamente en expresiones variables en tiempo de ejecucin. La forma del la Extensin de Signo 15 del operador aparece a la izquierda de una variable y la forma Post-Set aparece a la derecha de una variable. Lo siguiente es un ejemplo de la forma del operador Extensin de Signo 15: Y := ~~X + 50

El operador Extensin de Signo 15 en este ejemplo extiende el signo del valor, X en este caso, del bit 15 hasta el bit 31. Un entero con signo de 32-bits se almacena en forma de complemento a dos y el bit ms significativo (31) indica el valor del signo (positivo o negativo). Puede haber veces donde los clculos sobre datos simples dan lugar a valores de tamao word que se deben tratar como entero con signo en el rango de -32768 a +32767. Cuando se necesita realizar otros clculos con esos valores de tamao byte, se debe utilizar el operador Extensin de Signo 15 para convertir el nmero en forma apropiada de 32-bits de entero con signo. En el ejemplo anterior, si se asume que X representa el valor -300, que en forma de 16-bits en complemento a dos es realmente el valor 65.236 (%11111110 11010100). La porcin de la expresin ~~X extiende el signo de bit del bit 15 hasta el bit 31, convirtiendo el nmero a la forma 32-bits apropiada del complemento a dos de -300 (%11111111 11111111 11111110 11010100). Sumando 50 al valor de signo extendido el resultado seria -250, el resultado previsto, mientras que habra dado lugar a 65.286 sin la extensin de signo apropiada. Lo siguiente es un ejemplo de la forma del operador Post-Set.

3-59

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


Y := X~~ + 2

www.microcontroladores.com info@microcontroladores.com

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.

3-60

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

www.microcontroladores.com info@microcontroladores.com

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, 2b, 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

3-61

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

www.microcontroladores.com info@microcontroladores.com

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, 2b, 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

3-62

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

www.microcontroladores.com info@microcontroladores.com

puede ser utilizada en expresiones de constante entera y de variable, pero no en expresiones constantes de punto flotante. Ejemplo: X := Y -> 5 Si Y comenzase como: %10000000 01110000 11111111 00110101 el operador de Rotacin a la Izquierda rotara ese valor a la derecha por cinco bits, moviendo los cinco originales LSBs a los cuatro MSBs nuevos, y fijando X a: %10101100 00000011 10000111 11111001. La Rotacin a la Derecha tiene una forma de asignacin,->=, que utiliza la variable a su izquierda como primer operando y destino del resultado. Por ejemplo, X ->= 3 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:

3-63

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

www.microcontroladores.com info@microcontroladores.com

Ejemplo: X := %00101100 & %00001111 El ejemplo anterior realiza un AND con %00101100 y %00001111 y escribe el resultado, %00001100, sobre X. AND tiene una forma de asignacin, &=, que utiliza la variable a su izquierda como primer operando y destino del resultado. Por ejemplo, X &= $F 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.

3-64

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


manipulacin de bits mientras que el OR boleano es para propsitos de la comparacin.

www.microcontroladores.com info@microcontroladores.com

Hay que tener cuidado en no confundir el OR en modo bit con el OR Boleano. OR en modo bit es para la

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

3-65

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


Esto almacenara el valor invertido de Flag nuevamente dentro Flag.

www.microcontroladores.com info@microcontroladores.com

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.

3-66

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

www.microcontroladores.com info@microcontroladores.com

Hay que tener cuidado en no confundir el OR Boleano con el OR en modo bit. OR boleano es para propsitos de comparacin mientras que el OR en modo bit es para la manipulacin de bits. NOT Boleano NOT Operador boleano devuelve verdadero (-1) si el operando es falso (0), o devuelve (0) falso si el operando es verdadero (diferente a cero). El NOT boleano puede ser utilizado en expresiones variables y constantes. Ejemplo: X := NOT Y El ejemplo anterior devuelve el boleano contrario de Y; Verdadero (-1) si Y es cero, o (0) falso si Y es diferente a cero. Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo siguiente. IF NOT ( (Y > 9) AND (Y < 21) ) Este ejemplo evala el resultado de (Y> 9 AND Y < 21), y devuelve como resultado el valor boleano contrario; Verdadero (-1) si Y est en el rango 10 a 20, en este caso. El NOT boleano es un operador de asignacin cuando es el nico operador a la izquierda de una variable en una lnea. Por ejemplo: NOT Flag Esto almacenara el boleano contrario de Flag nuevamente dentro de Flag. Hay que tener cuidado en no confundir el NOT Boleano con el NOT en modo bit. NOT boleano es para propsitos de comparacin mientras que el NOT en modo bit es para la manipulacin de bits. Es igual a Boleano ==, === El operador boleano Es igual a compara dos operandos y devuelve verdadero (-1) si ambos valores son iguales, o devuelve falso (0), si no. Es igual a puede ser utilizado en expresiones variables y constantes. Ejemplo: X := Y == Z El ejemplo anterior compara el valor de Y con el valor de Z y fija X a: Verdadero (-1) si Y tiene el mismo valor que Z, o (0) falso si Y no tiene el mismo valor que Z. Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo siguiente. IF (Y == 1) Aqu, el operador Es igual a devuelve Verdadero si Y es igual a 1. Es igual a tiene una forma de asignacin, ===, que utiliza la variable a su izquierda como el primer operando y destino del resultado. Por ejemplo, X === Y 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 <>, <>=

3-67

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

www.microcontroladores.com info@microcontroladores.com

El operador boleano No es igual a compara dos operandos y devuelve verdadero (-1) si los valores no son iguales, o devuelve falso (0), si no. No es igual a puede ser utilizado en expresiones variables y constantes. Ejemplo: X := Y <> Z El ejemplo anterior compara el valor de Y con el valor de Z y fija X a: Verdadero (-1) si Y no tiene el mismo valor que Z, o (0) falso si Y tiene el mismo valor que Z. Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo siguiente. IF (Y <> 25) Aqu, el operador No es igual a devuelve verdadero si Y no es 25. No es igual a tiene una forma de asignacin, <>=, que utiliza la variable a su izquierda como el primer operando y destino del resultado. Por ejemplo, X <>= Y 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.

3-68

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

www.microcontroladores.com info@microcontroladores.com

Este operador se utiliza a menudo junto con otros operadores de comparacin, por ejemplo en el ejemplo siguiente. IF (Y > 50) Aqu, el operador Es mayor que devuelve verdadero si Y es mayor que 50. Es mayor que tiene una forma de asignacin, >=, que utiliza la variable a su izquierda como el primer operando y destino del resultado. Por ejemplo, X >= Y 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.

3-69

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

www.microcontroladores.com info@microcontroladores.com

Es mayor o igual tiene una forma de asignacin, =>=, que utiliza la variable a su izquierda como el primer operando y destino del resultado. Por ejemplo, X =>= Y 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

3-70

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

www.microcontroladores.com info@microcontroladores.com

Esto crea una tabla de words, comenzando en StrAddr, donde cada word contiene la direccin de un nico string. Desafortunadamente, para las constantes en tiempo de compilacin (como los de la tabla de StrAddr), la direccin devuelta por @ es solamente la direccin de ajuste en tiempo de compilacin, ms que la direccin absoluta en tiempo de ejecucin, del smbolo. Para conseguir la direccin real, en tiempo de ejecucin, necesitamos agregar la direccin base del programa objeto a la direccin de ajuste del smbolo. Eso es lo que lo hace el operador de la direccin de objeto ms smbolo. Ejemplo: REPEAT Idx FROM 0 TO 2 PrintStr (@@StrAddr [Idx]) El ejemplo anterior incrementa Idx de 0 a 2. La declaracin de StrAddr [Idx] recupera el ajuste del string almacenado en el elemento Idx de la tabla de StrAddr en tiempo de compilacin. El operador @@ que est delante de la declaracin de StrAddr [Idx] suma la direccin base del objeto al valor de ajuste que fue recuperado en tiempo de compilacin, dando por resultado una direccin vlida en tiempo de ejecucin. El mtodo de PrintStr, cuyo cdigo no se muestra en este ejemplo, puede utilizar esa direccin para procesar cada carcter del string. 3.3.39. OUTA, OUTB Registros de salida de 32-bits Puerto A y B. OUTA <[Pin(s)]> OUTB <[Pin(s)]>(Reservado para uso futuro) Devuelve: Valor actual de los pins de salida de Puerto A o B. Pin(s) es una expresin opcional, o una expresin de rango, que especifica el pin ,o pins, de E/S para acceder al puerto A (0-31) o al puerto B (32-63). Si se da una expresin nica, solamente se tendr acceso al pin especificado. Si se da una expresin de tipo rango (dos expresiones en un formato rango; x..y) se tendr acceso a los pins contiguos desde el comienzo de la expresin hasta el fin.

Explicacin OUTA y OUTB son uno de los seis registros (DIRA, DIRB, INA, INB, OUTA y OUTB) que afectan directamente los pins de E/S. El registro OUTA contiene los estados de salida de cada uno de los 32 pins de E/S en el puerto A; los bits 0 a 31 corresponden de P0 a P31. El registro de DIRB contiene los estados de salida de cada uno de los 32 pins de E/S en el puerto B; los bits 0 a 31 corresponden de P32 a P63. NOTA: OUTB est reservado para el uso futuro; el Propeller P8X32A no incluye los pins de E/S del puerto B. OUTA se usa tanto para fijar como para recoger el estado actual de salida de uno o mas pins E/S en el Puerto A. Un bit bajo (0) indica que el pin correspondiente E/S est a tierra, y un bit alto (1) indica que el pin correspondiente de E/S est a VDD (3.3 voltios). El registro OUTA est por defecto a cero, con todos los bits a 0, hasta el arranque del cog. Cada Cog tiene acceso a todos los pins de E/S en cualquier momento. Esencialmente, todos los pins de E/S estn conectados directamente con cada Cog. Esta configuracin se puede describir con las siguientes reglas: A. Un pin es una entrada slo de Cogs no activos fijados a salida. B. Un pin es una salida si cualquier Cog activo lo fija a salida.

Debido a la naturaleza "wired-OR" de los pins de E/S, no hay contencin elctrica entre los Cogs, y se puede tener acceso a los pins de E/S simultneamente. Es funcin del desarrollador de la aplicacin asegurarse de que ningunos de los Cogs causan contencin lgica en el mismo pin de E/S durante el tiempo de ejecucin. Uso de OUTA

3-71

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

www.microcontroladores.com info@microcontroladores.com

Fija o inicializa los bits en OUTA para afectar al estado de salida de los pins E/S deseados. Hay que asegurarse tambin fijar los bits correspondientes de DIRA para hacer que ese pin sea una salida. DIRA := %00000100_00110000_00000001_11110000 OUTA := %01000100_00110000_00000001_10010000 La lnea de arriba de DIRA fija los pins 25, 21, 20, 8, 7, 6, 5 y 4 de E/S a salida y el resto a entradas. La lnea de OUTA fija los pins 30, 25, 21, 20, 8, 7, y 4 a alto, el resto de E/S a bajo. El resultado es que los pins de E/S 25, 21, 20, 8, 7, y 4 estn fijados como salida alta y los pins 6 y 5 de E/S como salida baja. El pin 30 de E/S se fija a una direccin de entrada (segn DIRA) as que el estado alto en el bit 30 de OUTA se ignora y el pin se toma como entrada de acuerdo con ese Cog. Si se usa el campo opcional Pin(s), y los operadores unitarios post-clear (~) y post-set (~~), un Cog puede afectar a un pin de E/S (un bit) a la vez. El campo Pin(s) trata los registros de pins de E/S como array de 32-bits. Por ejemplo:

DIRA[10]~~ OUTA[10]~ OUTA[10]~~

Fija P10 a salida Pone P10 a bajo 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]~~ OUTA[12..8] := %11001 Fija DIRA12:8 (P12-P8 a salida) 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]~~ OUTA[8..12] := %11001 Fija DIRA8:12 (P8-P12 a salida) 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.

3-72

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


3.3.40. PAR Registro de Parmetros de arranque del Cog. PAR Devuelve: El valor de direccin pasado durante arranque con COGINIT o COGNEW.

www.microcontroladores.com info@microcontroladores.com

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

Mueve el valor ValReg a Shared

Mem res 1 ValReg

En el ejemplo de arriba, el mtodo principal lanza la rutina en ensamblador Process en un Cog nuevo con COGNEW. El segundo parmetro de COGNEW es utilizado por Main para pasar la direccin de una variable, Shared. La rutina de ensamblador, Process, recupera que valor de direccin de su registro PAR y lo almacena localmente en Mem. Entonces realiza alguna tarea, actualizando su registro local ValReg (creado en el final del bloque de DAT) y finalmente actualiza la variable Shared a travs de wrlong ValReg, Mem. 3.3.41. PHSA, PHSB Contador A y Contador B de los Registros Phase Lock Loop (PLL). PHSA PHSB Devuelve: Valor actual del Contador A o Contador B del registro PLL, si est utilizado como variable fuente. Explicacin

3-73

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

www.microcontroladores.com info@microcontroladores.com

PHSA y PHSB son dos de los seis registros (CTRA, CTRB, FRQA, FRQB, PHSA, y PHSB) que afectan el comportamiento de los mdulos Contador de un Cog. Cada Cog tiene dos mdulos Contador idnticos (A y B) que pueden realizar muchas tareas repetitivas. Los registros de PHSA y de PHSB contienen los valores que se pueden leer o escribir directamente por el Cog, pero pueden tambin ser acumulados con el valor de FRQA y de FRQB, respectivamente, en cada ciclo potencial de reloj del sistema. Uso de PHSA and PHSB PHSA y PHSB pueden ser leidos/escritos como otros registros o variables predefinidas. Por ejemplo: PHSA := $1FFFFFFF El cdigo anterior fija PHSA a $1FFFFFFF. Dependiendo del campo de CTRMODE del registro de CTRA, este valor puede seguir siendo el mismo, o se puede incrementar automticamente por el valor en FRQA en una frecuencia determinada por el reloj del sistema y los pins primarios y/o secundarios de E/S. Hay que tener presente que la escritura a PHSA o a PHSB elimina directamente el valor actual acumulado y cualquier acumulacin programada para el mismo momento que se realiza la escritura. 3.3.42. PRI Declara un Bloque de mtodo Privado. PRI Name <(Param<,Param>)> <:Rvalue> <|LocalVar<[Count]>> <,LocalVar <[Count]>> SourceCodeStatements 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.

3-74

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


3.3.43. PUB Declara un Bloque de mtodo Publico.

www.microcontroladores.com info@microcontroladores.com

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.

3-75

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


tabulado por lo menos un espacio.

www.microcontroladores.com info@microcontroladores.com

Todas las declaraciones ejecutables que pertenecen a un mtodo de PUB aparecen debajo de su declaracin,

El valor de Retorno Una declaracin de PUB especifique o no un RValue, hay siempre un valor de retorno implcito, que es cero (0) por defecto. Hay un nombre predefinido para este valor de retorno dentro de cada mtodo de PUB, llamado RESULT. En cualquier momento dentro de un mtodo, RESULT puede ser actualizado como cualquier otra variable y, mientras exista el mtodo, el valor actual del RESULT se pasar de nuevo al llamador. Adems, si se declara un RESULT para el mtodo, ese nombre se puede utilizar alternativamente con variable, incorporada por defecto, RESULT. Parameters and Local Variables Los parmetros y las variables locales son todas long (cuatro bytes). De hecho, los parmetros son variables que se inicializan a los valores correspondientes especificados por el llamador del mtodo. Las variables locales, sin embargo, no se inicializan; contienen datos al azar cuando se llama el mtodo. Todos los parmetros se pasan al mtodo por valor, no por referencia, as que los cambios de parmetros no se reflejan fuera del mtodo. Por ejemplo, si llamamos a MoveMotor usando una variable llamadora Pos para el primer parmetro, puede ser algo como esto: Pos := 250 MoveMotor(Pos, 100) Cuando se ejecuta el mtodo MoveMotor, recibe el valor de Pos en su parmetro Position, y el valor 100 en su parmetro Speed. Dentro del mtodo MoveMotor, puede cambiar Position y Speed en cualquier momento, pero sigue teniendo el valor de Pos (la variable del llamador) a 250. Si una variable tiene que ser alterada por una rutina, el llamador debe pasar la variable por referencia; es decir, que debe pasar la direccin de la variable en vez del valor de la variable, y la rutina debe tratar ese parmetro como la direccin de una posicin de memoria en la cual operar. La direccin de una variable, u otro smbolo basado en los registros, puede ser recuperada usando al operador de Direccin de smbolo, ` @ '. por ejemplo, Pos := 250 MoveMotor(@Pos, 100) El llamador pasa la direccin de Pos para el primer parmetro de MoveMotor. Lo que recibe MoveMotor en su parmetro Position es la direccin de la variable llamadora Pos. La direccin es un nmero, como cualquier otro, y el mtodo de MoveMotor tiene que estar diseado para que lo trate como direccin, el lugar de un valor. El mtodo MoveMotor debera utilizar algo como: PosIndex := LONG[Position] ... para recuperar el valor de la variable llamadora Pos, y ser algo como: LONG[Position] := <some expression> ... para modificar la variable llamadora Pos, en caso de necesidad. Salida de un mtodo Se sale de un mtodo, tanto si ha llegado a la ultima sentencia del mtodo o cuando alcanza un comando de RETURN o ABORT. Un mtodo puede tener solamente un punto de la salida (la ultima sentencia ejecutable), o puede tener muchos puntos de la salida (cualquier comando RETURN o ABORT adems de la ultima sentencia ejecutable). Los comandos RETURN y ABORT se pueden utilizar tambin para fijar el RESULT variable en la salida.

3-76

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


3.3.43B. QUIT Salida de un bucle REPEAT inmediatamente. QUIT

www.microcontroladores.com info@microcontroladores.com

Explicacin QUIT es uno de los dos comandos (NEXT y QUIT) que afectan a los bucles de REPEAT. QUIT hace que un bucle de REPEAT termine inmediatamente. Uso de QUIT QUIT se utiliza como un caso de excepcin, en una declaracin condicional, en los bucles REPEAT para terminar el bucle prematuramente. Por ejemplo, se asume que DoMore y SystemOkay son mtodos creados en otra parte y que cada uno devuelve valores boleanos: repeat while DoMore !outa[0] <do something> if !SystemOkay quit <more code here> Repetir mientras haya DoMore Activa el Pin 0 Realiza alguna tarea Si hay fallo en System, salir 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)

3-77

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


www.microcontroladores.com info@microcontroladores.com

Count es una expresin opcional que indica el nmero finito de veces a ejecutar Statement(s). Si se omite Count, la sintaxis 1 crea un bucle infinito compuesto de Statement(s). Statement(s) es un bloque opcional de una o ms lneas del cdigo a ejecutarse repetidamente. Omitir Statement(s) es raro, pero puede ser til en la sintaxis 3 y 4 si Condition(s) alcanza los efectos necesarios. Variable es una variable, generalmente definida por el usuario, que ser iterada de comienzo al final, opcionalmente en unidades de Delta por iteracin. Variable se puede utilizar en Statement(s) para determinar o para utilizar la cuenta de la iteracin. Start es una expresin que determina el valor de inicio de Variable en la sintaxis 2. Si Start es menor Finish, la variable ser incrementada cada iteracin; y decrementada de la otra manera. Finish es una expresin que determina el valor final de Variable en la sintaxis 2. Si Finish es mayor que Start, la variable ser incrementada cada iteracin; y decrementada de la otra manera. Delta es una expresin opcional que determina las unidades en las cuales se quiere incrementar/decrementar la Variable en cada iteracin (sintaxis 2). Si est omitida, la variable se incrementara/decrementara en 1 cada iteracin. Condition(s) es un o ms expresiones boleanas usadas por la sintaxis 3 y 4 para continuar o para terminar el bucle. Cuando est precedido de UNTIL, Condition(s) termina el bucle cuando es verdadero. Cuando est precedido de WHILE, Conditions(s) termina el bucle cuando es falso.

Explicacin REPEAT es una estructura repetitiva muy flexible para el cdigo Spin. Puede ser utilizada para crear cualquier tipo de bucle, incluyendo: infinito, finito, con o sin contador de bucle, y el de cero a N o de N a cero. La Sangra es critica IMPORTANTE: La sangra es crtica. El lenguaje Spin confa en la sangra (de un espacio o ms) en lneas que siguen comandos condicionales para determinar si pertenecen a ese comando o no. Para que la herramienta Propeller indique stos bloques de cdigo agrupados lgicamente en pantalla, se puede presionar Ctrl + I y encender los indicadores de grupo . Presionando Ctrl + I otra vez esa caracterstica se desactivara. Bucles Infinitos (Sintaxis 1) Realmente, cualquiera de las cuatro formas de REPEAT se pueden hacer en bucles infinitos, pero la forma usada para este propsito es la sintaxis 1 sin el campo Count. Por ejemplo: repeat !outa[25] waitcnt(2_000 + cnt) Repite sin fin Activa P25 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 !outa[25] Repite sin fin 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:

3-78

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


repeat 10 !outa[25] byte[$7000]++ Repite 10 veces Activa P25 Incrementa localizacin RAM $7000

www.microcontroladores.com info@microcontroladores.com

El cdigo anterior activa P25 diez veces, y entonces incrementa el valor de la localizacin RAM $7000. Bucles Finitos Contados (Sintaxis 2) A menudo es absolutamente necesario contar las iteraciones del bucle para que el cdigo del bucle pueda realizarse basado en esa cuenta. El comando REPEAT hace que esto sea fcil de hacer con la sintaxis 2. El siguiente ejemplo asume que la variable Index fue creada previamente. repeat Index from 0 to 9 byte[$7000][Index]++ Repite 10 veces Incrementa localizacin RAM de $7000 a $7009

Como el ejemplo anterior, el cdigo repite el bucle 10 veces, pero cada vez ajusta la variable Index. La primera vez a que se ejecute el bucle, el ndice ser 0 (segn lo indicado por " from 0") y cada iteracin siguiente ser 1 ms que el anterior (segn lo indicado por "to 9"): ..1. 2, 3... 9. Despus de la dcima iteracin, el ndice ser incrementado a 10 y el bucle terminar, haciendo que se ejecuten las siguientes sentencias al bucle REPEAT, si es que existen. El cdigo en el bucle utiliza Index como ajuste para afectar la memoria, byte[$7000][Index]++; en este caso est incrementando cada uno de los valores de tamao byte en las localizaciones $7000 a $7009 del RAM en 1, cada vez. El comando REPEAT determina automticamente si el rango sugerido por Start y Finish es ascendente o descendente. Como el ejemplo anterior utiliz 0 a 9, el rango es un Rango ascendente; ajustando Index en +1 cada vez. Para conseguir que la cuenta vaya al revs, simplemente habra que invertir los valores del Start y Finish, como en: repeat Index from 9 to 0 byte[$7000][Index]++ Repite 10 veces Incrementa localizacin RAM $7000

de $7009 hacia

Este ejemplo tambin repite el bucle 10 veces, pero cuenta con Index de 9 a 0; ajustando Index en -1 cada vez. Como los campos de Start y Finish pueden ser expresiones, pueden contener variables. El ejemplo siguiente asume que S y F son variables creadas previamente. S := 0 F := 9 repeat 2 repeat Index from S to F byte[$7000][Index]++ S := 9 F := 0

Repite 2 veces Repite 10 veces Incrementa localizacin RAM de 7000..$7009

El ejemplo anterior utiliza un bucle anidado. El bucle externo (primero) repite 2 veces. El bucle interno repite con Index desde S a F, estas variables han sido fijadas previamente de 0 a 9, respectivamente. El bucle interno incrementa el valor de las localizaciones $7000 a $7009 de la RAM, en ese orden, porque el bucle interno est contando iteraciones a partir de la 0 a 9. Entonces, este bucle termina (con Index fijado a 10) y las ultimas dos lneas ponen S a 9 y F a 0, intercambiando los valores de Start y Finish. Puesto que esto todava est dentro del lazo externo, el lazo externo entonces ejecuta su contenido (para la segunda vez) que hace otra vez que el bucle interno repita con Index desde 9 a 0 (en sentido contrario al bucle anterior). Los bucles REPEAT no tienen por que ser limitados a incrementar o a decrementar en 1. Si el comando REPEAT utiliza el sintaxis opcional Delta, incrementar o decrementara la variable en la cantidad que indique Delta. El ejemplo siguiente incluye el valor opcional Delta, llamado Step, para incrementar por 2. repeat Index from 0 to 8 step 2 byte[$7000][Index]++ Repite 5 veces Incrementa la RAM $7000 a $7008

3-79

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

www.microcontroladores.com info@microcontroladores.com

Aqu, REPEAT realiza el bucle cinco veces, con Index fijado a 0, 2, 4, 6, y 8, respectivamente. Este cdigo incrementa las localizaciones RAM (las localizaciones numeradas) a partir de $7000 a $7008 y terminan con Index igual a 10.

El campo Delta puede ser positivo o negativo, sin importar el rango natural de los valores Start y Finish, y se puede incluso ajustar dentro del bucle para alcanzar efectos interesantes. Por ejemplo, asumiendo que Index y D son variables definidas previamente, el cdigo siguiente fija Index a la siguiente secuencia: 5. 6, 6, 5, 3. D := 2 repeat Index from 5 to 10 step D --D Este bucle comienza con Index a 5 y Delta (D) de +2. Pero cada iteracin decrementa D por uno, as que en el final de la primera iteracin, Index = 5 y D = +1. la iteracin 2 tiene Index = 6 y D = 0. La iteracin 3 tiene Index = 6 y D = -1. la iteracin 4 tiene Index = 5 y D = -2. la iteracin 5 tiene Index = 3 y D = -3. El bucle termina entonces porque Index ms Delta (3 + - 3) est fuera de el rango de Start y Finish (5 a 10). Bucles Condicionales (Sintaxis 3 and 4) Las formas finales de REPEAT, sintaxis 3 y 4, son bucles finitos con salidas condicionales. Estas dos formas de REPEAT se refieren generalmente como "repeat while" o "repeat until". La forma REPEAT de la sintaxis 3, consiste en el comando REPEAT seguido por WHILE o UNTIL entonces Condition(s) y finalmente, en las lneas de abajo, Statement(s) opcionales. Por ejemplo, se asume que es X una variable creada anteriormente: X := 0 repeat while X < 10 byte[$7000][X] := 0 X++

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

Repite hasta que X sea mayor que 9 Incrementa el valor de RAM 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:

3-80

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


X := 0 repeat byte[$7000][X] := 0 X++ while X < 10 Incrementa el valor de RAM Incrementa X Repite mientras X sea menor que 10

www.microcontroladores.com info@microcontroladores.com

Esto tambin funciona igual que los ejemplos anteriores, ejecutando el bucle 10 veces, aunque la condicin no se prueba hasta el final de cada iteracin. Otras opciones REPEAT Hay otros dos comandos que afectan al comportamiento o a los bucles REPEAT: NEXT y QUIT. 3.3.46. RESULT Es el valor variable de retorno de mtodos. RESULT Explicacin La variable de RESULT es una variable local predefinida para cada mtodo de PUB y PRI. El RESULT contiene el valor de retorno del mtodo; este valor se pasa al llamador del mtodo, cuando termina el mtodo. Cuando se llama un mtodo pblico o privado, su variable RESULT se inicializa a cero (0). Si ese mtodo no altera RESULT, ni llama RETURN o ABORT con un valor especifico, entonces el valor de retorno de la terminacin de ese mtodo ser cero. Uso de RESULT En el ejemplo de abajo, el mtodo de DoSomething pone RESULT igual a 100 en su final. El mtodo principal llama DoSomething y fija su variable local, Temp, igual al resultado; de modo que cuando DoSomething sale, Temp se fija a 100. PUB Main | Temp Temp := DoSomething PUB DoSomething <do something here> result := 100

Llama a DoSomething, fija Temp con el valor de retorno

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.

3-81

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


3.3.47. RETURN Sale de un mtodo PUB/PRI con un valor de retorno opcional.

www.microcontroladores.com info@microcontroladores.com

RETURN <Value> Devuelve: El valor del RESULTADO actual o un valor (Value) si se provee. Value es una expresin opcional que valor debe ser devuelto del mtodo PUB o PRI.

Explicacin RETURN es uno de dos comandos (ABORT y RETURN) que terminan la ejecucin de un mtodo PUB o PRI. RETURN causa un retorno de un mtodo PUB o PRI con estado normal; esto significa que realiza un solo pop de la pila de llamadas y retorna al llamador de este mtodo, entregando un valor en el proceso. Cada mtodo PUB o PRI tiene un RETURN implcito en su final, pero RETURN se puede tambin escribir manualmente en uno o ms lugares dentro del mtodo para crear mltiples puntos de salida. Cuando RETURN aparece sin valor opcional, devuelve el valor actual de la variable incorporada en el RESULT de PUB/PRI. Si el campo valor fue incorporado, el PUB o el PRI devuelve ese valor. Sobre la pila de llamadas (Call Stack) Cuando los mtodos son llamados simplemente invocndoles de otros mtodos, debe haber un cierto mecanismo para almacenar donde debe retornar una vez que se termine el mtodo llamado. Este mecanismo es el llamado "stack" (pila) pero utilizaremos el trmino "call stack" aqu. Este mecanismo es simplemente memoria RAM, usada para almacenar las direcciones y los valores de retorno, los parmetros y los resultados intermedios. La pila de llamadas va aumentando a medida que se van haciendo llamadas a mtodos y disminuye cuando los mtodos terminan, ya sea va Return o alcanzando el final del mtodo. La pila aumenta y disminuye de tamao con estas dos acciones: 1)"push" que introduce valores sobre la pila y 2) "pop" que saca los valores contenidos en la pila El comando RETURN hace un pop de los datos ms recientes de la pila de llamadas devolviendo el dato al llamador inmediato; quin llam directamente al mtodo que acaba de volver. Uso de RETURN El siguiente ejemplo muestra dos aplicaciones de RETURN. Se asume que DisplayDivByZeroError es un mtodo definido en otra parte. PUB Add(Num1, Num2) Result := Num1 + Num2 return PUB Divide(Dividend, Divisor) if Divisor == 0 DisplayDivByZeroError return 0 return Dividend / Divisor

Suma Num1 + Num2

Mira si Divisor = 0 Si es as, muestra error y retorna con 0 sino, devuelve el resultado

El mtodo de la suma (Add) asigna su variable RESULT igual a Num1 ms Num2, entonces ejecuta RETURN. Las causas de RETURN agregan para volver el valor de RESULT al llamador. El mtodo Divide comprueba el valor Divisor. Si Divisor se iguala a cero, llama al mtodo de DisplayDivByZeroError y despus ejecuta el return 0, que hace inmediatamente que el mtodo retorne con el valor

3-82

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

www.microcontroladores.com info@microcontroladores.com

0. Si, sin embargo, Divisor no es igual a cero, ejecuta Dividend / Divisor y hace que el mtodo retorne con el resultado de la divisin. 3.3.48. ROUND Redondea una constante de coma flotante en el entero mas cercano. ROUND ( FloatConstant ) Devuelve: El entero mas cercano al valor original de la constante de punto flotante. 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 Smaller Rnd1 Rnd2 Rnd3

= 0.5 = 0.4999 = round(OneHalf) = round(Smaller) = round(Smaller * 10.0) + 4

El cdigo anterior crea dos constantes, OneHalf y Smaller de punto flotante, igual a 0.5 y a 0.4999, respectivamente. Las tres constantes siguientes, Rnd1, Rnd2 y Rnd3, son las constantes enteras que se basan en OneHalf y Smaller usando la directiva ROUND. Rnd1 = 1, Rnd2 = 0, y Rnd3 = 9.

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

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


3.3.49. SPR

www.microcontroladores.com info@microcontroladores.com

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

3-84

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


3.3.50. _STACK

www.microcontroladores.com info@microcontroladores.com

Una constante predefinida, ajustable una sola vez para especificar el espacio libre de pila de la aplicacin. CON _STACK = Expression Expression es una expresin de nmero entero que indica que el nmero de longs a reservar para el espacio de pila. Explicacin _ STACK es Una constante predefinida, ajustable una sola vez para especificar el espacio libre de pila de la aplicacin. Este valor se aade a _FREE si est especificado, para determinar la cantidad total de memoria stack/free a reservar para una aplicacin Propeller. Se debe usar _ STACK si una aplicacin requiere una cantidad mnima de espacio de pila para ejecutarse correctamente. Si la aplicacin compilada resultante es demasiado grande para permitir el espacio especificado de pila, se exhibir un mensaje de error. Por ejemplo: CON _STACK = 3000 La declaracin de _STACK en el bloque anterior de CON indica que la aplicacin necesita tener por lo menos 3.000 longs de espacio de pila despus de la compilacin en el caso de que eso no se cumpla, se mostrara un mensaje de error, indicando cuanto se ha excedido. Esta es una buena manera de prevenir que compilaciones satisfactorias fallen en tiempo de ejecucin por falta de memoria. 3.3.51. STRCOMP Compara la igualdad de dos strings. STRCOMP (StringAddress1, StringAddress2 ) Devuelve: Verdadero si los dos strings son iguales y falso en caso contrario. StringAddress1 es una expresin que especifica la direccin de comienzo del primer string para comparar. StringAddress2 es una expresin que especifica la direccin de comienzo del segundo string para comparar. Explicacin STRCOMP es uno de dos comandos (STRCOMP y STRSIZE) que recuperan la informacin sobre un string. STRCOMP compara el contenido del string en StringAddress1 al contenido del string en StringAddress2, y devuelve verdadero si ambas secuencias son equivalentes, falso en caso contrario. Esta comparacin es sensible a maysculas y minsculas.

Uso de STRCOMP El siguiente ejemplo asume que PrintStr es un mtodo creado a parte. PUB Main if strcomp(@Str1, @Str2) PrintStr(string(Str1 y Str2 son iguales)) else PrintStr(string(Str1 y Str2 son diferentes)) DAT Str1 byte Hello World, 0 Str2 byte Testing., 0

3-85

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

www.microcontroladores.com info@microcontroladores.com

El ejemplo anterior tiene dos strings en el bloque DAT, el Str1 y el Str2. El mtodo principal llama a STRCOMP para comparar el contenido de cada string. 3.3.52. STRING Declara constantes de tipo cadena (string) y recoge su direccin. STRING (StringExpression ) Devuelve: La direccin de la constante string. 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

3-86

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

www.microcontroladores.com info@microcontroladores.com

El ejemplo anterior tiene dos strings terminados en cero, en el bloque de DAT, el Str1 y el Str2. El mtodo principal llama a STRSIZE para conseguir la longitud de cada secuencia. Print es un mtodo que muestra un valor, en este ejemplo imprime 11 y 8 en la pantalla. Smbolos Los smbolos en la tabla 4-13 responden a uno o ms propsitos especiales en cdigo Spin.

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.

3-87

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

www.microcontroladores.com info@microcontroladores.com

Explicacin TRUNC es una de las tres directivas (FLOAT, ROUND y TRUNC) usadas para las expresiones constantes de punto flotante. TRUNC devuelve una constante entera que es la expresin constante dada en punto flotante sin la porcin fraccionaria. Uso de TRUNC TRUNC se puede utilizar para recuperar la porcin del nmero entero de una constante en punto flotante. Por ejemplo: CON OneHalf = Bigger = Int1 = Int2 = Int3 =

0.5 1.4999 trunc(OneHalf) trunc(Bigger) trunc(Bigger * 10.0) + 4

El cdigo anterior crea dos constantes con punto flotante, OneHalf y Bigger, igual a 0.5 y a 1.4999, respectivamente. Las tres constantes siguientes, Int1, Int2 e Int3, son las constantes enteras que se basan en OneHalf y Bigger con la directiva TRUNC. Int1 = 0, Int2 = 1, e Int3 = 18.

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.

3-88

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


VAR byte word long Str[10] Code LargeNumber

www.microcontroladores.com info@microcontroladores.com

Este ejemplo define Str como un array de bytes de 10 elementos, Code como word (dos bytes) y LargeNumber como long (cuatro bytes). Los mtodos pblicos y privados se pueden referir a estas variables de las maneras similares a la siguiente: PUB SomeMethod Code := 60000 LargeNumber := Code * 250 GetString(@Str) if Str[0] == A <more code here>

Hay que fijarse que Code y LargeNumber son utilizados directamente por expresiones. La referencia Str en la lista de parmetros del mtodo de GetString parece diferente; tiene @, el operador del smbolo de direccin, precedindolo. Esto es porque el mtodo ficticio de GetString necesita escribir de nuevo en la variable Str. Si hubiera sido GetString(Str), entonces el primer byte de Str, el elemento 0, habra sido pasado a GetString. Usando al operador del smbolo de direccin, @, se hace que la direccin del Str pase a GetString y as, se puede usar esa direccin para escribir a elementos del Str. Por ultimo, se utiliza Str[0 ] en la condicin del IF para ver si el primer byte es igual al carcter "A". Hay que recordar que, el primer elemento de un array es siempre cero (0). Declaraciones de Variables (Sintaxis 2) Una variacin en el sintaxis 1 permite variables delimitadas con comas del mismo tamao. A continuacin se muestra un ejemplo, similar al ejemplo anterior, pero se declaran dos words, Code e Index. VAR byte Str[10] word Code, Index long LargeNumber

Alcance de Variables Las variables definidas en bloques variables, son globales al objeto en el cual se definen pero no fuera de ese objeto. Esto significa que estas variables se pueden acceder directamente en cualquier sitio dentro del . Los mtodos pblicos y privados tienen la capacidad de declarar sus propias variables locales. Las variables globales no son accesibles desde el exterior de un objeto a menos que la direccin de esa variable se pase a otro objeto con una llamada de un mtodo. 3.3.56. VCFG Registro de Configuracin de Video. VCFG Devuelve: El valor actual del registro de configuracin de video del Cog, si est utilizado como variable fuente.

Explicacin VCFG es uno de dos registros (VCFG y VSCL) que afectan al comportamiento del generador video de un Cog. Cada Cog tiene un mdulo generador de video que facilita la transmisin de datos de la imagen video en un ratio

3-89

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

www.microcontroladores.com info@microcontroladores.com

constante. El registro de VCFG contiene los ajustes de la configuracin del generador de video, segn lo mostrado en la tabla 4-14.

VMode El campo de 2-bit VMode (modo video) selecciona el tipo y la orientacin de la salida de video, si la hay, segn la tabla 4-15.

En ensamblador del Propeller, el campo de VMode se puede escribir convenientemente usando la instruccin de MOVI a travs de los campos de ASubCar. CMode El campo de CMode (modo de color) selecciona modo de dos o cuatro colores. 0 = modo dos colores y 1 = modo de cuatro colores. En ensamblador del Propeller, el campo de VMode se puede escribir convenientemente usando la instruccin de MOVI a travs de los campos de ASubCar. BroadCma El campo BroadCma (broadcast chroma) habilita o inhabilita el chroma (color) en la seal broadcast. 0 = inhabilitado, 1 = habilitado. BaseCma El campo BaseCma (baseband chroma) habilita o inhabilita el chroma (color) en la seal de baseband. 0 = inhabilitado, 1 = habilitado. En ensamblador Propeller, el campo de Vmode se puede escribir convenientemente usando la instruccin de MOVI a travs de los campos de ASubCar. ASubCar El campo ASubCar (aural sub-carrier) selecciona la frecuencia del sub-carrier de la fuente FM (audio) de para modularla. La fuente es el PLLA de uno de los Cogs, identificado por el valor de ASubCar.

3-90

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

www.microcontroladores.com info@microcontroladores.com

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

3-91

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


3.3.57. VSCL Registro de la escala de Video VSCL

www.microcontroladores.com info@microcontroladores.com

Devuelve: El valor actual del Registro de escala de Video del Cog , si se usa como variable fuente.

Explicacin VSCL es uno de dos registros (VCFG y VSCL) que afectan al comportamiento del generador de video de un Cog. Cada Cog tiene un mdulo de generador de video que facilita la transmisin de datos de la imagen video en un ratio constante. El registro de VSCL fija el ratio en la cual se generan los datos de video.

PixelRate El campo 8-bit de PixelRate (tarifa del pxel) indica el nmero de relojes por el pixel; el nmero de los relojes que deben transcurrir antes de que cada pixel sea cambiado de puesto hacia fuera por el mdulo video del generador. Estos relojes son los relojes de PLLA, no el reloj del sistema. FrameRate El campo de 12-bit FrameRate (tarifa del marco) indica el nmero de relojes por marco; el nmero de los relojes que deben transcurrir antes de que cada marco sea cambiado de puesto hacia fuera por el mdulo video del generador. Estos relojes son los relojes de PLLA, no el reloj del sistema. Un marco es uno de largo de datos del pixel (entregados va el comando de WAITVID). Puesto que los datos del pixel son 16-bits por 2-bits, o 32- bits por 1-bit (pxeles del significado 16 de par en par con 4 colores, o 32 pxeles de par en par con 2 colores, respectivamente), el FrameRate es tpicamente 16 o 32 veces que del PixelRate valoran. Uso de VSCL VSCL puede ser leido/escrito como otros registros o variables predefinidas. Por ejemplo: VSCL: = %000000000000_10100000_101000000000 Esto fija el registro video de la escala para 160 un reloj PixelRate y 2.560 un reloj FrameRate (para un 16-pixel por el marco del color 2-bit). Por supuesto, la tarifa real en que los pxeles registra hacia fuera depende de la frecuencia de PLLA conjuntamente con este factor de posicionamiento. 3.3.58. WAITCNT Detiene la ejecucin de un Cog temporalmente. WAITCNT ( Value ) Value es el valor de 32-bits que se desea que el contador del sistema espere. Explicacin WAITCNT, Wait for System Counter,es uno de cuatro comandos de espera (WAITCNT, WAITPEQ, WAITPNE, y WAITVID) usados para detener la ejecucin de un Cog hasta que se resuelve una condicin. WAITCNT detiene el Cog hasta que el contador global del sistema iguala Value. Cuando est ejecutado, WAITCNT activa el hardware especial de "espera" en el Cog que evita que el reloj del sistema cause la ejecucin adicional del cdigo dentro del Cog hasta el momento que los valores del contador del

3-92

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

www.microcontroladores.com info@microcontroladores.com

sistema Value se igualan. El hardware de wait checkea el contador del sistema en cada ciclo del reloj y el consumo de energa del Cog se reduce aproximadamente 7/8s durante este tiempo. En aplicaciones normales, WAITCNT se puede utilizar estratgicamente para reducir el consumo de energa en cualquier sitio del programa donde se pierda el tiempo esperando a eventos de banda estrecha. Hay dos tipos de retrasos WAITCNT se puede utilizar para: retrasos fijos y retrasos sincronizados. Ambos se explican abajo. Retrasos Fijos Los retrasos fijos son los que no tienen relacin con un punto especfico en tiempo y responden al propsito de detener la ejecucin por una cantidad de tiempo fija. Un retraso fijo, por ejemplo, puede ser utilizado para esperar 10 milisegundos despus de que ocurra un acontecimiento, antes de proceder con otra accin. Por ejemplo: CON _clkfreq = xtal1 _xinfreq = 5_000_000 repeat !outa[0] waitcnt(50_000 + cnt)

Fija a cristal lento Usa cristal 5 MHz

Activa el pin 0 Espera 10 ms

Este cdigo activa el estado del pin P0 de E/S y espera 50.000 ciclos de reloj del sistema antes del loop de repeticin. IMPORTANTE: Desde que WAITCNT detiene el Cog hasta que el contador del sistema lo empareja al valor dado, hay que tener cuidado para asegurarse que el valor dado no haya sobrepasado ya el contador del sistema

Retrasos Sincronizados Los retrasos sincronizados son los que estn relacionados directamente con un punto especfico en el tiempo, un tiempo base, y sirven a para alinear en el tiempo acontecimientos futuros, en relacin con ese punto. Los retrasos sincronizados, por ejemplo, pueden utilizarse para hacer salir o entrar una seal en un intervalo especfico. Para entender la diferencia con el retraso fijo, miremos el diagrama que mide el tiempo de ese ejemplo.

La figura anterior muestra la salida del ejemplo anterior de retraso fijo. Se puede ver como el pin P0 se activa cada 10 milisegundos, aunque no es exacto. De hecho, hay un error acumulativo que hace que el retraso sea cada vez mayor. Se puede usar WAITCNT de una manera levemente diferente, porque el retraso sincronizado, eliminar este error de sincronizacin. El ejemplo siguiente asume que estamos utilizando un cristal externo de 5 Mhz. CON _clkfreq = xtal1 _xinfreq = 5_000_000 PUB Activa | Time Time := cnt repeat waitcnt(Time += 50_000)

Se fija un cristal lento Usa 5 MHz cristal

Recoge el valor actual del contador de Sis Espera 10 ms

3-93

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


!outa[0] Activa pin 0

www.microcontroladores.com info@microcontroladores.com

Este cdigo, primero recupera el valor del contador del sistema, entonces comienza el bucle Repeat donde espera el contador de sistema alcance Time + 50.000, se activa del estado del pin P0 de E/S y repite bucle otra vez. La declaracin Time + = 50_000 es realmente una declaracin de asignacin; que suma al valor Time 50.000, almacena el resultado nuevamente dentro de Time y despus ejecuta el comando de WAITCNT usando ese resultado. Cada iteracin sucesiva, espera a que el contador del sistema sea a igual otro mltiplo de 50.000 a partir del tiempo base. Este mtodo compensa automticamente el tiempo consumido arriba por las declaraciones del bucle: repeat,!outa[0 ] y waitcnt. La salida que resulta parece la siguiente figura.

3.3.59. WAITPEQ Detiene la ejecucin de un Cog hasta que los pins de E/S coincida con los estados designados. WAITPEQ (State, Mask, Port ) State es el estado lgico para comparar los pins. Es un valor 32-bits que indica los estados altos o bajos de hasta 32 pins de E/S. Solamente el estado de los bits que corresponden a los bits altos (1) de la Mask (mscara) se utilizan para la comparacin. Mask (mscara) es el/los pin(s) que se quieren supervisar. Mask es un valor 32-bits que contiene los bits altos (1) para cada pin de E/S que deban ser supervisados; los bits bajos (0) indican los pins que deben ser ignorados. Los pins supervisados se comparan con los bits correspondientes de State hasta que la condicin se cumpla. Port (puerto) es un valor de 1-bit que indica el puerto de E/S al monitor; 0 = Puerto A, 1 = Puerto B. Solo existe el Puerto A en el chip Propeller actual (P8X32A).

Explicacin WAITPEQ, " Wait for Pin(s) to Equal, " es uno de cuatro comandos de espera (WAITCNT, WAITPEQ, WAITPNE, y WAITVID) usados para detener ejecucin de un Cog hasta que se resuelve una condicin. WAITPEQ detiene el Cog hasta que por lo menos uno de los pins de E/S del puerto, indicado por alto (1) en la mscara, no coincide con los bits correspondientes del estado. Cuando est ejecutado, WAITPEQ activa el hardware especial "wait" en el Cog, que evita que el reloj del sistema cause una ejecucin adicional de cdigo dentro del Cog, hasta el momento que el pin sealado, o el grupo de pins, no coincida con los del estado. El hardware de wait chequea los pins de E/S en cada ciclo del reloj del Sistema y el consumo de energa del Cog se reduce aproximadamente 7/8s durante este tiempo. Uso de WAITPEQ WAITPEQ es una gran manera de sincronizar cdigo a los acontecimientos externos. Por ejemplo: waitpeq(%0100, %1100, 0) outa[0] := 1 Espera a que P3 & P2 sean bajo & alto 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

3-94

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

www.microcontroladores.com info@microcontroladores.com

usando el operador Decodificar en modo bit "|<". Por ejemplo, si el nmero de pin fue especificado por la variable Pin, y se necesita esperar hasta que ese pin sea alto, se podra utilizar el siguiente cdigo: waitpeq(-1, |< Pin, 0) 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) waitpeq(0, 5, 0) Espera al Pin 5 que sea alto 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 BAJO; una transicin altoa-baja. Si se hubiera utilizado la segunda lnea del cdigo, el Cog no se habra detenido si P5 hubiese sido bajo en el comienzo. 3.3.60. WAITPNE Detiene la ejecucin de un Cog hasta que los pins de E/S no sean igual a los estados designados. WAITPNE (State, Mask, Port ) State es el estado lgico para comparar los pins. Es un valor 32-bits que indica los estados altos o bajos de hasta 32 pins de E/S. Solamente el estado de los bits que corresponden a los bits altos (1) de la Mask (mscara) se utilizan para la comparacin. Mask (mscara) es el/los pin(s) que se quieren supervisar. Mask es un valor 32-bits que contiene los bits altos (1) para cada pin de E/S que deban ser supervisados; los bits bajos (0) indican los pins que deben serignorados. Los pins supervisados se comparan con los bits correspondientes de State hasta que la condicin no se cumpla. Port (puerto) es un valor de 1-bit que indica el puerto de E/S al monitor; 0 = Puerto A, 1 = Puerto B. Solo existe el Puerto A en el chip Propeller actual (P8X32A).

Explicacin WAITPNE, " Wait for Pin(s) to Not Equal, " es uno de cuatro comandos de espera (WAITCNT, WAITPEQ, WAITPNE, y WAITVID) usados para detener ejecucin de un Cog hasta que se resuelve una condicin. WAITPNE es la forma complementaria de WAITPEQ; detiene el Cog hasta que por lo menos uno de los pins de E/S del puerto, indicado por alto (1) en la mscara, no coincide con los bits correspondientes del estado. Cuando est ejecutado, WAITPNE activa el hardware especial "wait" en el Cog, que evita que el reloj del sistema cause una ejecucin adicional de cdigo dentro del Cog, hasta el momento que el pin sealado, o el grupo de pins, no coincida con los del estado. El hardware de wait chequea los pins de E/S en cada ciclo del reloj del Sistema y el consumo de energa del Cog se reduce aproximadamente 7/8s durante este tiempo.

Uso de WAITPNE WAITPNE es una gran manera de sincronizar cdigo a los acontecimientos externos. Por ejemplo: waitpeq(%0100, %1100, 0) waitpne(%0100, %1100, 0) outa[0] := 1 Espera a que P3 & P2 sean & y alto Espera a que P3 & P2 no coincida con el estado prev 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.

3-95

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


3.3.61. WAITVID

www.microcontroladores.com info@microcontroladores.com

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.

3-96

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

www.microcontroladores.com info@microcontroladores.com

Explicacin WORD es uno de tres declaraciones multiusos (BYTE, WORD, y LONG) que declaran o operan en memoria. WORD se puede utilizar para: 1) declarar un smbolo tamao-word o un array de simbolos de elementos tamao-word en un bloque del VAR, o 2) declarar datos de tipo alineacin de words, y/o tamao-word, en un bloque de DAT, o 3) leer o escribir una word de la memoria principal en una base de direccin con un ajuste opcional. Declaracin de la Variable Word (Sintaxis 1) En bloques VAR, sintaxis 1 de WORD se utiliza para declarar las variables globales, variables simblicas tanto tamao-word como cualquier array de words. Por ejemplo: VAR word Temp word List[25]

Temp es una word(2 bytes) 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 List[0] := 500 List[1] := 9_000 List[24] := 60_000

Fija Temp a 25,000 Fija el primer elemento de List a 500 Fija el Segundo elemento de List a 9,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 MyList byte word $FF99, 1_000

Datos alineados y de tamao word 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 bytealineado pero de tamao-word en memoria principal. Los valores de MyList, en memoria principal, son $FF99 y 1.000, respectivamente. Cuando se accede a un byte a la vez, MyList contiene $99, $FF, 232 y 768 puesto que los datos se almacenan en formato endian-pequeo. Estos datos se compilan en el objeto y en la aplicacin resultante como parte del cdigo ejecutable y se pueden acceder usando la forma de lectura / escritura, sintaxis 3, de WORD . Lectura / escritura de Words en Memoria Principal (Sintaxis 3) En los bloques PUB y PRI, la sintaxis 3 de WORD se utiliza para leer o para escribir valores de tamao-word de la memoria principal. Si se asume que nuestro objeto contiene el bloque DAT del ejemplo arriba, se poda utilizar el siguiente para tener acceso a esos datos. PUB GetData | Index, Temp Temp := WORD[MyData] Lee la primera word de MyData a Temp <do something with Temp> Realizar una tarea con Temp repeat Index from 0 to 1 Repetir dos veces Temp := WORD[MyList][Index] Lee el dato a Temp 1 word por vez <do something with Temp> Realizar una tarea con valor Temp

3-97

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

www.microcontroladores.com info@microcontroladores.com

La primera lnea dentro del mtodo de GetData, arriba, utiliza la declaracin de WORD para leer una word de la memoria principal en la localizacin MyData y lo almacena en Temp, en este caso, el valor 640. Mas abajo, en el loop del REPEAT, la declaracin de WORD lee una word de la memoria principal de la localizacin MyList + ndice y la almacena en Temp. Puesto que la primera iteracin del loop tiene ndice fijado a 0, la primera word de MyList se lee, en $FF99. La prxima vez que pasa por el loop lee la siguiente word, efectivamente, MyList + 1 (1.000). Usando una sintaxis similar, las words de la memoria principal se pueden escribir a tambin, mientras son localizaciones del RAM. Por ejemplo: WORD[MyList][0] := 8_192 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

3-98

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

www.microcontroladores.com info@microcontroladores.com

WORDMOVE es uno de tres comandos (BYTEMOVE, WORDMOVE, y LONGMOVE) usados para copiar bloques de la memoria principal a partir de una rea a otra. WORDMOVE copia Count words de la memoria principal que empiezan desde SrcAddress a la memoria principal que comienza en DestAddress. Uso de WORDMOVE WORDMOVE es una gran manera de copiar bloques grandes de memoria tamao-word. Por ejemplo: VAR word Buff1[100] word Buff2[100] PUB Main wordmove(@Buff2, @Buff1, 100)

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.

3-99

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

www.microcontroladores.com info@microcontroladores.com

3-100

Você também pode gostar