14.10.2014, 23:23 | #131 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ускоряем работу Arduino
Адрес 11 для Long будет занимать адреса 44,45,46,47 для значений типа byte
то есть умножайте на 4 и получите адресное поле однобайтников У разных тапов разная адресация Для обьединения разных типов данных в одно адресное поле используют структуры |
14.10.2014, 23:36 | #132 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 |
Re: Ускоряем работу Arduino
Спасибо, но вопрос почему забивает все адресное поле?
Если есть возможность, попробуйте этот скетч: #include <CyberLib.h> int i; void setup() { Serial.begin(9600); for (i=0; i<1024; i++) { WriteEEPROM_Byte(i,255); Serial.print(i,DEC); Serial.print(" "); Serial.println(ReadEEPROM_Byte(i),HEX); } if (ReadEEPROM_Word(0)<400) {WriteEEPROM_Word(0, 510);} //Значение клавиши Set if (ReadEEPROM_Word(2)<400) {WriteEEPROM_Word(2, 825);} //Значение клавиши UP if (ReadEEPROM_Word(4)<400) {WriteEEPROM_Word(4, 690);} //Значение клавиши DOWN if (ReadEEPROM_Byte(8)<1||ReadEEPROM_Byte(8 )>20) {WriteEEPROM_Byte(8, 5);} //Время освещения по умолчанию if (ReadEEPROM_Byte(9)<8||ReadEEPROM_Byte(9 )>20) {WriteEEPROM_Byte(9, 10);} //Температура по умолчанию if (ReadEEPROM_Byte(10)<30||ReadEEPROM_Byte (10)>80) {WriteEEPROM_Byte(10, 40);} //Влажность по умолчанию if (ReadEEPROM_Long(11)<-29||ReadEEPROM_Long(11)>29) {WriteEEPROM_Long(11, 0);} //Корр. времени по умолчанию if (ReadEEPROM_Long(15)<-5||ReadEEPROM_Long(15)>5) {WriteEEPROM_Long(15, 0);} //Корр. темп.помещения низ даллас if (ReadEEPROM_Long(19)<-5||ReadEEPROM_Long(19)>5) {WriteEEPROM_Long(19, 0);} //Корр.темп.улица даллас if (ReadEEPROM_Long(23)<-5||ReadEEPROM_Long(23)>5) {WriteEEPROM_Long(23, 0);} //Корр.темп.помещение DHT if (ReadEEPROM_Long(27)<-15||ReadEEPROM_Long(27)>15) {WriteEEPROM_Long(27, 0);} //Корр.влажности DHT WriteEEPROM_Byte(40, 28); WriteEEPROM_Byte(41, 29); WriteEEPROM_Byte(42, 30); WriteEEPROM_Byte(43, 31); WriteEEPROM_Byte(44, 32); WriteEEPROM_Byte(45, 33); WriteEEPROM_Byte(46, 34); WriteEEPROM_Byte(47, 35); } void loop() { for (i=0; i<1024; i++) { if (ReadEEPROM_Byte(i)!=255) { Serial.print(i,DEC); Serial.print(" "); Serial.println(ReadEEPROM_Byte(i),DEC); delay(200); } } } |
15.10.2014, 01:43 | #133 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ускоряем работу Arduino
Пока нет возможности проверить
Завтра проверю А Вы знаете как должны храниться в памяти 64,32,16 битные данные? |
15.10.2014, 09:24 | #134 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 |
Re: Ускоряем работу Arduino
Добрый день.
Упростил скетч: #include <CyberLib.h> int i; void setup() { Serial.begin(9600); for (i=0; i<1024; i++) { WriteEEPROM_Byte(i,255); Serial.print(i,DEC); Serial.print(" "); Serial.println(ReadEEPROM_Byte(i),HEX); } WriteEEPROM_Byte(1, 0); //WriteEEPROM_Word(1, 0); //WriteEEPROM_Long(2, 0); } void loop() { for (i=0; i<1024; i++) { if (ReadEEPROM_Byte(i)!=255) { Serial.print(i,DEC); Serial.print(" "); Serial.println(ReadEEPROM_Byte(i),DEC); delay(500); } } } Артефакты идут в *_Byte и *_Word с интервалом адрес+FF. В данном случае получается 0 в ячейках: 1, 257, 513, 769. А *_Long это очень большие грабли))) адресуется как адрес*4, тенденция +FF сохраняется и нигде про такую адресацию ни слова (добавьте в описание) А значения я так предполагаю хранятся побайтово. Либа и подкупила, что не надо заниматься байтовой расчлененкой для 2х и 4х байтовых чисел. |
15.10.2014, 09:44 | #135 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 |
Re: Ускоряем работу Arduino
Вдогонку, выше FF напрямую не адресуется. Где-то здесь собака порылась)))
|
15.10.2014, 10:19 | #136 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 |
Re: Ускоряем работу Arduino
По всем симптомам, похоже имеем однобайтовую адресацию к EEPROM. В либу лезть знаний не хватает(((.
|
15.10.2014, 10:53 | #137 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ускоряем работу Arduino
Похоже что проблема в адресации. Получается что предел адресов лежит от 0 до 255
Для Long от 0 до 63 Проблема в том что AVR-ская библиотека avr/eeprom.h использует тип uint8_t для адресации, то есть макимум 256 адресов Возможно придется править ее и переносить полностью в CyberLib, а пока добавил в описании Цитата:
|
|
15.10.2014, 12:13 | #138 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 |
Re: Ускоряем работу Arduino
Немного еще добавлю.
*_Word - адресное поле принимает 0-1022 (физические адреса 0-1023). По два байтика на пальцах считаем. Спасибо. |
15.10.2014, 12:41 | #139 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ускоряем работу Arduino
Это хорошо, можно будет реализовать и Long на все адресное пространство
Сегодня подправлю |
05.11.2014, 07:03 | #140 | |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Re: Ускоряем работу Arduino
Эдуард, замени "keywords.txt" на тот, что в архиве.
Будет подсвечиваться вот это: Цитата:
|
|
Здесь присутствуют: 52 (пользователей: 0 , гостей: 52) | |
|
|