Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
13.11.2015, 12:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,996
Сказал спасибо: 3,015
Сказали Спасибо 3,190 раз(а) в 2,164 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
pinco, Вы так смешали в кучу коней и людей, что трудно уследить за полётом.
"P.S." - это явный пример ложно понятой документации. Запрет прерываний требуется только на момент работы с битами EEMPE/EEPE.
|
|
|
|
13.11.2015, 13:28
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 709
Сказал спасибо: 363
Сказали Спасибо 795 раз(а) в 370 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Сорри за оффтоп..
Иногда возникает ощущение, что производители микроконтроллеров
резко прикрыли доступ к даташитам на свои изделия, а также удалили
их копии со всех сайтов мира. А в те копии даташитов, которые удалить
не удалось, внесли искажения или затёрли текст.
КОГДА.
УЖЕ.
БУДЕМ.
ВНИМАТЕЛЬНО.
ИЗУЧАТЬ.
ДОКУМЕНТАЦИЮ.
НА.
ИСПОЛЬЗУЕМОЕ.
ИЗДЕЛИЕ.
?
|
|
|
|
14.11.2015, 11:24
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Сообщение от ForcePoint
|
pinco, Вы так смешали в кучу коней и людей, что трудно уследить за полётом.
"P.S." - это явный пример ложно понятой документации. Запрет прерываний требуется только на момент работы с битами EEMPE/EEPE.
|
Ничего я не смешивал ,про запрет прерываний я тоже говорил, повторюсь - если в проге на время записи они не происходят по алгоритму работы проги - тогда нечего их запрещать - их и так не будет - это понятно ? А если Вы не в состоянии даже уяснить себе о чем я говорю то это Ваши траблы - и потом - я не стал уж до предела разжёвывать что для операций с битом EEPE(EEWE) сначала требуется разрешение на эти операции через взвод битов EEMPE/EEMWE, ну так это и так было всем известно кто внимательно читает datasheet, там все это есть и так, и на саму суть ответа на вопрос можно ли записывать EEPROM в прерывании - это Ваше замечание ну никак не влияет.
P.S. И кстати, в случае если Вы пишете в EEPROM уже находясь в прерывании (не от конретно EEPROM-а а в любом другом) - у Вас и так бит I аппаратно временно автоматом сброшен, так что все условия записи в EEPROM по datashet-у и так выполняются, если конечно Вы, уже находясь в самом этом прерывании, не включили снова принудительно этот бит I уже для каких либо своих специальных функций или действий по получается "вложенным" прерываниям .
__________________
Короче асма кода нет !
Последний раз редактировалось pinco; 14.11.2015 в 12:08.
|
|
|
|
14.11.2015, 12:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,996
Сказал спасибо: 3,015
Сказали Спасибо 3,190 раз(а) в 2,164 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Ну, давайте проверим, правльно-ли я понял мысль.
Сообщение от pinco
|
Нельзя записывать EEPROM еще находясь в предыдущем прерывании от этого же EEPROM-а, а во всех остальных прерываниях - можно, так как запись стартуем битом EEWE(EEPE) (подробности по datasheet-у, после записи он сам сбрасывается аппаратно - тоже по datasheet-у), (при этом еще можно кучу действий делать чтобы не терять 8-10 мс бесполезно пока этот бит сбросится) - так вот - дальше просто ждем пока он сбросится после окончания записи в EEPROM-е, и следовательно само это ожидание (И ВЗВОД ЭТОГО БИТА - что интересно!) можно организовать в любом месте проги, хоть в прерывании, хоть не в прерывании. При этом все равно разрешено само прерывание конкретно от EEPROM-а или нет.
|
Если заменить выделенное слово словами "цикл записи", то тут всё понятно, непротиворечиво и соответствует документации на МК.
Более того, можно даже не "дальше просто ждем пока он сбросится после окончания записи в EEPROM", а проверяем его перед началом каждого цикла записи. В чём нас поддерживает рекомендуемый код на ассемблере:
Код:
|
EEPROM_write:
sbic EECR,EEPE ; Wait for completion of previous write
rjmp EEPROM_write
out EEARH, r18 ; Set up address (r18:r17) in address register
out EEARL, r17
out EEDR,r16 ; Write data (r16) to Data Register
//cli // По необходимости
sbi EECR,EEMPE ; Write logical one to EEMPE
sbi EECR,EEPE ; Start eeprom write by setting EEPE
//sei или, даже, reti // По необходимости
ret |
Сообщение от pinco
|
P.S. На время ожидания еще нужно запретить все прерывания так как записываемые данные могут быть искажены в ходе записи в EEPROM если при этом неожиданно возникнут еще какие-либо прерывания, то есть чтобы данные надежно записывались - на это время сбрасывать бит I регистра SREG, ну а после записи - восстанавливать его в исходное. Если в системе по проге точно не ожидается никаких прерываний в это время или хотя бы когда пишем EEPROM - то со сбросом бита I в SREG можно и не заморачиваться.
|
Ну а тут - Вы предлагаете такой код для записи EEPROM, от которого за версту веет ересью:
Код:
|
EEPROM_write:
sbic EECR,EEPE ; Wait for completion of previous write
rjmp EEPROM_write
sei // И только тут мы можем, на жалкие три такта, ослабить удавку.
out EEARH, r18 ; Set up address (r18:r17) in address register
out EEARL, r17
out EEDR,r16 ; Write data (r16) to Data Register
cli // Обязательно!
sbi EECR,EEMPE ; Write logical one to EEMPE
sbi EECR,EEPE ; Start eeprom write by setting EEPE
ret |
Так? Или нет?
|
|
|
|
14.11.2015, 15:12
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Ну во-первых прерывание от самой EEPROM никак НЕ заменяется Вашим понятием "цикл записи" потому что в процессе самого цикла записи можно разместить любую произвольно написанную подпрограмму обработки, а во вторых я ещё не выложил сюда пока ни одной строчки ассемблера, пока обговариваем сам принцип работы с EEPROM. Так что - "...такой код для записи EEPROM, от которого за версту веет ересью: " - пока что предлагаете только Вы, и от этого же сами возмущаетесь. Вот ведь однако чудило-то какой.
__________________
Короче асма кода нет !
Последний раз редактировалось pinco; 14.11.2015 в 15:29.
|
|
|
|
17.11.2015, 15:55
|
|
Прописка
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Заменил запуск кода EEPROM из основной программы. Все равно не загружает предыдущее состояние.
Код:
|
#include ‹avr/io.h›
#include ‹avr/interrupt.h›
#include ‹avr/eeprom.h›
#include ‹stdint.h›
#include ‹avr/pgmspace.h›
uint8_t eepYellow EEMEM= 4;
char feeprom=0;
char timerCounter0=0;
volatile char fTemp=0;
char temp=0;
unsigned char PIND_TempNext;
ISR(TIMER0_OVF_vect){
feeprom=1;
TCNT0=1;
}
void ReadPorts(){
if(fTemp›0){
temp++;
outLED_Port&=~(1‹‹outYellow);
if(temp›58){
fYellowPrev=fYellow;
eeprom_write_byte(&eepYellow,fYellow);
fTemp=0;
temp=0;
}
}else{
temp=0;
outLED_Port|=(1‹‹outYellow);
}
}
int main(void){
DDRD=0x00;
PORTD=0xFF;
DDRC=0xFF;
PORTC=0xFF;
TCNT0 = 1;
TCCR0A |= (1 ‹‹ WGM01);
TCCR0B |= (1 ‹‹ CS00) | (1 ‹‹ CS02);
TIMSK0 |= (1 ‹‹ TOIE0);
fYellow=eeprom_read_byte(&eepYellow);
fYellowPrev=fYellow;
if(fYellow==0){
fRed=1;
fGreen=1;
}
sei();
while(1){
if(fYellowPrev!=fYellow){
fTemp=1;
}else{
fTemp=0;
}
.................................................. ....
if(feeprom==1){
feeprom=0;
ReadPorts();
}
}
return 0;
} |
|
|
|
|
21.11.2015, 14:27
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: ATMega48 не сохраняется EEPROM
Лично я пишу на асме, и на нем по проге четко видно что где получилось и куда пошло, а на С я не очень, да и на С не все можно сделать то что можно на свободно асме . Судя по Вашей проге вероятно Вы пытаетесь организовать прерывание и через него уже при участии другого прерывания от EEPROM-а организовать запись, хотя по Вашей проге может я и ошибаюсь, так вот - прерывание от EEPROM-а возникает после его записи в конце записи, так и должно быть, а сама запись с помощью него не стартуется никак, и не должна стартоваться, , тут на форуме дофига пишущих на Си - может кто и посмотрит - еще возможно при этом в синтаксисе самого С у Вас глюк может быть , не знаю, а на асме намного проще - всего-то строчек 8-10 и никакой воды - все пишется в EEPROM гарантированно в любом положении - хоть в прерывании, хоть в основной проге, - сам старт записи - в любом месте проги - взвести 2 бита и смотреть пока они скинутся - и запись готова, Попробуйте написать функцию свою записи на асме - тогда смогу подсказать где у Выс затык.
P.S. Еще один момент - если при отсоединении программатора есть неустойчивая запись в EEPROM то возможно что есть еще какие-то наводки на свободные выводы которые могут вызывать случайные прерывания если есть разрешение общее и данные могут также искажаться - так вот некоторые программаторы имеют внутреннюю подтяжку на выводах для программирования - при отсоединении программатора они не должны свободно болтаться в воздухе - так что рекомендую проверить наличие внутренней подтяжки в самом AVR-е на этих выводах и если Ваша схема это без последствий позволяет - то включить её , если она до сих пор не была включена , либо назначить их как выходы и принудительно выставить эти выходы порта как 0 или 1, тогда наводок не будет точно (при программировании они все равно переназначаются автоматом аппаратно так что конфликтов с программатором не будет .) .
__________________
Короче асма кода нет !
Последний раз редактировалось pinco; 22.11.2015 в 19:37.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:31.
|
|