Страница 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