Тут, к сожалению (или к счастью) ромбики не помогут. Этим ведают интеллект&&образование.ELcat писал(а):... Это чтобы человек умел выстраивать свои мысли в виде связанных и понятных окружающим логических цепочек вместо непонятной "каши в голове".
CodeVision AVR в вопросах и ответах
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- Реклама
- Сообщения: 171
- Зарегистрирован: Вс июн 17, 2012 16:32:42
Извините,но все таки я не отступлюсь. Может так наглядней будет? См. архив.
- Вложения
-
- МАССИВ,ЕЕПРОМ.rar
- (33.7 КБ) 164 скачивания
Ну так идти по массиву и сравнивать с переменной, если совпало - начинать перечисления. Или я чего-то недогоняю?
«И всё-таки она вертится!»
- Сообщения: 171
- Зарегистрирован: Вс июн 17, 2012 16:32:42
Дело втом,что я не знаю как это написать на си. Пробовал несколько раз,находил нужный элемент,а дальше него массив перечисляться не хотел.
Я ж всетаки начинающий. Ни бум бум ваще. Я только знаю циклы if-else,while и как функцию вызвать. Поэтому и спрашиваю вас как спецов,а вы блин чуть ли не в душу г...ть... Да и в книжках не совсем понятно написано,уж извините,институтов не заканчивал.
Я ж всетаки начинающий. Ни бум бум ваще. Я только знаю циклы if-else,while и как функцию вызвать. Поэтому и спрашиваю вас как спецов,а вы блин чуть ли не в душу г...ть... Да и в книжках не совсем понятно написано,уж извините,институтов не заканчивал.
- Сообщения: 114
- Зарегистрирован: Чт ноя 24, 2011 12:39:13
Ох как мне знакома сия ситуация, когда обращаешься к спецам за помощью, за подсказкой, а тебя как щенка за шкиряк и за учебники сажают! Хотя достаточно просто на пальцах рассказать или привести пример!
- Реклама
Marchello, дак приведите, в чём проблема ?
- Сообщения: 114
- Зарегистрирован: Чт ноя 24, 2011 12:39:13
)))))) С огромным удовольствием помог, только я сам в этом деле новичек! Всего две недели как в процессе изучения! Сижу вот самоучители штудирую! Но над вашей проблемкой подумаю!
При нажатии кнопки считайте из еепром в переменную, в цикле идите по массиву и сравнивайте значения с переменной, если значения совпадут сразу выходите из цикла с запоминанием индекса и вот с этого индекса и начинайте перечисление.
P.S.
P.S.
CVAVR это пародия на Си.eduardo писал(а):Дело втом,что я не знаю как это написать на си
«И всё-таки она вертится!»
И не делайте вот так:Иначе ваш еепром будет дохнуть быстрее, чем вы будете догадываться об этом 
Код: Выделить всё
if(PIND.1==1) // если нажать кнопку PIND.1 состояние PORTB присваивается переменной
{b=PORTB;} // b,объявленной в еепромЭто точноАlex писал(а):Иначе ваш еепром будет дохнуть быстрее, чем вы будете догадываться об этом
«И всё-таки она вертится!»
Не совсем понятно изложен вопрос, столько человек прочитало и не поняли.
Вам нужно определить номер элемента, в котором находится нужное вам число b?
Тогда в начале программы выполняем подпрограмму как вам указывали ранее
Вот применительно к вашей ситуации.
Вообще я так и не понял зачем вам сохранять PORTB в EEPROM какой в этом логический смысл?
Не проще запоминать номер элемента, а постом по этому номеру искать сам элемент? Тем более элементы это числа от 0 до 9
Вот так
Вообще решение задачи в коллективе приходит быстрее, если условия знают несколько человек, а не только Вы.
Вам нужно определить номер элемента, в котором находится нужное вам число b?
Тогда в начале программы выполняем подпрограмму как вам указывали ранее
Вот применительно к вашей ситуации.
Код: Выделить всё
char number_of_element(unsigned char etalon,unsigned char arraysize,unsigned char *arr){
char i ;
for(i=0;i<arraysize;i++)
{
if(arr[i] == etalon)return i;
}
return -1;
}
//применение
Required_num =number_of_element(0x01,11,a) ;//Тут вернет -1(255 в системе unsigned char)
Required_num =number_of_element(0x4F,11,a) ;//Тут вернет 4 так как это четвертый элемент списка
Не проще запоминать номер элемента, а постом по этому номеру искать сам элемент? Тем более элементы это числа от 0 до 9
Вот так
Код: Выделить всё
interrupt [TIM0_OVF]void timer0_ovf_isr(void)
{
c++;
if(c>=255)
{
f=1;
if(d>=11)d=0;
mig=~mig;
}}
if(PIND.0==1)&&(f==1) //если кнопка PIND.0 нажата,начинается перечисление массива
{f==0;PORTB=a[d++];} //после отпускания кнопкиPIND.0 состояние PORTB остается таким,каким было на момент отпускания
if(PIND.1==1) // если нажать кнопку PIND.1 состояние PORTB присваивается переменной
{b=d;} // b,объявленной в еепром
- Сообщения: 171
- Зарегистрирован: Вс июн 17, 2012 16:32:42
Хотелось,чтобы данные сохранялись после отключения питания. Ведь еер выдерживает
10000 циклов записи/стирания вроде как?
А в строке
{f==0;PORTB=a[d++];}
компилятор выдает ошибку––illegal address.
А если условие записать вот так:
if(PIND.0==1&f==1) ошибка пропадает.
А переменную f можно обявить как bit? Она ведь только два значения содержит...
10000 циклов записи/стирания вроде как?
А в строке
{f==0;PORTB=a[d++];}
компилятор выдает ошибку––illegal address.
А если условие записать вот так:
if(PIND.0==1&f==1) ошибка пропадает.
А переменную f можно обявить как bit? Она ведь только два значения содержит...
eduardo писал(а):компилятор выдает ошибку––illegal address.
Код: Выделить всё
if((PIND.0==1)&&(f==1)){ //если кнопка PIND.0 нажата,начинается перечисление массива
//Вообще можно и так : if(PIND.0&f){} смысл тот же,только короче
f=0;//очищаем флаг
PORTB=a[d++];//после отпускания кнопки PIND.0 состояние PORTB остается таким,каким было на момент отпускания
if(d>=11)d=0;} //Это из прерывания таймера можно убрать первый по снижению напряжения по BOD
второй просто поставить компаратор на входе питания и отлавливать по прерыванию компаратора
третий поставить транзистор+стабилитрон на нужное напряжение на любом из входов и ждать единицы,

Во первых это 100 000 циклов. Но даже такого количества, если их дёргать 1 раз в минуту, хватит лишь на полгода (лично проверено!).eduardo писал(а):Хотелось,чтобы данные сохранялись после отключения питания. Ведь еер выдерживает 10000 циклов записи/стирания вроде как?.
Во вторых:
После стирания хоть Flash, хоть EEPROM, в стёртых ячейках всегда 0xFF - это особенность тех структур, на которых сделана память. Ровно так же и Fuse-биты 1-не запрограммировано, 0-запрограммировано.eeprom unsigned char b; // при прошивке МК в переменную изначально записано 0х00
- Сообщения: 171
- Зарегистрирован: Вс июн 17, 2012 16:32:42
Но я вовсе не собираюсь каждую минуту записывать/стирать еер. Один раз записал,а потом только чтение. Перезапись делать только по мере надобности. Или читать еер каждую минуту тоже не рекомендуется?
Последний раз редактировалось eduardo Чт фев 07, 2013 10:56:20, всего редактировалось 1 раз.
Так нужно делать(!) - запись делать только по мере необходимости.Или так тоже нельзя?
Можно после записи проверять записанную информацию чтением. Если прочиталось неправильно - меняем ячейки (адреса еепрома) и работаем дальше с ними.
Чтение - неограниченное количество циклов. Просто при перезаписи на стираемые ячейки подаётся очень высокое напряжение порядка 24-28В, которое "сгоняет" электроны с "ловушек" затворов МНОП структур. Понятное дело, что электроны ускоряются до приличных скоростей в микроскопических объёмах, греют изоляционный слой и вызывают его деградацию.
Я, когда ещё только начинал осваиваться с АВР, сделал часы-будильник на Тини2313. И очень уж мне хотелось, чтобы при случайном пропадании питания не сбивалось время. Вот и дописал в код, чтобы при каждой смене минут значения часов и минут заносились в EEPROM. Посмотрел в даташит - 100тыс. циклов, ну, подумал, это как на наши изделия - гарантируют не менее, а в реальности на 1-2 порядка больше. Через примерно полгода часы начали "вспоминать" полную хрень - получился такой себе генератор случайных чисел или "аппаратный рандомайзер". Таким образом наработка составила около 250-300тыс. циклов.
Я, когда ещё только начинал осваиваться с АВР, сделал часы-будильник на Тини2313. И очень уж мне хотелось, чтобы при случайном пропадании питания не сбивалось время. Вот и дописал в код, чтобы при каждой смене минут значения часов и минут заносились в EEPROM. Посмотрел в даташит - 100тыс. циклов, ну, подумал, это как на наши изделия - гарантируют не менее, а в реальности на 1-2 порядка больше. Через примерно полгода часы начали "вспоминать" полную хрень - получился такой себе генератор случайных чисел или "аппаратный рандомайзер". Таким образом наработка составила около 250-300тыс. циклов.
- Сообщения: 804
- Зарегистрирован: Чт мар 12, 2009 16:31:05
Не могли бы в двух словах обозначить,отсутствие каких функций или типов данных Вас расстраивает CVAVR?Apparatchik писал(а): CVAVR это пародия на Си.
- Сообщения: 106
- Зарегистрирован: Пн мар 26, 2012 05:25:06
Да человек сам не понимает о чем говорит.
и продолжение...Apparatchik писал(а):Вот только что проверил CVAVR 1.25.9 если объявить переменную не в начале функции, а непосредственно перед циклом, компилятор дает ошибку must declare first in block. В GCC конечно таких проблем нету.
Apparatchik писал(а):Я понял, но в Eclipse я могу её объявить где захочу.


