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

Splav

Members
  • Постов

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

  • Посещение

Весь контент Splav

  1. @Alex а версия компилятора ХС8 RPO стоит того, что бы ее покупать? Интересен взгляд человека который владеет и пользуется. Оптимизация сильно влияет на размер и скорость выполнения кода? Есть ли какие-то еще полезные и стоящие плюшки?
  2. @Alex алгоритм не полный вышел, нагрузка включается при переполнении или при равенстве 0xFF. Проверка на больше и на равенство. Вот кусок из асм программы, почти как из листинга)) Вариант на Си получился очень больше в размере после компиляции. Но очень наглядный при написании. Это, конечно же ни для кого не секрет. Но есть куда расти и к чему стремиться. Все ведь только началось. @valentinovich может вы гениальная личность и изучение нового материала с умением его применить наступает мгновенно, но обычным смертным требуется на это время. Для усвоения, закрепления и приобретения навыков применения. Изучение происходит в свободное от основной деятельности время, несистемно. К тому же, программирование никак не связано с основным родом деятельности даже близко, это увлекательное хобби, поэтому, если даже асм не в "правильных блоках", не оптимален - я от этого не страдаю, при любом раскладе мне это приносит удовлетворение. Со временем получается намного лучше.
  3. @Alex спасибо, именно так это и работает в асме. Есть готовая рабочая программа. Быстрый алгоритм для обработчика прерывания. Регулятор мощности собран в железе. Сейчас начал изучать Си, поэтому решил тренироваться написать программы которые уже работают на асме и потом можно сравнивать. Но философия асма и Си отличаются. Обучение проходит в муках)))
  4. @ruhi изначально предполагалось использовать unsigned char a, отсюда вопрос по контролю переполнения. Позже стало ясно, что проще будет использовать unsigned int a. Но вы пропустили этот момент мимо. Вы смешной, пишите исчо, очень интересно.
  5. @ruhi что происходит в 8-ми битной переменной, если при сложении ее значение оказывается больше 0хFF? OxFA + 0x30, например? Какой результат сложения? Какое числовое значение будет? Вам не знаком термин остаток от переполнения? Вы не понимаете почему он важен и какой от него смысл? Не понимаю зачем тогда вы находитесь в профильном форуме. Да и ваши знания в математике тоже вызывают сомнения. Ваши версии выгладят бредово от недостатка знаний, тут уж никто не в силах помочь. В продолжении полемики не вижу смысла, читайте книги и прибудет с вами сила. Возможно. Но это не точно.
  6. @Yurkin2015 Да,верно, но выход неожиданно был найден. unsigned char x; void error (void){ static unsigned int a; a = x + a; //суммарная ошибка; if(a>=255){ // контроль максимума и переполнения; a = a - 255; // в обоих случаях необходимо привести к значению a<255; triac_pin = 1;// накопленная ошибка превысила допустимую, включить нагрузку; } } Получилось просто и понятно. Всем участвующим спасибо за наводящие вопросы и мнения, без этого бы не произошло.
  7. @ruhi это часть реальной задачи. Алгоритм Брезенхама. В "а" находится суммарная ошибка, как только переполнение или равенство максимуму - включить нагрузку. Куда же еще реальнее задача чем эта? Если контролировать переполнение и равенство, то больше никакой математики не надо. Проверка в прерывании, поэтому время имеет значение. Если переполнилось, то остаток уже находится в переменной. Если равенство, то сбросить переменную и включить нагрузку. В ассемблере этот алгоритм работает в железе. Теперь пришла очередь Си. А удивлять вы можете свою жену/подругу/детей/знакомых/соседку или еще кого нибудь(нужное подчеркнуть), я прошу конструктивного совета в конкретном вопросе. Конструктивные замечания будут? @IMXO спасибо. Двухбайтная переменная сразу решит все мои проблемы. @Yurkin2015 спасибо, ксор и логическое НЕ выглядят лучше, да, перегнул. А как лучше проверить на максимум? Вычитание 0xFF и проверкой на ноль - будет быстрее, ведь так?
  8. Доброго времени суток, уважаемые форумчане. Си, компилятор XC8. Появилась необходимость контролировать переполнение 8-ми битной переменной после операции сложения. Или использовать 16 битную переменную и раздувать объем? Все события будут в прерывании и стараюсь не делать лишних движений. Похожего решения пока не нашел. Думается, что будет выглядеть следующим образом: Я правильно улавливаю суть?
  9. @my504 Спасибо. Изучение Си началось не так давно, возникают вопросы, которые глупые. Пока все кажется новым, непонятным и непривычным. Знаний не достаочно. Опытного наставника рядом нет, подсказать и объяснить некому. Поэтому форум. Со временем, надеюсь, количество глупых вопросов будет уменьшаться.
  10. @Yurkin2015 Спасибо. Вчера в книге С.Катцена все таки нашел вскользь от этом упоминание. Компилятор CSS все далает сам. И в книге Уилмсхерста с компилятором C18 тоже вскользь об этом, но он PIC18 рассматривает, они от PIC16 отличаются. А надо ли в PIC16 указывать адрес прерывания, как это делается в PIC18, для разведения по сторонам прерывания высокого приоритета и низкого? Или будет достаточно написать void interrupt isr(void) { ....//опросить нужные флаги, отреагировать } и больше ничего?
  11. Доброго времени суток. Помогите разобраться. Начал изучать Си после Асм. Возник вопрос. Прерывания. Сохранение контекста, как с ним быть? Микроконтроллер PIC16. На асме все было понятно, сохранил контекст - опросил флаги - обработал - восстановил контекст и вернулся к главному циклу. А как в Си? В литературе не нашел примеров сохранения контекста в Си для PIC16. Обработчик прерывания сразу делает работу и все. Например, есть регулятор мощности на МК, по внешнему прерыванию считает ошибку по Брезенхему и принимает решение включать нагрузку в этот полупериод или нет. Быстрый код, по крайней мере в асме. В главном цикле занимается опросом АЦП, усреднением, и выводом информации на LCD - долгие процессы, особенно управление LCD. Если не сохранить контекст при входе в обработчик прерывания, то возникнут проблемы в главном цикле после возвращения в него. Как это правильно реализовать на Си? Программа во время компиляции сама ведь не сгенерирует необходимый код для правильного сохранения контекста Помогите разобраться, а лучше книжку посоветуйте где объяснения есть.
  12. @valentinovich Я вас не понимаю. Честно. Несколько раз пытался, но не смог. Вы мне пытались объяснить какое-то решение, которое не такое сложное, но такое же эффективное? Из этих слов я ничего не понял, наверное, не такой умный как вы. И почему вы решили, что что-то не срослось и не получилось? Все свои перечисленные требования к устройству выполнил. Схему собрал в железе и испытал. Все работает как хотелось изначально. Бонусом к отсутствию помех получил - равномерное распределение импульсов, а не работа пачками, гальваническая развязка, относительная простота для схем работающих по выбранному принципу регулирования мощности. Можно регулировать паяльник 25 ватт, а можно нагреватель на 1-2кВт. Во втором случае перечисленные бонусы будут полезными. Об этом было сказано выше. Если вы внимательно читали, то правильных идей я не просил, учить никого не пытался. Схема была предоставлена "как есть", из расчета что будет кому-нибудь полезна. А к критикам "для меня это очень сложно, я не понимаю поэтому какашка", таким как вы, всегда спокойно отношусь. Цитировать в споре субъективное мнение третьего лица это просто вишенка на торте)) Добавил вторую прошивку. Pic12F675_Power_reg_Bresenham_half_cycle - регулирование мощности пропусками полупериодов сетевого напряжения в нагрузку. Прошивка из первого поста. Pic12F675_Power_reg_Bresenham_full_cycle - регулирование мощности пропусками полных периодов сетевого напряжения в нагрузку. Ток всегда симметричен. Pic12F675_Power_reg_Bresenham_full_cycle.hex Pic12F675_Power_reg_Bresenham_half_cycle.hex
  13. @Falconist При регулировании мощной нагрузки будет важно распределение импульсов во времени. Например 30%. Значит 3 импульса из 10 уйдут в нагрузку, 7 ожидание. Таймер будет делать пачки 3 импульса подряд, 7 пропуск и так по кругу. Алгоритм Брезенхема будет пропускать каждый третий импульс в нагрузку. Более равномерное распределение очевидно. Выше писали про то как заморгали лампочки в подъезде от дискретного регулятора. Такой же эффект наблюдал иногда в паяльных станциях при работе фена. Кстати, я никого не призываю и не агитирую на повторение. Делать или нет решает каждый для себя сам, исходя из своих сил, умений и желаний.
  14. @Falconist Про синхронизацию поясню подробнее. Мк получает импульс и происходит прерывание. В прерывании МК считает мощность и зажигает или не зажигает светодиод отптопары. Расчет целочисленный без реализации ПИДа, поэтому очень быстрый - занимает всего 9мкс в худшем случае. Так же запускается таймер если оптопара зажглась (начало отсчета 5мс задержки), что бы погасить светодиод оптопары на пике полуволны - симистор будет гарантированно открыт и удерживать заженой оптопару уже не имеет смысла. Читал что импульса в 2мс достаточно, но решил, что так будет надежней. В обработке прерывания МК ставит флаг, который разрешает работу основного цикла. В основном цикле происходит измерение напряжения на R6, процесс этот относительно долгий и в быстрое прерывание ему нельзя. После этого программа основного цикла переходит к ожиданию флага из прерывания. Таким образом, прерывания максимально короткие и реакция на событие своевременная, без опозданий. Получили событие - почти мгновенно на него отреагировали. В основном цикле происходит вся работа, требующая времени. @avv_rem я же сразу написал, что регулятор для нагревателей. Лампочки в подъезде моргают скорее всего, что сеть слабая, это следствие. Зудящие моторы хододильников это тоже следствие слабой сети и недостатка управления полупериодами. При нечетном количестве происходит подмагничивание из-за несиметрии тока в синусоиде. Для того, что бы избавится от вероятности подмагничивания надо управлять целыми периодами - ток будет симметричным. От стрелочного вольтметра, если он не среднеквадратичный вообще толка будет мало, хоть на полупериодном управлении, хоть на фазоимпульсном. Форма напряжения далека от синусоиды - погрешность будет конская.
  15. @valentinovich схема из “Радио” 2007, №12 имеется ввиду? Не разобрал толком в этом потоке сознания. Любая задача решается исходя из условий, располагаемых знаний, средств и опыта. Кашу можно и руками сырую есть на корточках, но лучше приготовленную, ложкой, сидя за столом.
  16. Это называется скорее дискретностью)) 10 мс, физически полупериод сетевого напряжения, это не дискретность, это всего лишь квант мощности. В этой схеме используется счетчик 8 битный - вмещает 255 единиц. Значит разрешение регулятора (точность установки мощности) составит 1/255*100% = 0,39% по отношению ко всему периоду. А весь период = 255*10мс=2,55с в 50Гц сети. Как-то так.
  17. Смотрел на одну из вариаций этой схемы. Регулятор на ИЕ8 дискретный. Именно это обстоятельство заставило задуматься. Или много выключателей городить, или галетный ставить. К тому же, обвязка микросхемы, в принципе, одинаковая. Хотелось плавности как в аналоговых регуляторах, но что бы была цифровая тишина.
  18. Немного предыстории. Более 17 лет назад, будучи подростком, мною был собран простой регулятор мощности паяльника на диодном мосту, тиристоре, нескольких транзсторах и нескольких пассивных элементах. Классическая схема, таких схем можно найти уйму в интернете без труда. Отличная надежная схема, проверенная годами, однажды собранная - она просто работает. Так было и у меня. Она работала, работает и будет работать. Единственный недостаток - фазоимпульсное управление, которое выбрасывает в сеть широкий спектр помех. Маленький паяльник, но компьютерные колонки сразу дают фон, паяльник издает характерный треск. В тихой обстановке это слышно без труда. Можно отгородиться от помех LC фильтром, но это борьба со следствием, а не с причиной. Решение проблемы - регулятор, который будет пропускать определенное количество полу волн сетевого напряжения, в зависимости от установленной мощности. В моем понимании регулятор мощности должен иметь орган управления - переменный резистор, быть гальванически изолированным от сети. Безопасности много не бывает. Управление нагрузкой - алгоритм Брезенхема. Для нагревательных элементов это отличное решение. Паяльников с мало инерционным нагревателем у меня нет, поэтому работу с ними не имел возможности проверить. С обычным все работает отлично. Схема регулятора. Кратко по схеме. Регулятор синхронизирован с питающей сетью детектором перехода сетевого напряжения через ноль. Элементы C6-C7, R7-R10, VD2-VD7, VT1. Найти оригинал этой схемы на английском в сети с описанием работы не составит труда. На первый взгляд он сильно навороченный, ведь можно обойтись гасящим резистором, диодом, оптопарой и получить то же самое. На мой взгляд это мнение имеет обратную сторону. Все оптопары имеют свойства с течением времени, с наработкой часов, деградировать и терять свой коэфициент передачи тока. В изображенной схеме оптопара работает в импульсном режиме и выдает импульс длительностью всего 1мс за полупериод, а значит ее ресурс будет выше в 5-8 раз относительно простейшей схемы. Остальные элементы детектора намного надежнее. Так же мощность, выделяемая теплом около 100 миливатт, все компоненты постоянно холодные. Управление нагрузкой осуществляется силовым симистором в паре с оптосимистором, и обвязкой. VD1, VD8, R11-R13, C8. R12-C8 - снабер для защиты от импульсных помех и при работе на нагрузку с комплексным сопротивлением. В каждом конкретном случае эта цепь может быть рассчитана под конкретные условия. В схеме указаны номиналы из даташита для общего случая. Если необходимо включить нагрузку в определенный полупериод, подается импульс на оптопару длительностью 5 мс, на мой взгляд этого достаточно для надежного отпирания силового симистора в любых условиях. Остальные 5 мс полупериода оптрон выключен из соображений бесполезности его включенного состояния. Потенциометр R4 "Режим" отвечает за режим работы регулятора. Это подстроечное сопротивление. На мой взгляд маленький подстроечник это лучше чем паять перемычки или переставлять джамперы. Крутанул его - изменил режим работы. Быстро и просто. Найти легко, стоит копейки, доступен везде, можно добыть из старой техники без труда. Хотя, если нет необходимости менять режимы, то можно вывод микроконтроллера притянуть к питанию или земле сопротивлением 4,7--10кОм или заменить делителем из 2-х сопротивлений 4,7кОм для Режим2. Мною было принято решение сделать регулятор трех режимным, в зависимости от положения движка. Если напряжение на движке R4 в пределах (0--0,33)*Vdd, то это Режим1. (0,33--0,66)Vdd - Режим2. (0,67--1)Vdd - Режим3. Где Vdd - напряжение питание микроконтроллера. В моем случае Vdd=5в. Напряжение с движка резистора R4 измеряется каждый раз после включения регулятора в сеть, после инициализации микроконтроллера. После чего принимается решение в каком режиме работать. Переключить режим на лету во время работы не получится. Только при включении. Напряжение с движка R6 измеряется в начале каждого полупериода сетевого напряжения, то есть 100 раз в секунду. Производится 16 измерений, а затем значение усредняется, таким образом уменьшено влияние окружающего мира с помехами. Таким же способом измеряется напряжение с R4. Мощность, в зависимости от положения потенциометра R6, регулируется по режимам в пределах: Режим1 - 0--49% Режим2 - 50--100% Режим3 - 0--100% Чаще всего для паяльника использовал Режим2. Остальные режимы для универсальности регулятора. Его можно использовать с ТЭНами, электроплитами и другими нагревателями. Светодиод HL1 "Работа" моргает раз в секунду при работе регулятора. Индикация того, что контроллер не завис. Трансформатор можно использовать с напряжением вторичной обмотки 6В и током порядка 100 мА. Регулятор потребляет от источника +5В до 20мА во время работы нагрузки на 100% с указанными в схеме элементами и их номиналами. Для паяльников мощностью 25--100Вт охлаждения симистору не понадобилось. Его корпус в работе оставался холодным. Если надо управлять нагревателем 1000-2000Вт, то тут без радиатора не обойтись. Еще один плюс данного решения это уменьшенное выделение тепла на симисторе, по сравнению с фазоимпульсными схемами. Динамических потерь на симисторе нет (тот случай когда симистор открывается в середине периода). Симистор имеет всего 2 состояния, полностью закрыт и полностью открыт. При работе регулятора полностью исчез слышимый ранее треск в паяльнике и полностью исчез фон в колонках. Плавная и линейная регулировка мощности позволяют настроить мощность паяльника в зависимости от домашних условий (вечером напряжение ниже, днем выше) Печатная плата для регулятора мною не разводилась. Для испытаний все было собрано на универсальных макетных платах. Возможно, в будущем я это сделаю. Перед программированием микроконтроллера не забываем считывать калибровочную константу OSCCAL для тактового генератора, которая находится в конце адресного пространства памяти по адресу 3FF. Pic12F675_Power_reg_Bresenham.X.production.hex
  19. Нет, с ЕЕПРОМ работа при включении - считать значения и при возникновении отключения - записать значения. Но емкости конденсатора хватает с запасом. Гаражные сети - самые загадочные сети. В данный момент все работает как положено. Объяснения пока не нашел. Вот тут подумаю, спасибо. Контроль и дублирование настроек, а в случае их отклонения - запись по умолчанию.
  20. Пришел в гараж два дня назад. Вентиляция работает очень странно. Вынул PIC и пошел с ним домой. Считал его. Контрольная сумма в порядке. А вот в ЕЕПРОМе вместо адекватных значений обнаружил мусор. Прошил заново нормальными значениями. Для эксперимента прошил ПИК из другой партии и другой даты выпуска. Установил новую микросхему - работает. Накануне прихода в гараж по сетям 10кВ были аварийные отключения, знакомые энергетики рассказали. Возможно это стало причиной диких помех в сетях и мусора в ЕЕПРОМе.
  21. С момента первой публикации прошло больше года. Устройство все это время продолжает работать. Пришла в голову идея сделать этот циклический таймер более универсальным. Теперь время работы для каждого из режимов хранится в ячейках в ЕЕПРОМ. И может быть изменено без вмешательства в прошивку. Все остальное, описанное в 1-ом посте, осталось без изменений. Для изменения интервалов работы необходимо изменить значения в ячейках ЕЕПРОМ на этапе программирования МК. Время работы и время ожидания двухбайтная величина. Диапазон установки - 0 -- 65535 минут или секунд, в зависимости от прошивки. 65535 сек = 1092,25 мин = 18,2 час. 65535 мин = 1092,25 час = 45,51 сут. По моему мнению этого более чем достаточно для разных вариантов использования. Работает устройство про прежнему в трех режимах. -- Время работы режим 1 - ячейки 0х00 0х01, старший и младший байты соответственно. Время простоя режим 1 - - ячейки 0х02 0х03, старший и младший байты. -- Время работы режим 2 - ячейки 0х04 0х05, старший и младший байты. Время простоя режим 2 - - ячейки 0х06 0х07, старший и младший байты. -- Время работы режим 3 - ячейки 0х08 0х09, старший и младший байты. Время простоя режим 3 - - ячейки 0х0A 0х0B, старший и младший байты. -- Например, необходимые интервалы работы для 1-го режима буду 13 часов работы и 11 часов отдыха. Для минутной прошивки, с индексом min, величины будут следующими 13час*60 = 780 мин. 780dec = 30C hex. Значит, в ячейку 0х00 запишем "03", а в ячейку 0х01 запишем "0С" 11час*60 = 660 мин. 660dec = 294 hex. Значит, в ячейку 0х02 запишем "02", а в ячейку 0х03 запишем "94" Для секундной прошивки, с индексом sec, величины будут следующими 13час*60 = 780*60 = 46800 сек. 46800dec = B6D0 hex. Значит, в ячейку 0х00 запишем "B6", а в ячейку 0х01 запишем "D0" 11час*60 = 660*60 = 39600 сек. 39600dec = 9AB0 hex. Значит, в ячейку 0х02 запишем "9A", а в ячейку 0х03 запишем "B0" Для оставшихся режимов действия аналогичны. Значения по умолчанию: режим 1 - 60/120 (работа/отдых) режим 2 - 60/60 режим 3 - 120/60 Сразу после прошивки устройство находится в 1-ом режиме. Важно!!! Перед программированием не забываем считать калибровочную константу по адресу 3FF из ЕЕПРОМ fan_cycle_timer_min.hex fan_cycle_timer_sec.hex
  22. Доброго времени суток, форумчане. Назрел вопрос, которому я не смог найти в Гугле для себя внятный ответ. Побитовые операции при косвенной адресации. Будет ли работать вот такой код: DQ_LL movlw .6 ; movwf temp ; номер порта --> temp movlw PORTA ; movwf FSR ; PORTA --> FSR bcf INDF,temp ; PORTA,6 --> 0 movlw TRISA ; movwf FSR ; TRISA --> FSR bcf INDF,temp ; TRISA,6 --> 0 return Этот кусок в нормальном виде в работающем проекте выглядит так: DQ_LL bcf PORTA,SENS_1 ; очистить защелку порта bsf STATUS, RP0 ; bcf TRISA,SENS_1 ; направление порта - выход. bcf STATUS, RP0 ; return Так же интересует можно ли проверять бит регистра? Например вот так: movlw .6 ; movwf temp ; номер порта --> temp movlw TRISA ; Порт на вход movwf FSR ; TRISA --> FSR bsf INDF,temp ; TRISA,6 --> 1 movlw PORTA ; movwf FSR ; PORTA --> FSR btfsc INDF,temp ; Если кнопка не нажата, то ... ; сделать одно... ... ; иначе, другое... return
  23. Речь шла о совершенно ином устройстве, которое бы имело бы два датчика относительной влажности и температуры. По этим датчикам считалась бы абсолютная влажность и, на основании результата о количестве влаги в воздухе, принималось бы решение о включении или остановке вентилятора. Такие вычисления явно не по зубам применяемой микросхеме. Это был случай, когда я упоминал, что такая идея и алгоритм работы мною рассматривался. Она выполнима, но для этого нужен процессор помощнее, больше ног, больше памяти, больше внешней индикации. Повторюсь, в итоге задача свелась к созданию ржавого самоката)) С возложенными на него задачами он справляется))
×
×
  • Создать...