Санечка, с первого раза в голове каша, нужно пару раз пересмотреть и всё уляжется. А всё потому что суть в уроке изложена, просто начинающим как я это тяжело в память мозга как ячейку загрузить. Считаю, что получилось, спасибо за Труд!
Здравствуйте Александр . Я очень благодарный вам за ваши уроки они мне очень помогают в осваиваний МК так как я занимаюсь ими только пол года . Уже пробовал писать разные программки но хотелось сделать что то полезное .Хочу сделать цифровой двух канальный вольтметре. Но тут есть тонкость с настройкой АЦП, конечно в CodeVisionAVR это проще настроить чем в Atmel Studio ,но хотелось бы научится в Atmel Studio . Хочу вас попросить сделать урок по АЦП если можно? (по возможности еще может о ЛСД символьном расскажите)
Здравствуйте,а можно вас попросить выложить код сюда во вложение,побаловаться с ним,его можно сделать понятным для ребенка,чтобы он менял цыфры битов и врубился что к чему?
Обращение к памяти, загрузка операнда в АЛУ, выполнение операции, выгрузка в память. Что в случае с переменной, что в случае с адресом количество шагов одинаковое. Только ассемблерные команды отличаются. Ссылки нужны для экономии памяти. При передаче значения в функцию по ссылке переменная остается на своем месте, и новая память под нее не выделяется. Если разименовать ссылку т.е. записать &(*XX)++; (вместо *XX = 1 + *XX), то инкрементируется переменная.
Спасибо, освежил теорию, и попробовал на практике мультиплексоры. Не понятен такой момент: зачем каждый раз в векторе таймера записывать адреса в указатели, при инициализации 1 раза не достаточно?
Данный модуль можно использовать только на вход? или на выход тоже? Если нельзя, то как сделать аналогично, только на вход и выход, т.е. другими словами замкнуть другую группу контактов. Для данной задачи по идее можно взять переключатель (механический), но мне не нравится, что будет дребезг контактов. Мне нужно соединить контроллер интерфейса с двумя приемопередатчиками. Только вот как сделать пока не могу разобраться
Спасибо за урок! С мультиплекторами хоть давно разобрался, но всёравно интерестно было посмотреть. И да, спасибо огромное что так подробно расказали про указатели. Я сними имел дело но таких подробностей не знал) И один вопрос: для чего команда "volatile" и что она делаем?
"Итак, volatile в языке Си - это квалификатор переменной, говорящий компилятору, что значение переменной может быть изменено в любой момент и что часть кода, которая производит над этой переменной какие-то действия (чтение или запись), не должна быть оптимизирована."
Я помню немного С++. Помойму команда *CC++ не работает потому что у разыменования меньший приоритет. Получается *(СС++) сначала мы производим увеличение указателя, а потом его разыменовываем. Нужно както так (*CC)++; Хотя я могу и ошибаться =)
Я поместил вашу программу в Протеус у меня на микросхеме мультиплексора шине адресов A,B,C порты A5 ,A6 ,A7 постоянно висит логическая 1 . Если ваша программа не полная пожалуйста скажите чтобы я не тратил своё время.
Вот текст программы может я где то ошибся посмотрите пожалуйста - #include #include #define Ind_Port PORTA unsigned char Kanal_1,Da1,No1; unsigned char *XX,*CC; vxod (volatile unsigned char s) { volatile unsigned char A; switch (s) { case 0: Ind_Port|=0b10100000;A=0; break; //вход1 case 1: Ind_Port|=0b11100000;A=0; break; //вход2 case 2: Ind_Port|=0b01100000;A=0; break; //вход3 case 3: Ind_Port|=0b00100000;A=0; break; //вход4 case 4: Ind_Port|=0b01000000;A=0; break; //вход5 case 5: Ind_Port|=0b10000000;A=0; break; //вход6 case 6: Ind_Port|=0b00000000;A=0; break; //вход7 case 7: Ind_Port|=0b11000000;A=0; break; //вход8 case 8: Ind_Port|=0b10100000;A=1; break; //вход9 case 9: Ind_Port|=0b11100000;A=1; break; //вход10 case 10: Ind_Port|=0b01100000;A=1; break; //вход11 case 11: Ind_Port|=0b00100000;A=1; break; //вход12 case 12: Ind_Port|=0b01000000;A=1; break; //вход13 case 13: Ind_Port|=0b10000000;A=1; break; //вход14 case 14: Ind_Port|=0b00000000;A=1; break; //вход15 case 15: Ind_Port|=0b11000000;A=1; break; //вход16 default: return; } if (PINA& (1
Здравствуйте Александр У меня такой вот вопрос у меня ATmega 16 задаю порту (С ) работать на выход (DDRC = 0b11111111; ) и неработает (PINC2, PINC3, PINC4, PINC5) А нулевой ,первый, шестой, седьмой работают без проблем подскожите пожалуйста вчем можыт быть проблема ,
Данные порты предназначены для JTAG изначально вам не доступны. Их конечно можно перевести в нормальное использование но для этого нужно програматором все устанавливать.
Большое спасибо что ответили мне а можите подскозать как устанавливать и каким ппрогроматором Спасибо вам за ваши уроки очень интересно ,понятно обьясняите
Как с Вами связаться? Нужен маленький совет!! Мне надо посчитать количество включенных кнопок и вывести их сумму на семисегментник. Надо чтобы оно считало вне зависимости от номера кнопки. Например: нажата 1-я и 4-я кнопки - на семисегментнике число 2, или же - нажата 5 и 6 кнопки, но количество все равно два! Помогите пожалуйста с данным вопросом. Очень нужно!
Смотри состояние входов от кнопок по очереди, если нажата то добавляй в переменную единичку, нашел еще кнопку нажатую, добавляй еще. Потом выводи результат на дисплей и так по кругу.
Вот не знаю почему было сказано что при работе с переменными выполняется +1 лишняя команда, когда всё совсем наоборот вышло, проверил на этом сайте, который преобразовывает код С++ в asm (godbolt.org/) Может имелось ввиду время доступа, что через указатель быстрее, не знаю
У меня есть готовый проект с данными светодиодными матрицами. Размер всего поля 80 X 80 см. Делалось для магазина, для показа рекламы. Только данный проект, уж точно не для начинающих. Хотя за идею спасибо, надо будет подумать.
Досмотрел до строки 67, дальше можно не смотреть. Не забудьте в комментарии к define приписать, что при смене порта, необходимо сменить на 67 строке соответствующий DDRx.
"... У СВОИХ РАБОЧИХ ..." ??? с какого перепугу они ТВОИ ???? не задумывался никогда над этим ???? нелогично получается : знания раздаёшь как альтруист , а рабочих держишь как эгоист ....!!!!
Спасибо за ваш труд. Только сделайте либо фоновую музыку тише, либо микрофон громче. Спасибо.
Александр Николаевич благодарим Вас за ваш труд
Просто, наглядно, понятно. Спасибо большое.
Санечка, с первого раза в голове каша, нужно пару раз пересмотреть и всё уляжется. А всё потому что суть в уроке изложена, просто начинающим как я это тяжело в память мозга как ячейку загрузить. Считаю, что получилось, спасибо за Труд!
Александр, Большое спасибо!
Хорошая идея для начинающих! Только стоит подправить, что это не мультиплексор, а демультиплексор (дешифратор).
Молодец Автор! зачетно!
Спасибо вам большое ваши примеры помогли понять как программировать микроконтроллеров, можете сделать
пример для работы по RS485 протоколу
Хорошо получилось.Спасибо,молодца!
Здравствуйте Александр . Я очень благодарный вам за ваши уроки они мне очень помогают в осваиваний МК так как я занимаюсь ими только пол года . Уже пробовал писать разные программки но хотелось сделать что то полезное .Хочу сделать цифровой двух канальный вольтметре. Но тут есть тонкость с настройкой АЦП, конечно в CodeVisionAVR это проще настроить чем в Atmel Studio ,но хотелось бы научится в Atmel Studio . Хочу вас попросить сделать урок по АЦП если можно? (по возможности еще может о ЛСД символьном расскажите)
Здравствуйте,а можно вас попросить выложить код сюда во вложение,побаловаться с ним,его можно сделать понятным для ребенка,чтобы он менял цыфры битов и врубился что к чему?
с наступающим Вас!
У этой темы есть развитие/продолжение?
Допустим нужно увеличить количество портов до сотни?
Вот вроде видео про расширение портов, а на деле какие-то этюды программирования по экономии команд.
У автора в самого каша.
Обращение к памяти, загрузка операнда в АЛУ, выполнение операции, выгрузка в память. Что в случае с переменной, что в случае с адресом количество шагов одинаковое. Только ассемблерные команды отличаются.
Ссылки нужны для экономии памяти. При передаче значения в функцию по ссылке переменная остается на своем месте, и новая память под нее не выделяется.
Если разименовать ссылку т.е. записать &(*XX)++; (вместо *XX = 1 + *XX), то инкрементируется переменная.
Спасибо большое
Большое спасибо. Скажите, а ничего страшного, если использовать один вход "А" для двух микросхем, а для переключения пользоваться INH?
Это хорошо если использовать много микросхем 4051. А а место 4051 можно использовать 595 тый? В чем разница у них. У 595 два входа только и 8 выходов
А расскажите еще про блуждающий указатель
Спасибо!
можно ли этот вариант применить для включение релюшек и клапанов? будут ли корректно работать.
Конечно. Я для производства цилиндрами ( пневмо и гидро ) так управляю.
все понятно, пошел повторять
Спасибо, освежил теорию, и попробовал на практике мультиплексоры. Не понятен такой момент: зачем каждый раз в векторе таймера записывать адреса в указатели, при инициализации 1 раза не достаточно?
В данной программе номера портов каждый рас разные, поэтому и указатель постоянно считывает новые данные. Это если я вас правильно понял.
Еще такой момент любопытен: вы расширяли порты для 100 датчиков, switch блок будет толстым. Может проще функцию сделать?
Тут волен каждый сам решать, как ему лутче. Я в зависимости от проекта также выбираю разные варианты.
Данный модуль можно использовать только на вход? или на выход тоже? Если нельзя, то как сделать аналогично, только на вход и выход, т.е. другими словами замкнуть другую группу контактов. Для данной задачи по идее можно взять переключатель (механический), но мне не нравится, что будет дребезг контактов. Мне нужно соединить контроллер интерфейса с двумя приемопередатчиками. Только вот как сделать пока не могу разобраться
+Nik RU42 Мультиплексор работает как на вход так и на выход. Можно на выход поставить сдвиговой регистр.
Спасибо за урок! С мультиплекторами хоть давно разобрался, но всёравно интерестно было посмотреть.
И да, спасибо огромное что так подробно расказали про указатели. Я сними имел дело но таких подробностей не знал)
И один вопрос: для чего команда "volatile" и что она делаем?
"Итак, volatile в языке Си - это квалификатор переменной, говорящий компилятору, что значение переменной может быть изменено в любой момент и что часть кода, которая производит над этой переменной какие-то действия (чтение или запись), не должна быть оптимизирована."
Я помню немного С++. Помойму команда *CC++ не работает потому что у разыменования меньший приоритет. Получается *(СС++) сначала мы производим увеличение указателя, а потом его разыменовываем. Нужно както так (*CC)++; Хотя я могу и ошибаться =)
Работает и так СС++ увеличет содержимое указателя на 1
помогите разобратся с таким вопросом
пишу вот такую програмку
#include
int main(void)
{
DDRB &=~(1
В режиме симуляции pin настроенные на вход, не знаю почему, но нужно выставлять в ручную самому. Меняя состояние на порте на пине не меняется.
Я поместил вашу программу в Протеус у меня на микросхеме мультиплексора шине адресов A,B,C порты A5 ,A6 ,A7 постоянно висит логическая 1 . Если ваша программа не полная пожалуйста скажите чтобы я не тратил своё время.
Программа полная и рабочая. Насчет протеуса не зная, я в ней не когда не работал, работаю через отладчик на реальном железе.
У вас частота процессора 8 мгц . и Атмега 16 ? Генератор внешний ? Какие ноги на проце задействованы кроме 5 портов A ?
Не вспомнить уже по доменному проекту нечего, давно это было
Вот текст программы может я где то ошибся посмотрите пожалуйста -
#include
#include
#define Ind_Port PORTA
unsigned char Kanal_1,Da1,No1;
unsigned char *XX,*CC;
vxod (volatile unsigned char s)
{
volatile unsigned char A;
switch (s)
{
case 0: Ind_Port|=0b10100000;A=0; break; //вход1
case 1: Ind_Port|=0b11100000;A=0; break; //вход2
case 2: Ind_Port|=0b01100000;A=0; break; //вход3
case 3: Ind_Port|=0b00100000;A=0; break; //вход4
case 4: Ind_Port|=0b01000000;A=0; break; //вход5
case 5: Ind_Port|=0b10000000;A=0; break; //вход6
case 6: Ind_Port|=0b00000000;A=0; break; //вход7
case 7: Ind_Port|=0b11000000;A=0; break; //вход8
case 8: Ind_Port|=0b10100000;A=1; break; //вход9
case 9: Ind_Port|=0b11100000;A=1; break; //вход10
case 10: Ind_Port|=0b01100000;A=1; break; //вход11
case 11: Ind_Port|=0b00100000;A=1; break; //вход12
case 12: Ind_Port|=0b01000000;A=1; break; //вход13
case 13: Ind_Port|=0b10000000;A=1; break; //вход14
case 14: Ind_Port|=0b00000000;A=1; break; //вход15
case 15: Ind_Port|=0b11000000;A=1; break; //вход16
default: return;
}
if (PINA& (1
Для тех, кто привык к старой элементной базе и кому лень гуглить SD4051 это К561КП2
кто нибудь не подскажет как на codevision все это написать?
У меня вопрос вы указали в программе порты - A0 , A1 . а как же - A5, A6, A7 ? Как будет меняться код на шине адреса ( A,B,C,) микросхем ?
Это в прерывании вы задали код -
Ind_Port=0;
DDRC|=(1
Давно это было ). Не влияет на данные вывода
Не понял вас , Вы задавали код на шине адреса всё время одинаковый 000 ?
Извиняюсь я не правильно дал ответ. Та я вроде все наглядно показал 1:01
Видел , но в вашей программе я не понял каким образом меняется код на шине адресов . Порты A5,A6A7 .
Здравствуйте Александр
У меня такой вот вопрос
у меня ATmega 16 задаю порту (С ) работать на выход (DDRC = 0b11111111; ) и неработает (PINC2, PINC3, PINC4, PINC5)
А нулевой ,первый, шестой, седьмой работают без проблем подскожите пожалуйста вчем можыт быть проблема ,
Данные порты предназначены для JTAG изначально вам не доступны. Их конечно можно перевести в нормальное использование но для этого нужно програматором все устанавливать.
Большое спасибо что ответили мне
а можите подскозать как устанавливать и каким ппрогроматором
Спасибо вам за ваши уроки очень интересно ,понятно обьясняите
Я пользуюсь AVRDragon, но потом проблемонтичьно все вернуть на место. Нужно много проводов припаивать и т.д.
спасибо что ответили
А еще можно так записать: *CC += 1; или даже так (*CC)++;
Как с Вами связаться? Нужен маленький совет!!
Мне надо посчитать количество включенных кнопок и вывести их сумму на семисегментник. Надо чтобы оно считало вне зависимости от номера кнопки. Например: нажата 1-я и 4-я кнопки - на семисегментнике число 2, или же - нажата 5 и 6 кнопки, но количество все равно два! Помогите пожалуйста с данным вопросом. Очень нужно!
Смотри состояние входов от кнопок по очереди, если нажата то добавляй в переменную единичку, нашел еще кнопку нажатую, добавляй еще. Потом выводи результат на дисплей и так по кругу.
Дякую за урок! А дана мікросхема розширює порти лише як входи чи і як виходи? Дякую!
Нет, для портов здвиговые регистры нужны
Вот не знаю почему было сказано что при работе с переменными выполняется +1 лишняя команда, когда всё совсем наоборот вышло, проверил на этом сайте, который преобразовывает код С++ в asm (godbolt.org/)
Может имелось ввиду время доступа, что через указатель быстрее, не знаю
приведите код на ассмеблере. ваша страница не доступна
Александр можите вы зделать видео урок, как надо прогамировать лед матрицу. Ну например как в етом видео: Opel Astra Electronic Gear Indicator
У меня есть готовый проект с данными светодиодными матрицами. Размер всего поля 80 X 80 см. Делалось для магазина, для показа рекламы. Только данный проект, уж точно не для начинающих. Хотя за идею спасибо, надо будет подумать.
Музыку бы убрать фоновую
Досмотрел до строки 67, дальше можно не смотреть. Не забудьте в комментарии к define приписать, что при смене порта, необходимо сменить на 67 строке соответствующий DDRx.
Все то оно да, а всетаки где обещанное для начинающих??
Увы, но под всех я не могу подстроится.
@@АлександрПисанец понял, спасибо)
Ужас какой то))) И вы говорите что это для начинающих???????
Ужас это когда самому пытаться разобраться
Это точно .
Это делал с помощью кодера.
Ужасно получилось.)))) но принцы подключения мультиплексора был полезен.
не SD4051, а CD4051
Спасибо, исправил.
Александр Писанец Спасибо вам за ваши труды. С удовольствием смотрю.
"... У СВОИХ РАБОЧИХ ..." ???
с какого перепугу они ТВОИ ????
не задумывался никогда над этим ????
нелогично получается :
знания раздаёшь как альтруист , а рабочих держишь как эгоист ....!!!!
Людям надо давать инфо пошагово а не прыгать с 1го на 8ое а потом на 3е .так народ ничему тольком не научишь . Ставлю палец вниз
Людям надо давать инфо пошагово а не прыгать с 1го на 8ое а потом на 3е .так народ ничему тольком не научишь . Ставлю палец вниз