![]() |
![]() |
#131 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Адрес 11 для Long будет занимать адреса 44,45,46,47 для значений типа byte
то есть умножайте на 4 и получите адресное поле однобайтников У разных тапов разная адресация Для обьединения разных типов данных в одно адресное поле используют структуры |
![]() |
![]() |
![]() |
#132 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 ![]() |
![]()
Спасибо, но вопрос почему забивает все адресное поле?
Если есть возможность, попробуйте этот скетч: #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); } } } |
![]() |
![]() |
![]() |
#133 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Пока нет возможности проверить
Завтра проверю А Вы знаете как должны храниться в памяти 64,32,16 битные данные? |
![]() |
![]() |
![]() |
#134 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 ![]() |
![]()
Добрый день.
Упростил скетч: #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х байтовых чисел. |
![]() |
![]() |
![]() |
#135 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 ![]() |
![]()
Вдогонку, выше FF напрямую не адресуется. Где-то здесь собака порылась)))
|
![]() |
![]() |
![]() |
#136 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 ![]() |
![]()
По всем симптомам, похоже имеем однобайтовую адресацию к EEPROM. В либу лезть знаний не хватает(((.
|
![]() |
![]() |
![]() |
#137 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Похоже что проблема в адресации. Получается что предел адресов лежит от 0 до 255
Для Long от 0 до 63 Проблема в том что AVR-ская библиотека avr/eeprom.h использует тип uint8_t для адресации, то есть макимум 256 адресов Возможно придется править ее и переносить полностью в CyberLib, а пока добавил в описании Цитата:
|
|
![]() |
![]() |
![]() |
#138 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 ![]() |
![]()
Немного еще добавлю.
*_Word - адресное поле принимает 0-1022 (физические адреса 0-1023). По два байтика на пальцах считаем. Спасибо. |
![]() |
![]() |
![]() |
#139 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Это хорошо, можно будет реализовать и Long на все адресное пространство
Сегодня подправлю |
![]() |
![]() |
![]() |
#140 | |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Эдуард, замени "keywords.txt" на тот, что в архиве.
Будет подсвечиваться вот это: Цитата:
|
|
![]() |
![]() |
![]() |
Здесь присутствуют: 4 (пользователей: 0 , гостей: 4) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|