Esta será una respuesta media , ya que está sucia y no es muy eficiente. Bueno, nunca dijiste la velocidad en baudios que ibas a usar. Entonces, quién sabe, tal vez sea lo suficientemente eficiente.
Use un cable de tierra y un cable de señal . Este cable señal se conectará al ADC de cada Atmega (entrada) y a algún pin digital de cada Atmega (salida).
No irá directamente al pin de salida digital, tendrá una resistencia de 1 kΩ conectada entre sí y el pin de salida digital.
Así que en el arte ascii se verá así:
_______A_______
| |
| PF0(ADC0) |<--------|
| | |
| Atmega128 | |
| | |
| PD0 |->-1kΩ---|
|_______________| |
|
|
_______B_______ |
| | |
| PC0(ADC0) |<--------|
| | |
| Atmega8 B | |
| | |
| PD0 |->-1kΩ---|
|_______________| |
|
|
_______C_______ |
| | |
| PC0(ADC0) |<--------|
| | |
| Atmega8 | |
| | |
| PD0 |->-1kΩ---|
|_______________| .
.
.
Y luego asignas frecuencias particulares a cada Atmega. Entonces, si, digamos que A quiere generar un "1" lógico, entonces A generará una onda cuadrada en PD0 a ... digamos 10 kHz para un ejemplo. Y si A quiere emitir un "0" lógico, entonces A quedará en silencio.
Si B quiere hablar, generará una señal de onda cuadrada de, por ejemplo, 20 kHz o algo más, no 10 kHz. Lo mismo con C , tiene su propia frecuencia para hablar.
Luego, internamente en cada Atmega, realizarás FFT . No tiene que ser 8192 puntos o algún otro número innecesariamente alto, puede realizar fácilmente una FFT de 32 puntos. Cuantos menos puntos tenga, más se contraerá y superpondrá su onda sinusoidal. La vida no es ideal.
No se trata de ondas sinusoidales puras que emitirá a través de PD0, por lo que obtendrá algunos otros armónicos. En el caso de A , verá algunas ondas sinusoidales pequeñas a 30 kHz, 50 kHz, 70 kHz, etc., ya que forman parte de la onda cuadrada a 10 kHz. .
Además, como todo está conectado con resistencias, cuanto más larga sea la cadena, menos significará cada salida. Así que si tienes 4 Atmega's conectados. Luego hay 4 resistencias que se conectan al cable señal . Si uno de ellos está generando un valor alto y el resto bajo . Entonces tendrá \ $ 5 × 0.25 = 1.25 \ $ V. Eso significa que cuando lea ADC0 (ADC de 10 bits), leerá \ $ \ frac {1.25 × 1024} {5} = 256 \ $. Eso está bastante bien. Pero si tienes más, digamos 20 Atmega's, entonces leerás \ $ 5 × \ frac {1} {20} × \ frac {1024} {5} = 51 \ $ ... Hmmm, eso tampoco es tan malo ... Pero esto significa que también necesitarás 20 frecuencias diferentes, lo suficiente entre ellas para que no se superpongan cuando uses tu FFT.
Por lo tanto, cuantas más frecuencias utilice, más puntos de la FFT tendrá que calcular.
En otras palabras, lo que harás es como hacer que cada Atmega toque una cuerda de guitarra, y luego dices:
- "Oh, eso es un tono A, está bien, entonces Atmega # 2 me está enviando un '1' en este momento"
- "Hmm, creo que es un tono C, entonces ese es el Atmega # 1 que me está enviando un '1' en este momento"
- "Hay una ausencia del tono A, por lo que Atmega # 2 me está enviando un '0', ¡ya!"
Con respecto a tus Atmega8, si nunca van a hablar entre ellos. Luego, puede hacerlo para que escuchen el Atmega128 solo calculando la DFT de una frecuencia . Esa frecuencia sería de la onda cuadrada que su Atmega128 emitiría. O puede hacerlo para que cada Atmega8 escuche una frecuencia diferente, de esta manera puede hablar fácilmente con cada Atmega8 simultáneamente. Aunque necesitarías algo de DAC en el Atmega128, no una onda cuadrada.
Puedo continuar, pero creo que entiendes lo esencial. Recuerda, no es la solución más eficiente.