не работает чтение епрома в цикле

iopq
Offline
Зарегистрирован: 05.07.2016

странности происходят какие то. вот код -

    etemp[9] = eeprom_read_byte((uint8_t*)17);
    etemp[10] = eeprom_read_byte((uint8_t*)18);
    etemp[11] = eeprom_read_byte((uint8_t*)19);
    etemp[12] = eeprom_read_byte((uint8_t*)20);
    etemp[13] = eeprom_read_byte((uint8_t*)21);
    etemp[14] = eeprom_read_byte((uint8_t*)22);
    etemp[15] = eeprom_read_byte((uint8_t*)23);
    etemp[16] = eeprom_read_byte((uint8_t*)24);

он работает. но выглядит не красиво. сделал через цикл -

        for( uint16_t i = 17; i < 24; i++){
        etemp[i-8] = eeprom_read_byte((uint8_t*)i);
        }

и не работает. я совершенно не понимаю в чем дело

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Как не работает? Что не так?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

для начала расшифруйте/покажите код

eeprom_read_byte

или я б так попробовал

etemp[i-8] = eeprom_read_byte((uint8_t*)[i]);

for( uint16_t i = 17; i < 25; i++){
etemp[i-8] = eeprom_read_byte((uint8_t*)[i]);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

iopq пишет:

странности происходят какие то. вот код -

    etemp[9] = eeprom_read_byte((uint8_t*)17);
  

и не работает. я совершенно не понимаю в чем дело

что-то мне подсказывает, что запись (uint8_t*)17 - это что-то с чем-то...

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

А почему нельзя просто etemp[i] = EEPROM.read(i+8);?

 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

можно , но зачем тогда указатель на байт (uint8_t*) ?

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

andycat пишет:

можно , но зачем тогда указатель на байт (uint8_t*) ?

Если это мне вопрос, то я вообще не понимаю, что эта функция пытается творить и нафига ей такой сподвывертный аргумент 

iopq
Offline
Зарегистрирован: 05.07.2016

eeprom_read_byte это функция из #include <avr/eeprom.h>

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

надо у ТС для начала спросить что он хочет вообще сделать 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

andycat пишет:

надо у ТС для начала спросить что он хочет вообще сделать 

Это да. Потренирую телепатические навывыки

Может так, и всего делов?

#include <EEPROM.h>
for (uint8_t i = 17; i < 24; i++) etemp[i] = EEPROM.read(i+8);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

iopq пишет:

странности происходят какие то. вот код -

    etemp[9] = eeprom_read_byte((uint8_t*)17);
    etemp[10] = eeprom_read_byte((uint8_t*)18);
    etemp[11] = eeprom_read_byte((uint8_t*)19);
    etemp[12] = eeprom_read_byte((uint8_t*)20);
    etemp[13] = eeprom_read_byte((uint8_t*)21);
    etemp[14] = eeprom_read_byte((uint8_t*)22);
    etemp[15] = eeprom_read_byte((uint8_t*)23);
    etemp[16] = eeprom_read_byte((uint8_t*)24);

он работает. но выглядит не красиво. сделал через цикл -

        for( uint16_t i = 17; i < 24; i++){
        etemp[i-8] = eeprom_read_byte((uint8_t*)i);
        }

и не работает. я совершенно не понимаю в чем дело

В чём выражается, что "не работает"? Вывешивает плакаты о забастовке или что? Может, не заполняет последний элемент etemp[16]? Так, и не должна - напишите цикл правильно.

Если что-то не то, то выкладывайте полный (но короткий!!!!) скетч с первым вариантом и со вторым и чтобы видно было что именно не работает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andycat пишет:

надо у ТС для начала спросить что он хочет вообще сделать 

Да, какая разница. Человек привёл развёрнутый код и, как ему кажется, тоже самое, но в цикле и спрашивает. Может он просто циклы изучает.

Цикл написан неправильно, верхняя граница сдвинута. Надеюсь, это то. Он же не написал что именно не работает.

Так-то ему вообще можно посоветовать писать EEPROM[i] и не выпендриваться, но он же не об этом спрашивает.

iopq
Offline
Зарегистрирован: 05.07.2016

просто это на attiny13. я не думаю что полный код что-то изменит

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, тогда я не думаю, что Вам действительно нужна помощь.

Повторяю, Вы забыли сказать, что именно не работает и как Вы про это узнали. Я вот погадал на гуще и подумал, что у Вас последний элемент не заполняется (эта-то ошибка у Вас в любом случае есть), не угадал?

Еще погадать?

Или Вам всё-таки приподнять задницу и сделать демонстрационный код? Сразу говорю - демонстрационный - только для демонстрации проблемы! Т.е. те строки, что мы видели + печать, которая показывает в чём беда и не более. Если Вы планируете выкладывать 100500 строк, разбирайтесь в них сами.

iopq
Offline
Зарегистрирован: 05.07.2016
uint8_t etemp[26] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
ISR(INT0_vect) {
  if (etemp[0] == 0x00) {
    
      eeprom_read_block(etemp, (uint8_t*)0,  9);
    
//    etemp[9] = eeprom_read_byte((uint8_t*)17);
//    etemp[10] = eeprom_read_byte((uint8_t*)18);
//    etemp[11] = eeprom_read_byte((uint8_t*)19);
//    etemp[12] = eeprom_read_byte((uint8_t*)20);
//    etemp[13] = eeprom_read_byte((uint8_t*)21);
//    etemp[14] = eeprom_read_byte((uint8_t*)22);
//    etemp[15] = eeprom_read_byte((uint8_t*)23);
//    etemp[16] = eeprom_read_byte((uint8_t*)24);

        for( uint16_t i = 17; i < 25; i++){
        etemp[i-8] = eeprom_read_byte((uint8_t *)i);
        }

    etemp[0] = 0x55;
    writebytes(etemp, 18);

  }

ну вот кратчайшее для полного представления происходящего

iopq
Offline
Зарегистрирован: 05.07.2016

мусором заполняется. 

sadman41
Offline
Зарегистрирован: 19.10.2016

А что вы ожидаете найти в (uint8_t*)0 вместо мусора - номер оффшорного счёта Трампа?

iopq
Offline
Зарегистрирован: 05.07.2016
    for ( int16_t i = 17; i < 25; i++) {
      etemp[i - 8] = eeprom_read_byte((uint8_t *)(&i));
    }

вот так работает

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

eeprom_read_byte(i)  точно не работает? Или стоит задача осуществить максимальное количество взятий адреса и разименовывания? 

iopq
Offline
Зарегистрирован: 05.07.2016
invalid conversion from 'int16_t {aka int}' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive]

 

ошибка при компиляции
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

iopq пишет:

uint8_t etemp[26] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
ISR(INT0_vect) {
  if (etemp[0] == 0x00) {
    
      eeprom_read_block(etemp, (uint8_t*)0,  9);
    
//    etemp[9] = eeprom_read_byte((uint8_t*)17);
//    etemp[10] = eeprom_read_byte((uint8_t*)18);
//    etemp[11] = eeprom_read_byte((uint8_t*)19);
//    etemp[12] = eeprom_read_byte((uint8_t*)20);
//    etemp[13] = eeprom_read_byte((uint8_t*)21);
//    etemp[14] = eeprom_read_byte((uint8_t*)22);
//    etemp[15] = eeprom_read_byte((uint8_t*)23);
//    etemp[16] = eeprom_read_byte((uint8_t*)24);

        for( uint16_t i = 17; i < 25; i++){
        etemp[i-8] = eeprom_read_byte((uint8_t *)i);
        }

    etemp[0] = 0x55;
    writebytes(etemp, 18);

  }

ну вот кратчайшее для полного представления происходящего

Простите, Вы не могли бы выдать короткий скетч, но такой. чтобы я сам мог запустить и увидеть проблему? Чего Вы мне всё огрызки суёте?

Проблема не в этих строках, что Вы мне показываете. Здесь всё нормально. давайте полный скетч.

iopq
Offline
Зарегистрирован: 05.07.2016

так все заработало же. 

 

for ( int16_t i = 17; i < 25; i++) {
  etemp[i - 8] = eeprom_read_byte((uint8_t *)(&i));
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Rumata пишет:

eeprom_read_byte(i)  точно не работает? 

Мужики, ну с чего ей так работать? Вы посмотрите как она описана

uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__;

Всё нормально у ТС, но он упорно не хочет показать нормальный скетч, всё какие-то огрызки суёт. Показал бы, давно бы всё разрулили.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

iopq пишет:

так все заработало же. 

 

for ( int16_t i = 17; i < 25; i++) {
  etemp[i - 8] = eeprom_read_byte((uint8_t *)(&i));
}

 

То, что здесь написано - бред.

И заработать оно может лишь в одном случае - если при записи в еепром, допущен такой же бред. Тогда, да, заработает.

Если Вас устраивает бред в программе - Бог в помощь. Но с такими заморочками, вы рискуете получить охренительные и необъяснимые глюки!

Попробуйте напечатать величину &i и посмотреть из каких именно адресов Вы читаете - премного удивитесь.

Очень Вам советую таки разобраться.

iopq
Offline
Зарегистрирован: 05.07.2016

так уже интересно 

полный код для воспроизведения прикладывать смысла нет - вы его не воспроизведете. он под тини13

запись произвожу вот так -

eeprom_write_block(etemp, (uint8_t*)0,  sizeof(etemp));
#include <avr/eeprom.h>
uint8_t etemp[26] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void setup() {
  MCUCR = 0b00000011; 
  GIMSK = _BV(INT0);
  sei();
  while (1) {}
}
ISR(INT0_vect) {
  if ( etemp[0] == 0xAA) {
    eeprom_write_block(etemp, (uint8_t*)0,  sizeof(etemp));
  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

iopq пишет:
 

полный код для воспроизведения прикладывать смысла нет

Ну, тогда мне терять на Вас время смысла нет. Извините.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

iopq пишет:

invalid conversion from 'int16_t {aka int}' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive]

 

ошибка при компиляции

Само собой. Нафика i 16-битным объявлять

iopq
Offline
Зарегистрирован: 05.07.2016
invalid conversion from 'uint8_t {aka unsigned char}' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive]
    for ( uint8_t i = 17; i < 25; i++) {
      etemp[i - 8] = eeprom_read_byte(i);
    }

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Да я уже понял, залез в источник. Больше нет идей, сдаюсь. 

strarbit
Offline
Зарегистрирован: 12.06.2016

as an example

eeprom_write_byte (( uint8_t* ) 3, 88 );                // write the byte 88 to location 3 of the EEPROM
uint8_t eemread = eeprom_read_byte (( uint8_t* ) 3 );	// read the byte in location 3 

 

iopq
Offline
Зарегистрирован: 05.07.2016
#include <avr/eeprom.h>
uint8_t etemp[26] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void setup() {
  Serial.begin(115200);
    
    
    for (uint8_t i = 0; i < 26; i++){
    etemp[i] = rand();
    }

      for (uint8_t i = 0; i < 26; i++){
  Serial.print(etemp[i], HEX);
  }
    Serial.println();
    
    
    eeprom_write_block(etemp, (uint8_t*)0,  sizeof(etemp));
    eeprom_read_block(etemp, (uint8_t*)0,  sizeof(etemp));

  
  for (uint8_t i = 0; i < 26; i++){
  Serial.print(etemp[i], HEX);
  }

    Serial.println();
    
for ( int16_t i = 0; i < 26; i++) {
  etemp[i] = eeprom_read_byte((uint8_t *)(&i));
}
  
  for (uint8_t i = 0; i < 26; i++){
  Serial.print(etemp[i], HEX);
  }


}


void loop() {
  // put your main code here, to run repeatedly:

}
A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5
A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5
FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA

полный бред. как это у меня работает на тини13 я не понимаю

Green
Offline
Зарегистрирован: 01.10.2015

Неужто тяжело CTRL+T нажать?

#include <avr/eeprom.h>

uint8_t etemp[26];

void setup() {
  Serial.begin(115200);
  Serial.println();

  for (uint8_t i = 0; i < 26; i++) {
    etemp[i] = rand();
  }

  Serial.println();
  for (uint8_t i = 0; i < 26; i++) {
    Serial.print(etemp[i], HEX);
  }

  eeprom_write_block(etemp, (uint8_t*)0, sizeof(etemp));
  eeprom_read_block(etemp, (uint8_t*)0, sizeof(etemp));

  Serial.println();
  for (uint8_t i = 0; i < 26; i++) {
    Serial.print(etemp[i], HEX);
  }

  for ( int16_t i = 0; i < 26; i++) {
    etemp[i] = eeprom_read_byte((uint8_t*)i);
  }

  Serial.println();
  for (uint8_t i = 0; i < 26; i++) {
    Serial.print(etemp[i], HEX);
  }
}


void loop() {
}
A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5
A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5
A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5

 

Green
Offline
Зарегистрирован: 01.10.2015

И нафига жестко к адресам еепром привязываться?
 

#include <avr/eeprom.h>


EEMEM uint8_t eetemp[26];
uint8_t etemp[sizeof(eetemp)];


void setup() {
  Serial.begin(115200);
  Serial.println();

  for (uint8_t i = 0; i < sizeof(etemp); i++) {
    etemp[i] = rand();
  }

  Serial.println();
  for (uint8_t i = 0; i < sizeof(etemp); i++) {
    Serial.print(etemp[i], HEX);
  }

  eeprom_write_block(etemp, eetemp, sizeof(etemp));
  eeprom_read_block(etemp, eetemp, sizeof(etemp));

  Serial.println();
  for (uint8_t i = 0; i < sizeof(etemp); i++) {
    Serial.print(etemp[i], HEX);
  }

  for (uint8_t i = 0; i < sizeof(etemp); i++) {
    etemp[i] = eeprom_read_byte(&eetemp[i]);
  }

  Serial.println();
  for (uint8_t i = 0; i < sizeof(etemp); i++) {
    Serial.print(etemp[i], HEX);
  }
}


void loop() {
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

iopq пишет:

#include <avr/eeprom.h>
uint8_t etemp[26] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void setup() {
  Serial.begin(115200);
    
    
    for (uint8_t i = 0; i < 26; i++){
    etemp[i] = rand();
    }

      for (uint8_t i = 0; i < 26; i++){
  Serial.print(etemp[i], HEX);
  }
    Serial.println();
    
    
    eeprom_write_block(etemp, (uint8_t*)0,  sizeof(etemp));
    eeprom_read_block(etemp, (uint8_t*)0,  sizeof(etemp));

  
  for (uint8_t i = 0; i < 26; i++){
  Serial.print(etemp[i], HEX);
  }

    Serial.println();
    
for ( int16_t i = 0; i < 26; i++) {
  etemp[i] = eeprom_read_byte((uint8_t *)(&i));
}
  
  for (uint8_t i = 0; i < 26; i++){
  Serial.print(etemp[i], HEX);
  }


}


void loop() {
  // put your main code here, to run repeatedly:

}
A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5
A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5
FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA

полный бред. как это у меня работает на тини13 я не понимаю

да уберите же вы апостроф в строке 29, я же Вам сказал, что это бред

Я убрал и больше не менял ничего. Всё заработало

#include <avr/eeprom.h>
uint8_t etemp[26] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void setup() {
  Serial.begin(115200);


  for (uint8_t i = 0; i < 26; i++) {
    etemp[i] = rand();
  }

  for (uint8_t i = 0; i < 26; i++) {
    Serial.print(etemp[i], HEX);
  }
  Serial.println();


  eeprom_write_block(etemp, (uint8_t*)0,  sizeof(etemp));
  eeprom_read_block(etemp, (uint8_t*)0,  sizeof(etemp));


  for (uint8_t i = 0; i < 26; i++) {
    Serial.print(etemp[i], HEX);
  }

  Serial.println();

  for ( int16_t i = 0; i < 26; i++) {
    etemp[i] = eeprom_read_byte((uint8_t *)(i));
  }

  for (uint8_t i = 0; i < 26; i++) {
    Serial.print(etemp[i], HEX);
  }


}


void loop() {
  // put your main code here, to run repeatedly:

}
//  A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5
//  A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5
//  A7F1D92A82C8D8FE434D98558CE2B347171198542F112D558F5

А что у Вас там на тиньке - это э секрет большой :-(

iopq
Offline
Зарегистрирован: 05.07.2016

да спасибо. я вчера провел исследования и оказалось что я ошибочно принимал что все работает. на деле оказывается что добавление моего цикла приводит к неадекватному поведению всей программы. (даже предположить не могу почему). хотя при этом программа занимает меньший объем. вообщем удалив наименее необходимую функцию (проверки crc) все заработало. 

еще интересует должен ли мк корректно работать при заполнении флеш памяти на 100% или же нужно оставлять? по идее должен работать

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

То, что с & будет глючить, я Вам вчера писал.

Цикл у Вас написан правильно и на Уно, как видите, всё работает нормально. Ошибка где-то в другом месте. Но, коль скоро скетч у Вас секретный, разбирайтесь с ним сами.

Епром можете заполнять полностью, зачем что-то оставлять?

iopq
Offline
Зарегистрирован: 05.07.2016

не епром а память программы. там где .hex хранится 

 

вчера подразобрался с указателями и ссылками

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И память программы можете заполнять до последнего байта. Зачем там что-то оставлять?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

И память программы можете заполнять до последнего байта. Зачем там что-то оставлять?

а внуки куда функции будут дописывать? )))