Обсуждаем контроллеры компании Atmel.
Пт фев 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. Если кому интересно, то работает это приблизительно так (порядок операций может быть и чуть другой):
Очевидно, что изменить порты на другие очень легко.
Пт фев 07, 2020 16:23:46
Я уже немного запутался. Смысл понятен. Язык си не очень.
Добавлено after 5 minutes 39 seconds:х'=х<<1
(х')&(1<<7)
я это вообще не видел. объясни подробнее. в другом виде не знаю. что бы я смысл понял
Пт фев 07, 2020 16:31:20
видишь, там сложное действие (раскладывается на несколько более простых)
как и в математике снаыала выполняются действия в скобках
х' я обозначил результат вычисления скобки (так я сделал акцент на то, что в переменную х он не запишется)
просто я попытался пошагово расписать птоцесс вычисления этого выражения
Пт фев 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 раз(а).
Пт фев 07, 2020 16:57:07
WiseLord, в понедельник проверю как этот код понимается КВАВр'ом.
может попробовать собрать пары регистр-маска и разом их к портам применять?
Добавлено after 8 minutes 49 seconds:mixon46,
https://radiokot.ru/forum/viewtopic.php?f=57&t=168374 тут в конйе точно с такимже вопросом...
Пт фев 07, 2020 17:04:19
Почему я ставлю например переменную
B=0b1111 1111;
потом:
B=(1<<7)
все биты обнулятся кроме 7 бита. вне зависимости от того B=0 или B=255
Пт фев 07, 2020 17:18:00
(1<<7) это вариант записи числа 0b10000000 (1 сдвинута на 7 позиций влево)
Добавлено after 2 minutes 45 seconds:
я бы отправил тебя читать учебник т.к. это основы...
но, к сожалению я не помню в каком это написано более доходчиво
если до понедельника не разберёшься - обращайся, найду, укажу...
Пт фев 07, 2020 17:18:07
Ай да прав. Теперь до меня дошло. Вот тупень. & дают 1 и 1 = 1. Теперь ясно. Вот причина
.
Я разобрался. Смодулировал ситуацию в 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));
}
}
Пт фев 07, 2020 19:16:14
а все это случайно не для того, чтобы раскидать по разным портам байты, выводимые при динамиеской индикации на индикаторы?
просто в этом случае можно применить еще и перестановку битов в самих байтах... и в итоге получить заметный выигрыш в сдвигах и т.п.
Пт фев 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);
не требуются.
Сб фев 08, 2020 22:24:44
В прерывании должна быть переменная. Каждое прерывание переписывает ее. Переменная используется в главной функции main. Как ее нужно объявить и где.
Я объявил ее до прерывания и до главой функции. Но не как flash
Вс фев 09, 2020 10:43:56
По уму переменная должна быть volatile, но вашему CVAVR на это пофиг... Во всяком случае, раньше было пофиг...
Вс фев 09, 2020 10:54:46
объявляй переменную до описания прерываний, тогда она будет видна во всём коде
Ср фев 12, 2020 23:25:47
как выйти из прерывания?
Пт фев 14, 2020 17:49:48
На Си? То есть из программы ISR(<вектор>) ? Обычным return'ом. Или простым окончанием программы - по последней замыкающей фигурной скобке - ISR(<вектор>){ ... } - вот этой. Си прячет особенности программы обслуживания прерываний и делает ее для нас, как функцию без параметров и без возвращаемого значения. Ну, и нормальные функции вызываются явным вызовом, а эта вызывается каким-то аппаратным сигналом.
Связь с остальным хозяйством предполагается через общие переменные - те, которые объявлены вне (до) любой из функций.
Чт мар 26, 2020 07:26:29
Давненько не пользовался CVAVR, и вот недавно выскочил такой глюк - из папки BIN стал пропадать файл avrasm2.exe, вернее сначала при сборке проекта, сборке файлов проекта вылетала ошибка, типа нет файла avrasm2.exe. Помогала повторная установка в режиме восстановления, файл появлялся, но через несколько нажатий на кнопки компиляции, сборки файл на глазах исчезал. Проверка компа на вирусы и прочую гадость ничего не дала. Пока решил проблему так: присвоил avrasm2.exe атрибут "системный". Вроде пока работает и не пропадает, но хотелось бы понять причину такого глюка. Версия CVAVR 3.12 + лекарство.
Пт апр 10, 2020 16:22:24
Здравствуйте. Может ли кто помочь с написанием кода в CVAVR? Есть готовый код, просто правильно записать туда, а сама не понимаю
Если кто-то сможет помочь, напишите, пожалуйста, в лс
Сб апр 11, 2020 03:42:34
Написал в ЛС.
Чт авг 27, 2020 13:44:42
Добрый день.
Решил обратится за помощью, так как сам в С -1(т.е. меньше нуля) да и еще наверное стар и туп
Не могу придумать алгоритм "вытаскивания" определенной последовательности символов/знаков из принимаемых по UART данных.
Последовательность которая мне нужна имеет вид двух букв и 11 цифр типа IF00144000000.
Сделал несколько вариантов поиска внутри обработчика прерываний UART, но все равно иногда проскакивают "левые" значения.
Может кто то занимался подобным, прошу откликнутся.
Чт авг 27, 2020 16:09:37
може тктото и занимался, если делал то-же, что и вы... то он наверно и данные принимал так-же, и хранил их так-же, и правила выбора нужных данных у него были один в один... может это даже был я... только отсутствие экстрасенсорных способностей не даёт мне возможности узнать это
а кодевижен хороший и в твоих проблемах не виноват
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.