Страница 375 из 421

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

Добавлено: Ср ноя 16, 2016 18:06:29
realm
ARV писал(а):именно о том и шла речь - оставьте компилятору компиляторово, не майтесь ерундой
У всех задачи разные. Я вопрос задавал конкретный. Зачем в вопросе расписывать на 3 страницы почему так надо, а ни как иначе.

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

Добавлено: Ср ноя 16, 2016 18:26:54
COKPOWEHEU
Вам уже дали несколько готовых решений и кучу намеков на более извращениские или оригинальные решения. Теперь обсуждают более интересные вопросы.

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

Добавлено: Ср ноя 23, 2016 18:58:09
Mixail_BM
Здравствуйте. Прошу простить, но прочитать больше 300+ страниц ОЧЕНЬ долго, возможно повторюсь. С микроконтроллерами почти не работаю, но тут попросили...
В общем, суть простая, программа на мк atmega8 поочередно мигает светодиодами, по замыкании PD2 (INT0) на землю, необходимо переключать режимы (цикл можно и довести до конца после нажатия).
Как вижу - по прерыванию к объявленной переменной добавляется 1 (если меньше количества программ) или сбрасывается в 0 (если дошло до максимума) и выходит из прерывания назад.
например так:
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (flag==0)
{
flag++;
}
else
{
flag--;
};
Если оставить как есть работает на 2 программы - основная и вспомогательная (соответственно flag=0 или flag=1).
А основное тело выглядит так (прошу не изгаляться над тем, что по 2-3 строчки можно выполнить за 1 машинный цикл, мне так нагляднее, потом доработаю):
while (1)

if (flag==0)
{
pc=0x00;
pd=0x00;
pc.0=0x01;
pc.1=0x01;
delay_ms(250);
pc.0=0x00;
pc.1=0x00;
pc.2=0x01;
pd.6=0x01;
delay_ms(250);
pc.2=0x00;
pd.6=0x00;
pc.3=0x01;
pd.5=0x01;
delay_ms(250);
pc.3=0x00;
pd.5=0x00;
pd.4=0x01;
delay_ms(250);
}

else
{
pc=0x00;
pd=0x00;
delay_ms(1000);
PORTC=0b00001111;
PORTD=0b01110000;
delay_ms(1000);
};
Суть вопроса: как сделать переключение по окончании каждого цикла и сделать количество таких мини-программ на уровне 10-15шт? Желательно с простыми пояснениями для таких как я НАЧИНАЮЩИХ.

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

Добавлено: Чт ноя 24, 2016 09:56:53
pyzhman
Mixail_BM писал(а):...попросили...
Приведите задание препода дословно, а не своими словами.

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

Добавлено: Чт ноя 24, 2016 16:43:55
Mixail_BM
Это не задание, просто подсветка специфическая на картину - нужно подсвечивать разные фрагменты в разное время. или просто чтобы горело все.
Суть микроконтроллера в данном случае - при нажатии кнопки переключать режимы, и все. А atmega8 - как самая распространенная (и дешевая) с большим количеством выводов и достаточно большой памятью.

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

Добавлено: Чт ноя 24, 2016 19:28:53
pyzhman
Mixail_BM писал(а):...необходимо переключать режимы (цикл можно и довести до конца после нажатия)...
Тогда разъясните. Особенно то, что в скобках.

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

Добавлено: Чт ноя 24, 2016 19:54:06
Mixail_BM
Насчет доведения цикла до конца - это как я сделал, после прерывания вернется и будет выполнять код до окончания (проверки условия). Как сейчас, нажал кнопку, даже если в начале цикла, он вернется и цикл продолжится до следующего круга.
Насчет режимов - картина выполнена из бисера и имеет довольно много элементов (цветы, деревья, птицы вроде...) и их надо подсвечивать, причем не все, а в определенной последовательности (как мне скажут, так я и буду назначать порты, на крайний случай введу регистры, хоть и не хочу). Мне не надо оптимизировать для уменьшения кода, достаточно чтобы просто работало, и я понимал как.

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

Добавлено: Пт ноя 25, 2016 07:38:28
pyzhman
Засада одна и серьёзная - дребезг контактов. При нажатии на кнопку переменная flag может стать какой-угодно. Можно победить так:

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

// вызывается каждые 10мсек
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
oldButton= Button;
Button= PIND.2;

if(oldButton && !Button) // нажали на кнопку
{
if(++flag > N) flag= 0; // нарастили переменную
}
}
А тело будет таким:

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

switch(flag)
{
case 0:
// первый режим
break;
....
case N:
// N- ный режим
break;
}

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

Добавлено: Пт ноя 25, 2016 17:24:48
Mixail_BM
Спасибо большое. Попробовал пока без подавления дребезга контактов(хочу без таймера, просто сделал на задержке, тем более подтяжка висит), работает отлично.

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

Добавлено: Сб ноя 26, 2016 06:59:50
pyzhman
Пожалуйста.

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

Добавлено: Сб ноя 26, 2016 14:34:42
Q-ti
Как определить частоту ?
Например снимаем показания с датчика через АЦП , а как узнать еще и частоту ?

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

Добавлено: Сб ноя 26, 2016 15:33:01
Аlex
Q-ti писал(а):Как определить частоту ?
Варианта 2 :
1. Измерить кол-во колебаний за единицу времени. Это будет частота.
2. Измерить период между колебаниями и перевести его в частоту.

Ну и ответный вопрос - частоту чего ?

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

Добавлено: Сб ноя 26, 2016 15:45:46
Q-ti
Частоту внешней среды датчика . А как реализовать эти два варианта ?

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

Добавлено: Сб ноя 26, 2016 16:01:57
Аlex
Зачем реализовывать 2 варианта ? Выбирайте любой по вкусу и реализовывайте.
Ну а как реализовывать, я написал выше. Либо подсчитываем колебания, либо измеряем период между ними. Что представляется более технически-возможным для Вашего проекта, то и реализовывайте.

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

Добавлено: Чт дек 08, 2016 09:53:24
AndTer
Помогите с сортировкой массива.
Суть, имеем массив допустим из 10 элементов:
int MS[]={20,5,0,17,90,57,150,23,7,34};
Нужно его отсортировать, но при этом сохранить информацию о начальных позициях цифр.
То есть помимо сортировки получить ещё один массив с номерами их позиций, с примером выше:
3,2,9,4,1,8,10,6,5,7 или можно от 0 идти: 2,1,8,3,0,7,9,5,4,6
Итог, два массива:
{0,5,7,17,20,23,34,57,90,150} - собственно отсортированный массив.
{2,1,8,3,0,7,9,5,4,6} - изначальные позиции цифр, где какая была до сортировки.

Всё что делал, очень громоздко получается... Может кто решал подобную задачу и имеется "красивое" решение?

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

Добавлено: Чт дек 08, 2016 10:24:58
WiseLord
Первое что приходит на ум - создать изначально этот второй массив и заполнить [0, 1, 2, 3, 4, 5], а при сортировке первого параллельно двигать элементы второго.

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

Добавлено: Чт дек 08, 2016 10:51:36
AndTer
Понятно дело, что в массив...
Написал пока что так. Вроде работает. Сортировка от большего к меньшему. Но насколько оно экономично? Есть варианты лучше?

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

int PW[]={20,5,0,17,90,57,150,23,7,34};
char PWN[]={1,2,3,4,5,6,7,8,9,10};
int i,k,o;
char l;

for(k=9;k>=0;k--)
{
 for(i=0;i<k;i++)
 {
 if(PW[i]<PW[i+1])
  {
   o=PW[i];PW[i]=PW[i+1];PW[i+1]=o;
   l=PWN[i];PWN[i]=PWN[i+1];PWN[i+1]=l;
  }
 }
}

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

Добавлено: Чт дек 08, 2016 11:18:54
WiseLord
Обычная сортировка пузырьком. Не самая быстрая, но на таком наборе данных (десяток элементов) нормально.

Только логичнее было бы второй массив не 1..10, а 0..9 инициализировать.

Кстати, я бы для скорости избавился от int типов (индексы массива, сами элементы, если можно), если хватит char.

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

Добавлено: Чт дек 08, 2016 12:51:11
AndTer
WiseLord писал(а):Не самая быстрая
Так вот я и пишу чтобы найти самое быстрое) Есть предложения? Практические?

Почему то индексы массивов в виде char вешают МК. По данным в массивах указал сразу.

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

Добавлено: Чт дек 08, 2016 13:14:28
Аlex
AndTer писал(а):Почему то индексы массивов в виде char вешают МК
signed сделайте их.
По всей видимости, компилятор по-умолчанию делает их беззнаковыми.
Кстати, он ругнуться должен на такой код с беззнаковыми переменными.