Práctica básica de E/S y tiempo
Las dos variables globales en el objeto ButtonShiftSpeed se pueden reemplazar con variables locales
como sigue:
Remueva el bloque
Agregue el símbolo pipa a la derecha del bloque de declaración de método seguido por los
dos nombres de variables separados por comas, pruebe si el programa funciona igual.
PUB ShiftLedsLeft | pattern, divide
Las variables
y
pattern
pueden usarlas; ya que nuestro objeto aquí solo tiene un método no hay consecuencias. Hay otra
diferencia. Cuando usábamos la sintaxis del bloque
variables globales como byte, Word o Long. Sin embargo las variables locales se definen
automáticamente como Long y no hay opcion para tamaños de byte o Word en variables locales.
Aplicaciones de tiempo
Para aplicaciones de reloj y tiempo es importante eliminar todos los errores posibles excepto por la
precisión del cristal oscilador. Observe los dos objetos que desarrollan tareas de reloj. Asumiendo que
usted tiene un cristal muy preciso el programa a la izquierda tiene un serio problema! El problema es
que cada vez que se repite el ciclo, el ciclo de reloj transcurrido durante la ejecución de los comandos
en el ciclo no se cuentan, y esto retraso desconocido se acumula junto con
numero de segundos de la variable
mucha más que el solo error inducido por el rango del cristal +/- PPM.
''Archivo: TimekeepingBad.spin
CON
_xinfreq = 5_000_000
_clkmode = xtal1 + pll1x
VAR
long seconds
PUB BadTimeCount
dira[4]~~
repeat
waitcnt(clkfreq + cnt)
seconds ++
! outa[4]
El programa a la derecha resuelve el problema agregando dos variables:
tiempo se coloca con
dT := clkfreq
tiempo particular de inicio se marca con
tiene que esperar se calcula con
waitcnt
pasar por el ciclo genera una diferencia precisa del valor original marcado en el valor de
sistema cada nuevo valor para
tareas se ejecuten entre las ejecuciones del comando
menos de un segundo. Así que el programa de la derecha nunca perderá ciclos de reloj y mantendrá
Pagina 64 · Kit Educativo de Prácticas Propeller: Fundamentos
(incluyendo su declaración de byte variable).
VAR
ahora son locales, lo que significa que otros métodos en el objeto no
divide
estará desfasada y crecerá significativamente cada día
seconds
lo cual hace que
T := cnt
T += dT
es exactamente el valor de 1 segundo. No importa cuántas
waitcnt
, teníamos la opcion de definir nuestras
VAR
''Archivo: TimekeepingGood.spin
CON
_xinfreq = 5_000_000
_clkmode = xtal1 + pll1x
VAR
long seconds, dT, T
PUB GoodTimeCount
dira[9..4]~~
dT := clkfreq
T := cnt
repeat
T += dT
waitcnt(T)
seconds ++
outa[9..4] := seconds
iguale el numero de ciclos en un segundo. Un
dT
. Dentro del ciclo el siguiente valor de
. (Usted puede usar
T := T + dT
, siempre y cuando se complete en
waitcnt
. Así que el
clkfreq + cnt
and
. Un incremento de
T
dT
cnt
) sumando
a
dT
. Con este
T
que
al
T