¿Puedo usar pines ATmega328 TX / RX para manejar una red R2R y seguir usando el puerto serie para programar la MCU?

1

Fondo

Quería hacer un generador de funciones simple con un ATmega328 y un R2R resistor network , similar a Mini DDS (Síntesis Digital Directa) de Jesper Hansen .

Para hacer que el firmware de generación de funciones se ejecute lo suficientemente rápido, creo que tengo que conectar un PUERTO completo (todos sus 8 pines de salida) en el ATmega328 a la red de resistencia R2R. De esta manera, puedo escribir un byte completo en el puerto con un solo comando, así:

PORTD = B10101000;

En el ATmega328, creo que PORT D es el único puerto que puedo usar así. A continuación se muestra la distribución de pines y puertos de ATmega328.

Elproblema

ElproblemaalquemeestoyenfrentandoesquetambiénquierousarelpuertoserieATmega328paraprogramarlaplaca,peroelpuertoserietambiénestáenelPUERTOD(patillasPD0yPD1),creandounconflicto.

Soluciónpropuesta

Despuésdealgunasinvestigaciones,hedecididoquepodríasaliradelanteconeldiseñoacontinuación.Laparterelevanteestárodeadaconuncírculoverde.

Con ese circuito, creo que podré usar los pines en serie para programar la placa y también, pero no al mismo tiempo , conducir la red R2R para producir una onda sinusoidal.

Consideraciones

Las consideraciones que reuní hasta ahora, incluidas las contribuciones de los comentarios, son las siguientes:

  1. R17 es necesario para proteger lo que esté conectado a la línea RX (por ejemplo, MAX232 IC) cuando el pin 2 de ATmega se cambia a una salida para conducir la red R2R. Eso evitará que el CI MAX232 obtenga una gran corriente cuando el pin esté bajo.

  2. El valor R17 (1kΩ) ralentizará un poco la línea de RX (aumentará los tiempos de subida y caída), pero de acuerdo con lo que entendí de esta respuesta de Leon Heller - Resistores en serie con Tx y Rx , no será suficiente para evitar la comunicación en serie (experimentos pendientes para probarlo).

  3. No podré usar ambas funciones al mismo tiempo, pero está bien, ya que planeo cambiar entre las funciones en el firmware.

  4. Las líneas RX y TX están unidas entre sí por una resistencia equivalente de 50 kΩ, por R1, R2 y R3. Eso creará una corriente de 0,1 mA dentro y fuera de cada pin, cuando muestren diferentes niveles lógicos. Creo que eso no será un problema, pero se requieren más experimentos.

Preguntas

Mis preguntas son:

  1. ¿Funcionará mi circuito? Si no, ¿por qué no?
  2. ¿Este circuito quemará o estresará mi ATmega o lo que sea que conecte al conector serie?
  3. ¿Hay una mejor manera de hacerlo utilizando un ATmega328 y la red R2R?

Sé que hay muchos chips ADC por ahí que me ayudarían a resolver este problema fácilmente y harían que mi miniDDS fuera más preciso, pero quería comenzar con estos requisitos.

    
pregunta Ricardo

1 respuesta

1

Tengo respuestas para todas las preguntas indicadas:

  • Su circuito no proporcionará un voltaje variable en la salida por sí solo, solo una fuente de corriente variable. El voltaje real generado dependerá en gran medida de la impedancia del dispositivo conectado a la salida. Es posible que desee solucionar este problema con una resistencia adicional a tierra y / o una opamp.
  • Es probable que su circuito permita la comunicación en serie, especialmente a velocidades más lentas, como 19200, que creo que se utilizan por defecto en los cargadores de arranque en serie de estilo Arduino. El efecto pull-up de 50 kOhm no importa. La resistencia de 1 kOhm no disminuye demasiado.
  • Es improbable que su circuito queme o cause tensión al Atmega o al dispositivo conectado en serie.
  • Puedo pensar en otras tres formas, ver más abajo.

La primera forma sería usar un programador USB ICSP para programar el Atmega en lugar de la programación en serie, al estilo Arduino. Esto es más robusto, más rápido, evita el problema por completo y optimiza el costo de la lista de materiales para el dispositivo real (a expensas de requerir unos pocos dólares de hardware de programador si necesita programarlo). Esto se puede implementar incluso en una Tablero Arduino.

La segunda forma es ejecutar el Atmega328p en el oscilador RC interno, sin usar un cristal, y usar el puerto B en lugar del puerto D para la salida DDS. Esto deja el puerto serie completamente sin tocar.

La tercera forma es escribir PORTB y PORTD uno tras otro, y usar PORTB para los dos bits que usa el puerto serie. Esto generará una falla de dos ciclos en aproximadamente 4-8 Mhz. Dado que de todos modos necesitará un filtro de paso bajo para generar cualquier tipo de forma de onda suave, simplemente debe disminuir la frecuencia de corte de ese filtro para eliminar estos problemas. Para escribir correctamente los dos puertos en secuencia, cargue los valores en registros, desactive las interrupciones, escriba los dos puertos y vuelva a habilitar las interrupciones.

Finalmente, puedes usar un diodo de pequeña señal (como 1N4148) en lugar de R17.

    
respondido por el Jon Watte

Lea otras preguntas en las etiquetas