Alex 611 Posted July 20, 2014 А на что будет реагировать, если Вы char i=PIND;// читаем portD i=(~i)&0x0F;// в i - число заданное нажатыми кнопками убрали из основного цикла ? Quote Go to top Share this post Link to post Share on other sites
Adver 220 PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН (Экспресс изготовление за 24 часа!) Сборка высококачественных печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет Онлайн просмотрщик Gerber-файлов от PCBWay! Мы принимаем формат Sprint-Layout 6! Экспорт в Gerber из Sprint-Layout 6. Студенческое спонсорство
Тверской 2 Posted July 20, 2014 (edited) да,уже эту часть доработал while (1) { char i=PIND;// читаем portD i=(~i)&0x0F;// в i - число заданное нажатыми кнопками так сделал, теперь надо с цифрами в FOR разобраться чтоб повторял столько сколько в переменной храниться, а то всё наоборот выходит Edited July 20, 2014 by Тверской Quote Go to top Share this post Link to post Share on other sites
Adver 220 Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$! Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики! Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...
COKPOWEHEU 276 Posted July 20, 2014 Так замените инкремент на декремент. Вместо for(i=i;i<15;i++) можно написать for(j=0;j<i;j++) или проще for(;i>0;i--) Quote Go to top Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Share this post Link to post Share on other sites
Adver 220 Безмостовые ККМ для 99% КПД! Схема коррекции коэффициента мощности (ККМ) на основе так называемого «тотемного столба» (Totem Pole) обладает минимально возможными потерями и потенциально может обеспечить самые жесткие требования к энергоэффективности источников питания. Компания Wolfspeed представляет референсную разработку – плату ККМ CRD-02AD065N на базе собственных карбид-кремниевых MOSFET и диодов с наилучшими в отрасли характеристиками. Подробнее
Тверской 2 Posted July 21, 2014 (edited) И снова всем здравствуйте Спустя неделю и изучив ваши советы, я разродился нижеприведённым кодом) //стенд проверки АР и Л.С. //tiny2313 //Тверь,Медведев Евгений #define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h> void preset() //установка работы портов B и D { DDRB = 0xFF; //порт B работает на выход PORTB = 0xFF; //на выходе порта B везде 1 DDRD= 0x00; //порт D работает на вход PORTD = 0xFF; // подтяжка резисторами } char i; //задаём переменную в которой будет содержатся число извещателей в л.с. unsigned int v; //задаём переменную в которой будет содержатся оставшееся время питания до имп. сброса int main(void) { preset();// установили работу портов В и D while (1) //зацикливаем выполнение программы { char i=PIND;// считываем с порта D заданное кол-во изв-ей в л.с. i=(~i)&0x0F;// записываем это значение в переменную i while ((PIND==0x7F)) //пока не нажаты кнопки { //то формируем импульс сброса и подаём питание в л.с. { PORTB = 0x00; // отключаем сигнал _delay_ms(16); //формируем импульс сброса PORTB = 0xff; // подключаем сигнал _delay_ms(1264); // питание в л.с. } } // если нажата хоть одна кнопка, то формируем импульс сброса { PORTB = 0x00; // отключаем сигнал _delay_ms(16); //формируем импульс сброса // считываем с переменной кол-во извещателей for (i=i; i>0; i--)// столько же раз подаём в л.с. адресные импульсы { if ((~PIND)&(1 << 4))//PIND=(0x01&(PIND>>4)) { PORTB = 0xFF; // подключаем сигнал _delay_ms(9); // время работы извещателя до имп.квит. PORTB = 0x00; // начало формиров.имп.квит. _delay_us(500); //формируем имп.квит. PORTB = 0xFF; // подключаем сигнал _delay_ms(6.5); //формируем 2-ю половину работы изв. PORTB = 0x00; // отключаем сигнал _delay_us(250); //формируем адресный импульс } else { PORTB = 0xFF; // подключаем сигнал _delay_ms(16); // время работы извещателя PORTB = 0x00; // начало адр.импульса _delay_us(250); //формируем адр.импульс } } } // по окончанию импульсов подключаем питание PORTB = 0xff; // подключаем сигнал v =(1250-16-(i*16.25)+0.25);//вычитаю из общей длины-импульс сброса-кол-во изв-й * на время работы одного изв-ля + адресная задержка последнего извещателя _delay_ms(v); // оставшееся время до прихода нового импульса сброса } чтобы получить то что я хотел изначально мне осталось отладить последние 2 строки. Беда в том что delay (насколько информировали меня различные источники) не может быть дробной цифрой а у меня как раз дробная выходит. Как можно ещё задержать сигнал на дробное число миллисекунд? P.S. за v =(1250-16-(i*16.25)+0.25) прошу неругать,написал чтобы незабыть) На всякий случай прикрепляю схему в шпротеусе. shema.rar Edited July 21, 2014 by Тверской Quote Go to top Share this post Link to post Share on other sites
Adver 220 Гибридные IGBT - сила Si и SiC в одном корпусе! Компания Infineon представила новые гибридные IGBT-транзисторы на 650 В, которые сочетают в себе преимущества технологий TRENCHSTOP и CoolSiC. Использование SiC-диода Шоттки позволяет значительно расширить возможности IGBT и снизить уровень энергии, необходимой для включения транзистора (Eon), а также уменьшить потери на переключение. Подробнее
Alex 611 Posted July 21, 2014 Ещё существует delay_us - задержка в микросекундах. Но, скорее всего, аргументом должна быть константа. ЗЫ: Советую изучить таймеры. Quote Go to top Share this post Link to post Share on other sites
Adver 235 Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021) Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе. Подробнее
COKPOWEHEU 276 Posted July 21, 2014 Использовать не милли- а микросекунды, например. _delay_us(); if ((~PIND)&(1 << 4))Довольно оригинальное решение. Чаще пишут if(!(PIND & (1<<PD4))), но по сути оба варианта верны.char i=PIND;// считываем с порта D заданное кол-во изв-ей в л.с.i=(~i)&0x0F;// записываем это значение в переменную i while ((PIND==0x7F)) А в чем сакральный смысл такой конструкции? Допустим, кнопки не нажаты; считываем/обрабатываем их, получаем i=0; выжидаем, пока хоть одну кнопку на нажмут (причем на PD7 в это время обязательно должен быть лог.0), дальше продолжаем выполнение алгоритма.P.S. за v =(1250-16-(i*16.25)+0.25) прошу неругать,написал чтобы незабыть)Раз уж времянка - фиг с ней, неоптимальностью. Для надежности сделайте явное приведение типов.Беда в том что delay не может быть дробной цифройОбъявлен он как _delay_ms(double). Беда в том, что он предпочитает принимать константы, а не переменные. Quote Go to top Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Share this post Link to post Share on other sites
Тверской 2 Posted July 21, 2014 (edited) смысл той конструкции в том что при ненажатых кнопках на выходе не чистая 1 а с импульсом сброса в 16мс. Конешно оптимизировать наверно ещё что-то можно, но я делал по порядку как представляю, чтоб понятно было. с мс на мкс переделать непроблема, но вопрос в том что в delay незаписать переменную так и останется. Вот думаю может через что-то повторять delay_us (250), цифра кратная всем нужным интервалам, переделаю формулу и буду её повторять столько сколько надо. Что скажете? Edited July 21, 2014 by Тверской Quote Go to top Share this post Link to post Share on other sites
COKPOWEHEU 276 Posted July 22, 2014 Вполне возможный вариант. А на аппаратном таймере не пробовали считать время? Quote Go to top Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Share this post Link to post Share on other sites
BerZerKku 1 Posted July 22, 2014 (edited) unsigned int v; v = (1250 - 16 - (i*16.25) + 0.25);; Данная переменная уже не будет содержать дробной части, т.е. количество миллисекунд всегда будет целое. Если лень разбираться с аппаратными возможностями МК, дробные интервалы можно задавать с помощью меньшей задержки в цикле (при этом надо учесть что цикл вносит доп.задержку). Например, 1.5мс можно получить используя задержку в 100мк: void delay100us(int t) { while(t > 0) { _delay_us(100); t--; } } delay100us(15); // задержка в 1.5мс Опа, не внимательно прочитал пост Тверской и написал кучу лишних буков: вы творец своей программы, конечно можно. Edited July 22, 2014 by BerZerKku Quote Go to top Share this post Link to post Share on other sites
Тверской 2 Posted July 22, 2014 с таймерами ещё не общался, не приходилось,если выхода иного не найду, то начну их изучать) Quote Go to top Share this post Link to post Share on other sites
Тверской 2 Posted July 30, 2014 Данная переменная уже не будет содержать дробной части Почему небудет? а куда же она денется? Quote Go to top Share this post Link to post Share on other sites
Syltetooy 8 Posted July 30, 2014 Потому что INT, число округлиться вверх до ближайцего целого числа. 3.7 --> 4, так же как 3.1 -- 4. Quote Go to top Share this post Link to post Share on other sites
COKPOWEHEU 276 Posted July 30, 2014 (edited) Только не вверх, а вниз. Просто обрезание дробной части. В Вашем случае что из 3.7, что из 3.1 получится 4. Упс, только что сказал одно, а пример привел обратный. Конечно, 3. Edited July 31, 2014 by COKPOWEHEU Quote Go to top Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Share this post Link to post Share on other sites
Syltetooy 8 Posted July 30, 2014 В Вашем случае что из 3.7, что из 3.1 получится 4. Тогда уж 3 Quote Go to top Share this post Link to post Share on other sites
COKPOWEHEU 276 Posted July 31, 2014 тьфу, точно. Видимо, отвлекся, пока писал :-) Конечно, при переводе из дробного числа в целое, дробная часть просто отбрасывается. Так, из чисел 3.1, 3.7, 3.999, 22/7 получится число 3. Quote Go to top Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Share this post Link to post Share on other sites
Syltetooy 8 Posted July 31, 2014 Интересный факт. 95% интересуется "А что же будет", и только 5% "Почему так, а не иначе", а жаль.. 1 Quote Go to top Share this post Link to post Share on other sites
COKPOWEHEU 276 Posted July 31, 2014 В отличие от науки, в технике этот вопрос часто бесполезен. Какая практическая польза от знания причины выбора размера байта именно в 8 бит? Или выделения всего 4 первычных логических дисков на одном физическом жестком диске (кажется, уже пофиксили, но не уверен)? Или расположения выводов микросхемы именно в таком противоестественном порядке (561ИП2, да и многие другие, например)? Или выбора напряжения осветительной сети именно 220 В? Или от знания, почему электрон считается отрицательной частицей, а не положительной? Или даже почему выбраны именно такие эталоны физических величин (только посмотрите на определение метра)? Хотя когда собственное устройство не работает как надо, как раз с вопроса "почему" и надо начинать. Обычно потом появляется вопрос "Так, вот тут была ошибка, как оно хоть как-то умудрялось работать?!". Quote Go to top Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Share this post Link to post Share on other sites
Syltetooy 8 Posted July 31, 2014 (edited) Имелось ввиду почему именно отрасывается, а не округляется по законам математики (x<0.5;x=0 , x>0.4;x=1), много интересного можно было узнать. Насчет логических разделов зависит от разметки, у mbr (которому винда так сильно симпотизирует) это ограничение все еще есть, хотя уже есть разметка GPT (MAC'овая), и там все нормально, никаких ограничений, но винда туда не ставится, с линуксом получше вроде. Хотя это информация может уже устарела, давно не приходилось системы переставлять А что у метра, что у секунды опредедения не для обычных смертных (а это не наука случаем). Про 220В курс школьной физики, хочешь нехочешь, а узнаешь (тоже больше науки, чем техники). Байт=8бит, может и не нужно, но это историяИТ, а она меня всегда привлекала, так что пошел читать про биты P.S "как оно хоть как-то умудрялось работать?!". "- так это в программирование обычное дело Edited July 31, 2014 by Syltetooy Quote Go to top Share this post Link to post Share on other sites
Тверской 2 Posted August 1, 2014 Потому что INT, число округлиться вверх до ближайцего целого числа. 3.7 --> 4, так же как 3.1 -- 4. значит мне нужен тип данных float ? Quote Go to top Share this post Link to post Share on other sites
Alex 611 Posted August 1, 2014 Согласен с Syltetooy. Ибо, если бы человек интересовался именно вопросом "Почему так, а не иначе", он бы не задавал подобных вопросов : значит мне нужен тип данных float ? Начало изучения языка всегда должно быть с изучения типов переменных. Тверской, какой тип нужен именно Вам - решать только Вам. Quote Go to top Share this post Link to post Share on other sites
COKPOWEHEU 276 Posted August 1, 2014 А что у метра, что у секунды опредедения не для обычных смертных (а это не наука случаем).Имелось в виду почему выбрали для единицы длины и времени именно такие величины, а не те, которые воспроизводятся более логичными способами. В смысле, понятия "длина", "время" и правда ближе к науке, а вот выбор конкретного эталона - скорее к технике. Секунда - 9 192 631 770 колебания атома цезия-133! Как будто нельзя было подобрать более круглое число и более распространенный элемент. Согласен, отчасти это обусловлено какими-то объективными соображениями, но по большей части - просто дань традиции.значит мне нужен тип данных float ?В общем случае дробные числа в контроллерах нужны достаточно редко. Ваш это случай или нет - решать Вам."Почему так, а не иначе"А не знаете, это прописано в языке, или зависит от реализации? В смысле существуют ли реализации Си, где преобразование float-int идет в большую сторону или с честным округлением? Quote Go to top Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Share this post Link to post Share on other sites
Syltetooy 8 Posted August 1, 2014 А не знаете, это прописано в языке, или зависит от реализации? В смысле существуют ли реализации Си, где преобразование float-int идет в большую сторону или с честным округлением? Понятия не имею. Пока не встречал, не приходилось настолько в язык углубляться. Но ручками же не трудно реализовать. Quote Go to top Share this post Link to post Share on other sites
Тверской 2 Posted August 7, 2014 (edited) Всем снова здравствуйте ну и по написали вы тут) Перечитав с десяток раз всё выше написанное и вникнув в ваши советы я доразродил свой код до конца и получил то что хотел (ну по крайней мере в протеусе) #define F_CPU 10000000 #include<avr/io.h> #include <util/delay.h> void preset() //установка работы портов B и D { DDRB = 0xFF; //порт B работает на выход PORTB = 0xFF; //на выходе порта B везде 1 DDRD= 0x00; //порт D работает на вход PORTD = 0xFF; // подтяжка резисторами } char i; //задаём переменную в которой будет содержатся число извещателей в л.с. int main(void) { preset();// установили работу портов В и D while (1) //зацикливаем выполнение программы { char i=PIND;// считываем с порта D заданное кол-во изв-ей в л.с. i=(~i)&0x0F;// записываем это значение в переменную i PORTB = 0x00; // отключаем сигнал _delay_ms(16); //формируем импульс сброса // считываем с переменной кол-во извещателей for (i=i; i>0; i--)// столько же раз подаём в л.с. адресные импульсы { if ((~PIND)&(1 << 4))//PIND=(0x01&(PIND>>4)) { PORTB = 0xFF; // подключаем сигнал _delay_ms(9); // время работы извещателя до имп.квит. PORTB = 0x00; // начало формиров.имп.квит. _delay_us(500); //формируем имп.квит. PORTB = 0xFF; // подключаем сигнал _delay_ms(6.5); //формируем 2-ю половину работы изв. PORTB = 0x00; // отключаем сигнал _delay_us(250); //формируем адресный импульс } else { PORTB = 0xFF; // подключаем сигнал _delay_ms(16); // время работы извещателя PORTB = 0x00; // начало адр.импульса _delay_us(250); //формируем адр.импульс } } // по окончанию импульсов подключаем питание PORTB = 0xFF; //делаем задержку питания в зависимости от кол-ва заданных извещателей switch (PIND=(~PIND)&0x0F) { case 1:_delay_ms(1218); break; case 2:_delay_ms(1201.75); break; case 3:_delay_ms(1185.5); break; case 4:_delay_ms(1169.25); break; case 5:_delay_ms(1153); break; case 6:_delay_ms(1136.75); break; case 7:_delay_ms(1120.5); break; case 8:_delay_ms(1104.25); break; case 9:_delay_ms(1088); break; case 10:_delay_ms(1071.75); break; case 11:_delay_ms(1055.5); break; case 12:_delay_ms(1039.25); break; case 13:_delay_ms(1023); break; case 14:_delay_ms(1006.75); break; case 15:_delay_ms(990.5); break; // если кол-во не задано, то задержка = 1234 ms default:_delay_ms(1234); };switch } } нестал я крутить покругу много раз delay чтоб получить определённой длины задержку, а реализовал её с помощью функции switch, хотя с ней тоже пришлось повозиться, во всех описаниях на неё пишут что в круглые скобки ей можно указать переменную,но моя i туда неполезла потому описал её иначе) на следущей неделе буду пробовать заливать прогу в чип, на работе есть stk500 (вставлю ей в свободную панель свой мк и буду прошивать чип) и и avr studio 4, помогите фьюзы правильно выставить) в протеусе они выглядят так непойму вот что, например в протеусе отключен делитель частоты на 8, в фьюзах тогда непосредственно перед заливкой соответствующая галка на этом пункте должна стоять или быть снята? Кварц будет внешний на 10МГц.питание 5 вольт. что за время указывают в ms после 14 СК + сколько то миллисекунд? Edited August 7, 2014 by Тверской Quote Go to top Share this post Link to post Share on other sites
COKPOWEHEU 276 Posted August 7, 2014 непойму вот что, например в протеусе отключен делитель частоты на 8, в фьюзах тогда непосредственно перед заливкой соответствующая галка на этом пункте должна стоять или быть снята?Запрограммированный фуз-бит - выставленный в 0. Как там именно в Вашем прошивальщике все это выглядит - не знаю.что за время указывают в ms после 14 СК + сколько то миллисекунд?Время между запуском кварца и стартом программы. СК - такты кварца. Теоретически сделано для защиты от дребезга питания или чего-то подобного. Для любителей не слишком важно, я выставляю на максимум. Quote Go to top Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Share this post Link to post Share on other sites
Rox 0 Posted November 12, 2015 первое место где за два дня нарыл доходчивую инфу по опросу пина, все после асма и CVavr, видимо не у меня одного нитаз вместо мозга, благодарю за доходчивое описание Quote Go to top Share this post Link to post Share on other sites