legik Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 1 час назад, my504 сказал: Я просто в недоумении... В этом МК есть только ДВА источника прерываний касающихся событий времени - внешнее прерывание и прерывание по TMR0. Виноват, в прерывание заходим при изменении регистров кнопками но это не меняет сути 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
my504 Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 (изменено) 10 минут назад, legik сказал: Виноват Ну слава Богу, это выяснили... Тогда вопрос. Кнопки явно не относятся к периферии реального времени. То есть от момента нажатия до момента реакции программы на нажатие может пройти достаточно неопределенное (в разумных пределах) время. То есть нет никакой необходимости странным образом ресетить МК из прерывания. Вообще то так это не делается. Во первых, нужна защита от дребезга кнопки. Это уже потребует интервала ее опроса. Иначе одно нажатие будет приводить к серии прерываний (и при нажатии и при отпускании) или потребует фильтра на входе. Я не зря спросил про параметры генерируемого сигнала. Наличие таймера даст возможность сформировать опорный интервал в котором можно инкрементить софтовые счетчики и опрашивать кнопку. Основной цикл освободится от циклов счета и позволит спокойно решать вопрос с перегрузкой параметров генерируемого сигнала... Изменено 5 июля, 2020 пользователем my504 0 戦う前に相手のベルトの色に注目 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
legik Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 да, может быть... но мне проще будет посчитать длительность имульса без таймера в цикле по моему мнению. про дребезг я тоже понимаю но мне не важны процессы в начале цикла и при прерывании. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
my504 Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 Только что, legik сказал: но мне проще будет Прикольно... Значит считать машинные циклы с учетом разного времени при ветвлениях вам проще, чем считать базовые интервалы таймера? Вы видимо плохо понимаете о чем я веду речь.... 0 戦う前に相手のベルトの色に注目 Ссылка на комментарий Поделиться на другие сайты Поделиться
legik Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 я так понимаю про таймер, предделитель и дополнительный регистр 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 таки, да... только предделитель, если нужны точные выдержки низя поэтому и предлагали 628а , у него 16бит таймер имеетцо 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
legik Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 поэтому я и не использую таймер а чисто цикл так можно достаточно точно выдержать время 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 какую прелестную чушь вы несете.. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
legik Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 пусть будет так 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 для таймера без предделителя шаг изменения 1маш.цикл для циклов lo_cyc decfsz ml_b_lo_tmp,1 goto lo_cyc // для одного цикла 2маш.цикла decfsz sr_b_lo_tmp,1 goto lo_cyc // для двух циклов 4маш.цикла ;decfsz st_b_lo_tmp,1 ;goto lo_cyc // для трех циклов 6маш.циклов bsf PORTA,4 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 7 minutes ago, legik said: не использую таймер а чисто цикл Да нормально, нет проблем, делайте как делаете программный счётчик - и все будет хорошо. У этих таймеров только 1-2 байта на весь период, у Вас же используется 3 байта, можно сделать длинный период с мелким шагом изменения. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 1 минуту назад, Yurkin2015 сказал: нет проблем, делайте как делаете программный счётчик - и все будет хорошо. угу, при осцилляторе 4МГц , и формировании частот около 10КГц аппаратный таймер даст шаг 200Гц , программный 1100Гц , а так да все будет хорошо... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 1 час назад, legik сказал: про дребезг я тоже понимаю но мне не важны процессы в начале цикла и при прерывании. о как... а не беспокоит, что если на кнопки прилетит помеха, МК уйдет в прерывание и будет порушена работа цикла? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
legik Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 значит все в помойку... меня интересовал один вопрос, который я озвучил в самом начале 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 просто вы наступаете на детские грабли , которые многие уже прошли. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
valentinovich Опубликовано 5 июля, 2020 Поделиться Опубликовано 5 июля, 2020 5 минут назад, IMXO сказал: legik - значит все в помойку... меня интересовал один вопрос, который я озвучил в самом начале IMXO - просто вы наступаете на детские грабли , которые многие уже прошли. Как преподаватель с приличным стажем, могу только озвучить - такая "беда" совершенно неизбежна по любому предмету при возрастном обучаемом. Тут нельзя "тыкать носом" в дилетантские ошибки. И совершенно "безболезненно" проходит разъяснение грамотного освоения основ предмета. Типа - что считать "дурным" тоном в программировании и пути (как правило их не один) как возможно и правильно по "школе". Далее с "мелочами" человек (чай не мальчик ) разберётся во всём сам. legik, удачи вам в освоении программирования. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
my504 Опубликовано 6 июля, 2020 Поделиться Опубликовано 6 июля, 2020 (изменено) 5 часов назад, valentinovich сказал: Как преподаватель с приличным стажем, могу Обучаемый "возрастной" категории в отличии от учеников школьного возраста утрачивает аргументацию связанную с авторитетом старшего. Но подобная аргументация и в школьном возрасте будет негодной. Это аргументация ПЛОХОГО преподавателя. Зато с возрастом у людей обостряются качества "второй натуры". Но тут качество преподавания бессильно.Самоуверенность соединенная с упрямством и заправленная латентной ленью даст тот салат, который в лучшем случае даст фейковый результат, а в худшем злобу и отвращение к предмету занятий. Фейковым я называю результат. который работает на первый взгляд. но дает баги различной периодичности и фатальности. ЗЫ. Смешно читать, когда автор пишет про "точность", ни разу не обозначив величины формируемого сигнала и обоснованное разрешение этого сигнала по времени. При трех байтах программного счетчика разрешение по времени составит 1/2^24 = 1/16 777 216. Что же это такой за процесс, которому требуется такое разрешение? Даже ума не приложу... Тот факт, что разрешение еще не является точностью - это отдельная тема... Изменено 6 июля, 2020 пользователем my504 2 戦う前に相手のベルトの色に注目 Ссылка на комментарий Поделиться на другие сайты Поделиться
valentinovich Опубликовано 6 июля, 2020 Поделиться Опубликовано 6 июля, 2020 my504, по сути-то оно всё верно, но чего-то картинка у вас получилась мрачноватая. Но мы всё же будем надеяться, что legik на нас не сильно обидится, всё поймёт правильно, внемлет призывному голосу познания и продолжит осваивать это увлекательное дело - логику программирования. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
legik Опубликовано 7 июля, 2020 Поделиться Опубликовано 7 июля, 2020 swapf W_Temp,F ; Поменять местами старший и младший полубайты ; регистра W_Temp с сохранением результата ; операции в нем же. swapf W_Temp,W ; Поменять местами старший и младший полубайты ; регистра W_Temp с сохранением результата retfie Подскажите, зачем дважды менять регистр "W_Temp" при выходе из прерывания? или это надо принять как должное? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 7 июля, 2020 Поделиться Опубликовано 7 июля, 2020 (изменено) @legik Таким образом восстанавливается обратно содержимое рабочего регистра W из сохранённой копии W_Temp. Применять инструкцию MOVF нельзя, т.к. она изменяет STATUS регистр, который остаться таким как до прерывания. А инструкция SWAPF никак не влияет на STATUS, но она меняет полубайты местами. Поэтому приходится использовать её два раза. Изменено 7 июля, 2020 пользователем Yurkin2015 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Splav Опубликовано 14 января, 2021 Поделиться Опубликовано 14 января, 2021 (изменено) Доброго времени суток. Помогите разобраться. Начал изучать Си после Асм. Возник вопрос. Прерывания. Сохранение контекста, как с ним быть? Микроконтроллер PIC16. На асме все было понятно, сохранил контекст - опросил флаги - обработал - восстановил контекст и вернулся к главному циклу. А как в Си? В литературе не нашел примеров сохранения контекста в Си для PIC16. Обработчик прерывания сразу делает работу и все. Например, есть регулятор мощности на МК, по внешнему прерыванию считает ошибку по Брезенхему и принимает решение включать нагрузку в этот полупериод или нет. Быстрый код, по крайней мере в асме. В главном цикле занимается опросом АЦП, усреднением, и выводом информации на LCD - долгие процессы, особенно управление LCD. Если не сохранить контекст при входе в обработчик прерывания, то возникнут проблемы в главном цикле после возвращения в него. Как это правильно реализовать на Си? Программа во время компиляции сама ведь не сгенерирует необходимый код для правильного сохранения контекста Помогите разобраться, а лучше книжку посоветуйте где объяснения есть. Изменено 14 января, 2021 пользователем Splav 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 14 января, 2021 Поделиться Опубликовано 14 января, 2021 37 minutes ago, Splav said: сама ведь не сгенерирует Компилятор всё сгенерирует, и вход и выход из прерывания, всё сохранится в лучшем виде, не надо ни о чём беспокоиться! Прерывайтесь в любом месте! 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Splav Опубликовано 15 января, 2021 Поделиться Опубликовано 15 января, 2021 @Yurkin2015 Спасибо. Вчера в книге С.Катцена все таки нашел вскользь от этом упоминание. Компилятор CSS все далает сам. И в книге Уилмсхерста с компилятором C18 тоже вскользь об этом, но он PIC18 рассматривает, они от PIC16 отличаются. А надо ли в PIC16 указывать адрес прерывания, как это делается в PIC18, для разведения по сторонам прерывания высокого приоритета и низкого? Или будет достаточно написать void interrupt isr(void) { ....//опросить нужные флаги, отреагировать } и больше ничего? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 15 января, 2021 Поделиться Опубликовано 15 января, 2021 15 минут назад, Splav сказал: А надо ли в те просто открыть мануал на используемый компилятор, раздел прерывания и получить ответы религия не позволяет? Скрытый текст MPLAB® XC8 C Compiler User’s Guide 5.9.4 5.9.4.1 Context Switching CONTEXT SAVING ON INTERRUPTS Some registers are automatically saved by the hardware when an interrupt occurs. Any registers or compiler temporary objects used by the interrupt function, other than those saved by the hardware, must be saved in code generated by the compiler. This is the context save, or context switch code. See Section 5.7 “Register Usage” for the registers that must be saved and restored either by hardware or software when an interrupt occurs.Enhanced mid-range PIC devices save the W, STATUS, BSR and FSRx registers in hardware (using special shadow registers) and hence these registers do not need to be saved by software. The only register that can need to be saved is BTEMP11, a compiler temporary location that acts like a pseudo register. This makes interrupt functions on Enhanced mid-range PIC devices very fast and efficient.Other mid-range PIC processors only save the entire PC (excluding the PCLATH register) when an interrupt occurs. The W, STATUS, FSR and PCLATH registers and the BTEMP1 pseudo register must be saved by code produced by the compiler, if required. By default, the PIC18 high-priority interrupt function will utilize its internal shadow register to save the W, STATUS and BSR registers. All other used registers are saved in software. Note that for some older devices, the compiler will not use the shadow registers if compiling for the MPLAB ICD debugger, as the debugger itself utilizes these shadow registers. Some errata workarounds also prevent the use of the shadow registers see Section 4.8.26 “--ERRATA: Specify Errata Workarounds”. For the low priority PIC18 interrupts, or when the shadow registers cannot be used, all registers that has been used by the interrupt code will be saved by software. The compiler determines exactly which registers and objects are used by an interrupt function, or any of the functions that it calls (based on the call graph generated by the compiler), and saves these appropriately. Assembly code placed in-line within the interrupt function is not scanned for register usage. Thus, if you include in-line assembly code into an interrupt function, you can have to add extra assembly code to save and restore any registers or locations used. The same is true for any assembly routines called by the interrupt code. If the W register is to be saved by the compiler, it can be stored to memory reserved in the common RAM. If the device for which the code is written does not have common memory, a byte is reserved in all RAM banks for the storage location for W register. Most registers to be saved are allocated memory in the interrupt function’s auto area. They can be treated like any other auto variable and use the same assembly symbols. On mid-range devices, the W register is stored in BTEMP0, a pseudo register, see Section 5.7 “Register Usage”. If the software stack is in use, the context switch code will also initialize the stack pointer register so it is accessing the area of the stack reserved for the interrupt. See Section 5.5.2.2.2 “Software Stack Operation”, for more information on the software stack. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Splav Опубликовано 15 января, 2021 Поделиться Опубликовано 15 января, 2021 @IMXO спасибо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.