NebsteR

Pic. Общие Вопросы

504 сообщения в этой теме

NebsteR    743

Решил создать и прикрепить такую тему, ибо по мелким вопросам создавать новые темы - плохой вариант, а в "Начинающим с нуля (PIC)" писать не совсем простейшие вопросы тоже не годится.

И открою я её собственным вопросом.

Контроллер 12F675. Кто может объяснить, почему при полнобайтном доступе к регистру GPIO все записывается нормально:

MOVLW 0xFF
MOVWF GPIO

А при атомарном доступе GPIO0 и GPIO1 не хотят меняться из нуля:

BSF GPIO, 0x0
BSF GPIO, 0x1

При этом в даташите нет ничего, что могло бы блокировать эти биты...

Скажу сразу, в железе 675 сейчас нет. Такая картина наблюдается в протеусе, в симуляторе mplab в watch регистра GPIO биты управляются нормально. Ни в одном из используемых мной до этого пиках такого не наблюдалось ни в железе, ни в симуляциях.

Кто-нибудь с таким сталкивался и чего можно ожидать от железа?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
tcoder    282

Как одна из версий, что компилятор не понимает номера битов, записанных в шестнадцатеричной форме вида 0xXX

Попробуйте номера битов указывать в десятичном, а не в двоичном виде. Маловероятно, но возможно, что дело в этом. Я всегда просто указываю

bsf gpio,0

bsf gpio,1

- всегда работало без проблем (только не на этом контроллере и не на этом порте - мой контроллер попроще). Если не поможет, тогда ждем ответов.

Дополнение: судя по схеме этот вывод может использоваться для компаратора или ацп, вполне вероятно, что там где то может быть связь. На PIC16F628A столкнулся на началах с тем, что четыре бита занимали компораторы - которые по умолчанию подключены к шине и им всё равно, как я настраиваю TRIS. Выключил компараторы, и все заработало. Но правда в Вашем случае непонятно, почему тогда полнобайтная запись работает. Кстати содержимое регистра может отличаться от того что на выводах в зависимости от коммутации схем скорее всего.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
NebsteR    743

Понимает, сцобака :(

Для остальных портов все нормально, а для GPIO3 не имеет смысла, ибо он input only:

BSF GPIO, 0x2
BSF GPIO, 0x4
BSF GPIO, 0x5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
tcoder    282

Контроллер то необычный :) У него там какой то

скорее всего Вы наблюдаете read-modify-write эфект.
, связанный с медленным конденсатором каким то. Советуют изменять биты отдельного регистра, а потом целиком загружать в GPIO, и на Вашу проблему похоже - целиком то нормально записывается, а по отдельности походу там вообще неизвестно что получается.

Ссылочка на информацию

Изменено пользователем tcoder
  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
NebsteR    743

Угу, знаю про RMW в нем, однако это имело бы влияние на соседние биты, но не на целевой, который так или иначе явно устанавливается при modify...

Дополнение: судя по схеме этот вывод может использоваться для компаратора или ацп
Да, при инициализации отключаю всю периферию, ибо мне нужно минимальное потребление, 99.9% времени пик проводит в sleep, пробуждается по wdt. По расчетам выходит около 18мкА среднего потребления пика и около 250мкА потребление всей схемы, схема коммутации реле по событиям с автономным питанием.
Кстати содержимое регистра может отличаться от того что на выводах в зависимости от коммутации схем скорее всего.
Да, но нагрузки на портах нет, нечему настолько просаживать напряжение.

-----

Такс... Проблема действительно в RMW, я не учел то, что у меня в данный момент биты устанавливаются последовательно, из-за этого действительно предыдущий сбрасывается... Однако такое наблюдается только на GP0/GP1, странно...

Окей, значит будем сами использовать ram буфер, в данном случае сойдет... Однако надо будет что-нибудь придумать с этим в случае использования прерываний, а то может возникнуть очень плохая ситуация, когда прерывание, обрабатывающее порт через буфер, возникнет после считывания GPIO в буфер основным циклом и до записи модифицированных данных обратно в регистр... И в итоге, после короткого скачка, значение порта не будет учитывать изменения, внесенные прерыванием...

Как-же хреново без LAT регистров...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
tcoder    282

А если исключить чтение GPIO в буфер? (в том случае если "на вход" ничего нет). Т.е. работаем мы только с буфером всегда (в т.ч. и в прерываниях). А вот отдельная часть программы просто копирует ("отображает") буфер периодически в GPIO. Тогда что бы не случилось, если используются побитовые операции над буфером - всегда всё в норме будет.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
NebsteR    743

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 280

поставте пару тройку нопов и все заработает....(от эффектов емкостной нагрузки это не спасает...)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
NebsteR    743

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

ЧМЗ.

IMXO уже сказал - нопы спасут. На момент изменения второго бита, на первом ещё не сформировался нормально уровень. При доступе ко второму, процессор читает весь порт, модифицирует второй бит и выкидывает данные обратно в порт. А на первом, при чтении, реально не то значение, которое записали. Вот и происходит такая бяка )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
NebsteR    743

Именно :)

Вообще плохо, что этого пика нет в железе у меня, а то посмотрел бы порты и их фронты воочию осциллом, любопытно ж :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fuckir    6

в битовых ситуациях считаю лишней тратой времени писать пояснения системы исчисления типа "Н","х","D",".", "В". Всё работает без лишних пояснений ибо 0 и 1 будут везде 0 и 1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

А причём тут 0-1 ? В коде написан через "x" номер бита.

Или я Вас не допонял ? :mellow:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
NebsteR    743

fuckir, это не булевое значение, а адресация к номеру бита... В данном контроллере до 0x07, а в 16-битных до 0x0F.

Ясен пень, что адрес 15 воспримется точно так-же, однако в hex удобней и привычней :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fuckir    6

Cогласен.

Я конкретно данного контроллера... записывая номер бита можно не пояснять компилятору систему исчисления. Есть конечно такие варианты как: в настройках среды программирования установить систему по умолчанию.

Может просто дело привычки. я 16-ричную в асме пишу не через "х" а "Н" а десятичную через точку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
NebsteR    743

Дело привычки :) В си де-факто (а может и де-юро) принято 0x для hex и 0b для bin :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
lc433    33

Надеюсь, обратился по теме. Имеется довольно мощный коллекторный двигатель, обороты которого регулируются большим блоком управления с тиристорами на 25А. Теоретически, этот блок можно выкинуть и поставить PWM-управление и полевой транзистор Power MOSFET. Для данных параметров двигателя имеющиеся в наличии транзисторы слабоваты. Не хватает мощности, сильный перегрев во время эксперимента.

Идея запуска двигателя заключается в распределении мощности на три транзистора, каждому поровну. Но у МК имеется только один выход PWM. Как наиболее правильным образом осуществить распределение мощности, когда каждый транзистор работает какое-то время, потом переключается на следующий?

Если взять МК с двумя ПВМ, не облегчит ли это задачу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
chip-chip    1 489

Параллельте МОСФЕТы - это полевые транзисторы и не требуют уравнивающих сопротивлений. Сток-сток, исток-исток, затвор-затвор. Если драйвер управления не стоит - надо поставить. Емкости затворов складываются и в момент переключения будет большой ток.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
lc433    33

Драйвер управления - МК. Поэтому-то и интересуюсь алгоритмами перераспределения мощности. Может можно затворы отдельно, а исток-сток - параллельно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 280
Имеется довольно мощный коллекторный двигатель, обороты которого регулируются большим блоком управления с тиристорами на 25А. Теоретически, этот блок можно выкинуть и поставить PWM-управление и полевой транзистор Power MOSFET.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
chip-chip    1 489

Драйвер управления полевыми транзисторами - гуглим :use_search: ! Параллельное подключение ПТ - :use_search: ! Потом все внимательно читаем! Если блок промышленный - не лезь туда! Советская техника сделана на века и в улучшениях такого плана не нуждается!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
lc433    33

В том то и дело, что эта советская техника уже едва дышит. В оригинальном идёт согласование с тахогенератором, но эта проблема решаема с помощью входа АПЦ. Предполагаю использовать простой PIC16F716, без наворотов. И потенциометры для прецизионирования рабочего режима.

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

Что думаете о сдвиговом регистре, подсоединенном к выходу PWM?

Не лезь туда! Советская техника сделана на века!

Блок БУДЕТ выброшен. Это не обсуждается. Насчёт веков я бы так не горячился, смотря какой уход и какие условия эксплуатации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
chip-chip    1 489
однако может сказаться разброс параметров.
Какие параметры? Какие разбросы? Почитайте литературу о полевых транзисторах, особенно в плане параллельного подключения.

Что думаете о сдвиговом регистре, подсоединенном к выходу PWM?

Ничего! Я даже не представляю его назначение в ШИМ! Затея мутная - а знаний у вас маловато. Сделайте http://electronics-lab.ru/blog/82.html Эта схема рабочая!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 280
Затея мутная - а знаний у вас маловато. Сделайте http://electronics-lab.ru/blog/82.html Эта схема рабочая!

их там просто нет... а по схеме стоило бы поинтересоваться что в понимании тридцать-третего "довольно мощный" и уточнить количество фаз сети...глядишь вопросы о применении ШИМ отвалятся сами собой.... а ломится товарисч в сторону ШИМов по причине полного непонимания работы тиристоров и "точках естественной коммутации"
  • Одобряю 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
chip-chip    1 489

Вот вот! Если ему надо действительно высокомоментный привод на три фазы мощностью до 10кВт - у меня есть почти новый ЭПУ-1М. Продам по сходной цене! ;)

  • Одобряю 1

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Stratix
      Здравствуйте, у меня проблема с прошивкой разных устройств из-за программаторов. Дело в том что у меня есть некоторое количество китайских и самодельных программаторов для разных производителей, с ними постоянно какие-то проблемы, некоторые отказываются нормально работать на windows 10(другие версии ПО не устраивают), другие не работают с последними версиями сред разработки и т.д. Так же нужно прошивать схемы памяти. Хочу прошивать устройства без постоянной сборки программаторов и неудобств. Думаю о двух вариантах: взять оригинальные программаторы для всех производителей: altera, xlinx, arm, pic, avr(некоторые найти сложно, например оригинальный usb-blaster и высокая стоимость в сумме), второй вариант: взять универсальный программатор, который бы поддерживал все новые микросхемы, а вот с этим проблема, большинство универсальных программаторов не шьют stm, плис. Есть ли вообще реально универсальные программаторы? Мне было бы намного удобнее если на столе б лежал один программатор, а не куча. Смотрел список микросхем chipprog-48, пока что самый большой, к сожалению не поддерживает новые fpga, например: cyclone IV. Связывался, сказали что поддержки не будет и в будущем. Стоит ли взять chipprog-48 в 2018 году или есть программаторы лучше, с большим списком микросхем?
    • Автор: Дмитрий Дмитрий
      Здравствуй, добрый Алл.
      Задумал сделать сенсорный выключатель (блокировщик) двери. Задача: при двойном прикосновении к поверхности пластикового выключателя подать на управляющий контакт +5В.
      Реализация:  Использовать контроллер емкостного сенсора AT42Q1010, микроконтроллер PIC10F200.
      Логика: при полном закрытии двери,  срабатывает геркон, подается +5В на схему. На схеме расположены емкостной контроллер AT42Q1010 и микроконтроллер PIC10F200. Емкостной контроллер при прикосновении пальца дает сигнал на цифровой выход. Этот выход соединен со входом PIC10F200. В PIC10F200 крутится программа, определяющая двойное прикосновение, с заданными промежутками времени (ориентируюсь на обычный двойной клик мыши). Как только определяет двойной клик - подает на три GPIO выхода +5В, и уходит в пустой цикл, до снятия питания.
      С одного GPIO питаются светодиоды: 2 шт, 1.8 В, 1 мА, удалены на 3 метра, подключены кабелем 3х2.5 мм2.
      Со второго GPIO активируется герконовое реле 5В, 10мА, размыкающее наружную клавишу открытия двери.
      С третьего GPIO питаются светодиоды: 2 шт, 1.8 В, 1 мА, удалены на 3 см. Они находятся в том же выключателе, где будет смонтирована схема.
      Для повторного запуска нужно открыть - закрыть дверь. Питание будет отключено-включено, программа запустится с нуля.
      Вопросы:
      1. Нормально ли цеплять светодиоды прямо к PIC контроллеру, на такую дистанцию? Потери посчитал, выходит в районе 1%. Думаю проблем быть не должно, но чувствую кощунственность решения.
      2. Нормально ли PIC контроллер отнесется к многократному хард ресету? Дверью пользуюсь 50 раз в день. Это каждый раз снятие питания, включение обратно.
      3. Какое время на загрузку ожидать от схемы? Т.е. через какое время после полного закрытия двери я смогу заблокировать дверь. Судя по документации на емкостной контроллер , оно меньше 100 мс. Микроконтроллер PIC около 30 мс (reset time). Я нигде не ошибся?  
      4. Нужно ли вставлять резистор между герконовым реле блокировки двери и микроконтроллером? Расстояние от микроконтроллера до реле около 2 метров. Насколько я понимаю, желательно использовать токоограничительный резистор около 1 кОм, но методика точного расчета номинала мне не известна.
      5. Нужно ли вставлять резистор между дальними свтодиодами и контроллером? Ближним и контроллером? Для понижения напряжения я планирую в обоих случаях использовать резисторы 1.5кОм и последовательно подключать два диода 1.8 В,  1 ма. Этого достаточно? Диоды и резистор располагаются на крышке выключателя.
      6. Для подбора конденсатора нужной емкости для сенсора прикосновения хочу использовать макетную плату (такая пластиковая, с много рядов отверстий), и кучку кондеров из чип и дипа, около рекомендованной емкости.  К ним припаять проводки и по очереди проверять, каждый раз скидывая питания. Это верная методика или есть способ лучше?
      7. Имел ли кто дело с таким емкостным контроллером? Насколько plug and play решение? На внутреннюю часть выключателя планирую наклеить медную фольгу, номиналы конденсаторов и резистора подобрать на столе. Потом все собрать на печатной плате, смонтировать в корпус выключателя. Не уплывет ли со временем точность такого сенсора? Может быть на плате предусмотреть какие-то элементы для подстройки в будущем?
      8. Я выбрал самый младший из PIC  контроллеров. Могу ли я столкнуться с нехваткой памяти в своей задаче? Портов хватает. Может быть я не учел какой-то еще ресурс, которого не хватит для выполнения этой задачи?
      Даташит на емкостной контроллер  https://ru.mouser.com/datasheet/2/268/40001946A-1145216.pdf
      Даташит на PIC  контроллер http://ww1.microchip.com/downloads/en/DeviceDoc/40001239F.pdf
      С уважением,
      Дмитрий.
    • Автор: eestyk
      Имеется микроконтроллер dsPIC30F5011. Хочу реализовать на нём ШИМ через Output Compare Module, так как у этого модуля есть как раз режим PWM. Всё проинициализировал, задал период и коэффициент заполнения ШИМ (duty cycle - 50%), выбрал Timer2. На соответствующей ноге тыкаюсь осциллографом, ничего нет. Не могу понять в чём проблема. Вроде по даташиту настроил правильно.
      #define PERIOD_PWM 12484 #define PERIOD_PWM_div2 6242 WriteTimer2 (0); OpenTimer2 (T2_ON & T2_GATE_OFF & T2_IDLE_STOP & T2_PS_1_8 & T2_32BIT_MODE_OFF & T2_SOURCE_INT, PERIOD_PWM); ConfigIntTimer2 (T2_INT_PRIOR_5 & T2_INT_ON); OpenOC3(OC_IDLE_STOP & OC_TIMER2_SRC & OC_PWM_FAULT_PIN_ENABLE, PERIOD_PWM, PERIOD_PWM_div2); ConfigIntOC3(OC_INT_PRIOR_0 & OC_INT_ON); void __attribute__((interrupt, auto_psv)) _T2Interrupt(void) { IFS0bits.T2IF = 0; // Clear Timer interrupt flag Nop(); } void __attribute__((interrupt, auto_psv)) _OC3Interrupt(void) { IFS1bits.OC3IF = 0; // Clear interrupt flag }  
      dsPic30F5011-5013.pdf
    • Автор: Евгений Бабок
      Господа, здравствуйте. Не ругайтесь, пожалуйста, я студент и я учусь. Возможно, вопрос будет глуповат. Подскажите, пожалуйста, чем можно заменить PIC32MX775F256H для САПР Proteus. Или намеки как подобрать анлог. Имеется код и принципиальная схема некого проекта на данном микроконтроллере(в Proteus нету 32х битных PIC). Я хочу создать его в Proteus,разобрать его и с ним поработать, но необходим другой микроконтроллер(скорее всего 16битный PIC) т.к. данного в протеусе нету. 
      Повторюсь, что я учусь,а учиться лучше на примерах, а не изобретать колесо. Спасибо.