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

Обсуждаем контроллеры компании Atmel.
realm
Первый раз сказал Мяу!
Сообщения: 30
Зарегистрирован: Вт сен 20, 2016 23:50:51

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

Сообщение realm »

ARV писал(а):именно о том и шла речь - оставьте компилятору компиляторово, не майтесь ерундой

У всех задачи разные. Я вопрос задавал конкретный. Зачем в вопросе расписывать на 3 страницы почему так надо, а ни как иначе.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Вам уже дали несколько готовых решений и кучу намеков на более извращениские или оригинальные решения. Теперь обсуждают более интересные вопросы.
Mixail_BM
Открыл глаза
Сообщения: 50
Зарегистрирован: Пн июл 28, 2014 20:23:22

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

Сообщение 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шт? Желательно с простыми пояснениями для таких как я НАЧИНАЮЩИХ.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Mixail_BM писал(а):...попросили...

Приведите задание препода дословно, а не своими словами.
Docendo discimus
Mixail_BM
Открыл глаза
Сообщения: 50
Зарегистрирован: Пн июл 28, 2014 20:23:22

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

Сообщение Mixail_BM »

Это не задание, просто подсветка специфическая на картину - нужно подсвечивать разные фрагменты в разное время. или просто чтобы горело все.
Суть микроконтроллера в данном случае - при нажатии кнопки переключать режимы, и все. А atmega8 - как самая распространенная (и дешевая) с большим количеством выводов и достаточно большой памятью.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Mixail_BM писал(а):...необходимо переключать режимы (цикл можно и довести до конца после нажатия)...

Тогда разъясните. Особенно то, что в скобках.
Docendo discimus
Mixail_BM
Открыл глаза
Сообщения: 50
Зарегистрирован: Пн июл 28, 2014 20:23:22

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

Сообщение Mixail_BM »

Насчет доведения цикла до конца - это как я сделал, после прерывания вернется и будет выполнять код до окончания (проверки условия). Как сейчас, нажал кнопку, даже если в начале цикла, он вернется и цикл продолжится до следующего круга.
Насчет режимов - картина выполнена из бисера и имеет довольно много элементов (цветы, деревья, птицы вроде...) и их надо подсвечивать, причем не все, а в определенной последовательности (как мне скажут, так я и буду назначать порты, на крайний случай введу регистры, хоть и не хочу). Мне не надо оптимизировать для уменьшения кода, достаточно чтобы просто работало, и я понимал как.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение 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;
}
Docendo discimus
Mixail_BM
Открыл глаза
Сообщения: 50
Зарегистрирован: Пн июл 28, 2014 20:23:22

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

Сообщение Mixail_BM »

Спасибо большое. Попробовал пока без подавления дребезга контактов(хочу без таймера, просто сделал на задержке, тем более подтяжка висит), работает отлично.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Пожалуйста.
Docendo discimus
Q-ti
Встал на лапы
Сообщения: 134
Зарегистрирован: Чт ноя 17, 2011 00:57:23
Откуда: Харьков

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

Сообщение Q-ti »

Как определить частоту ?
Например снимаем показания с датчика через АЦП , а как узнать еще и частоту ?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Q-ti писал(а):Как определить частоту ?
Варианта 2 :
1. Измерить кол-во колебаний за единицу времени. Это будет частота.
2. Измерить период между колебаниями и перевести его в частоту.

Ну и ответный вопрос - частоту чего ?
Q-ti
Встал на лапы
Сообщения: 134
Зарегистрирован: Чт ноя 17, 2011 00:57:23
Откуда: Харьков

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

Сообщение Q-ti »

Частоту внешней среды датчика . А как реализовать эти два варианта ?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Зачем реализовывать 2 варианта ? Выбирайте любой по вкусу и реализовывайте.
Ну а как реализовывать, я написал выше. Либо подсчитываем колебания, либо измеряем период между ними. Что представляется более технически-возможным для Вашего проекта, то и реализовывайте.
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение 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} - изначальные позиции цифр, где какая была до сортировки.

Всё что делал, очень громоздко получается... Может кто решал подобную задачу и имеется "красивое" решение?
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Первое что приходит на ум - создать изначально этот второй массив и заполнить [0, 1, 2, 3, 4, 5], а при сортировке первого параллельно двигать элементы второго.
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение 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;
  }
 }
}
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Обычная сортировка пузырьком. Не самая быстрая, но на таком наборе данных (десяток элементов) нормально.

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

Кстати, я бы для скорости избавился от int типов (индексы массива, сами элементы, если можно), если хватит char.
Аватара пользователя
AndTer
Поставщик валерьянки для Кота
Сообщения: 2406
Зарегистрирован: Ср фев 23, 2011 12:12:31

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

Сообщение AndTer »

WiseLord писал(а):Не самая быстрая

Так вот я и пишу чтобы найти самое быстрое) Есть предложения? Практические?

Почему то индексы массивов в виде char вешают МК. По данным в массивах указал сразу.
Глупый не задает вопросы. Глупый и так все знает.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

AndTer писал(а):Почему то индексы массивов в виде char вешают МК
signed сделайте их.
По всей видимости, компилятор по-умолчанию делает их беззнаковыми.
Кстати, он ругнуться должен на такой код с беззнаковыми переменными.
Ответить

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