Paso 5: ¿Cuál es el punto entonces?
Debe quedar bastante claro que escribir directamente a los registros puede ahorrar espacio en la memoria del chip. El bosquejo acortado también toma menos tiempo para ejecutar simplemente porque no hay bibliotecas para ver para cada llamada de función. Para la mayoría de las aplicaciones, esto no tendrá ningún uso real porque elimina una función como pinMode() no guardar mucho tiempo o espacio en un dibujo complejo. Sin embargo en algunas aplicaciones el tiempo de procesamiento es una preocupación enorme, y acortar la cantidad de tiempo perdido en los archivos de biblioteca permite más ciclos de reloj para otras cosas. Lo que quiero decir por eso es que aunque debe incluyen una función de biblioteca y por lo tanto ocupan espacio en memoria con ella, si no llama a muy a menudo y en lugar de otro utilizar los registros directamente, por lo menos ahorras tiempo (pero no espacio) por no mirando para arriba.
Otra opción es la habilidad de usar pernos de maneras que pueden no haber sido previstos originalmente, pero sin efectos secundarios. Por ejemplo, las patillas asociadas con PWM en el chipKIT Uno32 tienen un registro adicional asociado con ellos que en el módulo de comparación de salida (OCMP) llamado la salida comparan registro (OCxR). La OCMP tiene algunos registros más que lidiar con la sincronización de la señal PWM, pero la OCxR es el registro de salida de señal, similar al LATx (PIC32) o registros PORTx (ATMEL). El período PWM se calcula multiplicando... (fácil pero confusas cosas de matemáticas aquí)... y que valor se introduce en el período de registro (palanca). Palanca dice el registro del temporizador (TMRy) que impulsa la OCMP específico cuando reajustar a 0, pero tienes que añadir un extra 1. El ciclo de trabajo entonces se escribe en el registro secundario compara (OCxRS), que es básicamente un tampón porque este valor es transferido casi de inmediato a la compara (OCxR), pero no puede escribir directamente porque OCxR es de sólo lectura.
Ejemplo: Si la palanca tiene un valor de 5 y OCxRS se carga con un valor de 2, OCxR se carga con el 2 como bien. TMRy empieza a contar en 0. En 1, salidas de un alto valor y permanece allí. En el tiempo 2, nada cambia, OCx ha sido alto para la 1 cuenta. Al tiempo 3, OCx gotas baja puesto que ha sido elevado para 2 cuentas. Al tiempo 3, 4 y 5 nada cambia pero TMRy = palanca, por lo que se restablece y entonces empieza nuevamente en 0 en la siguiente cuenta. 1 señal de reloj pasa, que es Conde 0 otra vez y en la cuenta 1, OCx salidas alta otra vez. Aquí es figura 16-18 de sección 16: salida de comparar del manual de referencia familia PIC32:
Ajuste palanca 5 y OCxRS a 2 da realmente un ciclo de trabajo de 33% (2/6) y no el 40% (2/5). Es donde entra ese extra 1. Se agrega al valor de la palanca. Esto es sólo un simple ejemplo, y si palanca y OCxRS eran mucho más grandes, la diferencia de % sería mucho, mucho más pequeña.
Bueno, eso fue simple ¿no? sí, Nº podía oír los engranajes de pulido a un alto "Por ejemplo..." Debe has visto la mirada en rostros de mis compañeros de clase cuando el profesor nos mostró esto la primera vez. Pero por esta razón contamos con bibliotecas. Todas esta cosas es manejado por las bibliotecas cuando decimos el servo para que gire a cierta velocidad o queremos tocar una melodía con diferentes tonos. 1 pero) estamos limitados a sólo poder usar los pines PWM, y 2) bibliotecas ocupan espacio en memoria. ¿Qué hacemos si necesitamos más opciones de PWM? Utilizar los registros.
El siguiente bosquejo es un generador de tono simple. No voy a hacer un ejemplo servo ya no recomiendo usar servos sin la librería servo.h, aunque con algo de trabajo es definitivamente posible. Es muy fácil de extender más el servo más allá de su tope interno. Si quieres hacerlo, tendrás que escribir todas las cosas de fondo que servo.h maneja en su bosquejo, pero resultarán más bocetos en diferentes períodos PWM ya que cada línea lleva un poco de tiempo.
Antes de ver el bosquejo, algunas matemáticas simple rápido. En primer lugar determinar la frecuencia de salida que desee. Divida 1 por su frecuencia a llegar tu periodo y entonces dividir por la mitad. Asegúrese de que el valor es en microsegundos, entonces puesto que el valor tanto de las implementaciones de delayMicroseconds() función. Si queremos generar un ciclo de trabajo diferente del 50%, multiplique el valor de su período por el porcentaje de ciclo de deber que desea alta. Entrar en ese nuevo valor en la función de delayMicroseconds() dentro de la instrucción() if. Introducir el resto en la delayMicroseconds() función dentro de la declaración de otra persona .
Ejemplo: Desea una salida de 1kHz. 1/1000 Hz = 1 milisegundo = 1000 microsegundos = período. 1000μs/2 = 500 μs ⇒ delayMicroseconds(). Si desea que el ciclo de trabajo 60%: 1000μs * 60% = 600 μs ⇒ si() declaración delayMicroseconds() valor. 1000μs - 600μs = 400μs ⇒ otra declaración delayMicroseconds() valor. Agradable y fácil.
Aquí está el código del generador de tono:
A continuación encontrará imágenes o alcance de la salida, primero de chipKIT Uno32...
.. .y entonces desde el Arduino UNO.
Loco lo suficiente, estas imágenes fueron generadas utilizando el bosquejo de manipulación del registro como se muestra arriba, y cuando he probado el bosquejo de la función estándar, la misma imagen exacta apareció. ¿Raro, correcto? Así que pensé repuesto de tener que perder tiempo buscando en un duplicado. Yo también no tienen idea de por qué el Arduino UNO es bastante inestable en el pico de salida, así que si alguien tiene alguna explicación legítima, por favor aclarar en los comentarios.