Обсуждаем контроллеры компании Atmel.
Ответить

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

Пт фев 07, 2020 15:44:45

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

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

Код:
#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. Если кому интересно, то работает это приблизительно так (порядок операций может быть и чуть другой):


Очевидно, что изменить порты на другие очень легко.

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

Пт фев 07, 2020 16:23:46

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

Добавлено after 5 minutes 39 seconds:
х'=х<<1

(х')&(1<<7)

я это вообще не видел. объясни подробнее. в другом виде не знаю. что бы я смысл понял

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

Пт фев 07, 2020 16:31:20

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

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

Пт фев 07, 2020 16:47:48

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

x&=~(1<<7)

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

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

x=1111 1111;

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

работает. а как не пойму :)))
Вложения
ввыв.JPG
(242.36 KiB) Скачиваний: 311
Последний раз редактировалось mixon46 Пт фев 07, 2020 16:53:52, всего редактировалось 2 раз(а).

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

Пт фев 07, 2020 16:57:07

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

Добавлено after 8 minutes 49 seconds:
mixon46, https://radiokot.ru/forum/viewtopic.php?f=57&t=168374 тут в конйе точно с такимже вопросом...

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

Пт фев 07, 2020 17:04:19

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

потом:

B=(1<<7)

все биты обнулятся кроме 7 бита. вне зависимости от того B=0 или B=255

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

Пт фев 07, 2020 17:18:00

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

Добавлено after 2 minutes 45 seconds:
я бы отправил тебя читать учебник т.к. это основы...
но, к сожалению я не помню в каком это написано более доходчиво
если до понедельника не разберёшься - обращайся, найду, укажу...

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

Пт фев 07, 2020 17:18:07

Ай да прав. Теперь до меня дошло. Вот тупень. & дают 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));
        }
          }

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

Пт фев 07, 2020 19:16:14

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

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

Пт фев 07, 2020 19:27:55

в исходном задании было
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);
не требуются.

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

Сб фев 08, 2020 22:24:44

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

Я объявил ее до прерывания и до главой функции. Но не как flash

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

Вс фев 09, 2020 10:43:56

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

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

Вс фев 09, 2020 10:54:46

объявляй переменную до описания прерываний, тогда она будет видна во всём коде

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

Ср фев 12, 2020 23:25:47

как выйти из прерывания?

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

Пт фев 14, 2020 17:49:48

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

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

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

Чт мар 26, 2020 07:26:29

Давненько не пользовался CVAVR, и вот недавно выскочил такой глюк - из папки BIN стал пропадать файл avrasm2.exe, вернее сначала при сборке проекта, сборке файлов проекта вылетала ошибка, типа нет файла avrasm2.exe. Помогала повторная установка в режиме восстановления, файл появлялся, но через несколько нажатий на кнопки компиляции, сборки файл на глазах исчезал. Проверка компа на вирусы и прочую гадость ничего не дала. Пока решил проблему так: присвоил avrasm2.exe атрибут "системный". Вроде пока работает и не пропадает, но хотелось бы понять причину такого глюка. Версия CVAVR 3.12 + лекарство.

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

Пт апр 10, 2020 16:22:24

Здравствуйте. Может ли кто помочь с написанием кода в CVAVR? Есть готовый код, просто правильно записать туда, а сама не понимаю
Если кто-то сможет помочь, напишите, пожалуйста, в лс

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

Сб апр 11, 2020 03:42:34

Написал в ЛС.

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

Чт авг 27, 2020 13:44:42

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

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

Чт авг 27, 2020 16:09:37

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