Jump to content

a_sergeevich

Members
  • Posts

    328
  • Joined

  • Last visited

Posts posted by a_sergeevich

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  5. Возвращаясь к защите на МК для УМЗЧ, АС.

    Узел защиты от постоянки на выходе будет на встроеном АЦП, вот набросал как хочу его сделать, согласно рекомендациям с vegalab-а, там была такая темка, но она померла, но так никто ничего не сделал помоему, имею ввиду в железе.Только пожалуйста не надо как там говорить зачем это надо,проще на дискрете, я просто учусь, а конкретно устройства для разработки,нужного мне, я не придумал.Кто хочет подключайтесь,буду рад. Сейчас пока определяюсь с внешними узлами,короче со схемотехникой.Да МК будет 16F877A т.к других нету.

    Режим работы АЦП:

    Опора от питания т.е +5 вольт.

    Источник тактового сигнала Fosc/8 ( согластно рекомендациям из дтш )

    Частота МК 4Мгц.

    Вот глянте, sxema.zip значения элементов пока конкретно не рассчитывал, но просимулировал в протеусе с такими и там вроде как работает, просто пока кроме протеуса у меня никаких железок нету,поэтому пока так.

    И ещё подскажите формулу как пересчитывать данные полученные от АЦП в напряжение.

  6. Мой тебе совет, поставь себе Proteus http://a_sergeevich.nxt.ru/Proteus%207.5SP3.zip и сходи по этой ссылке http://ikarab.narod.ru/ там есть ответы на все твои вопросы, про МК сейчас не заморачивайся в этом тебе и поможет Proteus. То, что тебе напишет Станислав мало чем тебе поможет, начни с основ, а они есть на вышеприведённом сайте, там всё разжёвано так, что остается только в рот положить и проглатить.Немного не с тех вопросов ты начал, а теперь вперёд на сайт и грызи гранит науки :) Удачи.

  7. Скачай тукую штуку от микрочипа, назвается "MPASM руководство пользователя" и читай, там и про мигание светодиодом есть, кстати это руководство на русском.Также полезно скачать "Справочник по среднему семейству МК PICmicro" от микрочипа, тоже на русском, очень подробно описана вся переферия самим производителем.

    Все это есть в инете поищи.

    По 16-й серии материалов на русском просто море, а уж про готовые изделия на них я вообще молчу, я ж не говорю, что 18-е плохие, я просто советую начать с того, для чего инфы больше.А если рассуждать про удобность то лучше сразу на AVR перейти и не париться, они удобней в программировании и команд у них больше, и инфы в последнее время много появилось на русском, и они дешевле,зачем спорить, человек спрашивает как ему светодиодом моргнуть,хотя при этом даже не сказал какой у него МК в наличии.А вообще проще поставить протеус и не долбать себе мозг первое время покупкой МК. ИМХО.

  8. Я думаю, что лучше все таки для начала взять 16F877 у него есть вся переферия на борту, русский даташит, море устройств на его базе, а перейти на 18-ю 24-ю серии и т.д уже потом можно, тем более для любительских, так сказать, целей может и вообще 12-й и 16-й серии хватит за глаза.Асм это конечно круто, но опять же для любительских нужд проще изучить Си т.к переносимость программ на нём в разы лучше и если приспичит практически безболезненно можно перейти на те же AVR, да и времени уйдет в разы меньше.Ну конечно же изучение внутренностей МК по даташиту это всё ни в коем случае не отменяет.Все это ИМХО.

  9. Вот переделал проект термометра на микроСи под 18B20 используя методу извлечения температуры, которую показал Alex.Правда с выводом значения на ЖК пришлось чуток помучаться, чтобы выводилось все нормально.

    Ну термометр у нас уже есть и для HI-TEC и для микроСи. Вот думаю может сделать блок защиты УМЗЧ на МК, один программный модуль уже есть, это контроль температуры, надо ещё добавить защиту от постоянки, задержку подключения АС, защиту от КЗ в линии АС.

    У кого какие мысли на этот счет ?

    Термоментр на микроСи: temp.zip

  10. Alex.

    Я разобрался все-таки почему твоя метода извлечения результата не работала в примере из журнала.

    Скачал даташит и сравнил 18S20 и 18B20, и увидел, что строение, если это так можно назвать , байта0 и байта1 разные у этих микрух.Зато теперь знаю это, в будущем буду даташиты внимательнее читать. :) Вывод если не нужна точность до десятых градуса и устраивает разрешение в 1 градус, то ставим 18S20 иначе ставим 18B20.Кстати купил вчера себе две 18В20, да, что-то дороговато 110 рублей за 1 шт, до этого брал Atiny2313 так он стоит 100 руб, думаю 18S20 должна стоить дешевле.

    Alex, а ты все эти функции для 1-wire, сам писал ?

  11. Так попробовал по вашему, чего-то не работает показывает не то.

    В примере если исправить строку tm = ( byte0 >> 1 ) * 100 + 75 - (( byte6 * 100 ) / byte7 ); убрав из неё ту часть которая согласно описанию повышает разрядность индикации, всё начинает показывать правильно, но разрядность уменьшается остаются только целые градусы, т.е строка имеет вид tm = ( byte0 >> 1 ) * 100.

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

    Получилcя следующий алгоритм извлечения температуры:

    Проверяем чему равен byte1 если 11111111 то температура отрицательная, если 00000000 то положительная.

    Далее значение которое находится в byte0 это наша температура.

    Если byte1 показал, что она отрицательная то тогда нам значение в byte0 надо тоже преобразовать в отрицательное,

    если вспомнить двоичную арифметику это можно сделать следующим образом, просто в значении byte0 заменяем нули на единицы, единицы наоборот заменяем на нули и к младшему разряду добавляем единицу, т.е ~( byte0 ) + 1.

    Всё преобразовали.

    Теперь выдернем из byte0 само значение температуры. В описании говорится, что значение температуры, целое число градусов, это 7-мь старших бит в byte0, поэтому делаем byte0 >> 1 и получаем нужное значение целых градусов.

    Программно будет так:

    if ( byte1 ) byte0 = ~( byte0 ) + 1;

    tm = ( byte0 >> 1 ) * 100;

    разрешение получаем в этом случае 1 градус.

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

    Правильно ли я вообще рассуждаю ?

    Теперь хотелось бы разобратся, что такое byte6 и byte7 , то что они играют роль для расширения разрешения это я понял, но мне не понятно как формула из даташита T = Temp_Read - 0.25 + ( Count_Per_C - Count_Remain) / Count_Per_C где Temp_Read целое число градусов, Count_Per_C это byte6, Count_Remain это byte7, преобразовалась в

    ( byte0 >> 1 ) * 100 + 75 - (( byte6 * 100 ) / byte7 ), ну ( byte0 >> 1 ) * 100 ясно, а вот откуда взялось 75, что это, короче хотелось бы понять, откуда ошибка с 0-м градусов лезет. :)

    Хотя по существу для домашнего термометра и разрешения в 1 градус хватит, но всё же.

    Может у кого есть даташит на русском по какому-нибудь датчику из серии DS1820, чтобы для HI-TEC функции накатать или может кто-то их уже написал отшлифовал и может выложить :) у меня есть и я их выложу просто они на другом компе дома, а я сейчас от него далеко и попаду туда только когда жена из больницы выйдет т.е где-то к 1-му декабря не раньше.

    Вообще я буду делиться всем, что у меня будет :)

  12. Alex

    В строке tm = tm << 4 если делим то сдвигать надо вроде вправо т.е tm = tm >> 4 или нет ?

    Просто из учебника цитата: сдвиг влево соответствует умножению первого операнда на степень числа 2, равную второму операнду, а сдвиг вправо соответствует делению первого операнда на 2 в степени, равной второму операнду.

    И ещё, а для 18S20 на сколько надо делить ?

  13. Вот проект термометра на pic16f877a, при небольшой переделке кода можно и pic16f628 зацепить.

    В архиве исходник на Си, сгенерированный асм файл ( для интересующихся ), hex- файл, файл проект протеуса версии 7.5SP3.

    Проект взят из журнала Радиоаматор 08 - 2006. Датчик тем-ры DS18S20. Диапазон -55...+100, точность +-0.5.

    temp.zip

  14. my504

    Я с Вами согласен, поэтому и предложил для рассмотрения HI-TEC и microC. Один прямо таки располагает к написанию своих функций, а вот второй больше располагает к использованию уже готовых библиотек. :) Поэтому я предлагаю не конкретно изучать язык Си для МК, а именно использовать его для каких-то задач.Например, человек начал, что-то делать, а у него проблема, не может он её решить, а задачу он решает именно на Си ну и чтобы не заводить 150 тем он свой вопрос задаст тут.

    И зная Вас по форуму как очень грамотного специалиста по МК (мне только сколько раз помогали) это касается и Alex, и wowa, и других, хотелось бы, чтобы заходили сюда чаще :).

    Странно, что ссылки битые, я сам оттуда скачивал, ну вот другая ссылочка на архив журналов: http://www.ddrservice.info/catalog/Journal...dioamator/2006/

    Возможно пропаду на какое-то время,наверное до декабря,жену в больницу положили вчера, так что пока не до PIC-ов и Си,так что извиняюсь.

  15. Ну насчет адекватный код на асм или нет, честно не знаю, но именно эти два компилятора заслуженно пользуются уважением на форуме microchip.su, а там ребята строгие :) . Вообще на счет этих двух компилей идёт в основном спор по библиотекам, в том плане, что у микроСи они закрыты от пользователя (сжаты), а у HI-TEC открыты, но у него их почти и нет. А так ведь оба компиля имеют разные опции оптимизации кода, да и асм-вставки никто не запрещал.Поэтому испытайте для себя тот и тот, посмотрите, и выбирайте.

    Просто пример, я когда начинал с нуля, сразу после мигания светодиодом решил написать программу частотомер по своему алгоритму, и написал, конечно не без помощи ребят с этого форума да и на микрочипе чуток помогли, но это скажем так, после недели изучения МК в общем. Писал на микроСи. Но это так моё мнение. А, Вы попробуйте, а потом решите надо или нет, но думаю понравится.

    http://tulinfo.ucoz.ru/news/2009-03-25-4 вот тут есть все журналы Радиоаматор.

    Для тех кто будет программировать на микроСи обязательны к скачиванию журналы Радиоаматор с 4 по 9 номера.

  16. Очень хорошо описан микроСи в журнале Радиоаматор 2006 год с 4 по 9 номер. Опять же сам язык Си со всеми ограничениями и отклонениями от стандарта обычного Си полностью описан в мануале по микроСи, на русском языке. Скачать саму среду разработки и сам мануал можно по приведённой мной ссылке: http://a_sergeevich.nxt.ru/microC.zip

    Сам язык, основные его концепции можно учить по любой книге по языку СИ ведь он стандартен в отличии от разномасных бейсиков. Т.е берёте любую, какая Вам больше нравится, книжку по Си и изучаете, затем смотрите в мануале ограничения и отличия его от языка микроСи в пункте "Особенности микроСи" и всё вперёд штудировать библиотеки :) А книг по Си в инете море,например очень хорошая книга Х.Дейтел, П.Дейтел "Как программировать на Си".

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

  17. Вот статейка реализация 10-ти разрядного АЦП на основе PIC16F877. Используемый компилятор HI-TEC PICC: http://www.pcports.ru/articles/pic7.php так же там имеется ещё ряд хороших статей по интеграции HI-TEC в MPLAB и др.

    Ещё одна статья по HI-TEC там он кстати в интегрированном виде с MPLAB идет и мне кажется его лучше использовать именно в таком виде т.к родной интерфейс очень страшный :)) http://habrahabr.ru/blogs/controllers/75312/

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

  18. Уже есть тема для Бейсика, асм это само сабой, а вот по Си темки нету, поэтому я и решил её создать.

    В данной теме хотелось бы рассматривать вопросы программирования на языке Си, а т.к компиляторов для этого языка и для PIC-ов довольно много то я предлагаю рассматривать тут два самых распространённых это HI-TEC PICC и microC.

    Почему именно они, спросит кто-то ? Просто данные компиляторы-среды две полные противоположности и вот в чём заключается их эта противоположность.

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

    HI-TEC PICC - это инструмент для тех кто предпочитает всё писать сам, досконально во всём разобравшись, т.к данный компилятор в своём составе имеет минимум уже готовых библиотек и всё надо писать ручками smile.gif Мануал на него краткий почти без примеров.

    Короче каждый сам решит для себя, что ему ближе. Мне ближе microC, но сейчас я изучаю и HI-TEC.

    И так, что нужно тому кто решил освоить программирование на Си для PIC:

    1.Желательно иметь сам контроллер, я предлагаю на эту роль избрать PIC16F877 т.к в нём есть вся нужная переферия, русский даташит, но можно и PIC16F628, у него правда нету АЦП, что является всё-таки минусом.

    2.Сами компиляторы: microC тут: http://a_sergeevich.nxt.ru/microC.zip в архиве две версии компилятора стандарт и про, а также мануал на русском. Предлагаю всем пользоваться про-версией.

    HI-TEC PICC берём тут: http://a_sergeevich....CC_V8.05PL1.zip , а мануал тут: http://a_sergeevich....ru/picc_env.pdf

    3.Для первого времени ну и вообще желательно иметь Proteus, тут версия 7.5SP3: http://a_sergeevich....teus 7.5SP3.zip внимание некотырые антивирусы ругаются на кряк.

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

    А теперь просьба ко всем, для облегчения дальнейшего общения:

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

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

    Давайте, чтобы у нас как в песне: вместе весело шагать по просторам ну, а песню напевать лучше хором smile.gif

  19. Да не вопрос. Только я думаю надо ветку отдельную создать. Завтра, ну т.е уже сегодня :) залью всю инфу, программы на какой-нибудь файлообменник, создам тему и выложу ссылки. Жди.

×
×
  • Create New...