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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

vitalik_1984 писал(а):unalex , откуда тогда взяться универсальности?


универсальность хорошо, но к конкретной задаче думаю она излишняя, проще передать функции ссылку на массив в качестве параметра и возвращать void

в моем примере кода разобрался - он читать то читает, но только первую строку массива а потом теряется

но я так и не понял как вернуть указатель на многомерный массив и какого типа должна быть функция в этом случае?
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Разобрался я со своим косяком. Всё дело было в типе переменные chanel1 chanel6 (unsigned char)
А с таймером пока тёмное дело.
Всем спасибо за помощь.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

но я так и не понял как вернуть указатель на многомерный массив
Да в принципе так-же, как и на любой тип данных:

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

/*********************************************************/
typedef unsigned int t_arr[5][5];   // Создаём тип - массив 5x5
typedef t_arr*  tp_arr;             // Создаём тип - указатель на массив t_arr
/*********************************************************/
unsigned int* asd(void){
static t_arr    arr;        // Создаём статический массив
unsigned char   i, a;       
   
for(i=0;i<5;i++)            // Работаем с массивом
    for(i=0;i<5;i++)        //
        arr[i][a]=i*10+a;   //

return (unsigned int*)arr;  // Возвращаем указатель на массив
}


/*********************************************************/
void main (void){

tp_arr   ret_arr;               // Создаём указатель на двумерный массив
ret_arr=(tp_arr)asd();          // Вызываем ф-ию и присваиваем возвращённый указатель
*ret_arr[1][1] = *ret_arr[0][0];// Работаем с массивом через указатель

.....................
.....................
Только после возврата, указатель приходится явно приводить к своему типу.
Короче, геморно это всё... :facepalm:
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

ПЫТАЮСЬ РАСПЕЧАТАТЬ ПРОГУ
файл-принт
а он мне выдате вот такое окно
http://www.imgup.ru/image-wbpx2019539.html
в чем может быть проблемма ?
Tell Me The Truth
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

выбран не тот принтер, а именно, вместо нормального принтера выбран Microsoft XPS Writer

в настройках печати выбрать нужный принтер, если его нет, значит не установлены драйвера на него
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

спасибо, Саня ! :beer:
Tell Me The Truth
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

как ВООБЩЕ отключить оптимизацию ?
вот сдесь что-то нашол http://www.imgup.ru/image-wcsx9014010.html
это самая низкая оптимизация, полный 0 ? или есть еще ниже ?
Tell Me The Truth
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

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

Сообщение Vov123 »

#pragma opt- //отключает оптимизацию

#pragma opt+ //включает оптимизацию
Аватара пользователя
Valiullin.Amir
Родился
Сообщения: 5
Зарегистрирован: Ср мар 13, 2013 08:41:58

AVR ATmega16A кнопка

Сообщение Valiullin.Amir »

здравствуйте коты
хотелось бы задать вопрос по поводу кнопок в CVAVR на C
как сделать так чтобы при нажатии на кнопку и удержании ее
цикл срабатывал всего один раз до тех пор пока ее не нажмешь снова
код примера пока предложить не смогу нахожусь не дома

понял что надо как-то с флагами мутить и с swich case
но не могу понять как
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

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

Сообщение Vov123 »

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

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

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

Или загляни в соседнюю ветку по кнопкам, там есть примеры.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

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

while(1)
{
   if (PORTA != KEY_OFF && PORTA != lastState)
    {
         lastState = PORTA;
         doSomething();
    }
   else lastState = PORTA;
}
Последний раз редактировалось unalex Ср мар 13, 2013 12:55:26, всего редактировалось 1 раз.
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
Valiullin.Amir
Родился
Сообщения: 5
Зарегистрирован: Ср мар 13, 2013 08:41:58

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

Сообщение Valiullin.Amir »

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

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

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

Неудачный код.
Во первых. Есть комбинация условий, при которых PORTA не сохранится в lastState, а это значит, что есть вероятность пропустить изменение порта.
Во вторых. Между if(PORTA != lastState) и lastState = PORTA; состояние порта может измениться. Хоть это и кажется невероятным, но вероятность имеется. А значит, как и в первом случае, есть вероятность пропустить изменение.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

Valiullin.Amir писал(а):KEY_OFF - это флаг ?


KEY_OFF - это состояние когда кнопки не нажаты(я просто не знаю какой логический уровень они выдают при нажатии)

немного сократил код

логика та же
если любая кнопка нажата и состояние изменилось - сохраняем новое состояние и делаем что хотим
иначе сбрасываем сохраненное состояние
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

Аlex писал(а):Неудачный код.
Во первых. Есть комбинация условий, при которых PORTA не сохранится в lastState, а это значит, что есть вероятность пропустить изменение порта.
Во вторых. Между if(PORTA != lastState) и lastState = PORTA; состояние порта может измениться. Хоть это и кажется невероятным, но вероятность имеется. А значит, как и в первом случае, есть вероятность пропустить изменение порта.


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

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

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

Я уже написал выше где его искать.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

Alex, вас наверное смутило отсутствие антидребезга(я не делал этого, полагая что его сделает автор)
ну а если с антидребезгом, то как-то так

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

while(1)
{
   if (PORTA != KEY_OFF)
   {
      _delay_ms(DEBOUNCE);
      if(PORTA != KEY_OFF && lastState != PORTA)
      {
         lastState = PORTA;
         doSomething();
      }
   }
   else lastState = PORTA;
}


ЗЫ. Не понимаю тех, кто занимается критикой, но сам не может привести нормальный по его мнению код
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Дело не в антидребезге, а в правильности сохранения предыдущего состояния. Даже при использовании задержки, возможен такой момент, что состояние порта/пина может измениться между его опросом и сохранением для следующего опроса. В этом случае будет пропуск изменения. Для кнопки, может это и ерунда, но, не зная что у Вас в голове, осмелюсь предположить, что Вы можете ловить какой-либо сигнал на изменение подобным способом. И в этом случае, подобный алгоритм сыграет с Вами злую шутку, которую тяжело будет отловить.
По этому, не поймите мои посты как критику, а поймите как некую попытку предостеречь от неприятностей.
Я то код могу привести, но в данный момент мы рассматриваем Ваш код, в котором есть небольшие недочёты. Я на них указал, а Вам уже решать как их исправлять и исправлять ли вообще. Если не знаете как это сделать - всегда можете об этом сказать или спросить на форуме. Вам с радостью ответят.

ЗЫ: Я не понимаю тех, кто начинает дуться и вставать на дыбы, когда в ихнем коде находят недостатки. Я бы, наоборот, спасибо сказал. :)
Аватара пользователя
Valiullin.Amir
Родился
Сообщения: 5
Зарегистрирован: Ср мар 13, 2013 08:41:58

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

Сообщение Valiullin.Amir »

ругается на LastState
как будто CVAVR не знает такой команды
undefined symbol 'LastState'
может какую нить библиотеку надо подключить или CVAVR не работает LastState
З.Ы. сейчас подключено
<mega16a.h>
<alcd.h>
<stdio.h>
<delay.h>
Ответить

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