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

Язык СИ для микроконтроллеров


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

Alex

Фенкс, за подсказочку, но я уже сам по немногу дошёл до этого :) У меня тут кое какие идеи другие появились по поводу моей защиты, пока думаю.

Будьте проще и люди к вам потянутся.

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

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

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

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

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

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

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

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

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

Всем доброго времени суток. У меня возник вопрос, правда он не совсем по теме, но я надеюсь что вы меня просвятите. Так вот: компиляторы micro_c по умолчанию ограничиваю код, по-моему, до 2000 слов. Кряк, который приведен в архиве http://a_sergeevich.nxt.ru/microC.zip решает эту проблему?

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

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

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

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

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

Так сидел тут изучал работу АЦП, ну и развил немного это изучение в конструкцию.

Короче получилось нечто мигалки для новогодних гирлянд, разные эффекты получаются с помошью двух переменных резиков которые подают

напряжение на аналоговые входы, короче если их крутить по разному можно получить кучу разных эффектов :).

Если добавить третий резистор и задействовать остаток порта B и чуток порта C можно увеличить кол-во эффектов и гирлянд.

Вообще это можно оформить в виде платы с ключами для гирлянд и панелькой под МК и просто перед НГ прошил МК

поставил, погонял, потом вытащил МК и дальше эксперементировать, ну чтобы МК не лежал без дела целый год :)

Так в архиве исходник, прошивка, проект для микроСи и проект для протеуса.

Прошу сильно не пинать и не кричать я просто продолжаю работать над своей защитой для УМЗЧ, а это побочный эффект от процесса изучения разных узлов МК. По защите в принципе блоки управления

вентиляторами готовы, есть софт старт, сейчас думаю защиту от постоянки делать на АЦП или как у меня сейчас

RC-цепь -> транзисторы, которые при появлении постоянки открываются и садят вход МК на землю, ну а он уже дальше отрабатывает.

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

НЗ-НО. При включении уся вход его отключен от источника сигнала и посажен контактами реле на землю, через 5 сек после

подачи питания включаются ( если всё ок ) реле АС, которые от блока защиты от постоянки, затем через 3-5 сек включаются реле

подсоединяя вход УМЗЧ к источнику сигнала и отключая его от земли. Всё это будет защищать от сваривания контактов реле

при включении УМЗЧ на полной громкости.

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

Да защиту от зависания МК решил сделать железно - софтовую, а именно поставлю генератор импульсов на ЛА7 и счетчик на ИЕ8, задача МК будет переодически подавать сигнал сброса на ИЕ8 и обнулять её, если этого не произойдёт ИЕ8 досчитает до конца и включит цепь сброса МК, как думаете нормально или проще собаку задействовать ?

Ещё, может кто подскажет как защиту от КЗ забацать, желательно схемку и чтобы сигнал в МК завести.

Кстати блоки программы по готовым узлам уже проверил в железе на макетке, всё работает как часы :)

Да чуть не забыл новогодняя мигалка: noviy_god.rar

У кого будут вопросы задавайте отвечу по мере возможностей и знаний :)

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

Будьте проще и люди к вам потянутся.

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

Начал потихоньку изучать микроСи. Первой под нож пошла прога для енкодера:

int REG6, REG7; // Регистры состояния соотв. входов МК
int FL6, FL7; // Регистры флагов изменения состояния выводов порта

void interrupt() {   // Обработчик прерываний
if (INTCON.RBIF=0) return; // Проверим, из-за чего произошло прерывание
INTCON.GIE=0; //Запрет всех прерываний
if (PORTB.RB6!=REG6){  // Проверка изменения сигнала на RB6
FL6=1;  //Установить флаг прерывания от соотв. входа RB6
  if (FL7=1) {
  PORTB.RB2=1;
  delay_ms (1);
  PORTB.RB2=0;
  FL6=0;
  FL7=0;
  }
}
if (PORTB.RB7!=REG7){   // Проверка изменения сигнала на RB7
FL7=1;  //Установить флаг прерывания от соотв. входа RB6
  if (FL6=1) {
  PORTB.RB3=1;
  delay_ms (1);
  PORTB.RB3=0;
  FL6=0;
  FL7=0;
  }
}
}

void main() {
TRISB=0b00001111; //Направление порта В
OPTION_REG=0b10000000;  //Подтягив. резисторы
L1: if (PORTB.RB7!=PORTB.RB6) goto L1 //Проверка исходного состояния, ждем когда будет равенство

// Заносим исходное состояние портов

if (PORTB.RB6=1) REG6=1;
else REG6=0;
if (PORTB.RB7=1) REG7=1;
else REG7=0;
INTCON=0b10001000;

do{  // Безконечный цикл
;
}
while (1);
}

Просьба ГУРУ отреагировать...

Не понятно по цепочке IF и ее сочетанию с ";"

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

Решил немного переделать вот эту часть:

if (PORTB.RB6!=REG6){ // Проверка изменения сигнала на RB6
FL6=1; //Установить флаг прерывания от соотв. входа RB6
if (FL7=1) {
PORTB.RB2=1;
delay_ms (1);
PORTB.RB2=0;
FL6=0;
FL7=0;
}
}
if (PORTB.RB7!=REG7){ // Проверка изменения сигнала на RB7
FL7=1; //Установить флаг прерывания от соотв. входа RB6
if (FL6=1) {
PORTB.RB3=1;
delay_ms (1);
PORTB.RB3=0;
FL6=0;
FL7=0;
}
}

на :

int func (int RBI,int REG,int RBO,int FL1,int FL2) {
if (RBI!=REG){   // Проверка изменения сигнала на RB7
FL1=1;  //Установить флаг прерывания от соотв. входа RB
  if (FL2=1) {
  RBO=1;
  delay_ms (1);
  RBO=0;
  FL1=0;
  FL2=0;
  }
}
}

............
func (PORTB.RB6, REG6, PORTB.RB2, FL6, FL7);
func (PORTB.RB7, REG7, PORTB.RB3, FL7, FL6);

Нужен помощь - не работает нигде - ни в PIC Emu, ни в Proteus... ЖУТЬ!

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

Я конечно может, что не так понял, но в микроСи доступ к отдельным битам осуществляется в виде PORTB.F0...7 либо надо в начале программы переопределить например, #define PORTB.F6 RB6.

У меня сейчас просто установлен обычный микроСи, может это для про версии актуально, но всё же у меня Ваш код даже не скомпилировался как Вы его могли в протеусе проверять ?

Будьте проще и люди к вам потянутся.

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

Я конечно может, что не так понял, но в микроСи доступ к отдельным битам осуществляется в виде PORTB.F0...7 либо надо в начале программы переопределить например, #define PORTB.F6 RB6.

На сколько я понял это нужно если у байта нету стандартного имени.

У меня сейчас просто установлен обычный микроСи, может это для про версии актуально, но всё же у меня Ваш код даже не скомпилировался как Вы его могли в протеусе проверять ?

ХЗ - у мну компилится... но при тесте на PIC Emu... зависает на постоянно прерыванию по RB4:7... почему - не понял!

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

зависает на постоянно прерыванию по RB4:7...

А зачем Вы написали вот эту строку ?

if (INTCON.RBIF=0) return; // Проверим, из-за чего произошло прерывание

И если проверяете флаг, то хотябы как минимум его нужно сбросить, а у Вас сразу возврат.

Вот он и виснет на этом месте.

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

Ну во первых возврат не если не было прерывания, а если небыло изменений на RB4-7.

Любое изменение этих выводов приведёт к установке флага RBIF и не важно было разрешено прерывание или нет.

Во вторых, у Вас не условие получается, а присвоение биту INTCON.RBIF нуля.

Знак сравнения это два знака равно "==".

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

Да, код компилится в про-версии микроСи. И ещё в условиях надо знак = поменять на == как подсказал Alex.

Изменение сигнала на выводе можно определить либо по прерыванию от RB4-RB7 если нужно отслеживать 4 ноги ( в функции прерывания уже определять на какой именно ноге RB4 - RB7 произошло прерывание, либо в функции обработки прерывания выставить флаг, сбросить флаг прерывания и в основном цикле уже определить конкретный вход, сбросить флаг и всё), если одну то RB0 от входа INT, ну или тупо в условии делать проверку и крутить в основном цикле.

Будьте проще и люди к вам потянутся.

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

Так вот интересно, как определить на каком ИМЕННО выходе изменился сигнал? Мой пример с дополнительным регистром вроде работает, но может есть намного интересней идеи!?

... переделую прогу(правлю)... в PIC Emu IDE работает, но в Proteus - не совсем...

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

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

char flag = 0, j;
unsigned char sost_reg [4]; // массив куда будем записывать начальное состояние регистра
unsigned char sig_reg [4]; // массив куда будем записывать состояние регистра после изменения состояния на RB4-RB7
unsigned char tmp; //переменная для временного хранения
void zap_port ( unsigned char mass [] ); //функция для записи состояния битов порта в массив
void poisk_sig ( unsigned char mass [], unsigned mass2 [] ); //функция определения изменившегося бита
void copy_mass ( unsigned char mass [], unsigned mass2 [] );
void init ( void );//функция инициализации МК

void interrupt () // обработка прерывания по изменению уровня на RB4-RB7
  {
	 if ( INTCON.RBIF )
		  { 
				 flag = 1;
				 INTCON.RBIF = 0;
		   }
   }
int main () 
 {
	  init ();
	  zap_port ( sost_reg ); //записываем начальное значение PORTB RB4-RB7
	  while (1)
			{
				if ( flag == 1 )//было прерывание уровень изменялся на в каком либо входе RB4-RB7 
					   {
						   zap_port ( sig_reg ); //записываем изменённое состояние RB4-RB7
						   poisk_sig ( sost_reg, sig_reg ); //определяем на каком из входов произошло изменение уровня
							//обрабатываем ситуацию в зависимости от того где изменился уровень
							switch (j)
								   {
									   case 0: if ( tmp ) то-то и то-то else то-то и то-то //для RB4
									   case 1: if ( tmp ) то-то и то-то else то-то и то-то //для RB5
									   case 2: if ( tmp ) то-то и то-то else то-то и то-то //для RB6  
									   case 3: if ( tmp ) то-то и то-то else то-то и то-то //для RB7
									}
							 copy_mass ( sost_reg, sis_reg );
							 flag = 0;
						 }
				 }
   }

void zap_port ( unsigned char mass [] )
			 {
				 unsigned char temp;
				 int i;
				 temp = PORTB >> 4;
				 for ( i=0; i < 4; i++ )
						{
							mass [i] = temp & 0b0001;
							temp = temp >> 1;
						 }
				 }

void poisk_sig ( unsigned char mass [], unsigned mass2 [] )
			 {
				 int i;
				 for ( i=0; i < 4; i++ )
						 {
							 if ( mass [i] != mass2 [i] ) { j = i; tmp = mass2 [i]; }
						  }
			   }
void copy_mass ( unsigned char mass [], unsigned mass2 [] )
			 {
				 int i;
				 for ( i=0; i < 4; i++ )
						   {
							  mass [i] = mass2 [i];
							}
			   }

Тут я определяю изменение сигнала одновременно на каком-то одном входе, если надо определять на нескольких нужно функции немного изменить, что уже просто т.к основная концепция ясна.

Может где-то и есть ошибки, так что смотри внимательнее я проверял код только на бумаге, составляя трассировочные таблици в ручную, может компилятор где-то думает иначе :) Может вообще работать не будет :) .

Я ж тоже только учусь :P

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

Будьте проще и люди к вам потянутся.

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

Чесно?! Я ни х...Х... не понял! ... я так далеко еще не прочитал книжку! Мя покаместь +/- и тд.

Кста case - как я занего мог забыть!

Лады - задача усложняется! - Два энкодера + на них еще и по кнопке! Крутилки будут сидеть на RB4:7, а кнопки на RB1:2 и через диодную развязку на RB0... пошел писать.

Первые идеи:

Читаем порт В в доп регистр - R1 при прерывании X = PORTB XOR R1, узнаем по какой причине произошло изменение(RB0 или RB4:7) и в зависимости от этого заносим в доп рег R2 очищеную часть = X and 0000 1111(или 1111 0000) а дальше дело техники оператор case и тд...

Думаю получится...

ЗЫ. Компилятор действительно думает по другому! - нехочет работать... -

0 102 Finished (with errors): 10 дек 2009, 23:23:57 04.mcppi
Изменено пользователем Lev@
Ссылка на комментарий
Поделиться на другие сайты

Я же сказал могут быть ошибки, вот исправленный

char flag = 0, j;
unsigned char sost_reg [4]; // массив куда будем записывать начальное состояние регистра
unsigned char sig_reg [4]; // массив куда будем записывать состояние регистра после изменения состояния на RB4-RB7
unsigned char tmp; //переменная для временного хранения
void zap_port ( unsigned char mass [] ); //функция для записи состояния битов порта в массив
void poisk_sig ( unsigned char mass [], unsigned mass2 [] ); //функция определения изменившегося бита
void copy_mass ( unsigned char mass [], unsigned mass2 [] );
void init ( void );//функция инициализации МК

void interrupt () // обработка прерывания по изменению уровня на RB4-RB7
  {
	 if ( INTCON.RBIF )
		  { 
				 flag = 1;
				 INTCON.RBIF = 0;
		   }
   }
int main () 
 {
	  init ();
	  zap_port ( sost_reg ); //записываем начальное значение PORTB RB4-RB7
	  while (1)
			{
				if ( flag == 1 )//было прерывание уровень изменялся на в каком либо входе RB4-RB7 
					   {
						   zap_port ( sig_reg ); //записываем изменённое состояние RB4-RB7
						   poisk_sig ( sost_reg, sig_reg ); //определяем на каком из входов произошло изменение уровня
							//обрабатываем ситуацию в зависимости от того где изменился уровень
							switch (j)
								   {
									   case 0: if ( tmp ) то-то  else то-то;break;//для RB4
									   case 1: if ( tmp ) то-то else то-то;break; //для RB5
									   case 2: if ( tmp ) то-то else то-то;break; //для RB6  
									   case 3: if ( tmp ) то-то else то-то;break; //для RB7
									}
							 copy_mass ( sost_reg, sig_reg );
							 flag = 0;
						 }
				 }
   }

void zap_port ( unsigned char mass [] )
			 {
				 unsigned char temp;
				 int i;
				 temp = PORTB >> 4;
				 for ( i=0; i < 4; i++ )
						{
							mass [i] = temp & 0b0001;
							temp = temp >> 1;
						 }
				 }

void poisk_sig ( unsigned char mass [], unsigned mass2 [] )
			 {
				 int i;
				 for ( i=0; i < 4; i++ )
						 {
							 if ( mass [i] != mass2 [i] ) { j = i; tmp = mass2 [i]; }
						  }
			   }
void copy_mass ( unsigned char mass [], unsigned mass2 [] )
			 {
				 int i;
				 for ( i=0; i < 4; i++ )
						   {
							  mass [i] = mass2 [i];
							}
			   }

Забыл про операторы break и название массива в функции написал sis_reg вместо sig_reg ;)

Счас попробовал скомпилить всё ок. И ещё функцию init () не забудь описать для своего МК.

Смысл кода такой. В начале мы записываем начальное состояние RB4-RB7 в массив zap_port ( sost_reg ); и уходим в цикл где ждём прерывания по изменению состояния RB4-RB7. Если произошло прерывание выставляем в обработчике флаг flag = 1; и начинаем выяснять на каком входе конкретно изменился уровень.Для этого мы в другой массив записываем состояние RB4-RB7 zap_port ( sig_reg ); Затем в функции poisk_sig ( sost_reg, sig_reg ); сравниваем массивы в одном из которых sost_reg записано начальное состояние в другом sig_reg действующее, находим номер изменённого входа, а также как он изменился с 1 на 0 или с 0 на 1, выполняем нужные действия в switch..case

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

copy_mass ( sost_reg, sig_reg );

flag = 0;

всё.

Изменено пользователем wowa
Для длинного кода используйте CODEBOX !!! Wowa.

Будьте проще и люди к вам потянутся.

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

Не обезательно знать как изменился сигнал: с 0 на 1 или с 1 на 0 - главно знать ГДЕ он изменился и в какой последовательности Вывод1 потом Вывод2 или наоборот - т.е. вращаем вправо или влево...

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

Не обезательно знать как изменился сигнал: с 0 на 1 или с 1 на 0 - главно знать ГДЕ он изменился и в какой последовательности Вывод1 потом Вывод2 или наоборот

Ну как раз тут мы и узнаём ГДЕ он изменился, а последовательность изменения и действия прописываем в switch..case. Ну как-то так.

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

Будьте проще и люди к вам потянутся.

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

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

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

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

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

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

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

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

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

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

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

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