Страница 116 из 421

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

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

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


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

Когда при последующих включениях всегда прописывается число ноль, НОООО эта запись почему то раз в 100 быстрее!!!
Вот я и решил, что прежде чем записать число в переменную, контроллер (или сама программа сделанная этим компилям) сравнивает ее с тем числом которое хотит записаьтся!!

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

Добавлено: Пт фев 25, 2011 20:26:08
Uselock
прошу прощения за глупый вопрос. Осваиваю микроконтроллеры.
Как засечь в программе изменение уровня на каком-либо порту? В исходном состоянии может быть и 1 и 0. Как без прерывания засечь изменение состояния, чтобы запустить какой-нить цикл?
Спасибо

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

Добавлено: Пт фев 25, 2011 20:33:31
ValBag
Amstron писал(а):if (a == 0) b = 5;
переменная b хранится в энергонезависимой памяти!
Это крутится в программе много раз в секунду.
Вот мне и интересно, если там уже записанно число, то оно заного записывается или сначало проверяется равно ли оно тому число которое надо записать???
Если в вышеописанной строке программы переменная b не изменяется по значению в течение времени, то и присваивание b = 5 будет повторятся, независимо от того, что там было прежде. Программа выполняет только то, что вы напишете в исходном коде.
у меня есть в программе массив из 100 чисел и когда я включаю в первый раз устройство после заливки прошивки, то у меня в каждую ячейку записывается число НОЛЬ.
Когда при последующих включениях всегда прописывается число ноль, НОООО эта запись почему то раз в 100 быстрее!!!
Быстрее чего? И как вы определяете быстродействие - секундомером?

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

Добавлено: Пт фев 25, 2011 20:34:32
Сериг
простите что отвечаю вопрсом на вопросо,вы сами поняли что написали?

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

Добавлено: Пт фев 25, 2011 20:36:11
ValBag
Uselock писал(а):прошу прощения за глупый вопрос. Осваиваю микроконтроллеры.
Как засечь в программе изменение уровня на каком-либо порту? В исходном состоянии может быть и 1 и 0. Как без прерывания засечь изменение состояния, чтобы запустить какой-нить цикл?
Спасибо
Опрашивать состояние и при нужном соответствии выполнить дальнейшее действие.

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

Добавлено: Пт фев 25, 2011 20:44:10
Uselock
Не понял.
Я вот например включаю устройство. Я не знаю какой в данный момент уровень на ножке. Мне нужно запустить цикл после того как состояние ножки изменится без разницы на 1 или на 0.

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

Добавлено: Пт фев 25, 2011 20:52:54
Amstron
ValBag писал(а):Быстрее чего? И как вы определяете быстродействие - секундомером?
перед тем как записывать число у меня загорается светодиод.
Дак вот. Если число новое, то светодиод горит в течении 2 секунд.
иначе он не горит вообще...
Чем можно это объяснить?

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

Добавлено: Пт фев 25, 2011 21:04:47
ValBag
Uselock писал(а):Не понял.
Я вот например включаю устройство. Я не знаю какой в данный момент уровень на ножке. Мне нужно запустить цикл после того как состояние ножки изменится без разницы на 1 или на 0.
Можно так:

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

bit status;
void main (void)
......
status = PINA.1;
if (PINA.1 != status)
{
// нужное действие
status = PINA.1;
}
......

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

Добавлено: Пт фев 25, 2011 21:14:42
ValBag
Amstron писал(а):перед тем как записывать число у меня загорается светодиод.
Дак вот. Если число новое, то светодиод горит в течении 2 секунд.
иначе он не горит вообще...
Может кто-то еще поможет, не могу уловить суть вопроса.

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

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

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


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

К примеру я выбрал значение 1 и записал в нее перед тем как записывать число у меня загорается светодиод.
Дак вот. Если число новое, то светодиод горит в течении 2 секунд.
иначе он не горит вообще...

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

Добавлено: Сб фев 26, 2011 12:57:16
Сериг
подскажи пожалуйста,делаю термометр-термостат ,меньше не бывает?взял за основу... так вот,как мне написать если больше то, если меньше то?

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

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

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


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

К примеру я выбрал значение 1 и записал в нее перед тем как записывать число у меня загорается светодиод.
Дак вот. Если число новое, то светодиод горит в течении 2 секунд.
иначе он не горит вообще...
Я так понял что Вы нехотите зазря писать в EEPROM?

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

Добавлено: Сб фев 26, 2011 13:47:22
Amstron
Apparatchik писал(а):
Amstron писал(а):Попробую еще раз описать суть вопроса!
У меня есть переменная , которая храниться в EEPROM.
Я так понял что Вы нехотите зазря писать в EEPROM?
Да, хочу что бы у меня EEPROM не достигла 100 000 записей.

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

Добавлено: Сб фев 26, 2011 13:57:49
Apparatchik
Amstron писал(а):
Apparatchik писал(а): Я так понял что Вы нехотите зазря писать в EEPROM?
Да, хочу что бы у меня EEPROM не достигла 100 000 записей.
Ну можно завести временную переменную не в EEPROM присвоить ей значение из EEPROMa, работать с ней, а потом конечный результат сравнить с EEPROM и если он отличается - переписать.

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

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

Мне всего лишь охото узнать ответ на свой вопрос!
ПОВТОРЮСЬ: Основной вопрос : прежде чем записать число в переменную, которое храниться в EEPROM - программа сначала сравнивает его с тем что там находится? Если там число такоеже, что и надо записать , то запись не производиться!?

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

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

P.S. Приведите файл исходника со светодиодом, где длительность записи доходит до 2 с.

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

Добавлено: Сб фев 26, 2011 16:47:07
Amstron
ValBag писал(а):
P.S. Приведите файл исходника со светодиодом, где длительность записи доходит до 2 с.
lamp_R=1;

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

lamp_R=0;


Дак вот, при первом включении после прошивки, светодиод lamp_R горит около 2 сек.
При последующих включениях - загорается совсем не надолго!
Бывает, что даже и не видно что загорается!

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

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

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

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

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

Добавлено: Вс фев 27, 2011 12:10:29
Amstron
ValBag писал(а): Попробуйте вытащить ассемблерный код из вашего простого примера. Там картина будет видна - что есть что.
Подскажите как код вытащить в конкретном месте программы?
У меня программа большая - уже 8 кбайт и будет больше.
в АСЕМБЛЕРЕ у меня 7000 строк! Как там определить, что есть что понять не могу. Я в нем не шарю(((.

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

Добавлено: Пн фев 28, 2011 17:35:37
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