CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: CodeVision AVR в вопросах и ответах

Сообщение Amstron »

ValBag писал(а):
Amstron писал(а):Подскажите! Если я прописываю в eeprom число...
Если вы ждете ответа, то изложите вопрос понятнее. И что значит в вашем толковании "прописывается" в отличие от "записывается". А лучше приведите код.
код:

if (a == 0) b = 5;
переменная b хранится в энергонезависимой памяти!
Это крутится в программе много раз в секунду.
Вот мне и интересно, если там уже записанно число, то оно заного записывается или сначало проверяется равно ли оно тому число которое надо записать???


По крайней мере, у меня есть в программе массив из 100 чисел и когда я включаю в первый раз устройство после заливки прошивки, то у меня в каждую ячейку записывается число НОЛЬ.

Когда при последующих включениях всегда прописывается число ноль, НОООО эта запись почему то раз в 100 быстрее!!!
Вот я и решил, что прежде чем записать число в переменную, контроллер (или сама программа сделанная этим компилям) сравнивает ее с тем числом которое хотит записаьтся!!
Реклама
Uselock
Открыл глаза
Сообщения: 64
Зарегистрирован: Пт янв 16, 2009 23:27:49

Re: CodeVision AVR в вопросах и ответах

Сообщение Uselock »

прошу прощения за глупый вопрос. Осваиваю микроконтроллеры.
Как засечь в программе изменение уровня на каком-либо порту? В исходном состоянии может быть и 1 и 0. Как без прерывания засечь изменение состояния, чтобы запустить какой-нить цикл?
Спасибо
Реклама
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

Amstron писал(а):if (a == 0) b = 5;
переменная b хранится в энергонезависимой памяти!
Это крутится в программе много раз в секунду.
Вот мне и интересно, если там уже записанно число, то оно заного записывается или сначало проверяется равно ли оно тому число которое надо записать???
Если в вышеописанной строке программы переменная b не изменяется по значению в течение времени, то и присваивание b = 5 будет повторятся, независимо от того, что там было прежде. Программа выполняет только то, что вы напишете в исходном коде.
у меня есть в программе массив из 100 чисел и когда я включаю в первый раз устройство после заливки прошивки, то у меня в каждую ячейку записывается число НОЛЬ.
Когда при последующих включениях всегда прописывается число ноль, НОООО эта запись почему то раз в 100 быстрее!!!
Быстрее чего? И как вы определяете быстродействие - секундомером?
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение Сериг »

простите что отвечаю вопрсом на вопросо,вы сами поняли что написали?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

Uselock писал(а):прошу прощения за глупый вопрос. Осваиваю микроконтроллеры.
Как засечь в программе изменение уровня на каком-либо порту? В исходном состоянии может быть и 1 и 0. Как без прерывания засечь изменение состояния, чтобы запустить какой-нить цикл?
Спасибо
Опрашивать состояние и при нужном соответствии выполнить дальнейшее действие.
Реклама
Uselock
Открыл глаза
Сообщения: 64
Зарегистрирован: Пт янв 16, 2009 23:27:49

Re: CodeVision AVR в вопросах и ответах

Сообщение Uselock »

Не понял.
Я вот например включаю устройство. Я не знаю какой в данный момент уровень на ножке. Мне нужно запустить цикл после того как состояние ножки изменится без разницы на 1 или на 0.
Реклама
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: CodeVision AVR в вопросах и ответах

Сообщение Amstron »

ValBag писал(а):Быстрее чего? И как вы определяете быстродействие - секундомером?
перед тем как записывать число у меня загорается светодиод.
Дак вот. Если число новое, то светодиод горит в течении 2 секунд.
иначе он не горит вообще...
Чем можно это объяснить?
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

Uselock писал(а):Не понял.
Я вот например включаю устройство. Я не знаю какой в данный момент уровень на ножке. Мне нужно запустить цикл после того как состояние ножки изменится без разницы на 1 или на 0.
Можно так:

Код: Выделить всё

bit status;
void main (void)
......
status = PINA.1;
if (PINA.1 != status)
{
// нужное действие
status = PINA.1;
}
......
Последний раз редактировалось ValBag Пт фев 25, 2011 21:57:09, всего редактировалось 1 раз.
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

Amstron писал(а):перед тем как записывать число у меня загорается светодиод.
Дак вот. Если число новое, то светодиод горит в течении 2 секунд.
иначе он не горит вообще...
Может кто-то еще поможет, не могу уловить суть вопроса.
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: CodeVision AVR в вопросах и ответах

Сообщение Amstron »

Попробую еще раз описать суть вопроса!
У меня есть переменная , которая храниться в EEPROM.
Значение этой переменной я выбираю сам при входа в определенное меню.
Далее, у меня в этом подменю программа крутиться и постоянно выполняется команда записи числа в эту переменную.
(на данный момент уже созрела идея сначала сохранить значение в переменную потом уйти в подменю).

Давайте, докапаемся до сути!!!
Основной вопрос : прежде чем записать число в переменную, которое храниться в EEPROM - программа сначала сравнивает его с тем что там находится? Если там число такоеже, что и надо записать , то запись не производиться!?


К примеру из моей практике: когдато я делал массив который храниться в EEPROM из 100 чисел и при записи другого числа у меня горел светодиод в течении 2 сек (что означает, что идет запись). Если число прописывается тоже самое , то светодиод не горел вообще.

К примеру я выбрал значение 1 и записал в нее перед тем как записывать число у меня загорается светодиод.
Дак вот. Если число новое, то светодиод горит в течении 2 секунд.
иначе он не горит вообще...
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение Сериг »

подскажи пожалуйста,делаю термометр-термостат ,меньше не бывает?взял за основу... так вот,как мне написать если больше то, если меньше то?
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

Amstron писал(а):Попробую еще раз описать суть вопроса!
У меня есть переменная , которая храниться в EEPROM.
Значение этой переменной я выбираю сам при входа в определенное меню.
Далее, у меня в этом подменю программа крутиться и постоянно выполняется команда записи числа в эту переменную.
(на данный момент уже созрела идея сначала сохранить значение в переменную потом уйти в подменю).

Давайте, докапаемся до сути!!!
Основной вопрос : прежде чем записать число в переменную, которое храниться в EEPROM - программа сначала сравнивает его с тем что там находится? Если там число такоеже, что и надо записать , то запись не производиться!?


К примеру из моей практике: когдато я делал массив который храниться в EEPROM из 100 чисел и при записи другого числа у меня горел светодиод в течении 2 сек (что означает, что идет запись). Если число прописывается тоже самое , то светодиод не горел вообще.

К примеру я выбрал значение 1 и записал в нее перед тем как записывать число у меня загорается светодиод.
Дак вот. Если число новое, то светодиод горит в течении 2 секунд.
иначе он не горит вообще...
Я так понял что Вы нехотите зазря писать в EEPROM?
«И всё-таки она вертится!»
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: CodeVision AVR в вопросах и ответах

Сообщение Amstron »

Apparatchik писал(а):
Amstron писал(а):Попробую еще раз описать суть вопроса!
У меня есть переменная , которая храниться в EEPROM.
Я так понял что Вы нехотите зазря писать в EEPROM?
Да, хочу что бы у меня EEPROM не достигла 100 000 записей.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

Amstron писал(а):
Apparatchik писал(а): Я так понял что Вы нехотите зазря писать в EEPROM?
Да, хочу что бы у меня EEPROM не достигла 100 000 записей.
Ну можно завести временную переменную не в EEPROM присвоить ей значение из EEPROMa, работать с ней, а потом конечный результат сравнить с EEPROM и если он отличается - переписать.
«И всё-таки она вертится!»
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: CodeVision AVR в вопросах и ответах

Сообщение Amstron »

Apparatchik писал(а):
Amstron писал(а): Да, хочу что бы у меня EEPROM не достигла 100 000 записей.
Ну можно завести временную переменную не в EEPROM присвоить ей значение из EEPROMa, работать с ней, а потом конечный результат сравнить с EEPROM и если он отличается - переписать.
Можно, то можно!!! Я нашол решение этой проблемы и даже дал ответ: на данный момент уже созрела идея сначала сохранить значение в переменную потом уйти в подменю.

Мне всего лишь охото узнать ответ на свой вопрос!
ПОВТОРЮСЬ: Основной вопрос : прежде чем записать число в переменную, которое храниться в EEPROM - программа сначала сравнивает его с тем что там находится? Если там число такоеже, что и надо записать , то запись не производиться!?
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

Amstron писал(а):Попробую еще раз описать суть вопроса!
Основной вопрос : прежде чем записать число в переменную, которое храниться в EEPROM - программа сначала сравнивает его с тем что там находится? Если там число такое же, что и надо записать , то запись не производиться!?
На это я уже отвечал, IMHO, - никакого сравнения нет - программу же пишете вы.
К примеру из моей практике: когдато я делал массив который храниться в EEPROM из 100 чисел и при записи другого числа у меня горел светодиод в течении 2 сек (что означает, что идет запись). Если число прописывается тоже самое , то светодиод не горел вообще.
Запись в EEPROM - длительная процедура. Для AVR может доходить до нескольких миллисекунд на одну операцию. Для старых типов до 8-9 мс, а для новых 3-4 мс. Чтение же - обычная по быстродействию операция. Скорее всего у вас повторно производится запись в цикле всего массива. Тогда 2 секунды (с натяжкой) вполне объяснимо.
Если бы существовали такие премудрости, то они были бы упомянуты в документации. Во всяком случае, я такого не примечал.

P.S. Приведите файл исходника со светодиодом, где длительность записи доходит до 2 с.
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: CodeVision AVR в вопросах и ответах

Сообщение Amstron »

ValBag писал(а):
P.S. Приведите файл исходника со светодиодом, где длительность записи доходит до 2 с.
lamp_R=1;

while (i<101)
{
massiv = 0;
i++;
};

lamp_R=0;


Дак вот, при первом включении после прошивки, светодиод lamp_R горит около 2 сек.
При последующих включениях - загорается совсем не надолго!
Бывает, что даже и не видно что загорается!
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

Amstron писал(а):прежде чем записать число в переменную, которое храниться в EEPROM - программа сначала сравнивает его с тем что там находится? Если там число такое же, что и надо записать , то запись не производиться!?
Не задавался ранее этим вопросом, но похоже, что так и происходит. Примеры записи - чтения в EEPROM, приводимые в даташите, на уровне ассемблера или СИ, довольно объемные и оперируют регистрами управления EEPROM. В частности, что касается записи, то выдержка из даташита:

"Массив памяти ЭСППЗУ (EEPROM) программируется побайтно, при этом, в инструкции записи указывается адрес и данные. Перед записью данных первоначально автоматически стирается адресуемая ячейка ЭСППЗУ".

Т. е., если использовать весь арсенал регисторов управления и последовательность действий по даташиту, то разницы во времени не должно быть. Однако в CVAVR обращение к переменным EEPROM, происходит как к обычным переменным. Скорее всего, далее действуют скрытые команды компилятора, которые делают остальную часть работы. Вот там, может быть и есть проверка значений того, что записано и что следует записать.
Попробуйте вытащить ассемблерный код из вашего простого примера. Там картина будет видна - что есть что.
Amstron
Нашел транзистор. Понюхал.
Сообщения: 173
Зарегистрирован: Вт дек 21, 2010 21:18:52

Re: CodeVision AVR в вопросах и ответах

Сообщение Amstron »

ValBag писал(а): Попробуйте вытащить ассемблерный код из вашего простого примера. Там картина будет видна - что есть что.
Подскажите как код вытащить в конкретном месте программы?
У меня программа большая - уже 8 кбайт и будет больше.
в АСЕМБЛЕРЕ у меня 7000 строк! Как там определить, что есть что понять не могу. Я в нем не шарю(((.
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Re: CodeVision AVR в вопросах и ответах

Сообщение ValBag »

Amstron писал(а):Подскажите как код вытащить в конкретном месте программы?
У меня программа большая - уже 8 кбайт и будет больше.
в АСЕМБЛЕРЕ у меня 7000 строк! Как там определить, что есть что понять не могу. Я в нем не шарю(((.
Дизассеблер есть в AVR Studio. Если вытаскивать весь код, то действительно, долго придется искать нужное место. Проще на пробной программе, согласно вашим задумкам: заполнение массива одним числом. Ваши догадки потверждаются. Компилятор не переписывает повторяющееся число.
Часть текста после дизассемблера, ниже, где:
R17 текущий индекс массива i,
R26, R27 - адрес в EEPROM;
R30 - записываемое (присваемое) число
EECR (0x1F), EEAR (0x21), EEDR (0x20) - регистры EEPROM.

Код: Выделить всё

+0000004F: 2FA1	MOV	R26,R17		Copy register
..........
+00000071: 9BF9	SBIS	0x1F,1         	Skip if bit in I/O register set
+00000072: C002	RJMP	PC+0x0003      	Relative jump
+00000073: 95A8	WDR			Watchdog reset
+00000074: CFFC	RJMP	PC-0x0003      	Relative jump
+00000075: B79F	IN	R25,0x3F       	In from I/O location
+00000076: 94F8	CLI                      		Global Interrupt Disable
+00000077: BDA1	OUT	0x21,R26       	Out to I/O location
+00000078: 9AF8	SBI	0x1F,0         	Set bit in I/O register
+00000079: B580	IN	R24,0x20       	In from I/O location  	читаем из массива
+0000007A: 17E8	CP	R30,R24        	Compare		сравниваемым с текущим
+0000007B: F019	BREQ	PC+0x04        	Branch if equal	если равны, переход к следующему
+0000007C: BDE0	OUT	0x20,R30       	Out to I/O location	если не равны, запись
+0000007D: 9AFA	SBI	0x1F,2         	Set bit in I/O register
+0000007E: 9AF9	SBI	0x1F,1         	Set bit in I/O register
+0000007F: BF9F	OUT	0x3F,R25       	Out to I/O location
+00000080: 9508	RET                      		Subroutine return
Ответить

Вернуться в «AVR»