Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с eeprom в atmega8535 
:(
    Опции темы
martyr
Дата 16.11.2005, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.10.2005

Репутация: нет
Всего: нет



проблема такая, что при записи или при чтении в eeprom, он записывает или читает младшую часть.все переменные и функции объявлены в другом файле. Вот код программы:
Код

void write_preset(void) 


if (Device.CurrentPreset < Device.PresetsRange) 


// Device.AzimuthToPreset - ??????, ??????? ???? ???????? (16 ???) 
// Device.CurrentPreset - ????? ??????? ??? ?????? ???????? ??????? (8 ???) 

eeprom_address = Device.CurrentPreset * 2; 
byte_eeprom = (uint8_t) Device.AzimuthToPreset ; 
write_byte_to_eeprom (eeprom_address, byte_eeprom); 

eeprom_address = Device.CurrentPreset * 2 + 1; 
byte_eeprom = (uint8_t) (Device.AzimuthToPreset >> 8) ; 
write_byte_to_eeprom (eeprom_address, byte_eeprom); 




else 



Device.ErrorNumber = 0x11; 








void read_preset(void) 


if (Device.CurrentPreset < Device.PresetsRange) 


// Device.AzimuthFromPreset - ??????, ??????? ?????? (16 ???) 
// Device.CurrentPreset - ????? ???????, ??????? ?????? (8 ???) 

eeprom_address = Device.CurrentPreset * 2; 
Device.AzimuthFromPreset = (uint8_t) (read_byte_from_eeprom (eeprom_address)); 

eeprom_address = Device.CurrentPreset * 2 + 1; 
Device.AzimuthFromPreset |= ((uint8_t) (read_byte_from_eeprom(eeprom_address) << 8)); 



else 



// Device.ErrorNumber = Device.CurrentPreset; 
Device.ErrorNumber = 0x11; 


return Device.AzimuthFromPreset; 





void write_byte_to_eeprom(uint16_t eeprom_address,uint8_t byte_eeprom) 


while (EECR & 0x02); 

asm("cli"); 

/* Set up Address and Data Registers */ 
/*EEARH = (uint8_t) (eeprom_address >> 8) ; 
EEARL = (uint8_t) (eeprom_address );*/ 
EEAR = eeprom_address; 

EEDR = byte_eeprom;
EECR=0x04; 
EECR = 0x02; 

asm("sei"); 


uint8_t read_byte_from_eeprom (uint16_t eeprom_address) 



while (EECR & 0x02); 
asm("cli"); 

/*EEARH = (uint8_t) (eeprom_address >> 8);
EEARL = (uint8_t) eeprom_address ; 
*/
 EEAR = eeprom_address; 
EECR =0x01; 

byte_eeprom = EEDR; 

asm("sei"); 

return byte_eeprom; 

}


Это сообщение отредактировал(а) martyr - 16.11.2005, 18:35
PM MAIL   Вверх
cardinal
Дата 16.11.2005, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



Используйте теги [c ode=vb][/code] для подсветки кода!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
PILOT
Дата 16.11.2005, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



Вопроса не понял... smile

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
martyr
Дата 16.11.2005, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.10.2005

Репутация: нет
Всего: нет



ну вообщем если я записываю значение 255, то eeprom мне выдаёт 255, а если я записываю 300, то eeprom выдаёт 44, т.е. считывает малдшую часть, а старшую нет. Вот :
1 я не знаю что он не правильно делает: записывает или читает
2. прога вроде нормально написано, не знаю где может быть косяк, я хотел, чтобы кто-нибудь взглянул на кусок проги свежим взглядом и посмотерл если бак в этом куске проги
PM MAIL   Вверх
cardinal
Дата 16.11.2005, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



martyr, извини я конечно протормозил. На форуме есть и c/c++ теги, так что можешь подредактировать...

uint16_t read_byte_from_eeprom (uint16_t eeprom_address)


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
martyr
Дата 16.11.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.10.2005

Репутация: нет
Всего: нет



cardinal не помогает и почему uint16_t, если мы возвращает byte_eeprom а он у нас 8 бит?
PM MAIL   Вверх
cardinal
Дата 16.11.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



в коде должно стоять так: code=cpp

А насчет byte ты прав. Ну так ты тогда тогда и будешь имеет максимальное значение в 255. Если хочешь больше, то и записывай на соседние адреса в eeprom несколько байт. Потом также несколько байт и читать надо будет...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
martyr
Дата 16.11.2005, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.10.2005

Репутация: нет
Всего: нет



cardinal, почему максимум 255, пояни момент плиз подробнее как больше получить
PM MAIL   Вверх
cardinal
Дата 16.11.2005, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99





--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
martyr
Дата 16.11.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.10.2005

Репутация: нет
Всего: нет



я это понимаю, как мне сделать больше 255? я ведь как раз для этого при записи вызываю 2 раза функцию
write_byte_to_eeprom (eeprom_address, byte_eeprom);

Это сообщение отредактировал(а) martyr - 16.11.2005, 18:33
PM MAIL   Вверх
cardinal
Дата 16.11.2005, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



Код

write_byte_to_eeprom (0x2e, 0x3f2e1a6e); // старший байт
write_byte_to_eeprom (0x3f, 0x3f2e1a6f);  // младший байт 

или наоборот
Код

write_byte_to_eeprom (0x3f, 0x3f2e1a6e); // младший байт 
write_byte_to_eeprom (0x2e, 0x3f2e1a6f);  // старший байт

, смотря какой порядок в памяти хочешь иметь...

В результате (когда прочитаешь и слепишь в одно) получишь число 0x2e3f, то есть 11839.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
martyr
Дата 16.11.2005, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.10.2005

Репутация: нет
Всего: нет



так я так и делаю
Код
eeprom_address =(uint16_t) Device.CurrentPreset * 2; 
byte_eeprom = (uint8_t) Device.AzimuthToPreset ; 
write_byte_to_eeprom (eeprom_address, byte_eeprom); 

eeprom_address = (uint_16)(Device.CurrentPreset * 2 + 1); 
byte_eeprom = (uint8_t) (Device.AzimuthToPreset >> 8) ; 
write_byte_to_eeprom (eeprom_address, byte_eeprom); 

или так нельзя писать?

Это сообщение отредактировал(а) martyr - 16.11.2005, 20:42
PM MAIL   Вверх
cardinal
Дата 17.11.2005, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



Цитата(martyr @ 16.11.2005, 18:40)
или так нельзя писать?

Посмотри на содержание byte_eeprom на строке 3 и потом на строке 7 и поймешь можно или нет.
printf у тебя работает вообще для отдладки? Если нет, то сделай, чтобы работало. smile Или как-нибудь там с диодиками что-нибудь придумай.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
martyr
Дата 17.11.2005, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.10.2005

Репутация: нет
Всего: нет



printf не получится, я ведь не в консоле работаю, у меня есть окошко, кот-ой показывает обмен данными по инетерфейсу
PM MAIL   Вверх
martyr
Дата 17.11.2005, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.10.2005

Репутация: нет
Всего: нет



ошибка нашлась, мне на работе дали новый комп, винда сама ставилась, по дефолту поставился год 2014, а заметил что 2014 год вчера, поставил 2005, и сегодня заметил, что у меня файл прошивки старый, компилятор не мог его создать писал, что старый файл прошивки 2014 года, а новый типа 2005, и компилятор мне говорил, что такого не может быть.
Вообщем как я это заметил долго матюгался,т.к. целый день искал ошибку :-(.
Теперь всё ок. :-)))))))))))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.