Esto comenzó como un comentario, pero no había una buena forma de formatearlo ...
Encontré (aunque en una MCU diferente: Coldfire para aquellos que estén interesados) que utilizando
PORTn ^= 1;
Es en realidad un lote más lento que escribir directamente en los registros PORTnSET
o PORTnCLR
, ya que implica una secuencia de lectura / operación lógica / escritura.
Para explicarlo, el micro tiene varios registros para cada puerto (no sé qué tan común es esto en todos los micros), pero el popular puerto de propósito general (que se puede usar para configurar, borrar o leer el estado del pin) se encuentra "por encima" del trío de nivel inferior de PORTnSET, CLR o STATE que, en orden, puede AJUSTAR el pin (1 = set, 0 = sin cambio), CLEAR (1 = borrar, 0 = sin cambio) o LEA el estado del pin sin procesar (leer los otros no es una garantía ya que el estado de registro puede no aplicarse si el pin está configurado como entrada, etc.).
Encontramos que PORTn ^= 1
resultó en una gran cantidad de líneas de ensamblaje desde el compilador, lo que de hecho causó que nuestros pulsos fueran demasiado largos.
Si apuntas a un solo pulso rápido, sería más rápido hacerlo:
PORTnCLR = 1; // Clears pin
<wait for button push or whatever>
PORTnSET = 1; // Sets pin
PORTnCLR = 1; // Clears pin
No sé qué tan rápido necesita ir, pero me parece que debería haber alguna forma analógica simple de proporcionar un pulso de disparo MUY nítido (si el ancho del pulso tiene que ser lo más estrecho posible) con unos pocos bits básicos.
También hay mejores opciones en términos micro si necesita la capacidad de secuenciación, las placas de desarrollo STM32 pueden tener hasta ~ 192MHz por menos de un Ardunio, y luego puede aprender algo de programación real.
Un buen comienzo serían los archivos de notas de Linear Tech, ya que hay algunas cosas brillantes de la talla de Bob Pease & Jim Williams está allí:
enlace