WAITCNT
– Referencia de Lenguaje Spin
Este código cambia el estado del pin E/S pin 0 y espera 50,000 ciclos de reloj de sistema
antes de repetir el ciclo nuevamente. Recuerde que el parámetro Value debe ser el valor
deseado de 32-bit a igualar contra el valor del valor del Reloj del Sistema. Como el reloj del
sistema es un recurso global que cambia cada ciclo de reloj, para retrasar por un cierto
numero de ciclos desde "ahora" se necesita un valor que se agregue al valor actual del
cnt
50_000 + cnt
contador del sistema. El
en "
" es el registro variable del contador del
sistema; regresa el valor del contador del sistema en ese momento a tiempo. así nuestro
código dice esperar 50,000 ciclos mas el valor actual del contador del sistema; Ejemplo:
espera 50,000 ciclos "desde este momento". Asumiendo que un cristal externo de 5MHz esta
h
siendo usado, 50,000 ciclos es alrededor de 10ms (1/100
segundo) de tiempo.
WAITCNT
IMPORTANTE: Como
detiene el cog hasta que el contador del sistema iguala al
valor dado, se debe tener cuidado de asegurar que el valor dado no se ha pasado por el
contador del sistema. Si el contador del sistema ya paso el valor dado antes de que se active el
hardware de espera entonces el cog aparecerá como detenido permanentemente cuando, de
hecho, esta esperando que el contador exceda los 32 bits y regrese nuevamente al valor dado.
Aun a 80 MHz, toma arriba de 53 segundos para un contador de sistema darle la vuelta!
WAITCNT
Relacionado a esto, cuando use
en código Spin como se muestra arriba, asegúrese de
Offset + cnt
escribirla expresión Value de la misma forma que lo hicimos: en la forma "
" Y
cnt + Offset
no "
." Esto es porque el interprete spin evaluara la expresión de izquierda a
cnt
derecha, y cada evaluación intermedia en una expresión tomo tiempo desarrollarse. Si
se
coloca al inicio de la expresión, el contador del sistema lo leerá primero y despues el resto de
la expresión será evaluada, tomando un desconocido monto de ciclos y haciendo nuestro
cnt
valor
muy viejo para el momento en que el resultado final se calcula. Sin embargo
cnt
WAITCNT
teniendo
como el ultimo valor en la expresión
se asegura un monto fijo de
tiempo extra (ciclos) entre la lectura del contador del sistema y la activación del hardware de
espera. De hecho el interprete toma 381 ciclos del tiempo extra final cuando la instrucción se
. Esto significa que el valor de
debe ser
waitcnt(Offset + cnt)
Offset
escribe de la forma
siempre al menos 381 para evitar inesperados retrasos largos.
Pausas Sincronizadas
Sincronizar los retrasos son aquellos que están relacionados directamente a un punto
especifico en el tiempo, un tiempo "base", y sirve al propósito de "alineación de tiempo" de
eventos futuros relativos a ese punto. Una pausa sincronizada, por ejemplo, puede usarse para
sacar o ingresar una señal en un intervalo especifico, sin importar el monto desconocido de
tiempo asociado con el código mismo. Para entender como esta situación es diferente a una
pausa fija veamos el siguiente ejemplo en el diagrama:
Pagina 224 · Manual Propeller v1.1