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

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

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

Сообщение WiseLord »

Я бы вообще сделал проще. Вместо малочитабельных сдвигов ради непонятно чего, сделал бы всё побитно.

Возможно, такой код и будет чуть медленнее (а может, и нет, с учётом имеющихся ассемблерных инструкций установки/сброса бита, более быстрых, чем "длинные" сдвиги), но зато его легко модифицировать в случае изменения назначения пинов (скажем, плата оказывается проще при другой конфигурации).

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

#define CONCAT(x,y) x ## y

#define PORT(x)     CONCAT(PORT,x)

#define SET(x)      (PORT(x) |= x ## _LINE)
#define CLR(x)      (PORT(x) &= ~x ## _LINE)

#define D0          C
#define D0_LINE     (1<<1)
#define D1          C
#define D1_LINE     (1<<2)
#define D2          C
#define D2_LINE     (1<<3)
#define D3          C
#define D3_LINE     (1<<4)
#define D4          C
#define D4_LINE     (1<<5)
#define D5          C
#define D5_LINE     (1<<7)
#define D6          B
#define D6_LINE     (1<<6)
#define D7          B
#define D7_LINE     (1<<7)

static void setPort(uint8_t data)
{
    if (data & (1 << 0)) SET(D0); else CLR(D0);
    if (data & (1 << 1)) SET(D1); else CLR(D1);
    if (data & (1 << 2)) SET(D2); else CLR(D2);
    if (data & (1 << 3)) SET(D3); else CLR(D3);
    if (data & (1 << 4)) SET(D4); else CLR(D4);
    if (data & (1 << 5)) SET(D5); else CLR(D5);
    if (data & (1 << 6)) SET(D6); else CLR(D6);
    if (data & (1 << 7)) SET(D7); else CLR(D7);
}
P.S. Если кому интересно, то работает это приблизительно так (порядок операций может быть и чуть другой):
Спойлер1) Исходная строка:

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

if (data & (1 << 0)) SET(D0); else CLR(D0);
2) SET и CLR раскрываются согласно макросам:

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

if (data & (1 << 0)) (PORT(D0) |= D0 ## _LINE); else (PORT(D0) &= ~D0 ## _LINE);
3) Срабатывает препроцессорное "склеивание" строк через ##:

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

if (data & (1 << 0)) (PORT(D0) |= D0_LINE); else (PORT(D0) &= ~D0_LINE);
4) Раскрывается PORT(D0):

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

if (data & (1 << 0)) CONCAT(PORT,D0) |= D0_LINE); else CONCAT(PORT,D0) &= ~D0_LINE);
5) Раскрывается CONCAT(PORT,D0):

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

if (data & (1 << 0)) PORT ## D0 |= D0_LINE); else PORT ## D0 &= ~D0_LINE);
6) Раскрываются D0 и D0_LINE:

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

if (data & (1 << 0)) PORT ## C |= (1<<1); else PORT ## C &= ~(1<<1);
7) Срабатывает препроцессорное "склеивание" строк через ##

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

if (data & (1 << 0)) PORTC |= (1<<1); else PORTC &= ~(1<<1);
Очевидно, что изменить порты на другие очень легко.
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Я уже немного запутался. Смысл понятен. Язык си не очень.

Добавлено after 5 minutes 39 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3786741#p3786741"]х'=х<<1

(х')&(1<<7)[/uquote]
я это вообще не видел. объясни подробнее. в другом виде не знаю. что бы я смысл понял
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

видишь, там сложное действие (раскладывается на несколько более простых)
как и в математике снаыала выполняются действия в скобках
х' я обозначил результат вычисления скобки (так я сделал акцент на то, что в переменную х он не запишется)
просто я попытался пошагово расписать птоцесс вычисления этого выражения
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

А как мне понять?

x&=~(1<<7)

где можно о таких вещах почитать?

вот объясни проще.

x=1111 1111;

x=~(1<<7);
что будет.

работает. а как не пойму :)))
Вложения
ввыв.JPG
(242.36 КБ) 332 скачивания
Последний раз редактировалось mixon46 Пт фев 07, 2020 16:53:52, всего редактировалось 2 раза.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

WiseLord, в понедельник проверю как этот код понимается КВАВр'ом.
может попробовать собрать пары регистр-маска и разом их к портам применять?

Добавлено after 8 minutes 49 seconds:
mixon46, https://radiokot.ru/forum/viewtopic.php?f=57&t=168374 тут в конйе точно с такимже вопросом...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Почему я ставлю например переменную
B=0b1111 1111;

потом:

B=(1<<7)

все биты обнулятся кроме 7 бита. вне зависимости от того B=0 или B=255
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

(1<<7) это вариант записи числа 0b10000000 (1 сдвинута на 7 позиций влево)

Добавлено after 2 minutes 45 seconds:
я бы отправил тебя читать учебник т.к. это основы...
но, к сожалению я не помню в каком это написано более доходчиво
если до понедельника не разберёшься - обращайся, найду, укажу...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

Ай да прав. Теперь до меня дошло. Вот тупень. & дают 1 и 1 = 1. Теперь ясно. Вот причина :facepalm:.


Я разобрался. Смодулировал ситуацию в CodeVishion и все получилось. И все действия на бумаге просчитал. Все сошлось. Но самому что то подобное составить это нужно огромный опыт иметь.

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

while (1)
      { b<<=1;
        b&=~(1<<7);
        b|=(b<<1)&(1<<7);
        while (c=1,c++) 
        {
        x=b;
        delay_ms (100);
        PORTB=x&((1<<7)|(1<<6));
        x=x<<1;
        x&=~(1<<7);
        x|=(x<<1)&(1<<7);
        PORTD=x&((1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1)); 
        }
          }
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

а все это случайно не для того, чтобы раскидать по разным портам байты, выводимые при динамиеской индикации на индикаторы?
просто в этом случае можно применить еще и перестановку битов в самих байтах... и в итоге получить заметный выигрыш в сдвигах и т.п.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

в исходном задании было
PORT=x&((1<<7)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1));
а тут
PORT=x&((1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<1));
для этого варианта действия
x&=~(1<<7);
x|=(x<<1)&(1<<7);
не требуются.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

В прерывании должна быть переменная. Каждое прерывание переписывает ее. Переменная используется в главной функции main. Как ее нужно объявить и где.

Я объявил ее до прерывания и до главой функции. Но не как flash
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

По уму переменная должна быть volatile, но вашему CVAVR на это пофиг... Во всяком случае, раньше было пофиг...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

объявляй переменную до описания прерываний, тогда она будет видна во всём коде
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

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

Сообщение mixon46 »

как выйти из прерывания?
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

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

Сообщение afz »

На Си? То есть из программы ISR(<вектор>) ? Обычным return'ом. Или простым окончанием программы - по последней замыкающей фигурной скобке - ISR(<вектор>){ ... } - вот этой. Си прячет особенности программы обслуживания прерываний и делает ее для нас, как функцию без параметров и без возвращаемого значения. Ну, и нормальные функции вызываются явным вызовом, а эта вызывается каким-то аппаратным сигналом.

Связь с остальным хозяйством предполагается через общие переменные - те, которые объявлены вне (до) любой из функций.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
gogaze
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Пн янв 09, 2017 06:50:37
Откуда: Приморье

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

Сообщение gogaze »

Давненько не пользовался CVAVR, и вот недавно выскочил такой глюк - из папки BIN стал пропадать файл avrasm2.exe, вернее сначала при сборке проекта, сборке файлов проекта вылетала ошибка, типа нет файла avrasm2.exe. Помогала повторная установка в режиме восстановления, файл появлялся, но через несколько нажатий на кнопки компиляции, сборки файл на глазах исчезал. Проверка компа на вирусы и прочую гадость ничего не дала. Пока решил проблему так: присвоил avrasm2.exe атрибут "системный". Вроде пока работает и не пропадает, но хотелось бы понять причину такого глюка. Версия CVAVR 3.12 + лекарство.
Мир не без добрых людей!
oks223
Родился
Сообщения: 1
Зарегистрирован: Пт апр 10, 2020 16:16:40

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

Сообщение oks223 »

Здравствуйте. Может ли кто помочь с написанием кода в CVAVR? Есть готовый код, просто правильно записать туда, а сама не понимаю
Если кто-то сможет помочь, напишите, пожалуйста, в лс
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Написал в ЛС.
Аватара пользователя
dibor
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Чт авг 27, 2020 13:15:49

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

Сообщение dibor »

Добрый день.
Решил обратится за помощью, так как сам в С -1(т.е. меньше нуля) да и еще наверное стар и туп :(
Не могу придумать алгоритм "вытаскивания" определенной последовательности символов/знаков из принимаемых по UART данных.
Последовательность которая мне нужна имеет вид двух букв и 11 цифр типа IF00144000000.
Сделал несколько вариантов поиска внутри обработчика прерываний UART, но все равно иногда проскакивают "левые" значения.
Может кто то занимался подобным, прошу откликнутся.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

може тктото и занимался, если делал то-же, что и вы... то он наверно и данные принимал так-же, и хранил их так-же, и правила выбора нужных данных у него были один в один... может это даже был я... только отсутствие экстрасенсорных способностей не даёт мне возможности узнать это :(
а кодевижен хороший и в твоих проблемах не виноват :)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ответить

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