Go Down

Topic: Dos 328p con un solo oscilador (Read 174 times) previous topic - next topic

alonsor90

May 26, 2018, 06:33 pm Last Edit: May 28, 2018, 03:38 pm by surbyte
buenos dias, estoy usando actualmente tres atmega328p en un proyecto, necesito reducir el tamaño significativamente y no es posible extraer mas micros, me surge la duda, puedo conectar mas de un atmega328p a un solo circuito de oscilador? es decir usar un solo cristal y dos condensadores para todo el proyecto?


surbyte

Si pero requeriras de varios cambios y los mas complicados estan en los fuses de cada ATmega328P

El chip puedes ser configurador para utilizar una fuente TTL como reloj o fuente de reloj.
La sección 13.8 de la hoja de datos cubre esta situación. Para hacerlo hay que cambiar los fusibles. El cambio de los fusibles no se puede hacer desde el IDE, requiere un programador apropiado pero la buena noticias es que puedes hacerlo con un arduino y su ICP y el averdude.


Debes usar EXTCLK
Quote
To drive the device from an external clock source, EXTCLK should be driven as shown in the Figure
below. To run the device on an external clock, the CKSEL Fuses must be programmed to '0000':
Y como ahi dice, cambiar CKSEL fuse a 0000

No he podido encontrar cual de los dos pines XTAL1 o XTAL2 funciona como EXTCLK, según vi en un comentario de otro foro es XTAL1 y XTAL2 pasa a ser un CLKOUT pero no lo aseguro.
Esta es la mejor información que encontré al respecto AVR Programming Interfaces



Tal vez una buena fuente de información sea el STK500 de ATMEL/Microchip que si lo buscas en su diagrama esquemático verás justamente que los elementos a programar lo hacen o hacían (creo que nadie usa un STK500) con una fuente externa de clock



tauro0221

Hi,
Pregunta cual es la razon de usar tres atmega328p y de que se trata el projecto digo si se puede saber. El atmega328p no tiene clock externo si tiene un voltaje de referencia analog externo.

surbyte

No veo lo que vaya a ganar, tendra que armar un oscilador con un driver que soporte la carga tal vez infima de los 3  ATmega328.
Tampoco entiendo que pueden hacer 3 ATmegas cuando uno solo mas grande y potente hace el trabajo de 3.
Un DUE por ejemplo.

tauro0221

Hi,
Surbyte por eso hice la pregunta de porque 3 atmegas. La razon es que el posiblemante este usando el 328p chips y los esta montando en una tarjeta.Por eso lo de usar un oscilador para tres 328p.

alonsor90

"Surbyte por eso hice la pregunta de porque 3 atmegas. La razon es que el posiblemante este usando el 328p chips y los esta montando en una tarjeta.Por eso lo de usar un oscilador para tres 328p."


soy algo nuevo con los atmega328, pero por lo menos debo manejar 10 salidas pwm independientes, pantalla, control de servos, control de paso a paso, sensor de presion, y todo esto ademas debe sincronizarse, por tanto estoy manejando un armega que se encargue de seleccionar los modos de operacion y pantalla, este envia una secuencia por serial a los otros dos atmega, los cuales uno se encarga del manejo de las pwm y el otro de los motores y sensado de presiones y flujos y actua de acuerdo a esto, hasta el momento me resulta imposible manejar todo este codigo en un solo microcontrolador pues se debe hacer todo esto de manera simultanea y la unica forma que he encontrado de momento ha sido el separar estas funciones, aun asi los montajes de los cristales y capacitores consumen demaciado espacio, aunque estoy usando el solo atmega 328p (uso una placa arduino uno como programador) por esto mi pregunta de si es posible usar un solo cristal para los tres microcontroladores atmega328p

surbyte

PUes si tienes que manejar  10 salidas pwm existe un chip I2C que te permite manejar 16 asi que ya eliminas 2 328P de un plumazo.

Siempre se pide en el foro que se explique bien el proyecto, porque la forma de encararlo de uno puede no ser la mas adecuada. Considera que todos tenemos visiones diferentes.

Acá lo tienes 16 salidas PWM a 12 bits PCA9685

Explica todo lo que vas a usar.
Tal vez incluso un MEGA sea mejor que un 328P
El Mega (acabo de revisarlo) tiene 15 PWMs.

Asi que un MEGA hace tu trabajo.

alonsor90

#7
May 28, 2018, 04:00 pm Last Edit: May 28, 2018, 08:23 pm by surbyte
Creo que no me estan entendiendo, todo debe trabajar de forma simultanea, el sensado de presion actua con los motores, las salidas pwm tambien actua de forma simultanea a el solo uso de servo inhabilita gran parte de otras funciones tales como lo son el manejo de tiempos (delay(), microdelay(), etc) es el ahorrar un micrcontrolador solo es posible por medio de uno el cual pueda manejar funciones y subfunciones de manera simultanea, es decir, sense ADC, envie serial, maneje servo, maneje paso a paso, salida pwm de manera filtrada, (las salidas pwm son sumadas de manera externa o restadas) y todo esto debe hacerse al mismo tiempo, mientras un micro se encuentra en un codigo ejemplo (delay(500); ) debe estar al mismo tiempo moviendo el servo, y sensando presion y moviendo el paso a paso, esa es la razon por la cual he debido utilizar mas de un microcontrolador, adicionalmente como requerimiento no puedo entregar tarjetas prefabricadas, es decir debo contruirlas yo mismo. y para complicar un poco las cosas, ya modifique la mayoria de componentes a componentes superficiales, intente modificar un arduino nano para utilizarlo de programador de 328p superficial pero no fue posible, la unica solucion de reduccion de espacio es ahorrarlo con los cristales
en ultimas, la otra opcion seria utilizarlos sin cristal (lei que es posible que funcionen con oscilador interno) pero como les digo soy nuevo en el tema de arduino y el atmega328p y no se com hacer esto, les agradeceria mucho si me indicaran con plastilina (metodo para decir en mi pais que sea detallado) pues consideren que estoy en 0 en el tema
gracias

surbyte

Si vas a usar 3 micros y usas delay(500) por favor, que derroche de trabajo estas haciendo!!

Entiéndeme bien, delay(500) anula el uso de uno de tus arduinos por 500 mseg. entonces de que simultáneidad me hablas?

Te aclaro que estoy ayudándote, no criticándote. Eso mismo da 500 mseg a un solo micro para hacer mas tareas pero esta claro que no es lo que persigues.
Asi que sigamos.

Te recomiendo que te detengas y que veas la factibilidad en prototipo de que puedas comandar 3 micros con un solo cristal o con un clock externo. Luego continua con el resto.

alonsor90

#9
May 29, 2018, 03:20 am Last Edit: May 29, 2018, 06:26 am by surbyte
Buenas noches a todos, de hablar directamente con Surbyte, se aclararon muchas dudas y surgieron muchas acciones de mejora para este proyecto, pido disculpas por no haberles podido comentar mejor de que se trataba y lo hare en este momento, iniciare por  una pequeña descripción de todo, soy ingeniero biomédico de Colombia, en nuestro ámbito de trabajo existen dispositivos llamados simuladores de paciente el cual es  un dispositivo que simula un paciente ideal y pacientes con ciertas condiciones, esto para medir los equipos usados en medicina, en qué estado se encuentran para finalmente verificar que un equipo da el diagnóstico correcto, este simulador normalmente en el mercado inician en 10.000 dólares más costos de importación más impuestos, son equipos muy delicados y costosos, y por mi ubicación de trabajo no es posible la adquisición de un equipo comercial, de allí nace este proyecto. el proyecto que he estado realizando es un simulador para electrocardiograma, para monitores de presión y para sensores de temperatura,(posteriormente quiero ampliarlo aún más incluyendo respiraciones por minuto, presión arterial invasiva y pulsoximetria)
el actual proyecto tiene bastantes retos, empezando por el sector económico y disponibilidad de dispositivos, y muchos a los que les interesa creo que se encontraran estos mismos inconvenientes, algunas cosas no son comerciales en ciertos países o regiones de su país, o son demasiado costosas, por tanto he tratado de diseñarlo de la manera más económica posible con cosas que se encuentran en la mayoría de las tiendas de electrónica, en mi caso me encuentro con otro reto el cual es tamaño del dispositivo, las herramientas que uso solo me permiten crear pcb de 10x15 cm y finalmente la calidad del equipo, que sea resistente a ruidos y demás, iré compartiendo módulos que he diseñado, soluciones y problemas a los que me he enfrentado para que entre todos en el foro podamos mejorarlo y sea útil a demás personas que enfrentan problemas similares en diferentes proyectos, y personas que se dedican a trabajos similares al mío.

de antemano me disculpo por errores de código o redundancias en este, como decía en mas arriba del post soy nuevo con arruino, he aprendido por mí mismo muchas cosas y mi lógica es algo tosca

Arrancamos con Electrocardiograma.

Bueno inicialmente muchos de nosotros hemos visto un diagrama de electrocardiograma


ésta por así decirlo es una onda básica, que ocurre esto es solo una de 12 ondas que se analizan de un corazón humano, en total son 10 ondas que se deben generar entre las cuales el equipo monitor de signos vitales suma, resta y analiza en un paciente, por tanto hay que producir con un mismo arduino estas 10 ondas estas ondas se leen alrededor de 2.5mV mi solución para la generación básica de estas ondas de una manera simple y económica fue generar un pulso PWM reducirlo de 5V a 2.5mV mediante un tevenin y con un condensador generar una onda sumada, variando el PWM genera una subida o bajada de la onda, a continuación les envío la onda base de un latido a 60 latidos por minuto, variando el ultimo delay se generan ondas de diferentes frecuencias cardiacas

Code: [Select]
     analogWrite(11,30);//estado base
     delay(30);
     analogWrite(11,50);
     delay(40);
     analogWrite(11,30);
     delay(30);
     analogWrite(11,1);
     delay(50);
     analogWrite(11,255);
     delay(50);
     analogWrite(11,1);
     delay(50);
     analogWrite(11,30);
     delay(100);
     analogWrite(11,70);
     delay(70);
     analogWrite(11,30);
     delay(70);
     delay(510);


ya se dirán lo  mismo que Surbyte no uses delay () deja parado el arduino por mucho tiempo, una opción de mejora surgió de esto, es implementar un timer que haga interrupciones cada cierto tiempo y modificar la salida durante esta interrupción, para esto deberíamos hacer un vector con los valores a arrojar en cada interrupción, ejemplo si usamos 1000 interrupciones tendríamos espacios de 1mS sin bloquear otras opciones, pero tengamos en cuenta que tendríamos un vector con 1000 valores, y esto solo para una sola salida (de 10 salidas que debemos implementar)

Este es el primer módulo que he creado, de acá el por qué estoy usando varios microcontroladores en lugar de uno solo (falta anexar el módulo de presión arterial que usa motores stepper y lectura de sensores además de ir sincronizado con el latido acá incluido actuando en simultaneo).

Bueno me despido por hoy, mañana si puedo les compartiré como he ido solucionando estos inconvenientes y espero les guste y que más adelante podamos mejorarlo gracias a todos en especial a Surbyte por su tiempo y ayuda.


Go Up