Pages: 1 [2]   Go Down
Author Topic: Memória do Mega cheia  (Read 3722 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Esses arrays ficarão com estes valores que você colocou ou ainda terão alguma modificação?
Pergunto isso porque notei que
int Outono_S_prob_iluminacao[]
int Outono_U_prob_iluminacao[]
int Inverno_U_prob_iluminacao[]

Possuem os mesmos valores. Provavelmente outras variáveis terão o mesmo conteúdo. Como parece que o código não faz alterações nesses arrays, pode-se cortar as repetições.

Matematicamente é possível saber o valor de um array através de outro array? Se for possível, você poderá cortar alguns arrays e utilizar a matemática quando for saber seus valores.

Abraços
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 29
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Não, neste momento apenas estão definidos com os mesmos valores unicamente por questões de testes e verificações de funcionamento. Posteriormente serão definidos e introduzidos valores representativos de uma variável real.

Contudo, já consegui melhorar um pouco o código e ganhei algum espaço em memória.
Obrigado a todos.

Rafa

Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3330
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Vi agora o código e não funciona porque falta lá basicamente tudo... smiley-neutral
Tens de incluir o progmem, tens de definir as variáveis com o tipo que eu defini no meu exemplo e também colocar PROGMEM na inicialização.

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Estou com o msm problema, será que poderiam me ajudar???

Acredito que a memoria ram esteja cheia tb.

tentei usar o progmem e msm assim não deu certo

#include <SPI.h>
#include <Ethernet.h>
#include <IRremote.h>
#include <ArdOSC.h>  //inclui blibioteca ArdOSC
#include <Wire.h>
#include <avr/io.h>
#include <avr/interrupt.h>

int RECV_PIN = 11;
int ON = 0;

IRrecv irrecv(RECV_PIN);
decode_results results;
#define DETECT 2  //zero cross detect
#define GATE1 8    //triac gate
#define GATE2 12//triac gate
#define PULSE 4   //trigger pulse width (counts)
int i=513;
int j=513;
int led = 13;

byte myMac[]={  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};  //define MAC para shield Ethernet
byte myIp[]  = {  192, 168, 0, 99 };   //define IP da central automação
int serverPort  = 8000;   //define a porta de recepção do comando OSC
int destPort= 9000;   //define a porta de envio do comando OSC

OSCServer server;    //inicializa o servidor OSC (serviço que trata a recepção de mensagem OSC)
OSCClient client;    //inicializa o cliente OSC (serviço que trata o envio de mensagem OSC)


unsigned int TVCABO_POWER[20]         = {6050,1200,1200,1150,650,550,650,550,650,1150,650,550,650,550,650,1150,650,1150,650,};
unsigned int TVCABO_MENU[20]          = {6050,1150,1200,1200,600,600,600,600,1200,550,650,550,650,550,1250,550,1200,600,600,};
unsigned int TVCABO_GUIA[20]          = {6000,1200,1150,1200,650,550,650,550,1250,550,1250,550,650,550,650,550,650,550,650,};
//unsigned int TVCABO_VOLUME_MAIS[20]  PROGMEM = {5950,1250,1250,1150,650,550,650,1150,650,1150,1200,600,600,1150,650,550,1250,1150,650,};
//unsigned int TVCABO_VOLUME_MENOS[20] PROGMEM = {6050,1150,1250,1150,650,550,650,1150,600,1200,1200,600,600,1200,600,600,1200,1200,600,};
//unsigned int TVCABO_CANAL_MAIS[20]   PROGMEM = {6050,1150,1200,1200,600,550,650,550,650,550,1250,1150,600,1200,1200,600,1200,600,600,};
//unsigned int TVCABO_CANAL_MENOS[20]  PROGMEM = {6000,1200,1200,1200,600,600,600,550,650,550,1250,1150,1250,550,1250,550,1250,1150,650,};
unsigned int TVCABO_ESQUERDA[20]      = {6100,1150,1200,1150,650,550,650,550,1250,550,600,600,1200,1200,1200,1200,600,1200,600,};
unsigned int TVCABO_DIREITA[20]       = {6000,1200,1150,1250,600,600,550,650,1150,650,550,1200,650,550,1200,1200,650,1150,600,};
unsigned int TVCABO_CIMA[20]          = {6050,1150,1250,1150,650,550,650,550,1200,600,650,550,650,1150,1200,600,1200,1150,650,};
unsigned int TVCABO_BAIXO[20]         = {6050,1150,1200,1200,600,600,650,550,1250,550,650,550,1250,550,1200,1200,600,600,600,};
unsigned int TVCABO_OK[20]            = {5950,1250,1200,1200,600,600,600,600,1250,500,650,1150,650,1150,1250,1150,1200,600,650,};
unsigned int TVCABO_1[20]             = {6050,1150,1200,1200,600,600,600,600,600,600,600,550,650,1150,650,550,650,1150,650,};
unsigned int TVCABO_2[20]             = {6050,1150,1200,1200,600,550,650,550,650,550,600,600,1200,600,600,600,1200,600,600,};
unsigned int TVCABO_3[20]             = {6050,1150,1250,1150,650,550,650,550,650,550,650,550,1250,1150,600,600,1200,1200,600,};
unsigned int TVCABO_4[20]             = {6050,1150,1250,1150,650,550,650,550,650,550,650,1150,650,550,650,550,1250,1150,600,};
unsigned int TVCABO_5[20]             = {6050,1150,1150,1250,550,650,600,600,600,600,600,1200,600,1200,600,1200,600,550,650,};
unsigned int TVCABO_6[20]             = {6050,1150,1250,1150,650,550,650,550,650,550,650,1150,1250,550,650,1150,650,1150,600,};
unsigned int TVCABO_7[20]             = {6050,1150,1150,1250,550,650,600,600,600,600,600,1200,1200,1150,600,1200,1250,550,650,};
unsigned int TVCABO_8[20]             = {6050,1200,1200,1200,600,550,650,550,650,550,1250,550,650,550,650,1150,1250,550,650,};
unsigned int TVCABO_9[20]             = {6050,1200,1200,1150,650,550,650,550,600,600,1200,600,600,1200,600,1200,1200,1200,550,};
unsigned int TVCABO_0[20]             = {6050,1200,1150,1200,600,600,650,550,650,1150,600,600,600,1200,650,1150,1200,600,600,};
unsigned int TVCABO_SAIR[20]          = {6050,1150,1250,1150,600,600,600,600,1200,600,600,1200,1200,600,1200,1200,1200,1150,650,6050,};


IRsend irsend;
String readString;



void setup(){

  Serial.begin(9600);
  // set up pins
  pinMode(DETECT, INPUT);     //zero cross detect
  digitalWrite(DETECT, HIGH); //enable pull-up resistor
  pinMode(GATE1, OUTPUT);      //triac gate control
  pinMode(GATE2, OUTPUT);      //triac gate control
  pinMode(led, OUTPUT);
  irrecv.enableIRIn();                // Start the receiver


  // set up Timer1
  //(see ATMEGA 328 data sheet pg 134 for more details)
  OCR1A = 100;      //initialize the comparator
  OCR1B = 100;
 
  TIMSK1 = 0x03;    //enable comparator A and overflow interrupts
  TCCR1A = 0x00;    //timer control registers set for
  TCCR1B = 0x00;    //normal operation, timer disabled


  // set up zero crossing interrupt
  attachInterrupt(0,zeroCrossingInterrupt, RISING);
 
  //IRQ0 is pin 2. Call zeroCrossingInterrupt
  //on rising signal


  Ethernet.begin(myMac ,myIp);   //inicializa a interface ethernet
  server.begin(serverPort);   //inicializa o servidor OSC definindo a porta de RX
  //set callback function & oscaddress



}

void loop()
{
  if(server.aviableCheck()>0){   //verifica se existe alguma mensagem OSC disponível para leitura
  }
     

  OCR1A = i;     //set the compare register brightness desired.
  OCR1B = j;
}



void func23(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_POWER,20,38);
}

void func24(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_GUIA,20,38);
}

void func25(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_MENU,20,38);
}

void func26(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_ESQUERDA,20,38);
}

void func27(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_DIREITA,20,38);
}

void func28(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_CIMA,20,38);
}

void func29(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_BAIXO,20,38);
}

void func30(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_OK,20,38);
}


void func31(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_1,20,38);
}

void func32(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_2,20,38);
}

void func33(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_3,20,38);
}

void func34(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_4,20,38);
}

void func35(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_5,20,38);
}

void func36(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_6,20,38);
}

void func37(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_7,20,38);
}

void func38(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_8,20,38);
}

void func39(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_9,20,38);
}

void func40(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_0,20,38);
}

void func41(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_SAIR,20,38); 
}

void func42(OSCMessage *_mes){  //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
  int value=(int)_mes->getArgFloat(0);  //armazena em "value" o argumento do comando OSC "/ard/led2"
  i = value;
}

void func43(OSCMessage *_mes){  //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
  int value=(int)_mes->getArgFloat(0);  //armazena em "value" o argumento do comando OSC "/ard/led2"
  j = value;
}

void func44(OSCMessage *_mes){  //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
  int value=(int)_mes->getArgFloat(0);  //armazena em "value" o argumento do comando OSC "/ard/led2"
  digitalWrite(led,value);
}

void zeroCrossingInterrupt(){ //zero cross detect   
  TCCR1B=0x04; //start timer with divide by 256 input
  TCNT1 = 0;   //reset timer - count from zero
}

ISR(TIMER1_COMPA_vect){ //comparator match
  digitalWrite(GATE1,HIGH);  //set triac gate to high
  digitalWrite(GATE2,HIGH);  //set triac gate to high 
  TCNT1 = 65536-PULSE;      //trigger pulse width
}

ISR(TIMER1_OVF_vect){ //timer1 overflow
  digitalWrite(GATE1,LOW); //turn off triac gate
  digitalWrite(GATE2,LOW);  //set triac gate to high 
  TCCR1B = 0x00;          //disable timer stopd unintended triggers
}   


Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3330
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quer erro é que o progmem te dá? Estás a usá-lo correctamente??
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Deixa eu explicar melhor...

É um programa de automação residencial, onde a través do celular (protocolo osc) controlaria os aparelho de infra vermelho.

Tudo estava funcionando perfeitamente ate o momento em que eu acrescento variooooos botos. o programa continua funcionando, no entanto para de funcionar os ultimos botoes que foram acrescentados, por isso estou achando que é a memoria ram q esta cheia. Tentei utilizar o progmem, porem continua na msm, com os utimos botoes sem funcionar.


Logged

Portugal
Online Online
Edison Member
*
Karma: 37
Posts: 1595
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
void func35(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_5,20,38);
}

void func36(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_6,20,38);
}

void func37(OSCMessage *_mes){  ///TVCABO/POWER
  irsend.sendRaw(TVCABO_7,20,38);
}

......
Sabes o motivo de se criar uma funçao?
Idealmente é para ser facil usa-la, fazer o que promete da forma mais eficiente e de futuro ser possivel reutiliza-la sem escrever mais codigo para algo que faça o mesmo.
Olhando para todas as funções que crias-te vejo isso completamente como desperdício ja que podias fazer tudo numa só, alterando simplesmente o valor do parâmetro passado à funçao.
Fico com a ideia que isso foi um copy past por ai abaixo sem dó ...
Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vc tem razão, foi msm copy and past. Peguei um código pronto e so fui acrescentando.

Então vc sujere no lugar das funções eu ir colocando if?

poderia alterar a primeira função pra eu ver como ia ficar?
Logged

Portugal
Online Online
Edison Member
*
Karma: 37
Posts: 1595
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Vc tem razão, foi msm copy and past. Peguei um código pronto e so fui acrescentando.

Então vc sujere no lugar das funções eu ir colocando if?
Pois logo vi.
Olhando com mais atenção ao teu código tu nunca chamadas as tuas funções funcxx() em lado algum, portanto elas estarem lá ou não estar é igual!
Claramente vais ter de estudar melhor o teu codigo

Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

to vendo que ta faltando partes no programa que enviei.... smiley-kiss
to anexando o código completo!

No inicio do programa eu declaro um vetor de 20 posições que dentro desse vetor tem os códigos do infra vermelho.

unsigned int TVCABO_POWER[20] = {6050,1200,1200,1150,650,550,650,550,650,1150,650,550,650,550,650,1150,650,1150,650,};

Quando eu aperto o botão de ligar a tv a cabo no celular, ele vai para a seguinte linha de comando.

server.addCallback("/TVCABO/POWER",&func30);

ou seja, quando ele receber o protocolo osc referente ao botao de ligar a tv cabo ele cahama a função 30.

void func30(OSCMessage *_mes)

  irsend.sendRaw(TVCABO_POWER,20,38);
}
quando a função 30 é chamada ela envia os valores que estão dentro do vetor pelo protocolo Raw.

O programa inteiro so faz isso!!!!

Me ajuda a reduzir e tirar esse tanto de função e da uma reduzida? 

* Controle_Remoto.ino (21 KB - downloaded 7 times.)
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3330
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

De momento não tenho tempo para estar a fazer isso, mas fica uma descrição do que uma função é...

Code:
void func_envia_comando(unsigned int comando) {
     unsigned int comandos[4];
    //faz algo aqui...
    envia_comando(comandos[comando]);
}

dentro do loop...

botao = leBotao(); //isto retorna um valor de o a 3...

func_envia_comando(botao);

Isto é o que o teu programa não está a fazer...

Nota que tu podes ter matrizes... ou seja:
Code:
unsigned int comandos[23][20];//23 variáveis de 20 posições...

Depois apenas tens de ligar o valor que te é enviado pelo OSC com o indice da matriz que criei agora.
No entanto, isto não vai reduzir o tamanho da RAM... que neste caso é, só nos comandos, cerca de 1kb.

Também reparo ali numas variáveis e código para controlo de triac... julgava que isso era apenas para controlo de IR...

Quanto ao uso do progmem...

Tens aqui descrito de forma bastante clara:

http://arduino.cc/en/Reference/PROGMEM
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: 1 [2]   Go Up
Jump to: