2 votos

PIC16: Comprender el límite del argumento _delay

Mi compilador de PIC16, XC8, define un _delay(n) pseudofunción que inserta un retardo de n ciclos. Sin embargo, existe una restricción (véase aquí página 59):

El argumento delay debe ser una constante aproximadamente 179.200 para dispositivos PIC18 y aproximadamente 50.659.000 para otros dispositivos.

¿De dónde proceden estos límites superiores? La factorización de 50.659.000 (2^3 * 5^3 * 7 * 7237) no parece arrojar ninguna luz.

3voto

Rob Lachlan Puntos 7880

_delay se genera en tiempo de compilación, por lo que el código no es necesariamente el mismo para todos los valores, pueden rellenar, o incluso bucles compuestos para lograr el número exacto deseado de ciclos.

50659000/2^(8*3) es aproximadamente 3. Así que probablemente el bucle central que están usando es un bucle de 3 instrucciones (si es un microcontrolador de 8 bits, se necesitan 3 decrementos para una variable de 3*8 bits). Como salta en 3, pueden rellenar con uno o dos nop para obtener el número exacto de ciclos. Esto requiere que la instrucción decremento y salto si/no cero sea posible (y con/sin carry).

1voto

RelaXNow Puntos 1164

En primer lugar, si la respuesta importa, entonces no deberías utilizar un compilador.

En segundo lugar, independientemente de la razón por la que quieras saberlo, la respuesta es buscar en el código fuente. Probablemente se implementa como algún tipo de macro en tiempo de compilación. Si es así, el código fuente tiene que estar donde se pueda ver. Si llama a una rutina de biblioteca, puede que no esté disponible. Sin embargo, todavía se puede construir un programa de prueba con él y luego un solo paso a través de la demora en la ventana de memoria del programa en MPLAB para ver lo que está pasando.

Lo más probable es que los números impar procedan de bucles anidados. El bucle interno es probablemente el mínimo necesario para hacer la comprobación de la condición final del bucle y el bucle, por lo que sale a tantos ciclos como salga. Esto podría introducir factores primos de aspecto extraño en los ciclos máximos.

En cualquier caso, esta es una mala forma de hacer retrasos de más de unos pocos ciclos. Usted nunca debe estar en cualquier lugar cerca de la máxima esta función puede retrasar. Si te encuentras queriendo retrasar más de unas pocas µs, entonces deberías repensar tu arquitectura. Haz una temporización más larga con una interrupción periódica regular, por ejemplo.

Añadido:

También me acabo de dar cuenta de que se dice que los retrasos máximos fueron aproximadamente el número de ciclos indicados. No se puede deducir nada significativo de los factores primos de los valores aproximados.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X