LusoRobótica - Robótica em Português

Software => C/C++ => Tópico iniciado por: DanBar em 28 de Janeiro de 2009, 16:28

Título: PROGMEM
Enviado por: DanBar em 28 de Janeiro de 2009, 16:28
Existem três categorias de memória no Arduino (ATmega168):

Memória flash, é onde o Arduino armazena o "sketch".
SRAM (memória estática de acesso aleatório) é o esboço que cria e manipula variáveis quando ele é executado.
Memória EEPROM é que os programadores podem utilizar para armazenar informação a longo prazo.

Memória Flash e EEPROM memória são não-volátil (a informação persiste após o poder é desligado). SRAM é volátil e será perdido quando o poder é cíclico.


O ATmega168 chip possui as seguintes quantidades de memória:


Flash 16k bytes (2k de que é utilizado para o gestor de arranque)
SRAM 1024 bytes
EEPROM 512 bytes

Aqui fica um link muito util, de como gravar informação na memória Flash do Arduino.

http://www.arduino.cc/en/Reference/PROGMEM (http://www.arduino.cc/en/Reference/PROGMEM)

Já experimentei o seguinte projecto:

Código: [Seleccione]
#include <avr/pgmspace.h>
prog_char string_0[] PROGMEM = "FLASH";   // "String 0" etc are strings to store - change to suit.
prog_char string_1[] PROGMEM = "Arduino";
prog_char string_2[] PROGMEM = "by";
prog_char string_3[] PROGMEM = "Daniel";
prog_char string_4[] PROGMEM = "Barradas";
prog_char string_5[] PROGMEM = "(2009)";

// Then set up a table to refer to your strings.

PGM_P string_table[] PROGMEM =  // change "string_table" name to suit
{   
  string_0,
  string_1,
  string_2,
  string_3,
  string_4,
  string_5 };

char buffer[30];    // make sure this is large enough for the largest string it must hold

void setup()
{
  Serial.begin(19200); // A velocidade que eu gosto !!!
}


void loop()
{
  /* Using the string table in program memory requires the use of special functions to retrieve the data.
     The strcpy_P function copies a string from program space to a string in RAM ("buffer").
     Make sure your receiving string in RAM  is large enough to hold whatever
     you are retrieving from program space. */


  for (int i = 0; i < 6; i++)
  {
    strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); // Necessary casts and dereferencing, just copy.
    Serial.println( buffer );
    delay( 500 );
  }
}
Título: Re:PROGMEM
Enviado por: TigPT em 29 de Janeiro de 2009, 02:20
Muito muito interessante!!!

Poder por exemplo gravar os dados dos últimos segundos após uma falha de energia ou isso para depois ir ver o que se passou!!!
Título: Re:PROGMEM
Enviado por: ricardo-reis em 29 de Janeiro de 2009, 02:37
se falha a energia como é que guardas a info? (pergunta estupida?)
Título: Re:PROGMEM
Enviado por: TigPT em 29 de Janeiro de 2009, 02:43
A fonte de alimentação pode não ser única, podes ter um condensador que aguente uns milisegundos para guardares a informação assim que detecta o corte, ou até mesmo uma mini bateria caso seja necessário ;)
Título: Re:PROGMEM
Enviado por: ricardo-reis em 29 de Janeiro de 2009, 02:48
pôr uma pilha tipo pc só pa backups.. é bem..
Título: Re:PROGMEM
Enviado por: tr3s em 29 de Janeiro de 2009, 02:58
Ou então estar a gravar os dados a todo o segundo, assim quando falhasse tinha-se tudo até ao último segundo! Guardava-se tudo num buffer FIFO por exemplo.
Título: Re:PROGMEM
Enviado por: TigPT em 29 de Janeiro de 2009, 03:00
Ou então estar a gravar os dados a todo o segundo, assim quando falhasse tinha-se tudo até ao último segundo! Guardava-se tudo num buffer FIFO por exemplo.

Tem o inconveniente de desgastar o chip para não falar que ao tares a fazer isso não estás a fazer outras coisas :D
Título: Re:PROGMEM
Enviado por: tr3s em 29 de Janeiro de 2009, 03:03
É Verdade! :P
Título: Re:PROGMEM
Enviado por: ricardo-reis em 29 de Janeiro de 2009, 03:06
pois.. podes sp ir ao baixo nível do assembly pa o forçar a fazer duas coisas (quase) ao mesmo tempo, mas acho mt mais simples pôr a pilha.. :)
Título: Re:PROGMEM
Enviado por: TigPT em 29 de Janeiro de 2009, 03:07
acho bem mais interessante ter uma pilha ou até mesmo condensador, quando falta a energia um chip externo lança uma interruption que faz mudarmos para o método que guarda essa informação enquanto há bateria.
Título: Re:PROGMEM
Enviado por: ricardo-reis em 29 de Janeiro de 2009, 03:09
kd falas de interrupções tem alguma coisa a ver com assembly? :)
Título: Re:PROGMEM
Enviado por: tr3s em 29 de Janeiro de 2009, 03:11
Está-me a apetecer fazer um "black screen of death" para o LCD do nokia :P
Provocar erros propositados so para fazer mockery ao BSD!
Black screen, 3 segundos e o LCD desliga-se! Só pa testar a ideia... aaahah Mesmo inútil, mas era giro :D
Título: Re:PROGMEM
Enviado por: TigPT em 29 de Janeiro de 2009, 03:12
tem a ver com cpus... hum.. o assembly também processa interrupções, ou melhor só ele é que processa pois é a única linguagem que o cpu (micro) sabe.

Contudo podes também gera-las e trabalha-las em C ou C++ que os compiladores passam para assembly. Hoje em dia ninguém precisa de descer a baixo nível a menos que queira optimizar tamanho ou velocidade de código. ;)

Está-me a apetecer fazer um "black screen of death" para o LCD do nokia :P
Provocar erros propositados so para fazer mockery ao BSD!
Black screen, 3 segundos e o LCD desliga-se! Só pa testar a ideia... aaahah Mesmo inútil, mas era giro :D
ahaha era genial :D
Título: Re:PROGMEM
Enviado por: ricardo-reis em 29 de Janeiro de 2009, 03:15
eu sei que sim, gostei mt de trabalhar com assembly.. (há dois anos, salvo erro)


black screens? tipo os azuis do windows?
Título: Re:PROGMEM
Enviado por: tr3s em 29 de Janeiro de 2009, 03:16
eu sei que sim, gostei mt de trabalhar com assembly.. (há dois anos, salvo erro)


black screens? tipo os azuis do windows?

Yep yep :P
Era so pa gozar com os do windows!
Título: Re:PROGMEM
Enviado por: TigPT em 29 de Janeiro de 2009, 03:16
black screens? tipo os azuis do windows?

Exactamente, mas versão nokia lcd..  ;D ;D
Título: Re:PROGMEM
Enviado por: ricardo-reis em 29 de Janeiro de 2009, 03:23
dizer k tá com pouca bateria era bom.. (tipo wall-e  - eu adoro akele caixote)