collapse

* Links de Robótica

* Posts Recentes

Ajuda Projecto IR / RF por Njay
[Hoje às 00:03]


Recomendação de um opamp para um DAC r2r por jm_araujo
[Ontem às 23:05]


Ideias para construir um quadrúpede simples por dropes
[Ontem às 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]


Amplificador audio por beirao
[12 de Novembro de 2017, 23:43]


Power_OK Enermax por edeweld
[12 de Novembro de 2017, 17:15]


Driver motor por beirao
[11 de Novembro de 2017, 17:40]

Autor Tópico: Erro ao fazer upload de uma array em particular  (Lida 2361 vezes)

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

Offline samc

  • Mini Robot
  • *
  • Mensagens: 403
Erro ao fazer upload de uma array em particular
« em: 03 de Outubro de 2013, 06:51 »
Viva, estou a deparar-me com um erro muito estranho que está a dar comigo em doido!

De uma forma simples, cada vez que quero fazer o upload do código com uma determinada array criada por mim, o upload não é realizado e o Arduino fica encravado no upload.
Mas o mais estranho é que fui buscar uma array a outro código para experimentar e com qualquer uma das arrays desse código, o upload é realizado sem problemas.

Uma das minhas arrays:
Código: [Seleccione]
const prog_int8_t minha[256] PROGMEM = {
   0,    1,   1,     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
   2,    2,   2,     2,    2,    2,    2,    3,    3,    4,    4,    5,    5,    5,    5,    6,
   6,    6,   6,     7,    7,    7,    7,    8,    8,    8,    8,    9,    9,    9,    9,   10,
  10,   10,   10,   11,   11,   11,   12,   12,   12,   12,   13,   13,   13,   13,   14,   14,
  14,   14,   15,   15,   15,   15,   16,   16,   16,   16,   17,   17,   17,   17,   18,   18,
  18,   18,   18,   19,   19,   19,   19,   20,   20,   20,   21,   21,   21,   21,   22,   22,
  23,   23,   24,   24,   25,   25,   26,   26,   26,   26,   26,   26,   26,   26,   26,   26,
  26,   26,   26,   26,   26,   26,   26,   26,   27,   27,   27,   27,   27,   27,   27,   27,
  27,   27,   27,   27,   27,   27,   27,   28,   28,   28,   28,   28,   28,   28,   28,   28,
  28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
  28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
  28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   29,   29,   29,
  29,   29,   29,   29,   29,   29,   29,   29,   29,   29,   29,   29,   29,   30,   30,   30,
  31,   31,   31,   32,   32,   32,   33,   33,   33,   34,   34,   34,   35,   35,   35,   36,
  36,   36,   37,   37,   38,   39,   39,   40,   40,   41,   41,   42,   42,   43,   44,   45,
  46,   47,   48,   49,   50,   51,   52,   53,   54,   55,   80,  105,  180,  205,  255,  255
};

ou num formato linear
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 80, 105, 180, 205, 255, 255}

Se mudar os valores para esta array, funciona tudo bem!

Código: [Seleccione]
const prog_int8_t funciona[256] PROGMEM = {
    0,    0,    0,   64,    0,    0,    0,    0,    0,    0,    0,    0,   65,   65,   65,   66,
   66,   66,   67,   67,   67,   68,   68,   69,   69,   69,   70,   70,   71,   71,   72,   72,
   73,   74,   74,   75,   75,   76,   77,   77,   78,   78,   79,   80,   81,   81,   82,   83,
   83,   84,   85,   86,   86,   87,   88,   89,   89,   90,   91,   92,   93,   93,   94,   95,
   96,   96,   97,   98,   99,  100,  100,  101,  102,  103,  103,  104,  105,  106,  107,  107,
  108,  109,  109,  110,  111,  111,  112,  113,  114,  114,  115,  115,  116,  117,  117,  118,
  118,  119,  119,  120,  120,  121,  121,  122,  122,  123,  123,  124,  124,  124,  125,  125,
  125,  125,  126,  126,  126,  126,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  126,  126,  126,  126,  125,  125,
  125,  125,  124,  124,  124,  123,  123,  122,  122,  121,  121,  120,  120,  119,  119,  118,
  118,  117,  117,  116,  115,  115,  114,  114,  113,  112,  112,  111,  110,  109,  109,  108,
  107,  107,  106,  105,  104,  103,  103,  102,  101,  100,  100,   99,   98,   97,   96,   96,
   95,   94,   93,   93,   92,   91,   90,   89,   89,   88,   87,   86,   86,   85,   84,   83,
   83,   82,   81,   81,   80,   79,   78,   78,   77,   77,   76,   75,   75,   74,   74,   73,
   72,   72,   71,   71,   70,   70,   69,   69,   69,   68,   68,   67,   67,   67,   66,   66,
   66,   65,   65,   65,   65,   64,   64,   64,   64,   64,   64,   64,   64,   64,   64,   64
};

Alguém sabe que erro estou a cometer?


EDIT: fiz um pequeno programa para testar as duas arrays e fiz o upload e funcionou bem!
Código: [Seleccione]
#include <avr/pgmspace.h>



const prog_int8_t led_curva[256] PROGMEM = {
    0,    0,    0,   64,    0,    0,    0,    0,    0,    0,    0,    0,   65,   65,   65,   66,
   66,   66,   67,   67,   67,   68,   68,   69,   69,   69,   70,   70,   71,   71,   72,   72,
   73,   74,   74,   75,   75,   76,   77,   77,   78,   78,   79,   80,   81,   81,   82,   83,
   83,   84,   85,   86,   86,   87,   88,   89,   89,   90,   91,   92,   93,   93,   94,   95,
   96,   96,   97,   98,   99,  100,  100,  101,  102,  103,  103,  104,  105,  106,  107,  107,
  108,  109,  109,  110,  111,  111,  112,  113,  114,  114,  115,  115,  116,  117,  117,  118,
  118,  119,  119,  120,  120,  121,  121,  122,  122,  123,  123,  124,  124,  124,  125,  125,
  125,  125,  126,  126,  126,  126,  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
  127,  127,  127,  127,  127,  127,  127,  127,  127,  127,  126,  126,  126,  126,  125,  125,
  125,  125,  124,  124,  124,  123,  123,  122,  122,  121,  121,  120,  120,  119,  119,  118,
  118,  117,  117,  116,  115,  115,  114,  114,  113,  112,  112,  111,  110,  109,  109,  108,
  107,  107,  106,  105,  104,  103,  103,  102,  101,  100,  100,   99,   98,   97,   96,   96,
   95,   94,   93,   93,   92,   91,   90,   89,   89,   88,   87,   86,   86,   85,   84,   83,
   83,   82,   81,   81,   80,   79,   78,   78,   77,   77,   76,   75,   75,   74,   74,   73,
   72,   72,   71,   71,   70,   70,   69,   69,   69,   68,   68,   67,   67,   67,   66,   66,
   66,   65,   65,   65,   65,   64,   64,   64,   64,   64,   64,   64,   64,   64,   64,   64
};

const prog_int8_t red_curva[256] PROGMEM = {
  64,    1,   1,     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
   2,    2,   2,     2,    2,    2,    2,    3,    3,    4,    4,    5,    5,    5,    5,    6,
   6,    6,   6,     7,    7,    7,    7,    8,    8,    8,    8,    9,    9,    9,    9,   10,
  10,   10,   10,   11,   11,   11,   12,   12,   12,   12,   13,   13,   13,   13,   14,   14,
  14,   14,   15,   15,   15,   15,   16,   16,   16,   16,   17,   17,   17,   17,   18,   18,
  18,   18,   18,   19,   19,   19,   19,   20,   20,   20,   21,   21,   21,   21,   22,   22,
  23,   23,   24,   24,   25,   25,   26,   26,   26,   26,   26,   26,   26,   26,   26,   26,
  26,   26,   26,   26,   26,   26,   26,   26,   27,   27,   27,   27,   27,   27,   27,   27,
  27,   27,   27,   27,   27,   27,   27,   28,   28,   28,   28,   28,   28,   28,   28,   28,
  28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
  28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
  28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   28,   29,   29,   29,
  29,   29,   29,   29,   29,   29,   29,   29,   29,   29,   29,   29,   29,   30,   30,   30,
  31,   31,   31,   32,   32,   32,   33,   33,   33,   34,   34,   34,   35,   35,   35,   36,
  36,   36,   37,   37,   38,   39,   39,   40,   40,   41,   41,   42,   42,   43,   44,   45,
  46,   47,   48,   49,   50,   51,   52,   53,   54,   55,   80,  105,  180,  205,  255,  255
};


const prog_int8_t minha2[256] PROGMEM = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 80, 105, 180, 205, 255, 255};

int led = 13;

// the setup routine runs once when you press reset:
void setup() {               
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}


Não percebo, porque no programa principal não está a aceitar as arrays que criei (basta comentá-las ou substituir os valores por os valores de outra array do programa de exemplo que fica logo a funcionar o upload)
« Última modificação: 03 de Outubro de 2013, 06:59 por samc »

Offline samc

  • Mini Robot
  • *
  • Mensagens: 403
Re: Erro ao fazer upload de uma array em particular
« Responder #1 em: 03 de Outubro de 2013, 07:26 »
A minha conclusão para já e qualquer sequência de valores desta array faz com que a escrita do programa na memória do Arduino crashe. Mas isto apenas no programa principal em questão e no qual eu precisava desta array, porque num qualquer outro programa funciona sem problemas!

Solução temporária que funcionou: declarei esta array sem ser na PROGMEM e o upload foi realizado com sucesso

EDIT: assim que continuei o código e fiz novos uploads voltou ao mesmo. Está mesmo "embruxada" esta array!

EDIT2: mudei o tipo de variável de byte para int e tem estado a funcionar bem. Vai ocupar memória desnecessária mas como estou a usar o MEGA2560 não estou demasiado limitado, mas está a usar cerca de metade da DRAM

Citar
Sketch uses 29.114 bytes (11%) of program storage space. Maximum is 258.048 bytes.
Global variables use 3.363 bytes (41%) of dynamic memory, leaving 4.829 bytes for local variables. Maximum is 8.192 bytes.
(antes)
Sketch uses 28.854 bytes (11%) of program storage space. Maximum is 258.048 bytes.
Global variables use 2.339 bytes (28%) of dynamic memory, leaving 5.853 bytes for local variables. Maximum is 8.192 bytes.
« Última modificação: 03 de Outubro de 2013, 08:52 por samc »

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.142
Re: Erro ao fazer upload de uma array em particular
« Responder #2 em: 03 de Outubro de 2013, 12:33 »
A olhar de alto para o array, os valores parecem bastante lineares. Acho que conseguias fazer uma funcao matematica Y = f(x) com umas 2..4 linhas de codigo que resolviam esse problema.

Offline samc

  • Mini Robot
  • *
  • Mensagens: 403
Re: Erro ao fazer upload de uma array em particular
« Responder #3 em: 03 de Outubro de 2013, 12:56 »
Por acaso a função não é nada linear, tem algumas partes lineares mas o R2 é de 0.3 (regressão linear)!

Começo a ligar mais ao que falavam dos problemas da plataforma Arduino. Caso use a PROGMEM tenho dados corrompidos, por isso tenho de carregar tudo na memória DRAM.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: Erro ao fazer upload de uma array em particular
« Responder #4 em: 03 de Outubro de 2013, 18:26 »
Possivelmente tens ai 3 valore seguidos que em ASCII representam !!!, se bem me lembro isso atrofia o bootloader, não sei se alguma vez foi corrigido.
Avr fanboy

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.165
  • NERD!
Re: Erro ao fazer upload de uma array em particular
« Responder #5 em: 03 de Outubro de 2013, 22:15 »
! Muito bem pescada, e  que erro rebuscado! Grande memória Senso!!!
O código Ascii do ! é 33, e realmente no array tem 3 seguidos, e é fácil encontrar referências aos "!!!" no fórum arduino. É uma sequência especial para por o bootloader em "Monitor Mode"

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: Erro ao fazer upload de uma array em particular
« Responder #6 em: 03 de Outubro de 2013, 22:31 »
Penso que se mudares para o bootloader do Uno que é muito mais simples que deixas de ter esse problema, isso acontecia nos bootloaders mais antigos que suportam o protocolo STK500v2 todo ou praticamente todo.
Avr fanboy

Offline samc

  • Mini Robot
  • *
  • Mensagens: 403
Re: Erro ao fazer upload de uma array em particular
« Responder #7 em: 03 de Outubro de 2013, 22:42 »
Estou impressionado com o nível de conhecimento por aqui  :D

Tinha experimentado o programa de teste com o UNO e não tive problemas. Vou tentar ver se consigo utilizar o UNO como ISCP para fazer o upload do bootloader do Mega (pode ser que existam já alterações com relação ao que está instalado de origem).


Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: Erro ao fazer upload de uma array em particular
« Responder #8 em: 03 de Outubro de 2013, 22:44 »
Tens outra opção, metes a fórmula a preencher o array(para ram) no setup, e assim continuas a ter a vantagem de ter um lookup mas sem teres de enviar o array pré-gerado, não sei se podes ou não "perder" essa ram, mas é uma solução.
Ou então aproximar a tua formula actual com matemática mais simples, tipo duas ou três y=mX+b, e tambem já vi uns truques de emular exp com shifts.

A assinatura diz tudo  ;D
Avr fanboy

Offline samc

  • Mini Robot
  • *
  • Mensagens: 403
Re: Erro ao fazer upload de uma array em particular
« Responder #9 em: 03 de Outubro de 2013, 22:49 »
Ou então aproximar a tua formula actual com matemática mais simples, tipo duas ou três y=mX+b
Por acaso hoje durante o dia lembrei-me disso, visto que há partes que são muito lineares e outras que são praticamente exponenciais.
Quanto à outra sugestão de emular exp com shifts não percebi

Offline KammutierSpule

  • Mini Robot
  • *
  • Mensagens: 1.142
Re: Erro ao fazer upload de uma array em particular
« Responder #10 em: 04 de Outubro de 2013, 08:33 »
Lol.. essa do !!! sonharam com isso de noite :P So uma intervenção divina explica lembrarem-se desse tipo de bugs :P

@samc: se postares ai um grafico exel e com a formula da curva aproximada ou etc.. posso ajudar a fazer o codigo para adaptar.. com "shifts".

Offline samc

  • Mini Robot
  • *
  • Mensagens: 403
Re: Erro ao fazer upload de uma array em particular
« Responder #11 em: 04 de Outubro de 2013, 12:07 »
Obrigado a todos por as ajudas, mas o ideal seria mesmo utilizar um vector porque isto são valores experimentais e que vão de certeza ser alterados no futuro, por isso, se a array funcionar (independentemente da memória que ocupar), fica o assunto "resolvido".
Pelo menos sei que terei de ter atenção à sequência de !!!.

Agradeço a ajuda KammutierSpule, mas se calhar é perder tempo desnecessário (embora sempre aprendesse algo de novo). Deixo aqui o gráfico de apenas uma das curvas caso estejam curiosos.