resumen_proyecto3_2p
DESCRIPTION
Resumen de la materia proyecto 3, enfoque sobre arduino y propellerTRANSCRIPT
Arduino
Lenguaje: Processing/Wiring (basado en JAVA)
Microprocesador: AtMega8
Open-Hardware: de libre acceso
Placas: Serie, USB, Prototipos, stand-alone, Shields
Placa serie: puerto RS232
Placa USB: puerto USB
Arduino UNO:
Microcontrolador: ATmega328
Memoria Flash: 32 Kb
RAM: 2 Kb
EEPROM: 1 Kb
Placa de Prototipos:
Matriz de agujeros para hardware adicional
Es necesaria otra placa para la programación
Placa Stand-Alone:
Todos los esquemas del Arduino están disponibles para hacerlo en un protoboard.
Shields:
Placas para montar encima de las placas Arduino para extender sus funcionalidades.
Ejemplos: Xbee (intercomunicador inalámbrico), Motor Shield(controlar motores y encoders),
Ethernet Shield (conectar el Arduino a red Ethernet)
Utilización: desarrollo de objetos interactivos autónomos.
Lenguaje:
Setup(): llamado al comienzo del programa para inicializar variables, definir los modos de los
pines, indicar librerías, etc.
Loop(): es un bucle que se repite indefinidamente. Es donde va el programa principal.
Sketch: nombre utilizado para un programa.
Comentarios: una línea//, multilíneas /*…*/
Algunas funciones:
pinMode(Pin, Modo E/S)
digitalWrite(Pin, Modo H/L)
delay(tiempo(ms))
Variables:
Char: caracteres ASCII, 1 byte, char var=’…’
Byte: 8 bits, valores numéricos de 127 a -128, byte numero …
Int: tipo entero de datos, 16 bits, rango de -32768 a 32767
Long: tipo dato largo o entero largo, 32 bits, rango de -2.147.483.648 a 2.147.483.647
Boolean: valores true/false, boolean var = …
Vector: estructura de datos int Vec[longitud]={}
Int digitalRead(pin): captura el valor del pin digital especificado (1/0)
Int analogRead(pin): captura el valor del pin analógico especificado (0/1024)
analogWrite(pin, valor): asigna un valor analógico al pin especificado, no es necesario declarar
pines analógicos como E/S.
Serial.begin(9600): inicializa el puerto serial a 9600
println: imprime línea a línea en el Serial Monitor
if(): comprueba si la condición contenida () se ha cumplido
if()…else: agrupa múltiples comprobaciones
for: realiza el control sobre una secuencia de repetición. Ej: for (int=1; i<=8, i++) {…}
switch case: estructura de control del flujo. Switch (var) {case var: … break; }
Arduino Software: IDE (Integrated Development Enviroment), Processing, JAVA
Librerías: proven funcionalidad extra al sketch. Importar librerías primero
EEPROM, Ethernet, Firmata, LiquidCrystal, Servo, SoftwareSerial, Stepper, Wire.
Propeller
El Propeller proporciona flexibilidad y potencia a través de sus ochos procesadores, llamados Cogs,
que puede realizar simultáneamente tareas independientes o cooperativas. Los Cogs comparten de
E/S y otros recursos.
Cada uno de estos ochos procesadores (Cogs) es de 32 bits, con una velocidad de procesos de 20
MIPS usando un pulso de reloj de 80 MHz. Es decir, en un momento en que están trabajando todos
los Cogs, tenemos una capacidad de proceso de 160 MIPS.
Cada procesador tiene su propia RAM local de 2Kb (512 registros de 32 bits). También existe una
memoria común, compartida, que se divide en dos secciones: una RAM de 32 Kb y una ROM de 32
Kb.
Especificaciones
La arquitectura del Propeller
La arquitectura del Propeller se basa en:
8 procesadores, denominados Cogs
Recursos propios de cada procesador
Recursos compartidos
Un controlador principal, llamada Hub.
El Hub se encarga de:
1. Mantener la integridad del sistema
2. Asignar el funcionamiento de los Cogs y el reparo de los recursos comunes
3. Controlar que el Cogs pueda tener acceso a los recursos comunes-exclusivos (mutuo-
exclusivo), tales como RAM/ROM principal, registros de configuración, etc.
4. Proporcionar el acceso exclusivo a los recursos siguiendo el procedimiento “Round
Robin”, sin importar cuantos Cogs están funcionando.
Los recursos compartidos:
Hay dos tipos de recursos compartidos en el Propeller:
1. Común
2. Mutuo-exclusivo
Los recursos comunes se pueden emplear cualquier momento por cualquier número de
Cogs.
Los recursos mutuo-exclusivos se puede alcanzar por cualquier Cog, pero solamente un
Cog a la vez.
Los recursos comunes
son los pines de E/S y el
contador del sistema. El
resto de los recursos
compartidos son mutuo-
exclusivos por
naturaleza y el acceso a
ellos es controlado por
el Hub.
EL reloj del sistema
El reloj del sistema es el oscilador principal o central para casi todos los componentes del
Propeller
La señal del reloj del sistema se proporciona a partir de una de las tres posibles fuentes:
o El oscilador interno de RC
o El circuito de PLL
o El oscilador de cristal
La fuente se determina en los ajustes del registro CLK, que es seleccionable en tiempo de
ejecución.
Un oscilador externo puede usar el multiplicador PLL que puede ser de 1x, 2x, 4x, 8x, 16x y
puede ser modificado en tiempo de ejecución.
El reloj puede ir de 32Khz hasta 80Mhz.
Cogs (procesadores).
El Propeller contiene ocho procesadores, llamados Cogs, numerados del 0 a 7.
Cada Cog contiene los siguientes componentes:
o Un procesador
o RAM local de @Kb configurados como 512 registros
o Dos asistentes de E/S
o 2 PLLs
o Un generador de video
o Registro de salida de E/S
o Registro de dirección de E/S
Pueden ejecutar tareas independientes
Pueden ejecutar instrucciones simultáneamente
Pueden tener acceso a los mismos recursos compartidos, como los pines de E/S, la RAM
global, y el contador del sistema
Pueden arrancar y parar en el tiempo de ejecución
El Hub
Para mantener la integridad del sistema, los recursos mutuo-exclusivos no debe ser accedido por
más 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
EL Hub y el bus que controla, funcionan la mitad de la frecuencia de reloj del sistema. Esto
significa que el Hub da acceso al Cog a los recursos mutuo-exclusivos una vez cada 16 ciclos de
reloj del sistema
Pines de E/S
El Propeller tiene 32 pines de E/S, 28 de los cuales están destinados para fines de propósito
general. Cuatro pines de E/S (28-31) son de propósito especial durante el arranque y luego están
disponibles para usos generales
Después 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 común.
Contador del Sistema (común)
Es un contador global de 32 bits.
Los Cogs pueden leer el contador del sistema (vía su registro CNT) para realizar cálculos de
sincronización y pueden utilizar el comando de WAITCNT para crear retrasos eficaces
dentro de su proceso.
Registro CLK (común)
El registro de CLK es el de control de configuración del reloj del sistema; determina la
fuente y las características del Reloj del Sistema.
El registro de CLK configura el oscilador RC, el reloj PLL, el oscilador de cristal, y los
circuitos del selector del reloj.
Es configurado en el tiempo de compilación por la declaración CLKMODE
Semáforos (mutex)
Hay ocho semáforos disponibles para facilitar el acceso exclusivo a los recursos definidos
por el usuario entre los múltiples Cogs.
Los semáforos son bits globales accedidos a través del Hub con las siguientes instrucciones:
LOCKNEW, LOCKRET, LOCKSET y LOCKCLR.
Los semáforos solo pueden ser accedidos a través del Hub, sólo un Cog a la vez puede
afectarlos
Memoria Principal (mutex)
La memoria principal es un bloque de 64 K bytes que es accesible por todos los Cogs como
recurso mutuo-exclusivo a través del Hub.
Está formada por 32 KB de RAM y 32 KB de ROM.
Los 32 KB de RAM principal son de propósito general y constituyen el destino de una
“aplicación Propeller”, que puede ser descargada de un host o cargada de los 32 KB de
EEPROM externa.
La ROM se utiliza para almacenar la definición de caracteres, funciones matemáticas, el
Boot Loader y el intérprete Spin.
Definición de caracteres
La primera mitad de la ROM contiene un sistema de 256 definiciones de carácter. Cada definición
de carácter corresponde a 16 píxeles de ancho y 32 píxeles de alto. Estas definiciones de carácter
se pueden utilizar para las presentaciones de vídeo, LCD gráfico, impresión, etc.
El arranque o reset
El proceso de encendido o reset se divide en las siguientes fases:
1. Carga el programa embebido del Boot Loader al Cog 0 y arranca.
2. El Boot loader realiza una o más de las siguientes tareas en este orden:
a. Detecta la comunicación de un host, en los pines P30 y P31. Si se detecta conversa con
el host para identificar el chip Propeller y posiblemente para descargar un programa
en RAM global y opcionalmente en la EEPROM externa de 32Kb.
b. Si no se detectó ninguna comunicación, el Boot Loader busca la EEPROM externa 32Kb
en los pines P28 y P29. Si se detecta una EEPROM, se carga los 32KBen 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 y 2b son capaces de cargar un programa a la RAM global, y el host no ha
mandado un comando de suspensión., el Cog 0 se re arranca con el intérprete Spin y el
código del usuario se ejecuta desde la RAM global.
Entorno de desarrollo
Software Propeller
El software del Propeller consta de:
Un archivo ejecutable
Unos archivos de ayuda on-line
Archivos de la biblioteca Propeller
Cada archivo de la biblioteca es un objeto independiente, disponible para utilizar en los proyectos
Propeller, con código fuente y documentación incorporada. Son realmente archivos de texto, que
pueden ser corregidos en cualquier editor de texto.
Documentación
Es posible escribir la documentación de usuario para un objeto dentro del archivo fuente del objeto.
Esto significa que habrá menos archivos para mantener
Para permitir este proceso, sean creados dos tipos de comentarios en la fuente:
1. Los comentarios código
2. Comentario de documento
El lenguaje Spin
El Propeller puede ser programado en asembler o en un lenguaje propio llamado Spin.
Bloques de código
CON: declaración de constantes
VAR: declaración de variables
OBJ: declaración de referencias de objetos
PUB: declaración de métodos públicos
PRI: declaración de métodos privados
DAT: declaración de datos
Control de Cog
COGID: obtener el ld de Cog actual
COGNEW: iniciar el siguiente Cog disponible
COGINIT: iniciar o reiniciar un Cog por su ld
COGSTOP: detener un Cog por su ld
REBOOT: resetear el chip Propeller
Control de proceso
LOCKNEW: comprobar un nuevo semáforo
LOCKRET: devolver semáforo
LOCKCLR: pone un semáforo a eros por ld
LOCKSET: fijar un semáforo por ld
WAITCNT: espera a que el contador del sistema alcance el valor
WAITPEQ: esperar a que el pin se iguale a un valor
WAITPNE: espera que el pin no se igual a un valor
WAITVID: espera a la sincronización de video y repartir el siguiente grupo color/pixel
Control de flujo
IF, ELSEIF, ELSE
CASE, OTHER
REPEAT… FROM… TO… STEP… UNTIL… WHILE
NEXT: salta el resto del bloque REPEAT y va a la siguiente iteración del bucle
QUIT sale del bucle REPEAT.
RETURN sale de PUB/PRI con estado normal y opcionalmente con un valor de retorno
ABORT sale de PUB/PRI con estado de abort y opcionalmente con un valor de retorno
Operaciones sobre pines
Dira[pin] configura un pin como entrada o salida
o Dira[1]:=1 configura como salida
o Dira[2]:=0 configura como entrada
Outa[pin] configura el pin como alto o bajo
o Outa[4]:=1 coloca el P4 como alto
o Outa[4]:=0 coloca como bajo
Ina[pin] lee un pin
Retrasos de tiempo
Los tres constructores de bloques básicos para un evento de tiempo en Spin son:
Cnt un registro que cuenta los ciclos de reloj
Clkfreq un comando que regresa la frecuencia del reloj en hz
Waitcnt un comando de espera a que el registro cnt tenga cierto valor
o waitcnt (clkfreq + cnt) ' espera por 1 s
o waitcnt(clkfreq/1000 + cnt) ' espera 1 ms
Definición del reloj de un sistema
El reloj del sistema se define en el bloque CON de la siguiente manera:
CON
o _xinfreq = 5_000_000
o _clkmode = xtal1 + pll16x
Comando Repeat
Existen diferentes formas de modificar el ciclo repeat para contar hasta cierto valor y parar.
repeat 20 ' Repite el ciclo 20 veces
repeat until valor == 20 ' Repite hasta que valor es igual a 20
repeat while valor < 20 ' Repite mientras que valor es menor que 20
repeat valor from 0 a 18 step 2 ‘asigna a valor los valores de 0 a 18 de dos en dos