La Figura 2-3 muestra la salida de nuestro ejemplo anterior, el ejemplo de pausa fija. Observe
como el P0 de los pins E/S cambia cada 10 milisegundos, pero ¿no exactamente? De hecho
hay un error acumulativo que se hace sucesivo al estado de los cambios y se va quedando
fuera d sincronía en relación a nuestro inicio, 0 ms. La pausa es 10 ms en longitud, pero el
error ocurre porque la pausa no compensa la longitud del resto del ciclo. Las instrucciones
repeat, !outa[0]
WAITCNT
y
suma a la pausa de los 10 ms que se especifico en
WAITCNT
Usando
de una forma diferente, para una pausa sincronizada, eliminaremos este
error. El siguiente ejemplo asume que estamos usando un cristal externo de 5 MHz.
CON
_clkfreq = xtal1
_xinfreq = 5_000_000
PUB Toggle | Time
Time := cnt
repeat
waitcnt(Time += 50_000)
!outa[0]
Este código primero recupera el valor del contador del sistema,
repeat
ciclo
donde espera por el contador del sistema para alcanzar
estado del pin E/S Pin P0 y repite el ciclo. La instrucción
instrucción de asignación; Suma el valor de
Time
a
y luego ejecuta la instrucción
recuperado el valor del contador del sistema solo una vez, al inicio del ejemplo; que es
nuestro tiempo base. Luego esperamos por el contador del sistema para igualar esa base
original de tiempo mas 50,000 y desarrollar las acciones en el ciclo. Cada iteracion sucesiva a
través del ciclo esperara por el contador del sistema para igualar a otro múltiplo de 50,000 de
2: Referencia de Lenguaje Spin –
Figura 2-3: Tiempo en Pausa Fija
toma un poco de tiempo en ejecutarse, y el y ese tiempo extra se
WAITCNT
'Activa a cristal lento
'Usa un cristal de 5MHz de precision
'Obtiene el valor actual del contador
'Espera 10 ms
'Cambia Pin 0
Time
a 50,000, almacena ese resultado de regreso
WAITCNT
usando ese resultado. Observe que hemos
WAITCNT
.
Time := cnt
, luego inicia el
Time
+ 50,000, cambia el
Time += 50_000
es actualmente una