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 писал(а):
Amstron писал(а):Попробую еще раз описать суть вопроса!
У меня есть переменная , которая храниться в EEPROM.

Я так понял что Вы нехотите зазря писать в EEPROM?

Да, хочу что бы у меня EEPROM не достигла 100 000 записей.

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

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

Сообщение Amstron »

Apparatchik писал(а):
Amstron писал(а):
Apparatchik писал(а):Я так понял что Вы нехотите зазря писать в EEPROM?

Да, хочу что бы у меня 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[i] = 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»