collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: PROGMEM  (Lida 10746 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline DanBar

  • Mini Robot
  • *
  • Mensagens: 685
    • iCAR Lusorobotica Blog
PROGMEM
« 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

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 );
  }
}
« Última modificação: 13 de Janeiro de 2012, 23:05 por Psycop »
Antigo Nick do Forum: iCAR

Projectos iCAR
icar.lusorobotica.com

DB@G
http://www.facebook.com/daniel.barradas

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:PROGMEM
« Responder #1 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!!!

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:PROGMEM
« Responder #2 em: 29 de Janeiro de 2009, 02:37 »
se falha a energia como é que guardas a info? (pergunta estupida?)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:PROGMEM
« Responder #3 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 ;)

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:PROGMEM
« Responder #4 em: 29 de Janeiro de 2009, 02:48 »
pôr uma pilha tipo pc só pa backups.. é bem..

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:PROGMEM
« Responder #5 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.
Tr3s
Daniel Gonçalves

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:PROGMEM
« Responder #6 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

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:PROGMEM
« Responder #7 em: 29 de Janeiro de 2009, 03:03 »
É Verdade! :P
Tr3s
Daniel Gonçalves

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:PROGMEM
« Responder #8 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.. :)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:PROGMEM
« Responder #9 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.

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:PROGMEM
« Responder #10 em: 29 de Janeiro de 2009, 03:09 »
kd falas de interrupções tem alguma coisa a ver com assembly? :)

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:PROGMEM
« Responder #11 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
Tr3s
Daniel Gonçalves

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re:PROGMEM
« Responder #12 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

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re:PROGMEM
« Responder #13 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?

Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:PROGMEM
« Responder #14 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!
Tr3s
Daniel Gonçalves