#pragma config FOSC = INTOSC #pragma config WDTE = ON #pragma config PWRTE = OFF #pragma config MCLRE = ON #pragma config CP = OFF #pragma config BOREN = ON #pragma config CLKOUTEN = OFF
// CONFIG2 #pragma config WRT = OFF #pragma config STVREN = ON #pragma config BORV = HI #pragma config LPBOR = OFF #pragma config LVP = ON
Да, вот тут сбрасываю, как написано в даташите PCONbits.nRMCLR = 1; PCONbits.nBOR = 1; PCONbits.nPOR = 1;
Подскажите начинающему PICоводу. Есть устройство на pic18f2550 на котором реализована PS2 to hid клавиатура плюс дополнительные функции обработки ввода с ps2 клавиатуры. Если USB подключен к ПК то все работает нормально но если USB отключить то как я понял контроллер зацикливается на прерывании от USB и не выполняется основной код. Использую среду mikroC for PIC PRO и стандартную библиотеку USB. Подскажите, может нужно как то определять подключения USB и если не подключен то отключать его в коде до появления физического подключения? Хотя я думал это должно быть реализовано в библиотеке. Кто работает с подобными проектами может смогут подсказать. Второй день мануалы курю безрезультатно. Спасибо
как я понял контроллер зацикливается на прерывании от USB и не выполняется основной код.
Стек HID USB device- это машина состояний, где исполнение функций в цикле while (1) определяется этим самым состоянием. Стек не может зацикливаться в прерывании от USB в состоянии DETACHED по определению, потому что эти самые прерывания могут возникать лишь при наличии входящих пакетов от хоста. Впрочем, он вообще не может циклиться в прерывании. Свой код должен быть вставлен в этот цикл и так же управляться машиной состояний стека (когда нужно - забирать передавать данные, когда нужно - выполнять код режима отключения). А вообще, у Микрочипа есть MLA, где имеется и HID USB device. Даже пример для клавиатуры есть. Из него, полагаю, можно запилить и мост из PS/2
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Пример из mikroc тоже прекрасно работает пока USB подключен. Может есть возможность определить подключен ли USB? Может кусочек кода у кого есть? Спасибо.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
2 - это номер бита в переменной _flag, который Вы устанавливаете командой bsf. Поскольку в определении структуры этот бит третий, то естественно, что его номер будет 2 (счет от 0)
Э... я считать умею. Суть вопроса в том, что если я переопределю структуру, в ассемблере у меня этот BSF "уплывёт". Можно ли избавиться от константы "2"?
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
доброе время суток, ой понимаю что тема заезжена, но код я так и не нашёл, глаза уже болят, а гугол помойка, поэтому прошу, есть ли у кого эффективный код конвертации числа формата long в двоично-десятичное .
_________________ Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Привет всем. Есть несколько вопросов к профи по си. На асме более менее пишу, но всё чаще посматриваю в сторону си. Литература разная на компе есть, давно уже накачал. Начинаю читать, вроде понимаю о чем конкретно говорится в том или ином предложении, но как это применять, мозг работает в ассемблерном стиле. Никак не могу понять как соотнести асм и си. Может кто что посоветует? Такое ощущение что не могу словить какую-то фишку.
И ещё вопрос, связанный уже с удобством написания на си. Я понимаю, что сишный компилятор многое берет на себя. Обратился к переменной - не надо думать о банке....итп. Но как понять границы этой "интеллектуальности". К примеру, я определил начало прерываний org 0x04, и тут же возникает вопрос, - а контекст надо сохранять, или компиль сам поймёт к чему я обращаюсь в прерываниях и соответственно всё устроит лучшим образом? То же самое например с таблицами: достаточно описать алгоритм с несколькими сценариями как функцию и он сам создаст таблицу, или же всё таки мне её вручную создавать (как это я делаю сейчас на асме)? Короче, не могу уложить такие вещи в голове, а без этого даже что-либо начать, прикинуть не могу. Например я видел в чужих кодах при инициализации строчки типа: porta=0. По сути это как в асме, я бы написал clrf porta, и получается, что разница в данном случае не существенна, а это сбивает с толку.
С компиляторы для PIC не ограничиваются только XC8. Как минимум, есть еще MikroC и CCS, которые довольно сильно отличаются от XC8 в деталях реализации особенностей PIC. Особенно этим отличается CCS. Поэтому надо сначала определиться с компилятором. XC8 бесплатный в варианте "совсем без оптимизации", а этого хватает не всегда. Вариант PRO "с подпиской", где оптимизация работает хорошо, но каждый месяц нужно платить за продление лицензии в России не продается. Да, он есть на Microchip Direct, но купить его нельзя, отправляют в Гамму, а там говорят, что недоступно из-за особенностей законодательства и купить можно только бессрочную лицензию (по цене это примерно 3 года, с хвостиком, лицензии с подпиской). Mikro C бесплатный для программ размером кода после компиляции до 2 кБ и не работает под Linux (под Wine работает, но подглючивает). CCS только платный.
groot:
Для начала надо сам С изучить, многие вопросы отпадут в принципе. В частности, станет понятно, что в С есть нормальные операторы управления потоком, которые исключают необходимость таблиц переходов. Но если они сильно нужны, то есть указатели на функции, которые, естественно, можно собрать в массив. Процедуры обработки прерываний делают все сами, и размещаются там, где надо сами. Только такую процедуру надо описывать как interrupt, а вот тонки такого описания в разных компиляторах различаются. Например в CCS это делается через pragma. И контекст такие процедуры сами сохранят.
Ну и никакие таблицы с константами через retlw не нужны. Просто описываете инициализированный массив и получаете нужно значение обратившись по индексу. Все остальное сделает сам компилятор.
С не только исключает необходимость следить за банками RAM и страницами ROM, там еще и стек не ограничивается 8 уровнями (midrange). Понятно, что аппаратный стек никуда не девается, но если его не хватает, то используется программный стек полностью управляемый компилятором. Фактически, там вместо call и return используется прямое обращение к PC и PCLATH. Но есть и ограничения, по сравнению со стандартом С. Например, размер структуры или массива не должен выходить за границы банка, а размер процедуры быть больше страницы. Опять таки, это может зависеть от компилятора.
Еще на С не очень удобно работать со сдвигами. Например, вывод байта в разряд порта (программный URT или I2C) на asm легко делается через сдвиги (циклические сдвиги, если надо сохранить байт) и бит C в STATUS. На С нет циклических сдвигов, обычные есть.
В общем, к мышлению в стиле С, конечно, придется привыкать. Но не так это и страшно. Кстати, всегда можно посмотреть asm файл сгенерированный компилятором, что позволит лучше понять взаимосвязь конструкций. Ну и ошибки найти, я вот в CCS нашел одну, обещали исправить.
_________________ Мир вокруг нас разумен настолько, насколько разумны мы сами. Профессионал не обязательно говорит умные слова, но зная самые глубины, способен объяснить их любому "на пальцах".
ektsysto, благодарю за развернутый ответ. Кстати, а каким тогда лучше всего компилятором пользоваться, если получается что там не всё так просто и много всяких ограничений и прочих нюансов? А насчёт изучать си - по возможности я и так читаю разную литературу и в принципе понимаю каждое предложение. Но проблема с применением этих знаний. К примеру, идёт описание if...else, и я понимаю, что если выражение истинно то выполняется то, что "здесь", а если ложно, то "там". Ладно, что тут не ясного. Вот только возникает куча вопросов, - как это всё будет в ассемблере, как часто это будет происходить в коде, зачем, например, мне постоянно дёргать ногой, если нужно всего один раз, то есть я хочу контролировать код на уровне асма, понимать что в итоге получается, но здесь с этим непонятка.
К примеру есть задача, которая на асме решается без проблем: при нажатии кнопки, led загорелся, при следующем нажатии - потух; иными словами простой делитель на два. На асме я могу сделать так: создаю флаг, который поднимается в прерываниях (каждые 20ms) и всегда проверяю его в основном цикле. В итоге я периодически (20ms) опрашиваю ножку порта и сравниваю её текущий уровень с флагом (дублирующим). Однажды происходит расхождение и я получаю два четких сценария исполняемых однократно: либо нажали, либо отжали, и там пишу все то, что хочу сделать по любому из этих фактов (инвертировать led), а потом при выходе инвертирую дублирующий флаг (устраняю несоответствие) и все происходит вновь. Таких процедур может работать одновременно сколько угодно от любого количества ног и ничего ничему не будет мешать или задерживать. Но главное я прекрасно понимаю как это работает непосредственно на уровне асма. А как к примеру реализовать этот же алгоритм на си?
Разница в компиляторах начинается на уровне нюансов. Оптимальным, на мой взгляд, является XC8. К тому же потом можно легко перейти на XC16 и XC32. Но, как я уже сказал, бесплатная версия отличается полным отсутствием оптимизации. По моим наблюдениям это дает раза в 2 - 2.5 больший объем кода и скорость работы раза в 3 ниже, чем с оптимизацией лицензии PRO (там есть возможность 2 месяца бесплатно тестировать PRO). Стоимость лицензии PRO для XC8 варианта "рабочая станция" составляет 995 USD, что многовато для начинающих и тех, кто не зарабатывает этим деньги. Подписка в России не продается, проверял сам.
Mikro C бесплатно позволяет генерировать до 2 кБ кода. Не работает под Linux (для меня очень критично). Платная версия стоит 249 USD. Особого ничего сказать не могу, только немного погонял на простеньком примере. IDE навороченная, но это к компиляции имеет довольно опосредованное отношение. Кстати, этот же производитель делает и компилятор Pascal и Basic.
CCS использую сам. Версия командной строки для Linux. Есть и версия с IDE. Без IDE может компилировать только один файл, но это легко обходится через include, хотя добавляет неудобств. У компилятора разные версии, PCB, PCM, PCH, PCD под base-range, mid-range, extended mid-range, PIC24. И покупать их надо по отдельности. От прочих компиляторов отличается скрытостью описаний контроллеров и некой оберткой маскирующей физические отличия контроллеров. То есть, прочитав документацию на контроллер прямо так один в один к компилятору ее не применить. Зато появляется переносимость, так как функции работы, например с PWM будут работать на любом контроллере, даже если у него регистры по иному устроены. Опять таки, у него приличная библиотека, встроенная. Например, там можно писать программу совершенно не обращая внимания есть встроенный I2C master в контроллере, или он будет эмулироваться программно встроенной библиотекой. При этом можно получить и стандартные имена, например, бита запуска таймера, но они будут не в .h фале, а в программе функцией genenv (отрабатывает на уровне компиляции, а не выполнения). То есть, всю эту обертку можно легко обойти, если надо. У меня PCML, версия командной строки Linux, покупал за 150 USD.
Что касается трансляции команд С в команды контроллера, то ничего мистического там нет и все видно в asm файле для любого компилятора. Конечно, там будет много такого, чего Вы не напишете сами, но это необходимо, так как в любом случае есть некая "среда времени выполнения" (run-time environment). Она есть у любого компилятора для любой целевой архитектуры. Но если Вы пишете действительно большую программу, то объем кода на ассемблере будут сравнимым со сгенерированным компилятором С кодом. Зато пишется быстрее.
И ничего там само не будет выполняться. Все точно так же, как на ассемблере. Есть проверка в программе на ассемблере, выполняется пару раз за программу, точно так же будет и для С с оператором if. Цикл так цикл. Только надо учитывать, что цикл лучше делать не с автоинкрементом, а с автодекрементом. Просто в итоговом коде это будет чуть быстрее. И "дерганье ногой" делается элементарно. И прерывания будут работать точно так же.
Что бы стало понятнее, можете прислать мне пример программы на ассемблере, для начала простой. Я отвечу, как это будет на C. Оттранслирую в XC8 и CCS, пришлю lst файлы, добавив туда немного комментариев для большей понятности. Конечно, полностью сгенерироваггый код комментировать и описывать не буду, но основные моменты помечу.
Но вообще, если разберетесь собственно с С и будете понимать, как работает контроллер, то разобраться в другом компиляторе не составит большого труда. Переписать программу будет немного муторно, но вполне выполнимо. Сложнее, когда новый компилятор менее функционален и наворочен, чем ранее используемый.
Поверьте, для Вас будет гораздо большим открытием тот факт, что не всегда написанное на С будет выполняться Про модификатор voltile для переменных промолчу, тут регистров общего назначения нет, почти все делается через WREG, так что они все volatile получаются. А вот логические выражения запросто могут закончить вычисляться до окончания собственно выражения, просто результат станет известен заранее. И если Вы в таком выражении используете автоинкремент, например, а эта часть выражения окажется пропущенной, причем во время выполнения, то автоинремента не будет. И искать, без понимания того, как логические выражения вычисляются, Вы это будете долго. И отладчик не поможет, так как такой пропуск может выполняться не каждый раз (например, не каждую итерацию цикла). Кстати, это работа оптимизатора компилятора.
_________________ Мир вокруг нас разумен настолько, насколько разумны мы сами. Профессионал не обязательно говорит умные слова, но зная самые глубины, способен объяснить их любому "на пальцах".
Оптимальным, на мой взгляд, является XC8. ... Mikro C бесплатно позволяет генерировать до 2 кБ кода. ... CCS использую сам.
Увы и ах, XC8 не "оптимальный" а единственно верный выбор. МикроС от микроЕ это компилятор языка похожего на С и весьма далекого от вменяемого С. Это скорей врапер фрэймвока изоБреденного микроЕ, аналог аурдуньи. CCS хоть и позволяет ограничено писать на вменяемом С, но выбирают его новички из-за встроенных "плюшек" кои так же далеки от стандартного С.
Так что, чтобы не было в последствии мучительно больно от осознания что изучал "с для пЫк" , единственно верный выбор XC8.
ektsysto, вопрос- если сами еще плаваете, зачем поучать других? Гуру медвежьих услуг?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения