У всех задачи разные. Я вопрос задавал конкретный. Зачем в вопросе расписывать на 3 страницы почему так надо, а ни как иначе.ARV писал(а):именно о том и шла речь - оставьте компилятору компиляторово, не майтесь ерундой
CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
- Реклама
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Вам уже дали несколько готовых решений и кучу намеков на более извращениские или оригинальные решения. Теперь обсуждают более интересные вопросы.
Re: CodeVision AVR в вопросах и ответах
Здравствуйте. Прошу простить, но прочитать больше 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шт? Желательно с простыми пояснениями для таких как я НАЧИНАЮЩИХ.
В общем, суть простая, программа на мк 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 в вопросах и ответах
Приведите задание препода дословно, а не своими словами.Mixail_BM писал(а):...попросили...
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
Это не задание, просто подсветка специфическая на картину - нужно подсвечивать разные фрагменты в разное время. или просто чтобы горело все.
Суть микроконтроллера в данном случае - при нажатии кнопки переключать режимы, и все. А atmega8 - как самая распространенная (и дешевая) с большим количеством выводов и достаточно большой памятью.
Суть микроконтроллера в данном случае - при нажатии кнопки переключать режимы, и все. А atmega8 - как самая распространенная (и дешевая) с большим количеством выводов и достаточно большой памятью.
- Реклама
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Тогда разъясните. Особенно то, что в скобках.Mixail_BM писал(а):...необходимо переключать режимы (цикл можно и довести до конца после нажатия)...
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
Насчет доведения цикла до конца - это как я сделал, после прерывания вернется и будет выполнять код до окончания (проверки условия). Как сейчас, нажал кнопку, даже если в начале цикла, он вернется и цикл продолжится до следующего круга.
Насчет режимов - картина выполнена из бисера и имеет довольно много элементов (цветы, деревья, птицы вроде...) и их надо подсвечивать, причем не все, а в определенной последовательности (как мне скажут, так я и буду назначать порты, на крайний случай введу регистры, хоть и не хочу). Мне не надо оптимизировать для уменьшения кода, достаточно чтобы просто работало, и я понимал как.
Насчет режимов - картина выполнена из бисера и имеет довольно много элементов (цветы, деревья, птицы вроде...) и их надо подсвечивать, причем не все, а в определенной последовательности (как мне скажут, так я и буду назначать порты, на крайний случай введу регистры, хоть и не хочу). Мне не надо оптимизировать для уменьшения кода, достаточно чтобы просто работало, и я понимал как.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Засада одна и серьёзная - дребезг контактов. При нажатии на кнопку переменная 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
Re: CodeVision AVR в вопросах и ответах
Спасибо большое. Попробовал пока без подавления дребезга контактов(хочу без таймера, просто сделал на задержке, тем более подтяжка висит), работает отлично.
Re: CodeVision AVR в вопросах и ответах
Как определить частоту ?
Например снимаем показания с датчика через АЦП , а как узнать еще и частоту ?
Например снимаем показания с датчика через АЦП , а как узнать еще и частоту ?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Варианта 2 :Q-ti писал(а):Как определить частоту ?
1. Измерить кол-во колебаний за единицу времени. Это будет частота.
2. Измерить период между колебаниями и перевести его в частоту.
Ну и ответный вопрос - частоту чего ?
Re: CodeVision AVR в вопросах и ответах
Частоту внешней среды датчика . А как реализовать эти два варианта ?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Зачем реализовывать 2 варианта ? Выбирайте любой по вкусу и реализовывайте.
Ну а как реализовывать, я написал выше. Либо подсчитываем колебания, либо измеряем период между ними. Что представляется более технически-возможным для Вашего проекта, то и реализовывайте.
Ну а как реализовывать, я написал выше. Либо подсчитываем колебания, либо измеряем период между ними. Что представляется более технически-возможным для Вашего проекта, то и реализовывайте.
Re: CodeVision AVR в вопросах и ответах
Помогите с сортировкой массива.
Суть, имеем массив допустим из 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} - изначальные позиции цифр, где какая была до сортировки.
Всё что делал, очень громоздко получается... Может кто решал подобную задачу и имеется "красивое" решение?
Суть, имеем массив допустим из 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 в вопросах и ответах
Первое что приходит на ум - создать изначально этот второй массив и заполнить [0, 1, 2, 3, 4, 5], а при сортировке первого параллельно двигать элементы второго.
Re: CodeVision AVR в вопросах и ответах
Понятно дело, что в массив...
Написал пока что так. Вроде работает. Сортировка от большего к меньшему. Но насколько оно экономично? Есть варианты лучше?
Написал пока что так. Вроде работает. Сортировка от большего к меньшему. Но насколько оно экономично? Есть варианты лучше?
Код: Выделить всё
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 в вопросах и ответах
Обычная сортировка пузырьком. Не самая быстрая, но на таком наборе данных (десяток элементов) нормально.
Только логичнее было бы второй массив не 1..10, а 0..9 инициализировать.
Кстати, я бы для скорости избавился от int типов (индексы массива, сами элементы, если можно), если хватит char.
Только логичнее было бы второй массив не 1..10, а 0..9 инициализировать.
Кстати, я бы для скорости избавился от int типов (индексы массива, сами элементы, если можно), если хватит char.
Re: CodeVision AVR в вопросах и ответах
Так вот я и пишу чтобы найти самое быстрое) Есть предложения? Практические?WiseLord писал(а):Не самая быстрая
Почему то индексы массивов в виде char вешают МК. По данным в массивах указал сразу.
Глупый не задает вопросы. Глупый и так все знает.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
signed сделайте их.AndTer писал(а):Почему то индексы массивов в виде char вешают МК
По всей видимости, компилятор по-умолчанию делает их беззнаковыми.
Кстати, он ругнуться должен на такой код с беззнаковыми переменными.


