[DUVIDA] É possível utilizar uma eeprom externa para aumentar a memoria programavel ?

Olá galera,

      Uma duvida que apareceu foi que o arduino possui uma memoria programável de apenas 32k, mais especificamente 32,256 bytes.

       A duvida é:  É possível utilizar memoria externa como chip eeprom ou outro meio, para upar sketchs de grande tamnho para o arduino, quebrando assim a barreira dos 32k ?

valeu galera.

Exibições: 5578

Responder esta

Respostas a este tópico

Acredito que ate seja possivel de se colocar uma memoria externa para isso, a questão é que vai ter que usar algumas portas para isso e que poderiam ser usadas para seu projeto, não sei se é o caso de precisar de todas entradas/saidas do Arduino..

Essa é uma questão que estou constantemente "brigando" com o Uno, o limite de memoria, ou seja, quanto menor for o programa, ou mais compacto eu poder deixar a programação, mais funções coloco no meu projeto.

E pode ter certeza, que esse é o maior desafio em programação, fazer a mesma coisa ocupando menos memoria e de forma mais rapida possivel,e se analizar o seu codigo, sempre vai ter muito a ser otimizado, mas é claro que isso demanda muito tempo e conhecimento de como reduzir o codigo, inclusive muitas libs prontas que usa no seu projeto, podem ser reduzidas a sua necessidade.

Quando eu penso que agora sim, estou no limite dos 32k, sempre tem um pouco mais a reduzir de codigo fazendo a mesma coisa e com isso vai constantemente reduzindo e melhorando a sua programação.

Uma dica que reduz muito ao longo de todo o programa é trabalhar com o limite das variaveis que realmente usa, não adianta usar um long  por exemplo para usar valores que vão ate o maximo de 255, neste caso, pode usar o byte que ocupa menos espaço, o mesmo acontece com o int, que na maioria das vezes usam para valores menores que o seu limite, inclusive isso é usado nos exemplo oficiais do Arduino, se vai fazer so aqui, nao tem problerma, mas se ja esta no limite de codigo, o uso correto das variaveis reduz e muito o tamanho final.

Espero ter ajudado um pouco..

Jota

 Olá Weider.

 Compreendo o que deseja.  Antigamente era muito comum você encontrar este tipo de arquitetura nos microcontroladores com a arquitetura do 8051 (por exemplo). 

 Um dos mais recentes em que pude trabalhar eram os da linha AT89S da Atmel. Onde era possível escolher por qual memória de programar iriamos iniciar(boot), seja a interna ou a externa quando era preciso ter mais quantidade de código.

 Agora com estas novas arquiteturas ficamos amarrados no tamanho interno da memória FLASH, embora tenhamos uma enorme gama de opções de códigos e fabricantes para as capacidades que precisamos.

 Pensando em uma solução, dependendo do tipo de tarefa que você iria executar no seu código, você poderia fazer um "interpretador de comandos" como seu programa principal. E utilizando uma memória externa tipo FLASH, ou EEPROM, ou SRAM, podendo ser SERIAL do tipo I2C ou SPI, você conseguiria executar muitas coisas.

 Mas veja, interpretar comandos é diferente do que escrever um programa diretamente para o microcontrolador. Pense no programa externo como sendo um "SCRIPT" que será interpretado. Enquanto que internamente irá existir o programa que irá executar os comandos do script, mas tendo o limite interno imposto pela memória de programa normal.

 Espero ter ajudado.

 T++.  ^^

No ATmega328, usado no Arduino, o código precisa estr na memória Flash interna. Nao é possível executar diretamente código que esteja em uma das outras memórias internas (Ram e EEProm) ou em uma memória externa.

Como já disseram, você pode tentar reduzir as suas necessidades de memória otimizando o código ou usando esquemas como interpretador.

Mas tem uma outra alternativa, se 32K for realmente pouco: usar um Arduino Mega. Existem modelos com 128K e 256K. Se isto ainda for insuficiente, talvez seja o caso de você abandonar os Arduinos baseados nos ATmega e partir para algo mais sofisticado, como um Raspberry Pi, Beaglebone, etc.

Jota, Daniel Cezar e Daniel Quadros,

    Amigos, inicialmente muito obrigado pelas respostas.

    Jota, sobre a questão das portas, eu andei estudando sobre o aumento delas ultimamente, descobri vários metodos, como conversores digitiais, interligação de multiplos CIs via seriais e por ultimo multiplexação,  dessas a que mais gostei foi a multiplexação, onde a ideia é utilizar CIs controladores de bargraphs de leds para ampliar as portas, tanto digitais como analogicas.

    Mas voltando a falar sobre os 32k ,  realmente, o que mais vejo em todo canto quando procuro sobre memoria programavel é o pessoal falando sobre fazer "lipo aspiração" no codigo ha ha ha.

    Andei descobrindo algumas técnicas de estruturação do codigo, nada demais, mas que a maioria não conhece, que é juntar a criação de funções com a utilização de tabs, o que estrutura o codigo de forma incrivel.(já comecei a fazer um tutorial e posto ele em breve passando a tecnica pra quem não conhece.)

    Mas realmente o que eu queria era utilizar uma eeprom pra ampliar a memoria para sketchs,  sei que dá pra aumentar a memoria eeprom interna de 1k com eeproms externas,  mas a minha vontade era aumentar a memoria programável.

    Mas segundo nosso amigo, Daniel quadros isso não é possível.

    Sobre utilizar o MEGA, isso seria complicado, pois só utilizo as placas arduino para testar o prototipo, apos isso eu faço o desenho do projeto no EAGLE, faço a placa e a monto tendo o atmega328 como coração, logo, nesse caso seria complicado, pois apesar que já vi comentarios aqui de colegas que conseguiram comprar o CI atmega2560 que é o coração do Mega,  eu ainda não tenho conhecimento nem de como o comprar, nem de como utiliza-lo.

   

     Bem, como já deu pra ver, estou na fase de aprendizagem,  logo, ainda não me deparei com o problema de estouro de memoria,  o meu maior projeto teve pouco mais de 20k, longe dos 32k,    mas quero aprender como fazer antes de precisar, pois sei que na hora de um projeto pra valer tem-se que matar varios leões.

    Logo, a duvida seria então:  JÁ QUE O ATMEGA328 POSSUI APENAS 32K E NÃO DÁ PARA AUMENTAR,  QUAL O OUTRO CI ATMEGA DE PREFERENCIA EM FORMATO DIP e  NÃO SMD,  QUE SUPORTE O BOOTLOADER ARDUINO QUE POSSUIRIA UMA MEMORIA MAIOR QUE 32K ?

Weider!

Gostei desta discussão,  no passado pensei em criar alguma coisa como um computador com SO baseado em  arduino, (monitor LCD, HD com SD card e algo como teclado e mouse. Vi que, com muito trabalho quase tudo daria certo, mas não sei como seria possivel fazer algo parecido com um Aplicativo para ser copiado para o SD e executado sem alterar o codigo do Arduino.

por exemplo seria possivel copiar um "blink" para o cartão SD e quando reinicia-se o arduino ele reconhece o novo aplicativo "instalado'.

Não sei se consegui explicar, mas acho que é mais ou menos a sua "busca".

Para tentar resolver seu problema... e se, vc colocasse mais memória flash de.. outro Atmega328, ou um attiny?, fazendo parte do código num e parte em outro?

num atmega master vc faria o código e no outro as subrotinas... por comunicação serial com um protocolo próprio.

 

Olha Ricardo Pedroso,

   Se o colocado pelo nosso amigo Daniel Quadros estiver correto não vai dar criar programas e fazê-lo rodar de uma memoria externa como um sd card,  o maximo que dá pelo que entendi é guardar variaveis.

   Pelo que dá pra entender, baseado na experiencia dos nossos amigos, é que não dá pra expandir a memoria programavel de microcontroladores, a unica coisa a fazer é encontrar microcontroladores com memorias maiores, mas mesmo assim com suas limitações.

 

   Colocar vários atmegas em uma única montagem daria até certo, mas é algo meio incomum de se fazer, e isso não aumentaria realmente a memoria, você apenas faria cada um deles executar funções diferentes em um mesmo processo global, mas eles seriam independentes.  É uma montagem possível, mas tem que ser bem pensada.

 

    A unica sai da que vejo, é a pergunta que fiz   QUAL ATMEGA QUE SUPORTA BOOTLOADER DO ARDUINO E DE PREFERNCIA PADRÃO DIP,  POSSUI MAIS QUE 32K DE MEMORIA ?

 

    Pergunto isso porque sei que fora os atmegas "canonicos" como o Atmega8(duemila), atmega328(uno),atmega1280 e 2560(mega),  sei que existem os "apocrifos" como o Tiny o atmega32 e outros.

Encontrei essa lista de Cis ATMEGAS AVR deem uma olhada

 

http://www.atmel.com/pt/br/products/microcontrollers/avr/megaAVR.aspx

 

agora vejam que louco o site desses caras

 

http://www.avr-developers.com/

 

E ai que acham de criarmos um grupo para sair metendo o arduino em variados tipos de CI s?

amigo dah uma pesquisada no CI Atmega644 com Sanguino... ele tem 64k de memoria flash...

Realmente o ATmega644 é uma boa opção. Tem o dobro da memória e está disponível em encapsulamento DIP. A Farnell tem à venda.

Olá amigos. ^^

Só para não colocarmos uma pedra em cima das possibilidades,(rs), como disse, é possível criar "scripts" que podem ser interpretados pelo microcontrolador. E cada script poderia ser visto como um pequeno programa. Digo isto pois já fiz isto em outros microcontroladores, e escrevendo em assembly. Realmente não é trivial e fácil.

Em um nível acima, podemos também criar algo parecido com um "bootloader", que  buscaria trechos de programas na memória externa, gravaria em uma região de memória reservada, e só então deslocar a execução do programa para aquele trecho em diante.

Tomem como exemplo o comando "debug" no "cmd" do Windows, que entra no modo de programação assembly. Dai, em todas as linhas de comandos aparecem os respectivos endereços do programa digitado. E na hora da execução você chama exatamente o endereço inicial do programa, que pode estar em qualquer região de memória.

E indo um pouco mais além, podesse pensar em um pequeno Sistema Operacional. Onde é inevitável ter total domínio da memória de programa e volátil, além de criar mecanismos de "troca de contexto", "gerenciamento de memória", "interpretador dos cabeçalhos de programas", "agendamento de tarefas (scheduler)", "timers(clock do sistema)", etc...pois com isto você poderia compilar trechos de programas e executá-los pelo S.O. .

Mas vejam, o desafio não é escrever este tipo de coisa para o microcontrolador. Com um grande estudo de sistemas operacionais (não estou falando de Windows e Linux, e sim da arquitetura de um sistema), você consegue ir criando as funções necessárias para isto. Só que o desafio maior seria escrever "tudo" isto para a quantidade de memória que temos no ATmega328.  Só que pequenos conceitos podem ser utilizados para otimização do código atual usando as "bibliotecas Arduino".

Se inspirei alguém, desejo boa sorte, pois é trabalho para se levantar as mangas e ir sem medo do aprendizado que terá.

Espero ter ajudado.

T++. ^^

Complemento:

E qual a vantagem do S.O.? É que o programa poderá estar armazenado em qualquer media,seja memória externa, seja no cartão, etc...

Daniel,

O ATmega não é muito propício para isto, por ter uma arquitetura Harvard (memória de programa separada da memória de dados). Como falei antes, o código precisa estar obrigatoriamente na Flash interna para poder ser executado. Embora seja possível um programa gravar na Flash (é o que o bootloader faz, por exemplo), isto é bastante desajeitado e existe um limite para o número de gravações.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço