Перейти к содержанию

С нуля Программирование AVR Купил программатор и Контроллер Что дальше...


Рекомендуемые сообщения

17 минут назад, ARV сказал:

90% всех задач, которые интересны начинающим, делаются на delay-ях преотлично

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

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Sergey-Ufa сказал:

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

Вот именно, и совершенно непонятно, почему в книжках нет такой информации. А начинающие учатся как раз по книжкам.

Ссылка на комментарий
Поделиться на другие сайты

Хотелось бы аргументов, а не деклараций: кто и на каком основании назвал плохими привычками делать просто и понятно? Или если алгоритм понятен новичку, гуру обязан назвать его убогим?

2 часа назад, demiurg1978 сказал:

Я ни разу не видел чтобы "гуру" негативно отзывались о программных таймерах.

Зато ни один гуру не пройдет мимо delay(), как мимо тёщина забора... что это значит?

2 часа назад, demiurg1978 сказал:

Лично у меня даже нет таких понятий, как фоновые, не фоновые.

Очень жаль... и вы берётесь поучать других и критиковать чужие подходы?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

delay() хорош только когда код линеен и задержка нужна с точностью +- лапоть, больше нечего делать и не нужна экономия энергии.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, ARV сказал:

Очень жаль... и вы берётесь поучать других и критиковать чужие подходы?

Вы не поняли. О своем подходе в написании проектов я писал неоднократно. Модульность, псевдопараллельность процессов, конечные автоматы. Именно поэтому в моих проектах нет фоновых и нефоновых процессов в принципе.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

18 минут назад, Alexeyslav сказал:

Если бы этот подход работал безупречно, никто бы и слова не сказал.

Этот подход работает безупречно. Проблема в том, что гуры не видят разницы в сложности задач, и традиционно считают, что сложные, но правильные решения, работают всегда лучше, чем простые, но "не правильняе". А это не так: новичкам надо объяснять от простого к сложному, но никак не наоборот. И дело именно в уровне абстракций. В первом классе учат азбуку и цифры, во втором - предложения и арифметику... в десятом - тригонометрию и основы дифисчисления. Именно в таком порядке, потому что сначала подготовка к восприятию нового уровня абстракций, а уж затем сами абстракции.

Даже вождению учат сначала в теории, на стуле, потом на стоянке в авто, а уж потом в движении... Чтобы необходимость таймерной реализации разделения времени была воспринята, необходимо, чтобы на 100% не было проблем с битовыми операциями, приоритетом, логикой ветвления и т.п. основами программирования. Необходимо, чтобы понимание фонового процесса по отношению к основному было уже усвоено на уровне рефлекса. И тогда таймер и прерывание станет естественным продолжением этих абстракций.

А наоборот всегда будет 100 страниц обсуждения без реального продвижения...

10 минут назад, demiurg1978 сказал:

Модульность, псевдопараллельность процессов, конечные автоматы.

Возьметесь начинающему объяснить, что такое конечный автомат? Что такое машина состояний? Или отправите читать литературу? Начинающий в толк взять не может, что такое PORTB |= 1<<6, а вы ему "конечный автомат" суёте! Первокласснику говорят "делить на ноль нельзя" - и точка. Хотя в 10 классе уже говорят - можно, но результат будет бесконечность. А в институте выясняется, что деление бесконечности на бесконечность может давать в результате как 1, так и бесконечность... А еще позже выясняется, что уравнение sin(x) = -2 имеет решение... И  все это подается постепенно, когда мозг готов к этой информации.

Даже если параллельность процессов - хорошо и удобно, не стоит лупить этим фактом по неокрепшим знаниям новичка. 

 

10 минут назад, demiurg1978 сказал:

в моих проектах нет фоновых и нефоновых процессов в принципе

Вы не правы: даже в ваших проектах есть процесс, которым вы сами не управляете (функция main, запускаемая "системой") - это и есть основной процесс, а уж остальные по отношению к нему и друг к другу могут являться как тем, так и другим. Процессы, один из которых порождает другой, всегда будут иметь отношение основной-фоновый.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ARV сказал:

Возьметесь начинающему объяснить, что такое конечный автомат?

Если отбросить всю заумную шелуху, то конечный автомат - Switch-case и индексный переход. Все тупо и просто.

Светильник с веревочкой. Исходное состояние - выключено. Если веревочку не трогают, ничего не происходит. Дернули за веревочку, включили лампочку и установили следующее состояние. В этом состоянии все также, не трогают веревочку - ничего не происходит. Дернули за веревочку, выключили лампочку, установили предыдущее состояние. Источником состояния в этом случае может служить как своя переменная-состояние, так и выход на лампочку.

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

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

20 минут назад, demiurg1978 сказал:

Все тупо и просто.

Угу. Подождем "начинающего" и послушаем его мнение - действительно ли тупо и просто?

21 минуту назад, demiurg1978 сказал:

Проверка условий, флагов, переходы по состояниям.

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

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Ваша морзянка - простейший пример. Задача устройства одна единственная - отправка сообщения, пауза, заново. И там нечего параллелить. Все реализуется простым линейным кодом. Что вы и сделали. Не пример для конечных автоматов.

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

Моя морзянка построена на некошерных делеях. Сделайте кошерно - что вам стоит? А потом объясните, почему у вас лучше.

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Ваше устройство тупое как валенок. Пишется линейным кодом на делеях. По простой причине - целесообразность.

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

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ARV сказал:

<...>Проблема в том, что гуры не видят разницы в сложности задач, и традиционно считают, что сложные, но правильные решения, работают всегда лучше, чем простые, но "не правильняе". А это не так: новичкам надо объяснять от простого к сложному, но никак не наоборот. <...>Именно в таком порядке, потому что сначала подготовка к восприятию нового уровня абстракций, а уж затем сами абстракции.<...>

Спасибо.

Именно об этом, но своими словами я говорил ещё на первой или второй странице.

Собственно, помимо владения программированием, необходимо иметь понятие о дидактике и методике. Без этого процесс сеяния разумного доброго и вечного идёт именно так, как он идёт на любом не педагогическом форуме.

P.S.Для некоторых, особенно для не владеющих собой коллег, который не хотят отвлекаться, но не могут с собой совладать и постоянно отвлекаются - это вообще просто повод для саморекламы и набора количества сообщений.

 

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

Тема на 7 страниц. Что вы сделали в своей программе за это время? Книгу почитали, пробовали по книге? Пробовали, что вам здесь отвечали?

Так что я зашел на эту тему пообщаться с другими участниками. А что делать вам - это ваш выбор. "Флуду быть" или вы начнете что-то делать...

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, demiurg1978 сказал:

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

Ваш подход (псевдопараллельность) постоянно уводит вас в область категоричных заявлений о том, что все иное неприемлемо. А вот я сделал немало проектов с миганием светодиодов, выводом информации на дисплей и опросом кнопок, и практически во всех этих проектах работал с опросом кнопок на делеях. И вы можете ли себе представить: мигало и выводилось все отлично! 

Все это к тому, что, как говорят англичане, "There is more than one way to kill a cat" (есть больше одного способа убить кошку). То есть могут существовать разные решения задачи. И в области программирования эти разные решения могут быть одинаково эффективными. МОГУТ БЫТЬ - понимаете? И при правильном подходе они таковыми и БУДУТ.

Чем плох долгий цикл, если по прерываниям отрабатывают необходимые фоновые процессы? Нет смысла возводить любые принципы в ранг догмы. Но осваивать следует сначала простые.

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

В 18.03.2017 в 08:52, COKPOWEHEU сказал:

<...>заводите глобальный счетчик времени и на каждой итерации увеличиваете. При равенстве этой переменной заданному заполнению канала, выставляете соответствующий вывод в 1, при достижении максимума - в 0.<...>

В чём принципиальная разница между увеличением счётчика и уменьшением?

В аппаратном таймере - понятно. Устроен он так - считает от нуля до числа заложенного в OCRx, или до переполнение OCRx. Я начал не с увеличения, а с уменьшения. Могу наоборот.

Если же основная ваша мысль - то, что можно обойтись одной переменной и для периода и для заполнения - ну так и сделайте её основой сообщения....

Но всё равно - спасибо.)

Буду пробовать.

 

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

PORTD=0xFF;//включаем всё
		
while(T<=260)//период

{						
	if(T==ton0)//сравниваем время PORTD0_on
	PORTD&=0b11111110;//выключаем PORTD0_on
		
	if(T==ton1)//сравниваем время PORTD1_on
	PORTD&=0b11111101;//выключаем PORTD1_on
			
	T++;//считаем период				
}
		
T=T_;//восстанавливаем период

Ну да. Так конечно лучше... И каналы меньше расползаются относительно друг-друга.

Приращение импульса, вообще, в ерунду какую-то превратилось. Смех один...

									// **** кнопка "+" *** //
										
if((!(port_state&0b00000001))&&(260>=(ton0+d0))&&(!r))//если нажат "+" и есть возможность расширения импульса и разрешено изменение

{										     
	ton0=ton0+d0;//увеличиваем время PORTD0_on
	r=1;//запрещаем изменения	
}

 

Изменено пользователем pliss

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, pliss сказал:

В чём принципиальная разница между увеличением счётчика и уменьшением?

ни в чем, я описал принцип формирования ШИМ. Конкретная реализация может быть любая. Можно считать от 0 до TOP (максимальное значение счетчика, проще всего оставить максимальное значение типа - 255 для unsigned char), можно от TOP до 0, можно от 0 до TOP, потом обратно (это называется phase-correct PWM).

1 час назад, pliss сказал:

Ну да. Так конечно лучше... И каналы меньше расползаются относительно друг-друга.

странный какой-то код. Непонятно чем примечательно магическое число 260, где задается время одного такта (чтобы оно не сильно плавало).

Вам ведь советовали разделить на задачи и считать время в ОСНОВНОМ цикле а не каком-то вложенном. Чтобы на КАЖДОМ проходе цикла проверялось равенство с порогами переключения и на КАЖДОМ проходе проверялись кнопки. Пока ваш код генерирует не ШИМ а непонятно что.

Ну и разберитесь наконец с нормальным опросом кнопок: запись if( PINx & 0b00000001 ) хоть синтаксически и верна, куда менее наглядна и более подвержена ошибкам чем if( PINx & (1<<0) ) и тем более if( pin_state & (1<<BTN1) ). Так что осваивайте логические операции, сдвиги, константы и макросы.

 

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Только что, COKPOWEHEU сказал:

странный какой-то код. Непонятно чем примечательно магическое число 260, где задается время одного такта (чтобы оно не сильно плавало).

При данном количестве тактов и данной частоте CPU получается нужная мне частота шим.

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

Тут пока достаточно дефайнов, определить BTN1 = PINx & 0b00000001 и остальные кнопки схожим образом и в дальнейшем оперировать чисто BTN1, видно что и можно заменить одним разом все проверки если надо переместить кнопку на другой пин.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

12 минуты назад, COKPOWEHEU сказал:

Вам ведь советовали разделить на задачи и считать время в ОСНОВНОМ цикле а не каком-то вложенном. Чтобы на КАЖДОМ проходе цикла проверялось равенство с порогами переключения и на КАЖДОМ проходе проверялись кнопки. Пока ваш код генерирует не ШИМ а непонятно что.

Ну, вот я и разделил на задачи - кнопки отдельно, шим - отдельно. На верное, вы имели ввиду совершенно другое разделение, но вы говорите на языке программистов, а я пока ещё на обычном - человеческом, естественно, что чаще всего я вас понимаю не правильно.

Вообще-то, появление отдельного цикла для шим - это для того, чтобы не потеряться в том, что я понаписал...

23 минуты назад, COKPOWEHEU сказал:

запись if( PINx & 0b00000001 ) хоть синтаксически и верна, куда менее наглядна и более подвержена ошибкам чем if( PINx & (1<<0) ) и тем более if( pin_state & (1<<BTN1) ).

А здесь - я вам возражу.

Для меня строка "0b00000001", пока, более наглядна, так как я вижу восемь однотипных ножек микросхемы, одна из которых отличается от других. А здесь "0b00000010" - отличается другая ножка. И т.д.

Но это именно - "пока".

 

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

Чтобы не путаться что куда, придумали дефайны. Один раз задаёшь соответствие, а в программе пользуешься понятным символическим именем.

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

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

Фактически у вас самый верхний уровень программы будет очень простой - инициализация и бесконечный цикл внутри с 4-мя блоками: 1) логика кнопок, 2) реализация ШИМ, 3) счетчик циклов, и 4) ожидание следующего цикла(признака прерывания от таймера, задающего длительность одного такта ШИМ).

в 1-м если счетчик циклов = 0 (начало цикла ШИМ), реализуем тот алгоритм обработки кнопок что я выше писал.
Во 2-м сравнивать счетчик циклов со значениями переменных задающих длительность импульсов ШИМ и если счетчик больше то выставлять на выход 0 иначе 1. Если счетчик =  0 то установить все выходы ШИМ в 1.

В 3-м вроде всё понятно - инкремент счетчика, сравнение с максимальным значением и сброс если больше или равно.

в 4-м ждем появления флага прерывания от таймера(само прерывание нам не нужно и даже разрешать его не стоит) как только появится - выходим из цикла ожидания и сбрасываем признак прерывания(без обработчика и разрешённых прерываний он сам не сбросится)
Таймер настроить в режим CTC со сбросом по сравнению, в регистр сравнения загрузить значение чтобы получить нужный период такта ШИМ, но значение не должно быть слишком маленьким - иначе у нас не успеет выполнится код до конца цикла. В качестве отладки, в начале цикла(перед опросом кнопок) выставить свободный вывод порта в 1 а перед 4-м блоком сбросить его в ноль. Потом посмотрев осциллографом увидишь сколько у тебя остаётся свободного времени после отработки кода, если там будет слишком много "1" то дело плохо и надо увеличивать период такта ШИМ. Но поидее не должно быть настолько плохо.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, pliss сказал:

Ну, вот я и разделил на задачи - кнопки отдельно, шим - отдельно.

Прикиньте на глазок время импульса ШИМ и время паузы. Учитывая что время импульса фиксировано внутри вложенного цикла (причем невелико, поскольку нет задержек), а время паузы определяется и внутри цикла и, что хуже, всем кодом, который вы добавите после. То есть время паузы будет плавать. А для ШИМ нестабильность коэффициента заполнения куда хуже, чем немного меньшая частота. Впрочем, реализация на общем бесконечном цикле не будет медленнее. Кроме того, использование общего счетчика времени может потом пригодиться не только для ШИМ, но и для отсчета времени. Автоотключение там, или тот же опрос кнопок. Особенно если повесить счетчик времени на таймер.

Кстати, можно попробовать. Сделайте счетчик времени глобальным и меняйте его только в прерывании таймера. А бесконечный цикл пусть формирует ШИМ и опрашивает кнопки. Может, таким путем будет проще прийти к псевдопараллельности.

7 часов назад, pliss сказал:

Для меня строка "0b00000001", пока, более наглядна, так как я вижу восемь однотипных ножек микросхемы

Но интересует-то вас единственный вывод, а не восемь одновременно. В вашей записи необходимо считать нули после единицы чтобы она попала точно на нужное место. К тому же остается риск случайно написать, например, 0b10000100 - единица заметна, конечно, но не слишком. Впрочем, это, конечно, косметика.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

@ARV , вашу статью прочитал. Если вы не потеряли интерес к вашему сайту, то вопросы по ней я задам там.

Ну хорошо. Вы описали последовательность так, как её видит программист:

В 19.03.2017 в 11:49, ARV сказал:

1. должна быть функция, которая вернет текущее состояние кнопок
2. если кнопок несколько - каждая должна быть как-то описана, чтобы вышеупомянутая функция возвращала не абы что, а конкретные сведения о конкретных кнопках
3. для узнавания состояния кнопок надо сделать функцию опроса физических линий МК (портов)
4. для борьбы с дребезгом контактов надо сделать двукратный опрос с паузой между ними физических линий и сравнить результаты

А вот так выглядит последовательность с точки зрения "нормального")) человека:

1. Получить несколько - пусть две (для простоты), последовательности импульсов определённой частоты.
2. Иметь потенциальную возможность независимо изменять скважность импульсов для каждой последовательности.
3. Иметь возможность запомнить установленную скважность импульсов.

Кнопок у меня, на этапе постановки задачи - нет вообще!

А каждое третье сообщение в обсуждении - о необходимости специальным образом организованного опроса кнопок.

Каждое четвёртое - о необходимости поддержания точности частоты импульсов до +-1 такта процессора.

И в каждом из них напоминают, что мой код - это основа очередного сервис-пака для windows, а с моим подходом он будет сильно глючным...)

 

5 часов назад, COKPOWEHEU сказал:

Прикиньте на глазок время импульса ШИМ и время паузы. Учитывая что время импульса фиксировано внутри вложенного цикла (причем невелико, поскольку нет задержек), а время паузы определяется и внутри цикла и, что хуже, всем кодом, который вы добавите после. То есть время паузы будет плавать. А для ШИМ нестабильность коэффициента заполнения куда хуже, чем немного меньшая частота

Пока код выглядит так:

Скрытый текст

/*
 * PVM_ATmega16.c
 увеличение и уменьшение заполнения ШИМ нажатием кнопок
 */
#define F_CPU 4000000UL
#include  <avr/io.h>

int main()
{

DDRB=0x00;//кнопки
PORTB=0xFF;//кнопки с резисторами

DDRD=0xFF;//выход шим
PORTD=0x00;//выход шим низкий

int  port_state=PINB;//переменная состояния порта

int  t_on0=0;//время PORTD0_on
int  t_on1=0;//время PORTD1_on
int  T_temp=0;//переменная для отсчёта периода

const int T_const=260, d0=13, d1=13;//период, приращение PORTD0 и PORTD1

unsigned char  n=0, r=0;//счётчик периодического опроса кнопок, разрешение изменения

while(1)//основной цикл
{

//  ****** периодический опрос кнопок *********** //

port_state=PINB;//запоминаем состояние порта B

n++;//инкр счётчик периодического опроса кнопок


  
//если у счётчика периодического опроса 
//три младших разряда ==0 и разрешено изменение
if(!(n&0b00000111)&&(!r))
{
	//  ******* кнопки канала PORTD0 *******  //

//если нажат "+" и есть возможность расширения импульса
if((!(port_state&0b00000001))&&(T_const>=(t_on0+d0)))
t_on0=t_on0+d0;//увеличиваем время PORTD0_on

//если нажат "-" и есть возможность расширения импульса
if((!(port_state&0b00000010))&&(0<=(t_on0-d0)))
t_on0=t_on0-d0;//уменьшаем время PORTD0_on

	//  ******* кнопки канала PORTD1 *******  //

//если нажат "+" и есть возможность расширения импульса
if((!(port_state&0b00000100))&&(T_const>=(t_on1+d1)))
t_on1=t_on1+d1;//увеличиваем время PORTD1_on

//если нажат "-" и есть возможность расширения импульса
if((!(port_state&0b00001000))&&(0<=(t_on1-d1)))
t_on1=t_on1-d1;//уменьшаем время PORTD1_on

r=1;//запрещаем изменения
}

// ****** ШИМ ********************  //

PORTD=0xFF;//включаем всё

while(T_temp<=T_const)//период
{
	if(T_temp==t_on0)//сравниваем время PORTD0_on
	PORTD&=0b11111110;//выключаем PORTD0_on

	if(T_temp==t_on1)//сравниваем время PORTD1_on
	PORTD&=0b11111101;//выключаем PORTD1_on

	T_temp++;//считаем период
}

T_temp=0;//восстанавливаем период

if(port_state==0b11111111)
r=0;//если кнопки отпущены разрешаем изменение
}
}

 

Прикинул.

Пауза каждого, в моём случае восьмого периода, отличается от остальных на количество тактов за которое выполняется действие

if((!(port_state&0b00000001))

умноженное на количество кнопок. Если кнопки не нажимались...

Если я перемешаю опрос кнопок и отсчёт периода, то период всё равно будет плавать тогда, когда будет выполняться приращение импульса при нажатой кнопке...

Так?

Изменено пользователем pliss

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

Ссылка на комментарий
Поделиться на другие сайты

13 минуты назад, pliss сказал:

Если вы не потеряли интерес к вашему сайту, то вопросы по ней я задам там.

Я, разумеется, ничего не потерял.

13 минуты назад, pliss сказал:

2. Иметь потенциальную возможность независимо изменять скважность импульсов для каждой последовательности.

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

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Согласитесь, 7 страниц темы ни о чем. Это ненормально. Нужно это понять и принять. Раз ненормально, значит ситуацию нужно менять.

ТС, судя по всему, у вас боязнь сложности. Эта боязнь лечится просто, нужно чтобы было желание понять. Составить план. И попунктно ему следовать. Как изучить МК и си. Книжки и только книжки. Изучать с нуля микроконтроллеры на форумах - неблагодарное занятие. Сначала нужно понять азы. И пройти самостоятельно некоторые шаги. На форумах задавать только конкретные вопросы. Если не запускается таймер, ШИМ, дисплей и вы действительно помучались, а не прибежали на форум с просьбой принести вам готовенькое на блюде.

2 - Планирование. ТЗ. Дербаним задачу, планируем дальше. Обдумываем каждую мелочь, в прямом смысле этого слова станьте и программой и микроконтроллером.

3 - Продолжение 2 пункта. Берем карандаш и бумагу и пишем все пункты затруднений. Рисуйте алгоритм вашей будущей программы.

Желание, интерес, труд. Планирование своих шагов. Визуализация (к примеру, рисовать алгоритм на бумаге). Здесь самое интересное. Когда вы сформулируете свои мысли на бумаге, писать программу будет на порядки проще. Потому что она по сути уже составлена на бумаге. И тогда у вас начнет получаться. Никак иначе.

 

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...