¿Cómo expandir la memoria del programa en un arduino?

A veces me quedo sin espacio del tamaño del programa para el programa C incrustado que quiero poner en un arduino. Entonces, ¿qué chip necesito para expandir la memoria del programa del arduino para poder usar programas C más grandes con mi arduino?

Comentarios

  • Considerando que un compañero llamado Petri H ä kkinen puso un juego de estilo arcade en un Atmega328P, ¿quizás deberías considerar ahorrar espacio en tu código? Si eso no es ‘ t práctico, como dicen algunas de las respuestas, puede obtener un chip más grande con más memoria de programa. El Atmega644, por ejemplo, viene en un paquete de chip DIP, entre otros.
  • Vea también forum.arduino.cc/index.php?topic= 226465.0
  • ¿Puede explicar un poco más su respuesta? 2) El Arduino tiene SPI, por lo que se puede acceder a una tarjeta SD. Cualquier código de la tarjeta SD debería cargarse en la memoria ejecutable. Esto es complicado y no para principiantes … ¿Quiere decir que puede cambiar o reprogramar la memoria de instrucciones mientras se ejecuta el programa? ¿Puede el programa en ejecución llamar al gestor de arranque y cargar nuevas instrucciones en direcciones diferentes? ¿Ganó ´ esta edad la memoria del programa? Una solución diferente puede ser identificar rutinas en su programa y todas las » llamar ´ s » almacenado con los datos en una memoria externa spi … ¡Gracias!

Responder

Un ATmega2560 es el chip para agregar más memoria cuando se quede sin memoria de programa en un Uno. Consultando la página web Memory en arduino.cc, verá que tiene Flash = 256KB, SRAM = 8KB, EEPROM = 4KB, donde el chip ATmega328 está el Uno tiene Flash = 32KB, SRAM = 2KB, EEPROM = 1KB.

Cuando te quedas sin memoria de programa en un Uno, tienes alrededor de tres opciones que son prácticas: hacer el programa más pequeño; quitar el cargador de arranque (para liberar uno o dos KB); use una placa diferente con un procesador más capaz. La CPU en una placa Uno no tiene una forma de acceder a los bytes del programa desde lugares distintos a la memoria flash de 32 KB en el chip. La CPU en una placa Mega2560 comienza con 8 veces más flash, por lo que puede contener programas más grandes que los de Uno.

Si quita el cargador de arranque, podría programar usando una placa USBASP, como se describe en un «Programar el chip AVR usando un USBASP con cable de 10 pines» en learningaboutelectronics.com.

Comentarios

  • pero si libera el cargador de arranque, ¿cómo usaría el IDE de arduino para programar?
  • @ qwerty10, vea el último párrafo de la edición. Arduino IDE es compatible con USBASP.
  • ¿No funcionaría con ningún programador que pueda cargar código en ATMEGA? En lugar de solo un USBASP. Según tengo entendido, en realidad no se utilizan 10 pines, sino un subconjunto de esos pines.
  • @ qwerty10, USPASP es un programador ISP (en programación de sistemas). Generalmente, cualquier programador ISP puede usarse para programar un chip (con o sin un cargador de arranque en él) siempre que los pines MOSI, MISO, SCK, RST, VCC y GND estén disponibles en el chip de destino.
  • Los Unos actuales utilizan el cargador de arranque optiboot muy compacto. Eliminarlo solo liberará 512 bytes.

Respuesta

Otra forma (que no sea MCU con más memoria) es no usar el marco de Arduino y sus bibliotecas. Este nivel de abstracción es caro en ambos sentidos: uso de memoria y velocidad. Pero esa es una manera mucho más difícil. Si necesita alguna biblioteca, debe portarla (si no ha encontrado una nativa) o al menos proporcionar las funciones requeridas de Arduino.

Por ejemplo, en Arduino IDE 1.6.11 el boceto vacío está usando 444 bytes de flash. Usar un pinMode y digitalWrite(13, ! digitalRead(13)); + delay(500); significa 964 bytes. Por supuesto, lo más probable es que sean de una sola vez. Si usa seis pines más y lo alterna, usa mucha menos memoria de programa que el primero (1192B). Pero aún crece muy rápido.

En C puro, el programa vacío tiene aproximadamente 134 bytes de longitud. La misma funcionalidad (alternar un pin cada 500ms) toma 158 bytes (y es mucho más rápido).

Pero para un proyecto de hobby, optaría por ATMega2560 o ATMega644 / 1284.

Y también puede usar acceso directo al hardware. Alternar el boceto de pines con el uso de registros directamente y _delay_ms de las bibliotecas avr usa 468 Bytes en lugar de 964B. Con el retraso de las bibliotecas centrales de Arduino, es 602B.

Comentarios

  • Te refieres a _delay_ms().
  • Esto tiene el beneficio adicional de aprender realmente sobre el mcu que ‘ usando. Los AVR en estos Arduinos son mucho más capaces de lo que la » biblioteca estándar » le haría creer.++

Respuesta

¿Qué pasa con una raspberry pi cero ? Tengo un par y los uso bastante a menudo como arduinos.

Comentarios

  • Se deberían considerar otras arquitecturas, pero un sistema Linux embebido con arranque obligatorio con tarjeta SD como pi agrega mucha complejidad y es frágil de maneras únicas, incluso si no es más costoso. Hay muchas placas basadas en MCU ARM más pequeñas y altamente integradas que son mucho más similares a un Arduino en términos de aplicaciones, mientras que son drásticamente más capaces. Pero si necesita mucho procesamiento, o megabytes de memoria, entonces sí, estas complejidades comienzan a valer la pena.
  • También prefiero el cero porque es muy flexible. Puede agregar más almacenamiento o incrustarlo en proyectos y al mismo tiempo tener un procesador lo suficientemente grande para hacer prácticamente cualquier cosa.

Respuesta

También puede buscar en otras plataformas. Por ejemplo, un Teensy 3.2 es compatible con Arduino y tiene una eeprom de 2 KB y 64 KB de RAM.

Responder

Wen preguntando a un amplio pregunta, es útil incluir algunos detalles. Como cuánta memoria y por qué cree que la necesita.

Una vez especifiqué un procesador con un espacio de programa de 2 KB, 64 bytes de RAM y 1 KIPS. El ingeniero preguntó, MIPS, expliqué miles por segundo. Él respondió, no son tan lentos. Al final del proyecto, se agregó una gran interfaz de usuario y la memoria se hizo más ajustada … pero aún así encaja sin problemas.

Por lo tanto, considere ser más reflexivo sobre los recursos que se están utilizando.

Para responder a la pregunta:

1) El Arduino no proporciona un bus conveniente para recuperar la memoria. Por lo tanto, no hay forma de conectar un chip para obtener más memoria.

2) El Arduino tiene SPI, por lo que se puede acceder a una tarjeta SD. Cualquier código en la tarjeta SD debería cargarse en la memoria ejecutable. Esto es complicado y no para principiantes …

3) Como se sugirió, refuerce su código. Esta es probablemente una buena forma de aprender.

3) Cambie a un Arduino más grande.

Hay diferentes procesadores Arduino. Algunos en la línea ACR, otros en la línea ARM. Ir a un dispositivo diferente en la misma familia es un cambio relativamente modesto y puede proporcionar hasta 368 Bytes de programa FLASH. Pero estas no son placas Arduino exactamente.

Los dispositivos basados en Arduino ARM son muy diferentes y usa diferentes bibliotecas.

Mira el Arduino Mega 2560, es muy similar al Uno, tiene una huella similar, el código debería portarse con relativa facilidad y es económico.

Hay dispositivos más grandes en la familia AVR.

Tenga en cuenta que el AVR32 es un procesador diferente y los periféricos son lo suficientemente diferentes como para que sea un dispositivo diferente.

Si desea ingresar a programas muy grandes ( gigabytes de memoria) echa un vistazo a Beagleboard. Tiene un linux completo, con memoria virtual (ver # 2 arriba) y tiene mecanismos de E / S más poderosos.

Comentarios

  • Tal vez arregle algunos errores tipográficos, como Wen, 3, y diferente
  • Quiero decir, si corrige esos errores tipográficos, alguien podría votar su respuesta …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *