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

Обсуждаем контроллеры компании Atmel.
Ответить
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

ELcat писал(а):... Это чтобы человек умел выстраивать свои мысли в виде связанных и понятных окружающим логических цепочек вместо непонятной "каши в голове".
Тут, к сожалению (или к счастью) ромбики не помогут. Этим ведают интеллект&&образование.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Извините,но все таки я не отступлюсь. Может так наглядней будет? См. архив.
Вложения
МАССИВ,ЕЕПРОМ.rar
(33.7 КБ) 164 скачивания
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Ну так идти по массиву и сравнивать с переменной, если совпало - начинать перечисления. Или я чего-то недогоняю?
«И всё-таки она вертится!»
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Дело втом,что я не знаю как это написать на си. Пробовал несколько раз,находил нужный элемент,а дальше него массив перечисляться не хотел.
Я ж всетаки начинающий. Ни бум бум ваще. Я только знаю циклы if-else,while и как функцию вызвать. Поэтому и спрашиваю вас как спецов,а вы блин чуть ли не в душу г...ть... Да и в книжках не совсем понятно написано,уж извините,институтов не заканчивал.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Сообщение Marchello »

Ох как мне знакома сия ситуация, когда обращаешься к спецам за помощью, за подсказкой, а тебя как щенка за шкиряк и за учебники сажают! Хотя достаточно просто на пальцах рассказать или привести пример!
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Marchello, дак приведите, в чём проблема ?
Контактная информация:
Реклама
Встал на лапы
Сообщения: 114
Зарегистрирован: Чт ноя 24, 2011 12:39:13

Сообщение Marchello »

)))))) С огромным удовольствием помог, только я сам в этом деле новичек! Всего две недели как в процессе изучения! Сижу вот самоучители штудирую! Но над вашей проблемкой подумаю!
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Извините за некорректные вопросы.
Последний раз редактировалось eduardo Ср фев 06, 2013 20:50:43, всего редактировалось 1 раз.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

При нажатии кнопки считайте из еепром в переменную, в цикле идите по массиву и сравнивайте значения с переменной, если значения совпадут сразу выходите из цикла с запоминанием индекса и вот с этого индекса и начинайте перечисление.

P.S.
eduardo писал(а):Дело втом,что я не знаю как это написать на си
CVAVR это пародия на Си.
«И всё-таки она вертится!»
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

И не делайте вот так:

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

if(PIND.1==1)      // если нажать кнопку PIND.1 состояние PORTB присваивается переменной
{b=PORTB;}         // b,объявленной в еепром
Иначе ваш еепром будет дохнуть быстрее, чем вы будете догадываться об этом :))
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Аlex писал(а):Иначе ваш еепром будет дохнуть быстрее, чем вы будете догадываться об этом :))
Это точно :beer: , нужно, хотябы, проверять значение, и если оно другое, тогда писать.
«И всё-таки она вертится!»
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение 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,объявленной в еепром
 
Вообще решение задачи в коллективе приходит быстрее, если условия знают несколько человек, а не только Вы.
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Хотелось,чтобы данные сохранялись после отключения питания. Ведь еер выдерживает
10000 циклов записи/стирания вроде как?
А в строке
{f==0;PORTB=a[d++];}
компилятор выдает ошибку––illegal address.
А если условие записать вот так:
if(PIND.0==1&f==1) ошибка пропадает.
А переменную f можно обявить как bit? Она ведь только два значения содержит...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

eduardo писал(а):компилятор выдает ошибку––illegal address.
:facepalm: блин забыл общие скобки в условии

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

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
второй просто поставить компаратор на входе питания и отлавливать по прерыванию компаратора
третий поставить транзистор+стабилитрон на нужное напряжение на любом из входов и ждать единицы,
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Сообщение ELcat »

eduardo писал(а):Хотелось,чтобы данные сохранялись после отключения питания. Ведь еер выдерживает 10000 циклов записи/стирания вроде как?.
Во первых это 100 000 циклов. Но даже такого количества, если их дёргать 1 раз в минуту, хватит лишь на полгода (лично проверено!).

Во вторых:
eeprom unsigned char b; // при прошивке МК в переменную изначально записано 0х00
После стирания хоть Flash, хоть EEPROM, в стёртых ячейках всегда 0xFF - это особенность тех структур, на которых сделана память. Ровно так же и Fuse-биты 1-не запрограммировано, 0-запрограммировано.
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Но я вовсе не собираюсь каждую минуту записывать/стирать еер. Один раз записал,а потом только чтение. Перезапись делать только по мере надобности. Или читать еер каждую минуту тоже не рекомендуется?
Последний раз редактировалось eduardo Чт фев 07, 2013 10:56:20, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Или так тоже нельзя?
Так нужно делать(!) - запись делать только по мере необходимости.
Можно после записи проверять записанную информацию чтением. Если прочиталось неправильно - меняем ячейки (адреса еепрома) и работаем дальше с ними.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Сообщение ELcat »

Чтение - неограниченное количество циклов. Просто при перезаписи на стираемые ячейки подаётся очень высокое напряжение порядка 24-28В, которое "сгоняет" электроны с "ловушек" затворов МНОП структур. Понятное дело, что электроны ускоряются до приличных скоростей в микроскопических объёмах, греют изоляционный слой и вызывают его деградацию.
Я, когда ещё только начинал осваиваться с АВР, сделал часы-будильник на Тини2313. И очень уж мне хотелось, чтобы при случайном пропадании питания не сбивалось время. Вот и дописал в код, чтобы при каждой смене минут значения часов и минут заносились в EEPROM. Посмотрел в даташит - 100тыс. циклов, ну, подумал, это как на наши изделия - гарантируют не менее, а в реальности на 1-2 порядка больше. Через примерно полгода часы начали "вспоминать" полную хрень - получился такой себе генератор случайных чисел или "аппаратный рандомайзер". Таким образом наработка составила около 250-300тыс. циклов.
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Apparatchik писал(а): CVAVR это пародия на Си.
Не могли бы в двух словах обозначить,отсутствие каких функций или типов данных Вас расстраивает CVAVR?
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Сообщение Совесть »

Да человек сам не понимает о чем говорит.
Apparatchik писал(а):Вот только что проверил CVAVR 1.25.9 если объявить переменную не в начале функции, а непосредственно перед циклом, компилятор дает ошибку must declare first in block. В GCC конечно таких проблем нету.
и продолжение...
Apparatchik писал(а):Я понял, но в Eclipse я могу её объявить где захочу.
Ответить

Вернуться в «AVR»