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

a_sergeevich

Members
  • Постов

    328
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные a_sergeevich

  1. У меня раз было подобное я так и не понял почему правда, но решил я эту проблему тем, что поместил уже описаную функцию до её вызова, т.е вместо прототипа и глюк прошёл и кстати больше не повторялся, хотя сто раз перепроверил, прототип был правильно описан и функция тоже. Короче попробуй, может поможет.

  2. Программный ШИМ у тебя сожрёт всё, т.к при его работе МК у тебя ничего делать больше не будет, а тем более тебе ещё надо 3-ри канала АЦП использовать, а преобразование занимает время, поэтому лучше присмотри себе МК у которого нужное тебе кол-во модулей ШИМ.

  3. Короче такая тема, может это правда и проскакивало где-то, но всё же. Сегодня попробовал такой способ. Берём такую штуку (наверное все знают) под названием "КРОТ" окунаем туда ПЭВ буквально минуты на 2-3 и лак очень легко снимается, если же подержать провод минут 5-7 то лак вообще сам отвалится. После этого промываем вытираем и всё.

    Да, "КРОТ" не содержит кислоту, он изготовлен на основе едкой щёлочи. Вот такой вот способ :)

  4. Да у меня уже почти весь код готов, осталось как раз добавить только функции для работы с I2C, но пока если честно руки не доходят, в принципе и функции в голове уже все собраны, если может кого заинтересует могу выложить, то что уже сделал, там чуть-чуть осталось. Но, что-то мне кажется добровольцев не будет, т.к в инете уже готовых схем со схожим функционалом и даже круче просто море и на пиках и на аврках. Ещё самое плохое, что магазин мне прислал заказ без нужной мне TDA8425, а ждал я почти месяц, редиски они такие вот оказались.

    Короче вот, то что сделал zashita.rar

    если всё же доделаю соответственно выложу обновление.

    Жаль, конечно темка задумывалась для всех кто хочет научиться программировать МК на Си, но что-то как-то народ вяло раскачивается, хотя то тут, то там создаются темки с вопросами. Ладно пошёл спать, завтра на работу :)

  5. Вот термометр на 18B20, правда МК использован 16ф877, просто данный приборчик делался только как тренировочный.

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

    то велкам в тему http://forum.cxem.net/index.php?showtopic=57524&st=0

    Сам архивчик: temp.zip

  6. Короче после всех раздумий по поводу защиты от КЗ я решил, что проще будет её прямо в усилке реализовывать, вместо этого узла решил привинтить TDA8425, будет пред со всеми регуляторами только без ДУ, у меня его нету и ИК приёмника тоже, ну и за одно потренеруюсь в работе с I2C, микру сегодня уже заказал дней через 10 придёт, сейчас даташит качать буду и курить, курить ( даташит ) до посинения :) Фигово, что её в протеусе нема, буду ждать в железе, как долго, блин. :)

    Может у кого уже есть опыт по общению с данным зверем ? Я тут подумал, I2C мне лучше задействовать железную, а не софтовую т.к это побережёт ресурсы МК, верно или нет ?

  7. Да вот думаю над этим, чтобы из АЦП соорудить подобие компаратора, но пока это в голове, в коде и железе не реализовывал, надо продумать как это лучше сделать. А то, что в 877-м есть АЦП я знаю у меня защита от постоянки с использованием двух каналов сделана уже.

  8. Народ, ну может у кого есть мысли по поводу защиты от КЗ ? У меня уже кончились, осталась одна, но она требует внешней микросхемы компаратора, а я этого не хочу, охота. чтобы был только контроллер и использовать его по максимуму, если нет ни у кого дельных мыслей, (а скачало проект 28 человек) то может тогда прикрутить к МК индикацию уровня сигнала на светодиодах ?

    Что-то как-то вяло народ реагирует на всё, то по форуму куча вопросов, а теперь ветка есть и я тут сам с собой разговариваю :) Может моя конструкция нах никому не нужна и людям проще это на ИС собирать в виде отдельных узлов ? Ну давайте может кто ещё какой узел предложит, а ?

  9. Все кто решил начать программировать МК на Си заходите в эту тему http://forum.cxem.net/index.php?showtopic=57524

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

  10. Уважаемые профессионалы, я тут пытаюсь разработать защиту на МК, уже кое, что есть. Загляните пожалуйста вот сюда http://forum.cxem.net/index.php?showtopic=...mp;#comment-587155 и оцените, ну и покритикуйте, посоветуйте. Сейчас решаю задачу защиты от КЗ и интеграции её с МК хочу попытаться сделать её с минимумом внешних элементов использовав возможности МК и реализовав большую часть программно, либо сделать внешнюю схему и сигнал с неё завести на МК для отработки аварии, если есть схемка такая то подкинте.

    Уже сейчас в проекте работает: защита от постоянки ( на АЦП ), задержка подключения АС ( 5 сек ), управление вентиляторами по температуре ( вкл.+55, выкл. +45 ).

  11. Так проект защиты тихо валко, но двигается, просто соверщенно нет времени, могу, что-то проверять только по выходным. Вот, что получилось пока, модуль защиты от постоянки работает, сделал его на АЦП, модуль включения вентиляторов работает( включение +55, выключение +45). Сейчас думаю как прикрутить защиту от КЗ, уже есть кое-какие мысли задействовать для этого также АЦП, надо проверить будет, плохо, что в 16f877 нету модуля компараторов, было бы проще,ну да ладно. В программе пока не использовал ни прерываний ни собаку, пока чисто рабочий скелет. В архиве исходник, hex, проект протеуса.

    zashita.rar

    В проекте: L4, L5 - имитация реле.

    L3, L6 - сигнал авария по постоянке.

    L1, L2 - имитация вентиляторов.

    Задержка включения 5 секунд. Порог отключения по постоянке +- 0.2 в.

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

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

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

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

    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;

    всё.

  14. Можно сделать следующим образом, для определения на каком выводе 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

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