Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 13.11.2015, 12:18  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,996
Сказал спасибо: 3,015
Сказали Спасибо 3,190 раз(а) в 2,164 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: ATMega48 не сохраняется EEPROM

pinco, Вы так смешали в кучу коней и людей, что трудно уследить за полётом.

"P.S." - это явный пример ложно понятой документации. Запрет прерываний требуется только на момент работы с битами EEMPE/EEPE.
Реклама:
ForcePoint вне форума  
Непрочитано 13.11.2015, 13:28  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 709
Сказал спасибо: 363
Сказали Спасибо 795 раз(а) в 370 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: ATMega48 не сохраняется EEPROM

Сорри за оффтоп..
Иногда возникает ощущение, что производители микроконтроллеров
резко прикрыли доступ к даташитам на свои изделия, а также удалили
их копии со всех сайтов мира. А в те копии даташитов, которые удалить
не удалось, внесли искажения или затёрли текст.
КОГДА.
УЖЕ.
БУДЕМ.
ВНИМАТЕЛЬНО.
ИЗУЧАТЬ.
ДОКУМЕНТАЦИЮ.
НА.
ИСПОЛЬЗУЕМОЕ.
ИЗДЕЛИЕ.
?
j-Roger вне форума  
Непрочитано 14.11.2015, 11:24  
pinco
Гражданин KAZUS.RU
 
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
pinco на пути к лучшему
По умолчанию 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.
pinco вне форума  
Непрочитано 14.11.2015, 12:29  
ForcePoint
Почётный гражданин KAZUS.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,996
Сказал спасибо: 3,015
Сказали Спасибо 3,190 раз(а) в 2,164 сообщении(ях)
ForcePoint на пути к лучшему
Вопрос 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

Так? Или нет?
ForcePoint вне форума  
Непрочитано 14.11.2015, 15:12  
pinco
Гражданин KAZUS.RU
 
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
pinco на пути к лучшему
По умолчанию Re: ATMega48 не сохраняется EEPROM

Ну во-первых прерывание от самой EEPROM никак НЕ заменяется Вашим понятием "цикл записи" потому что в процессе самого цикла записи можно разместить любую произвольно написанную подпрограмму обработки, а во вторых я ещё не выложил сюда пока ни одной строчки ассемблера, пока обговариваем сам принцип работы с EEPROM. Так что - "...такой код для записи EEPROM, от которого за версту веет ересью: " - пока что предлагаете только Вы, и от этого же сами возмущаетесь. Вот ведь однако чудило-то какой.
__________________
Короче асма кода нет !

Последний раз редактировалось pinco; 14.11.2015 в 15:29.
pinco вне форума  
Непрочитано 17.11.2015, 15:55  
sanstan
Прописка
 
Регистрация: 06.03.2007
Сообщений: 144
Сказал спасибо: 22
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
sanstan на пути к лучшему
По умолчанию 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;
}
sanstan вне форума  
Непрочитано 21.11.2015, 14:27  
pinco
Гражданин KAZUS.RU
 
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
pinco на пути к лучшему
По умолчанию Re: ATMega48 не сохраняется EEPROM

Лично я пишу на асме, и на нем по проге четко видно что где получилось и куда пошло, а на С я не очень, да и на С не все можно сделать то что можно на свободно асме . Судя по Вашей проге вероятно Вы пытаетесь организовать прерывание и через него уже при участии другого прерывания от EEPROM-а организовать запись, хотя по Вашей проге может я и ошибаюсь, так вот - прерывание от EEPROM-а возникает после его записи в конце записи, так и должно быть, а сама запись с помощью него не стартуется никак, и не должна стартоваться, , тут на форуме дофига пишущих на Си - может кто и посмотрит - еще возможно при этом в синтаксисе самого С у Вас глюк может быть , не знаю, а на асме намного проще - всего-то строчек 8-10 и никакой воды - все пишется в EEPROM гарантированно в любом положении - хоть в прерывании, хоть в основной проге, - сам старт записи - в любом месте проги - взвести 2 бита и смотреть пока они скинутся - и запись готова, Попробуйте написать функцию свою записи на асме - тогда смогу подсказать где у Выс затык.

P.S. Еще один момент - если при отсоединении программатора есть неустойчивая запись в EEPROM то возможно что есть еще какие-то наводки на свободные выводы которые могут вызывать случайные прерывания если есть разрешение общее и данные могут также искажаться - так вот некоторые программаторы имеют внутреннюю подтяжку на выводах для программирования - при отсоединении программатора они не должны свободно болтаться в воздухе - так что рекомендую проверить наличие внутренней подтяжки в самом AVR-е на этих выводах и если Ваша схема это без последствий позволяет - то включить её , если она до сих пор не была включена , либо назначить их как выходы и принудительно выставить эти выходы порта как 0 или 1, тогда наводок не будет точно (при программировании они все равно переназначаются автоматом аппаратно так что конфликтов с программатором не будет .) .
__________________
Короче асма кода нет !

Последний раз редактировалось pinco; 22.11.2015 в 19:37.
pinco вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход из спящего режима по INT0 putmannn AVR 24 07.01.2013 16:47
Протеус и система зажигания после симуляции не сохраняет настройки cfif11 Proteus 23 04.02.2012 01:26
Проблемы с чтением блоков EEPROM MEGA128 под WinAVR maw_1961 Микроконтроллеры, АЦП, память и т.д 7 23.03.2011 21:26
AT89S8253 проблема чтения из внутренней EEPROM thunder367 Микроконтроллеры, АЦП, память и т.д 5 09.08.2007 13:08
Запись трехбайтного чила в EEPROM delay Микроконтроллеры, АЦП, память и т.д 4 30.03.2006 10:41


Часовой пояс GMT +4, время: 20:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot