Страница 239 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 17:52:33
Goodefine
ELcat писал(а):... Это чтобы человек умел выстраивать свои мысли в виде связанных и понятных окружающим логических цепочек вместо непонятной "каши в голове".
Тут, к сожалению (или к счастью) ромбики не помогут. Этим ведают интеллект&&образование.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 19:23:13
eduardo
Извините,но все таки я не отступлюсь. Может так наглядней будет? См. архив.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 19:31:57
Apparatchik
Ну так идти по массиву и сравнивать с переменной, если совпало - начинать перечисления. Или я чего-то недогоняю?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 20:37:56
eduardo
Дело втом,что я не знаю как это написать на си. Пробовал несколько раз,находил нужный элемент,а дальше него массив перечисляться не хотел.
Я ж всетаки начинающий. Ни бум бум ваще. Я только знаю циклы if-else,while и как функцию вызвать. Поэтому и спрашиваю вас как спецов,а вы блин чуть ли не в душу г...ть... Да и в книжках не совсем понятно написано,уж извините,институтов не заканчивал.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 20:40:10
Marchello
Ох как мне знакома сия ситуация, когда обращаешься к спецам за помощью, за подсказкой, а тебя как щенка за шкиряк и за учебники сажают! Хотя достаточно просто на пальцах рассказать или привести пример!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 20:44:45
Аlex
Marchello, дак приведите, в чём проблема ?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 20:46:48
Marchello
)))))) С огромным удовольствием помог, только я сам в этом деле новичек! Всего две недели как в процессе изучения! Сижу вот самоучители штудирую! Но над вашей проблемкой подумаю!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 20:47:55
eduardo
Извините за некорректные вопросы.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 20:49:15
Apparatchik
При нажатии кнопки считайте из еепром в переменную, в цикле идите по массиву и сравнивайте значения с переменной, если значения совпадут сразу выходите из цикла с запоминанием индекса и вот с этого индекса и начинайте перечисление.
P.S.
eduardo писал(а):Дело втом,что я не знаю как это написать на си
CVAVR это пародия на Си.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 20:53:07
Аlex
И не делайте вот так:
Код: Выделить всё
if(PIND.1==1) // если нажать кнопку PIND.1 состояние PORTB присваивается переменной
{b=PORTB;} // b,объявленной в еепром
Иначе ваш еепром будет дохнуть быстрее, чем вы будете догадываться об этом

Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 20:55:00
Apparatchik
Аlex писал(а):Иначе ваш еепром будет дохнуть быстрее, чем вы будете догадываться об этом

Это точно

, нужно, хотябы, проверять значение, и если оно другое, тогда писать.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 21:37:31
vitalik_1984
Не совсем понятно изложен вопрос, столько человек прочитало и не поняли.
Вам нужно определить номер элемента, в котором находится нужное вам число 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 так как это четвертый элемент списка
Вообще я так и не понял зачем вам сохранять PORTB в EEPROM какой в этом логический смысл?
Не проще запоминать номер элемента, а постом по этому номеру искать сам элемент? Тем более элементы это числа от 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,объявленной в еепром
Вообще решение задачи в коллективе приходит быстрее, если условия знают несколько человек, а не только Вы.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 22:38:16
eduardo
Хотелось,чтобы данные сохранялись после отключения питания. Ведь еер выдерживает
10000 циклов записи/стирания вроде как?
А в строке
{f==0;PORTB=a[d++];}
компилятор выдает ошибку––illegal address.
А если условие записать вот так:
if(PIND.0==1&f==1) ошибка пропадает.
А переменную f можно обявить как bit? Она ведь только два значения содержит...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср фев 06, 2013 23:07:23
vitalik_1984
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
второй просто поставить компаратор на входе питания и отлавливать по прерыванию компаратора
третий поставить транзистор+стабилитрон на нужное напряжение на любом из входов и ждать единицы,

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 07, 2013 02:15:56
ELcat
eduardo писал(а):Хотелось,чтобы данные сохранялись после отключения питания. Ведь еер выдерживает 10000 циклов записи/стирания вроде как?.
Во первых это 100 000 циклов. Но даже такого количества, если их дёргать 1 раз в минуту, хватит лишь на полгода (лично проверено!).
Во вторых:
eeprom unsigned char b; // при прошивке МК в переменную изначально записано 0х00
После стирания хоть Flash, хоть EEPROM, в стёртых ячейках всегда 0xFF - это особенность тех структур, на которых сделана память. Ровно так же и Fuse-биты 1-не запрограммировано, 0-запрограммировано.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 07, 2013 10:37:35
eduardo
Но я вовсе не собираюсь каждую минуту записывать/стирать еер. Один раз записал,а потом только чтение. Перезапись делать только по мере надобности. Или читать еер каждую минуту тоже не рекомендуется?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 07, 2013 10:52:12
Аlex
Или так тоже нельзя?
Так нужно делать(!) - запись делать только по мере необходимости.
Можно после записи проверять записанную информацию чтением. Если прочиталось неправильно - меняем ячейки (адреса еепрома) и работаем дальше с ними.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт фев 07, 2013 10:58:01
ELcat
Чтение - неограниченное количество циклов. Просто при перезаписи на стираемые ячейки подаётся очень высокое напряжение порядка 24-28В, которое "сгоняет" электроны с "ловушек" затворов МНОП структур. Понятное дело, что электроны ускоряются до приличных скоростей в микроскопических объёмах, греют изоляционный слой и вызывают его деградацию.
Я, когда ещё только начинал осваиваться с АВР, сделал часы-будильник на Тини2313. И очень уж мне хотелось, чтобы при случайном пропадании питания не сбивалось время. Вот и дописал в код, чтобы при каждой смене минут значения часов и минут заносились в EEPROM. Посмотрел в даташит - 100тыс. циклов, ну, подумал, это как на наши изделия - гарантируют не менее, а в реальности на 1-2 порядка больше. Через примерно полгода часы начали "вспоминать" полную хрень - получился такой себе генератор случайных чисел или "аппаратный рандомайзер". Таким образом наработка составила около 250-300тыс. циклов.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт фев 08, 2013 10:32:31
Vov123
Apparatchik писал(а):
CVAVR это пародия на Си.
Не могли бы в двух словах обозначить,отсутствие каких функций или типов данных Вас расстраивает CVAVR?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт фев 08, 2013 11:52:00
Совесть
Да человек сам не понимает о чем говорит.
Apparatchik писал(а):Вот только что проверил CVAVR 1.25.9 если объявить переменную не в начале функции, а непосредственно перед циклом, компилятор дает ошибку must declare first in block. В GCC конечно таких проблем нету.
и продолжение...
Apparatchik писал(а):Я понял, но в Eclipse я могу её объявить где захочу.