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

Вопросы от начинающих по МК


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

ну или более удобней через структуру

// описание переменых
union {       
struct {
  unsigned bit0  : 1;  
  unsigned bit1  : 1;
  unsigned bit2  : 1;
  unsigned bit3  : 1;
  unsigned bit4  : 1;  
  unsigned bit5  : 1;
  unsigned bit6 : 1;  
  unsigned bit7 : 1;   
} PIN;             
  unsigned char reg;       
} temp,tempOld; 

// применение
temp.reg=0;
if(PINB&(1<<0)) temp.PIN.bit0 =1;
if(PINC&(1<<2)) temp.PIN.bit1 =1;
if( !tempOld.PIN.bit0
     && temp.PIN.bit0
     && temp.PIN.bit1 ) PORTD |=(1<<0);
if( !temp.PIN.bit1
     && tempOld.PIN.bit1 ) PORTD &= ~(1<<0);
tempOld.reg=temp.reg;

 

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

10 часов назад, IMXO сказал:

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

надо фиксировать фронт импульса пинВ и спад импульса пинС

я бы сделал так
 


temp_PIN=0;
if(PINB&(1<<0)) temp_PIN |=(1<<0);
if(PINC&(1<<2)) temp_PIN |=(1<<1);
if(!(tempOld_PIN&(1<<0))
     &&(temp_PIN&(1<<0))
     &&(temp_PIN&(1<<1))) PORTD |=(1<<0);
if(!(temp_PIN&(1<<1))
     &&(tempOld_PIN&(1<<1)) PORTD &= ~(1<<0);
tempOld_PIN=temp_PIN;

 

IMXO, Спасибо за очередную подсказку. Я далеко еще не все изучил в AVR поэтому прошу вас расшифруйте мне эту строчку  "tempOld_PIN&(1<<0)"

Я конечно это найду, но иногда хочется хоть что-нибудь сразу.:)

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Логическое И переменной с маской в которой установлен один бит(нулевой). В итоге останется только 0-й бит переменной, остальные сравняются с нулём.

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

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

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

по факту вы пытаетесь реализовать обычный RS-триггер с приоритетом Reset,  только Reset у вас инверсный. PC2=!Reset, PB0=Set. те RS-триггер устанавливается по нарастающиму фронту, сбрасывается  по спадающему фронту.

zzxx.png.6bd650d7f8993afc61e43909fcf87cc1.png

А далее все просто. для фиксации фронтов нужно знать предыдущие состояние пина (переменная tempOld_PIN) , тк вы используете пины на разных порта ввода, то для работы текущие состояние пинов записываются в переменную temp_PIN, значение Set записываем в бит0 , Reset в бит1.

temp_PIN=0;
if(PINB&(1<<0)) temp_PIN |=(1<<0);
if(PINC&(1<<2)) temp_PIN |=(1<<1);

проверяем условие установки: нарастающий фронт на Set и высокий уровень на Reset , если выполняется устанавливаем выход

if(!(tempOld_PIN&(1<<0)) // нарастающий фронт: предыдущий Set=0,
     &&(temp_PIN&(1<<0)) // текущий Set=1.
     &&(temp_PIN&(1<<1)))// + текущий Reset=1.
  PORTD |=(1<<0);

проверяем условие сброса: спадающий фронт на Reset

if(!(temp_PIN&(1<<1)) // спадающий фронт: текущий Reset=0
     &&(tempOld_PIN&(1<<1)) // предыдущий Reset=1
   PORTD &= ~(1<<0);

сохраняем текущие значение пинов

tempOld_PIN=temp_PIN;

 

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

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

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

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

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

      IMXO. Большое спасибо за помощь. Фактически я закончил программу для задуманного устройства. Пока она в виде отдельных блоков, объединить их в одно целое, не составит проблем (надеюсь). Изучать программирование AVR не собираюсь бросать (было такое желание), вошел во вкус. Читая ваш пост, вспомнилось приятное чувство, когда попался отличный перевод  руководства по программированию одного ПЛК. (Сам использую CodeSys, но на фирменном оборудование часто используется СИ)

P.S. В ин-нете много информации для начинающих , начинается с морганием светодиодом, потом сразу подключение LCD .:o Есть информация по таймерам, АЦП (на троечку, но есть), а вот по ДИСКРЕТНОЙ ЛОГИКЕ почти ни чего не нашел, а ведь как оказалось здесь столько нюансов, которые надо не только понять, а просто тупо запомнить.

P.P.S. Теперь дело за программатором.

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

Просто сама логика это как ССР(само-собой-разумеется) является базой для изучения контроллеров, раз забрался на такой уровень то уж логику должен понимать. Просто надо знать одну вещь - контроллер в отличие от ПЛИС все операции делает последовательно, поэтому любую сложную логику надо разворачивать на последовательные шаги.

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

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

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

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

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

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

Есть код  такого плана:

while (1){		
			
	if (TIFR & (1 << TOV0)){	// if timer overflow
		run_timer4us();
		ON;			
		OFF;
		resetTOV0;			// reset overflow flag
	}			
	
	if (GIFR & (1 << INTF0)){	// if pin level change
		run_timer6us();
		ON;			
		OFF;			
		ON;			
		OFF;
		resetINTF0;	// reset INTF0 interrupt
	}		
			
}

 

Т.е. в бесконечном цикле идёт опрос двух флагов. Первый - на переполнение таймера, второй - на смену лог. уровня пина PD2. Контроллер ATtiny 2313A. 
Всё вроде бы не плохо, если бы не одно но. В логике цикла заложена такая штука, что если произошла смена лог. уровня - таймер взводится на 6 мкс (чтобы попасть на середину следующего бита в передаче), а если смены за 4 или 6 мкс не наблюдалось - значит мы как раз на середине принимаемого бита. Но иногда переполнение с 4 мкс наступает раньше, чем должно, а событие по смене уровня отрабатывается потом.

Никаких прерываний не используется, ON, OFF - макросы для своего рода дебага в железе типа PORT_LED |= (1 << LED_PIN). run_timerXus() - inline функции с одной строкой TCNT0 = fUs4, где fUs4 - константа, ресеты тоже макросы типа resetTOV0    TIFR &= (1 << TOV0).

Картина того, что иногда идёт не так:

IMG_20180305_013021.thumb.jpg.902aa51ae4bff77fcd6785b50db57072.jpg

Сверху - принимаемый сигнал - внизу - результат работы команд ON/OFF в условиях. Тут видно, что вторая смена уровня отрабатывается позже, чем переполнение таймера в 4 мкс, хотя измеритель показывает, что прошло как раз 6 мкс. 

А вот как оно должно быть по задумке:

IMG_20180305_015605.thumb.jpg.daf81d29a0537b63f4c431dc47b60a3e.jpg

То есть отрабатывается смена логического уровня и через 6 мкс уже срабатывает переполнение. Но даже это время отклика меня несколько смущает. Сам уровень вроде давно поменялся, а условие только где-то через микросекунду а то и больше срабатывает. Есть вероятность, что фронты/спады недостаточно крутые, пока нечем посмотреть, но это не критично. Критична именно ситуация на первом фото. Как такое вообще может произойти?

P.S. Прерывания не использую, потому что с ними вообще не успеваю, период 4 мкс, кварц 24 (!) МГц стоит, (на 20 под рукой не было), константы есть под оба варианта, но это уже другая история :) 

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

11 минуту назад, Tokes сказал:

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

1. смотрим в ДШ время установки флага.

2. смотрим асм и считаем сколько команд выполняется и сколько на это уходит времени.

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

while (1){		
			
	//if (TIFR & (1 << TOV0)){	// if timer overflow
	//	run_timer4us();
	//	ON;			
	//	OFF;
	//	resetTOV0;			// reset overflow flag
	//}			
	
	if (GIFR & (1 << INTF0)){	// if pin level change
	//	run_timer6us();
		ON;			
		OFF;			
		ON;			
		OFF;
		resetINTF0;	// reset INTF0 interrupt
	}		
			
}

Я думаю так можно проверить, как затянут задний фронт входного сигнала

Можно сигнал сделать длинней и задержки 4 ms  и 6 ms и не надо будет сомневаться успевает контроллер или нет

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

@IMXO , посмотрел. В даташите это время, если я всё верно понял равно четырём тактам осциллятора:
5a9d06dfaafdb_1.PNG.cf10b16f7cf87e56ae0b0c322bb622fb.PNG

В дизассемблере проход по этим двум командам ветвления плюс переход на начала цикла занимает 6 инструкций, некоторые по два такта за инструкцию Пусть будет 10. Итого, по идее, максимум должно быть в самой плохой ситуации 10+4+10 - 24 такта. При тактовой в 24Мгц это 1 мкс. А у меня как будто всё в самом худшем случае, а то и ещё хуже, как в Беларуси )
@Геннадий , а если сюда ещё прерывания добавить, пока перейдёт на старт ПП прерывания, пока всё это сохранит/вытащит из стека, потом возврат...  - это будет точно дольше, чем такая конструкция в данной ситуации. Хотя я уже ни в чём не уверен :wacko:

Ладно, а кто-нибудь видит способ выйти из ситуации победителем?

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

31 минуту назад, Tokes сказал:

Пусть будет 10. Итого, по идее, максимум должно быть в самой плохой ситуации 10+4+10 - 24 такта. При тактовой в 24Мгц это 1 мкс

вы сюда еще забыли впихнуть время на переустановку таймера, как в АВР не знаю а в ПИКах таймер валиден только через машинный цикл те время переустановки  8 тактов осциллятора думеецо в АВР не меньше. те выполняя  run_timer6us(); проверка if (TIFR & (1 << TOV0)) идет на 7-8 такте...

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

@IMXO , про задержку NOPами подумаю, спасибо за идею. Но на дешёвых AVR я, похоже, упёрся в потолок. Давно смотрю на STM32, но как подумаю, сколько там всего...

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

то же самое там все, только быстрее и в бОльшем ассортименте. А смысл программирования тот же самый - пока не нужно, не трогай лишнего. Натроил тактирование, включил нужный модуль, подав на него такты, и погнали. Так что бояться там особо нечего. Если есть практика на 8-битках то осваивается влет. Потом уже альтернативы просто перестают существовать за те деньги и с теми возможностями при прочих равных.

Представь так сразу с велосипеда ты пересел в феррари, да еще и сэкономил. Ясно дело ощущения совсем другие будут )

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

День добрый. Кто делал обычный диммер на мк. Как реализовывали регулировку? Вопрос в ступенях регулировки. К примеру если я буду добавлять задержку на открытия симистора к примеру с интервалом 1 мс. То напряжение будет меняться на разные значения, с каждой ступенью. В идеале нужно что бы площадя добавляемых отрезков синуса были равными. Тогда нужна некая таблица значений по оси Х (угол или время). Считается через интеграл, но больно муторно это, может есть решение побыстрее?

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

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

Ладно, а кто-нибудь видит способ выйти из ситуации победителем?

waitHigh:
while (1){		
	if (TIFR & (1 << TOV0)){	// if timer overflow
		run_timer4us();
		ON;			
		OFF;
		resetTOV0;			// reset overflow flag
	}			
	if (PIND & (1 << 2)){	// if pin level go to high
		run_timer6us();
		ON;			
		OFF;			
		ON;			
		OFF;
		resetINTF0;	// reset INTF0 interrupt
		goto waitLow;
	}		
}

waitLow:
while (1){		
	if (TIFR & (1 << TOV0)){	// if timer overflow
		run_timer4us();
		ON;			
		OFF;
		resetTOV0;			// reset overflow flag
	}			
	if (!(PIND & (1 << 2))){	// if pin level go to zero
		run_timer6us();
		ON;			
		OFF;			
		ON;			
		OFF;
		resetINTF0;	// reset INTF0 interrupt
		goto waitHigh;
	}		
}

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

Других проблем действительно не видно!

15 часов назад, Tokes сказал:

TIFR &= (1 << TOV0)

а тут опечатка на сайте, наверно? он вроде единицей сбрасывается, так должно быть:

TIFR |= (1 << TOV0);

?

 

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

19 минут назад, GOR23 сказал:

диммер на мк.

смотря для чего, для освещения линейно.  глаз имеет логарифмическую зависимость нарастания яркости , синус дает линейность. или нет?

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

6 часов назад, Tokes сказал:

посмотрел. В даташите это время, если я всё верно понял равно четырём тактам осциллятора

а этот регистр у тебя задан:

7.6.3. Clock Prescaler Register
Name: CLKPSR

Bits 3:0 – CLKPS[3:0]: Clock Prescaler Select

Сколько?

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

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

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

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

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

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

@ruhi , интересный вариант тоже, обдумаю. По поводу опечатки - у меня всё верно. Читаем внимательно: определённый флаг сбрасывается записью единицы в соответствующий бит соответствующего регистра - это по документации. Представьте ситуацию, где в регистре, например, TIFR установлено несколько флагов. А мы берём эти несколько флагов, проводим с ними операцию ИЛИ и записываем все эти флаги вместе с установленным в этот же регистр. Что произойдёт в итоге? Правильно - вместо какого-то конкретного мы сбросим все установленные флаги, которые были установлены в единицу на момент операции ИЛИ.
Дальше, Clock Prescale Register - я так понял позволяет на ходу подключать прескалер к тактовому генератору? Я даже не знал, что в этом МК такое можно :) Не пользовался этим регистром, поэтому, подозреваю, этот прескалер отключён. Иначе бы я не получал точных временных выдержек.

@mail_robot , я тут почитал. Хочу себе феррари :) Есть у меня в запасах платка, типа для ардуино, там F103 серия. Скачал референс мануал, а так же даташит на эту серию. Сходу разобраться не получилось. Там указана максимальная тактовая в 72 МГц, так же где-то читал недавно, что порты IO не могут на такой частоте работать. Это так? Ну и другой вопрос - я эту платку смогу использовать где-то кроме как в среде ардуино, которую я так не перевариваю?

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

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

 

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

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

5 hours ago, Tokes said:

Там указана максимальная тактовая в 72 МГц, так же где-то читал недавно, что порты IO не могут на такой частоте работать. Это так?

порты на частоте ядра априори не могут работать. Но вопрос в другом - а так ли это необходимо? Принцип обработки сигналов в СТМ отличается от обычного парсинга. Там все строится на модулях, а до ядра доходит уже в переработанном виде (в основном)

5 hours ago, Tokes said:

я эту платку смогу использовать где-то кроме как в среде ардуино, которую я так не перевариваю?

я конечно понимаю, что меня опять закидают тапками - типа говно и все такое. Но мне как то пофик. Попробуй CubeMX в связке с Keil. Кодить можно попробовать на HAL. Это будет чтото типа Java, если сравнивать с голым регистровым кодом. Просто, быстро и оно работает. Есть гениальные индивиды, которые говорят что это то же самое что и ардуино, но это далеко не так. Это нормальная библиотека абстрагированного кода на С, которая кстати предлагается самим производителем камней как основной и желательный инструмент. Единственный официально поддерживаемый на сегодняшний день. Но у нас тут есть люди, которые считают себя умнее всех инженеров и программистов ST, поэтому лучше выбирай сам. Вариант ассемблера кстати тоже не исключен

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

Из минусов - потеря производительности (порядка 1-5%), более массивный бинарник на выходе. Tсли ты не готов отдать 5 лишних килобайт из 32-х (обычно) и 4 мегагерца из 72-х (допустим) за утроенную скорость написания кода, то это не твой инструмент и лучше юзать например SPL. Месяц на колупание кода и у тебя отличный софт, который правда недели через две ты сам будешь читать как китайские иероглифы. Но это не страшно, говорят привыкаешь быстро. Годик другой кодинга в режиме полной занятости и все будет на автомате )

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

20 часов назад, Tokes сказал:

...а если сюда ещё прерывания добавить...

Не добавить, а заменить "это сюда" на прерывания.

19 часов назад, mail_robot сказал:

...да еще и сэкономил.

Как-то сомнительно. Продаваны следят за спросом. Сейчас тот же STM32f103C8T6 уже обгоняет в стоимости Atmega328p.

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

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

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

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

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

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

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

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

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

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

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

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