EEPROM Arduino IDE 1.6.x
- Войдите на сайт для отправки комментариев
Пт, 27/11/2015 - 13:11
Помогите разобраться.
В старых версиях работает нормально, в новых не могу понять, что не так?
Весь код очень длинный и написан для работы с тач дисплеем, вот фрагмент в котором вроде как проблема.
[code] #include <EEPROM.h> byte ch1led[96], ch2led[96], ch3led[96], ch4led[96], ch5led[96]; byte tled[96]; void SaveToEEPROM(int what) { switch (what) { case 1: EEPROM.write(0, 121); delay(5); for (int i = 0; i < 96; i++) { EEPROM.write(i + 1, ch1led[i]); delay(5); } break; case 2: EEPROM.write(97, 122); delay(5); for (int i = 0; i < 96; i++) { EEPROM.write(i + 98, ch2led[i]); delay(5); } break; case 3: EEPROM.write(194, 123); delay(5); for (int i = 0; i < 96; i++) { EEPROM.write(i + 195, ch3led[i]); delay(5); } break; case 4: EEPROM.write(291, 124); delay(5); for (int i = 0; i < 96; i++) { EEPROM.write(i + 292, ch4led[i]); delay(5); } break; case 5: EEPROM.write(388, 125); delay(5); for (int i = 0; i < 96; i++) { EEPROM.write(i + 389, ch5led[i]); delay(5); } break; } } void ReadFromEEPROM() { int k; k = EEPROM.read(0); delay(5); if (k == 121) { for (int i = 0; i < 96; i++) { ch1led[i] = EEPROM.read(i + 1); delay(5); } } k = EEPROM.read(97); delay(5); if (k == 122) { for (int i = 0; i < 96; i++) { ch2led[i] = EEPROM.read(i + 98); delay(5); } } k = EEPROM.read(194); delay(5); if (k == 123) { for (int i = 0; i < 96; i++) { ch3led[i] = EEPROM.read(i + 195); delay(5); } } k = EEPROM.read(291); delay(5); if (k == 124) { for (int i = 0; i < 96; i++) { ch4led[i] = EEPROM.read(i + 292); delay(5); } } k = EEPROM.read(388); delay(5); if (k == 125) { for (int i = 0; i < 96; i++) { ch5led[i] = EEPROM.read(i + 389); delay(5); if (i == EEPROM.length()) i = 0; } } } void setup() { ReadFromEEPROM(); } void loop() { // Далее ненужная программа // которая никак нехочет подхватывать значения памяти int a; switch (selectChannel) { case 1: for (int i = 0; i < 96; i++) tled[i] = ch1led[i]; break; case 2: for (int i = 0; i < 96; i++) tled[i] = ch2led[i]; break; case 3: for (int i = 0; i < 96; i++) tled[i] = ch3led[i]; break; case 4: for (int i = 0; i < 96; i++) tled[i] = ch4led[i]; break; case 5: for (int i = 0; i < 96; i++) tled[i] = ch5led[i]; break; } for (int j = 0; j < 8; j++) { a = (i * 8) + j; // tled[a] указывается куда и как выводить на дисплей } } [/code]
Вернее сказать, массив tled[i] всё же имеет значения, но только с первого прерывания.
Прошу сильно не пинать, я тут только въезжаю в тему...
Вроде разобрался...
В новой IDE нужно задавать массив:
А старая съедала
И нормально работало...
Может ты сказать что то хотел или так, пришел покурить? В чем проблема то?
Хочешь, конечно, можешь поменять byte на int, только проблема может возникнуть снова, если её не понять.
В чем проблема и как это проявляется?
И да, о каких прерываниях речь, если здесь прерываниями и не пахнет.
Может ты сказать что то хотел или так, пришел покурить? В чем проблема то?
Хочешь, конечно, можешь поменять byte на int, только проблема может возникнуть снова, если её не понять.
В чем проблема и как это проявляется?
И да, о каких прерываниях речь, если здесь прерываниями и не пахнет.
Может неправильно сформулировал.
Проблема в преобразовании типа данных, причину понять я так и не смог.
Как выяснилось она не связана с EEPROM. Тему можно закрыть.
Почему это выплыло только в IDE версии 1.6.х, ???
Бред. Во всём скечте tled присваиваеются значения типа byte и никак потом не используются. Или нам пудрят мозги и показазывают не весь скетч, или здесь byte или int ни на что не влияет и влиять не может.
ЕвгенийП, Так автор сказал, что выложил нарезку кода, а не весь код. Как обычно, ошибки в коде, который не приложили, потому что даже не подозревают, что там и есть ошибка.
Не вопрос...
Вот, Вам код, изучайте
На Arduino IDE 1.x.x нет проблем, на 1.6.x проблемы...
Не вопрос...
Вот, Вам код, изучайте
Во-первых, если код большой, надо ставить "скрыть".
Во-вторых, мне Ваш код не нужен. Помощь нужна была Вам, а не мне, но Вы не соизволили даже показать код, когда за ней обращались. А теперь просто хамите.
Обращайтесь ещё.
Во-первых, если код большой, надо ставить "скрыть".
Во-вторых, мне Ваш код не нужен. Помощь нужна была Вам, а не мне, но Вы не соизволили даже показать код, когда за ней обращались. А теперь просто хамите.
Обращайтесь ещё.
Странно, в чём хамство?
Вообще-то проблемный участок кода был, но Вам показалось мало...
но Вам показалось мало...
*ну, почему они такие упоротые? ...и мстительные!
теперь возьми этот код распечатай и съешь.
Ок, исходник есть, а где описание проблемы? Да, это мой последний вопрос. Фразу "Проблема в преобразовании типа данных" можно понять как угодно, вот варианты:
1. Ошибка компиляции. Но текста ошибки компилятора не приложено, предположим не оно.
2. Вывожу на дисплей данные, но выводится не то. Тогда нужно указать, при каких условиях, что должно выводиться и что выводится.
3. Думаю еще можно придумать вполне правдоподобные варианты, но как то уже не хочется фантазий.
printVBar первым параметром хочет знаковое число, а byte == unsigned char, т.е. беззнаковое. Чем это может быть плохо? Тем, что в printVBar это значение сравнивается на > -1, т.е. это условие будет ВСЕГДА срабатывать, потому что на входе было беззнаковое число, т.е. число >= 0. Важно ли, что этот код будет вызываться всегда, потому что val не может быть меньше 0:
можно только догадываться, но как то не хочется.
PS Вместо копирования 96 байт, проще хранить указатель на массив, это не будет занимать лишних 96 байт.
Ок, исходник есть, а где описание проблемы? Да, это мой последний вопрос. Фразу "Проблема в преобразовании типа данных" можно понять как угодно, вот варианты:
1. Ошибка компиляции. Но текста ошибки компилятора не приложено, предположим не оно.
2. Вывожу на дисплей данные, но выводится не то. Тогда нужно указать, при каких условиях, что должно выводиться и что выводится.
3. Думаю еще можно придумать вполне правдоподобные варианты, но как то уже не хочется фантазий.
printVBar первым параметром хочет знаковое число, а byte == unsigned char, т.е. беззнаковое. Чем это может быть плохо? Тем, что в printVBar это значение сравнивается на > -1, т.е. это условие будет ВСЕГДА срабатывать, потому что на входе было беззнаковое число, т.е. число >= 0. Важно ли, что этот код будет вызываться всегда, потому что val не может быть меньше 0:
можно только догадываться, но как то не хочется.
PS Вместо копирования 96 байт, проще хранить указатель на массив, это не будет занимать лишних 96 байт.
Я так понимаю Вы поняли о чём речь и собрали
Компиляция без ошибок.
Проблема в функции -
void
ledSetScreen()
Если указываю массив как
то всё нормально, если
то выдаёт всякую ерунду... Вот в этой части кода (5строка)
Это можно увидеть когда задаёшь значения по каналам, к примеру "Сh 1" --> "CHANGE" --> задаём значения --> SAVE -- > (значения изменились) --> BACK --> "Ch 3" --> (и вот на этом экране видим значения от предыдущего канала, а должны быть от 3-го канала)