|
Tiny24 не пишет в EEPROM, помогите разобраться |
|
|
|
Jan 30 2008, 14:35
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
в даташит есть такие примеры:
unsigned char EEPROM_read_8 (unsigned char Address) { while (EECR & (1<<EEPE)); EEARL= Address; EECR |= (1<<EERE); return EEDR; }
void EEPROM_write_8(unsigned char Address, unsigned char Data) { while (EECR & (1<<EEPE)); EECR = (0<<EEPM1) | (0>>EEPM0); EEARL= Address; EEDR = Data; EECR |= (1<<EEMPE); EECR |= (1<<EEPE); }
на их основе сделаны функции:
unsigned int EEPROM_read_16 (unsigned char AddressH, unsigned char AddressL ) { unsigned int Data_eep_16; Data_eep_16=EEPROM_read_8(AddressH); Data_eep_16=(Data_eep_16<<8); Data_eep_16=Data_eep_16+EEPROM_read_8(AddressL); return Data_eep_16; }
void EEPROM_write_16 (unsigned char AddressH, unsigned char AddressL, unsigned int Data) { unsigned int Data_eep_8; Data_eep_8=(Data>>8); EEPROM_write_8(AddressH, Data_eep_8); Data_eep_8=(char) Data; EEPROM_write_8(AddressL, Data_eep_8); }
перед записью всегда запрещаются прерывания: cli(); фуз EESAVE=1, тактовая - 8 МГц, внутренний RC. В AVR Studio 4.13 все симулируется правильно, запись происходит. Программатором EEPROM пишется исправно.
Нет записи в EEPROM в ходе выполнения программы, не пойму почему. Прошу помочь разобраться. Заранее благодарен.
Сообщение отредактировал smk - Jan 30 2008, 14:53
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
 |
Ответов
(1 - 13)
|
Jan 30 2008, 20:46
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(smk @ Jan 30 2008, 17:35)  в даташит есть такие примеры:
unsigned char EEPROM_read_8 (unsigned char Address) { while (EECR & (1<<EEPE)); EEARL= Address; EECR |= (1<<EERE); return EEDR; }
void EEPROM_write_8(unsigned char Address, unsigned char Data) { while (EECR & (1<<EEPE)); EECR = (0<<EEPM1) | (0>>EEPM0); EEARL= Address; EEDR = Data; EECR |= (1<<EEMPE); EECR |= (1<<EEPE); } на их основе сделаны функции:
unsigned int EEPROM_read_16 (unsigned char AddressH, unsigned char AddressL ) { unsigned int Data_eep_16; Data_eep_16=EEPROM_read_8(AddressH); Data_eep_16=(Data_eep_16<<8); Data_eep_16=Data_eep_16+EEPROM_read_8(AddressL); return Data_eep_16; }
void EEPROM_write_16 (unsigned char AddressH, unsigned char AddressL, unsigned int Data) { unsigned int Data_eep_8; Data_eep_8=(Data>>8); EEPROM_write_8(AddressH, Data_eep_8); Data_eep_8=(char) Data; EEPROM_write_8(AddressL, Data_eep_8); } unsigned int Data_eep_8; и void EEPROM_write_8(unsigned char Address, unsigned char Data) не стыкуются по типам данных 16 и 8 бит. Включите ВСЕ предупреждения компилятора и внимательно их проанализируйте.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Jan 30 2008, 21:08
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата unsigned int Data_eep_8; и void EEPROM_write_8(unsigned char Address, unsigned char Data) не стыкуются по типам данных 16 и 8 бит. сделал так: void EEPROM_write_16 (unsigned char AddressH, unsigned char AddressL, unsigned int Data) { unsigned char Data_eep_8; Data_eep_8=(Data>>8); EEPROM_write_8(AddressH, Data_eep_8); Data_eep_8=(char) Data; EEPROM_write_8(AddressL, Data_eep_8); } Цитата Включите ВСЕ предупреждения компилятора и внимательно их проанализируйте. а как это сделать я не знаю Вот эта строчка не выполняется. Без видимых причин. EECR |= (1<<EEPE); переписал: EECR |= (1<<1); не помогло. был уровень оптимизации -О0. включил -О1. стала выполняться(на симуляторе). Что это было?
Сообщение отредактировал smk - Jan 30 2008, 21:14
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 30 2008, 21:31
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(smk @ Jan 30 2008, 16:35)  EECR = (0<<EEPM1) | (0>>EEPM0); Если убрать эту явную ляпу, то все должно работать (хотя и с этой ляпой тоже ничего не меняется): Код EECR = (0<<EEPM1) | (0<<EEPM0); Технология программирования copy/paste позволяет обойти массу ошибок Ну и еще сложно вы функции пишете (правильно, но вычурно). Можно так: Код unsigned int EEPROM_read_16 (unsigned int Address) { unsigned int Data; Data = (unsigned int)(EEPROM_read_8(Address>>8))<<8; return Data | EEPROM_read_8(Address); }
void EEPROM_write_16 (unsigned int Address, unsigned int Data) { EEPROM_write_8(Address, Data); EEPROM_write_8(Address>>8, Data>>8); } А как вы определяете, что ничего не пишеться? Может все таки все нормально, и ваш метод контроля не работает
Сообщение отредактировал Baser - Jan 30 2008, 21:42
|
|
|
|
|
Jan 30 2008, 23:14
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(smk @ Jan 31 2008, 00:08)  был уровень оптимизации -О0. включил -О1. стала выполняться(на симуляторе). Что это было? Это было невнимательное чтение даташита: If the EEPMn bits are zero, writing EEPE (within four cycles after EEMPE is written) will trigger the erase/write operation.На -O0 Вам никто не гарантирует что будет <=4 цикла между: EECR |= (1<<EEMPE); EECR |= (1<<EEPE);
|
|
|
|
|
Feb 4 2008, 20:34
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Если убрать эту явную ляпу Точно по даташиту. Пишите в Атмел. Цитата На -O0 Вам никто не гарантирует что будет <=4 цикла между: э... почему? как Вы узнали об этом? Цитата А как вы определяете, что ничего не пишеться? По факту и при симуляции. Цитата Может все таки все нормально, и ваш метод контроля не работает Да сложного ничего нет. Аналог программы, написанный в CVAVR, работает без сбоев. Цитата Ну и еще сложно вы функции пишете (правильно, но вычурно). Спасибо, попробую.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Feb 4 2008, 21:15
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(smk @ Feb 4 2008, 23:34)  э... почему? как Вы узнали об этом? Потому что это стандартная ошибка... Покажите Ваши листинги на -00 и на -O1 Ну и еще раз перечитайте мою цитату насчет 4 тактов...
|
|
|
|
|
Feb 4 2008, 21:54
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(smk @ Feb 5 2008, 00:31)  Перечитал. Только как гарантировано писать чтоб не более 4-х тактов? -Штирлиц, почему Вы всегда отвечаете вопросом на вопрос - А разьве это плохо ? А зачем вобще компилируете в -O0 ? Вам кажется что так проще/правильнее отлаживать ? Тогда Вы глубоко заблуждаетесь... Гарантированно только с помощью библиотечных функций записи в EEPROM, только я например не люблю пользоваться ими в принципе, ну не устраивают они меня и все тут... Поэтому у меня всегда компилируется или на -O2 или на -Os, ну и код в асме при этом как то более правильным/читаемым выглядит.
|
|
|
|
|
Feb 4 2008, 22:26
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Я тогда специально заглянул на сайт Атмела в даташит на Tiny24, поскольку конкретно её не применял. Там все как у меня В варианте с Ассемблером - да, а на С - так как у меня. Цитата А если все дело в 4-х тактах, то применяйте библиотечные функции. Я уже столкнулся с тем, что библиотеки WinAVR дают громоздкий код, мало того. При попытке разрешить прерывания глобально - встала вся программа. Так что пытаюсь писать сам. Для начала для маленьких Тини, потом для Мега, опираясь на опыт.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Feb 4 2008, 22:41
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(smk @ Feb 5 2008, 01:26)  Я уже столкнулся с тем, что библиотеки WinAVR дают громоздкий код, мало того. Правда ? Ну тогда предлагаю Вам для примера более оптимально написать CRC16... например... Цитата При попытке разрешить прерывания глобально - встала вся программа. Так что пытаюсь писать сам. Для начала для маленьких Тини, потом для Мега, опираясь на опыт. Вот только давайте без ерунды, WinAVR здесь явно ни при чем...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|