Lista de Códigos de Objetos
SquareWave.spin
'' De Parallax Inc. Kit Educativo Propeller
'' SquareWave.spin
''Puede usarse para hacer alguno de los dos módulos contadores del cog
''para transmitir ondas cuadradas
PUB Freq(Module, Pin, Frequency) | s, d, ctr
'' Determina parámetros CTR para síntesis de 0..128 MHz en pasos de 1 Hz
''
'' entrada:
Pin = pin para salida de frecuencia
''
Freq = actual Hz para sintetizar
''
'' salida:
ctr y frq tienen valores ctra/ctrb y frqa/frqb
''
''
Usa modo NCO %00100 para 0..499_999 Hz
''
Usa modo PLL %00010 para 500_000..128_000_000 Hz
''
Frequency := Frequency #> 0 <# 128_000_000
if Frequency < 500_000
ctr := constant(%00100 << 26)
s := 1
else
ctr := constant(%00010 << 26)
d := >|((Frequency - 1) / 1_000_000)
s := 4 - d
ctr |= d << 23
spr[10 + module] := fraction(Frequency, CLKFREQ, s)
ctr |= Pin
spr[8 + module] := ctr
dira[pin]~~
PUB NcoFrqReg(frequency) : frqReg
{{
Regresa frqReg = frequency × (2³² ÷ clkfreq) calculada con división long binaria.
Esto es más rápido que la librería de punto flotante y toma menos espacio de código.
Este método es una adaptación del método fracción del objeto CTR
}}
frqReg := fraction(frequency, clkfreq, 1)
PRI fraction(a, b, shift) : f
if shift > 0
a <<= shift
if shift < 0
b <<= -shift
repeat 32
f <<= 1
if a => b
a -= b
f++
a <<= 1
Pagina 198 · Kit Educativo de Prácticas Propeller: Fundamentos
Practica de Contadores y Circuitos
'limite de frecuencias
'si 0 a 499_999 Hz,
'..activa modo NCO
'..shift = 1
'si 500_000 a 128_000_000 Hz,
'..activa modo PLL
'determina PLLDIV
'determina shift
'activa PLLDIV
'calcula frqa/frqb value
'activa PINA para
'completar valores ctra/ctrb
'si shift, pre-shift a o b izq
'para mantener bits significativos
'mientras asegura resultado
'realiza división long de a/b