я с вами полностью согласен, но если это не основной профиль тратить пару месяцев на досканальное изучение одного вида контролера, который через десять лет будет встречаться только в музеях(с учетом развития нашей техники) всего-лишь для написания пары программ, по моему не очень разумно. Я бы с удовольствием попросил бы это сделать кого-нибудь, кто этим занимается(не бесплатно разумеется) но к сожалению я таких людей, в нашей деревне не знаю(. Пришлось вспоминать школьные курсы по информатике и писать самому. Разумеется воспользовавшись вашими советами.А в свое оправдание замечу, что программу я все-таки сам написал и она работает, не смог разобраться только с глюками на прерывании и попросил тут помощи. И еще раз всем спасибо за поддержку. Да и вопрос был про значения после выполнения команд, в описании меняется только флаг Z, а тут вроде и переполнение происходит, поэтому и добавил про флаги, а описание при крайних значениях(0,255) я нигде не видел.
Последний раз редактировалось prizrack* Сб ноя 12, 2016 16:50:09, всего редактировалось 1 раз.
До этого смотрел исходник с телефона, поэтому в подробности вникать было сложно. Сейчас, просмотрев его на компе, увидел ужасы нашего городка
Во-первых, пишите биты регистра статус по их именам, а не номеру. Вам же самому проще будет ориентироваться при написании C, Z, DC и прочем, чем по цифрам. И тем, у кого вы просите совета, тоже не будет вопросов. Я, например, не помню номера битов. Да и в TRISx удобнее и, как мне кажется, правильнее загружать конфигурацию одной (точнее двумя) командой, т.е.
Код:
movlw 0b01010110 movwf TRISB
Если потом понадобится подправить направление работы порта, то нужно просто поменять бит. Это также удобнее в плане переносимости кода.
Во-вторых, чем вызвана необходимость выполнять такую длинную простыню кода в прерывании? Даже если источник прерываний у вас один, все равно надо проверить, что вызвало прерывание и было ли оно правомерным. Вы же сразу начали что-то делать со статусом (так и не понял зачем), даже вникать не стал. Попадая в прерывание надо сохранить (в данном конкретном случае) статус и аккумулятор, затем установить источник прерываний, проверить правомерность его обработки (может вы и не разрешали его вообще), очистить его флаг, выставить флаг операции, которую нужно произвести, если прерывание правомерное, восстановить ранее сохраненные регистры и выйти. А в основном цикле постоянно мониторить выставленный флаг(и) и соответственно действовать.
В-третьих, и это возможно ваша главная ошибка и причина проблемы - goto из прерывания в программу. При этом в стеке остается невостребованный адрес, а при накоплении таких неправильных выходов (стек у 84-го 8-уровневый) происходит переполнение стека и в итоге - большой бадабум. На странице 13 оригинального ДШ кратко описывается работа стека. Если с английским все плохо, найдите русскоязычную документацию и обязательно почитайте. Если кратко и в общем, то НЕЛЬЗЯ выходить из подпрограммы или из прерывания методом goto без последующего возврата по return/retlw/retfie. И нельзя делать больше 8 call один из другого.
84-й и так уже музейный экспонат. Валяется у меня парочка, выкинуть жалко, а куда-то притулить: то портов не хватает, то АЦП отсутствует, то еще что-то. Вот может внукам показывать буду этих тараканов Если уж подсели на ПИКи, то имейте в виду, что все младшее семейство - близнецы. Практически все сказанное по 84-му применимо даже к самым современным ПИКам, ну может кроме сохранения контента в прерывании. Да, стек у них (да и то не у всех) поширше будет, но им точно также нельзя грубо пользоваться.
Вот специально посмотрел: из 88 страниц ДШ по 84-му ПИКу программирование описано только в первых 44-х. На это уж точно пару месяцев не нужно. Да и все учить наизусть не нужно, просто знать, что это есть. А при необходимости заглядывать и уточнять конкретные вопросы.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
программу писал как мне удобно, при этом несколько раз переделывал в корне(итоговая версия не "чистилась"), по флагам согласен, но т.к. еще не привык к их значению, решил делать цифрами, по портам мне удобней по отдельности их назначать, хотя согласен, что это не рационально. В прерывании у меня считаются витки и просчитываются кол-во витков в ряду, для изменения направления укладки. Считаю все в двоично-десятичной системе, отсюда и куча переходов, вызвано это тем, что во-первых вывод на индикатор по сегментам так проще делать, а во-вторых числа большие и в 8 бит не влезают, поэтому решил не делать кучу переводов в двоичку, потом опять в десятичку и сразу все делать в десятичной, памяти уходит больше(но ее хватает), зато считать проще) выход из прерывания через goto идеn вслучае окончания работы, после этого все параметры задаются заново. У меня ДШ на 43 страницах(на русском) и там очень многого нету из того, что вы здесь поясняете, качал к стате его с этого сайта, не прочитав его и кучу всего в интернете я бы вообще ничего не написал... P.S. Станок мотает и полностью отвечает моим требованиям к нему. Я не в коем случае не говорю, что программа оптимальна, да собственно как и вся остальная схема, делалось все не на выставку и не в серийное производство, мне всего-лишь надо намотать 60 катушек по 3500 витков на магнитный стол, с этим он вполне справиться) после этого, скорее всего я его разберу и поставлю двигатели на более интересный станок, для управления которым не хватит никакого PICа или AVRа.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Отвечу только по поводу goto: закончилась программа или нет - неважно, нельзя так выходить из прерывания и оставлять невостребованный адрес в стеке. В любом случае это вам нужно, поэтому следовать советам или нет решайте сами.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
на будущее учту, спасибо, goto исправлю. С ошибкой разобрались, причина была в не сохранении статуса и аккума в прерывании. после устранения этого все заработало как часики, только скорость маловата(, но это уже другая история если буду доводить до "ума" все учту, но скорее всего не буду. Для моих целей достаточно, что все заработало.
Вложения:
Комментарий к файлу: на всякий случай исправленная версия, если кому-то будет интересно ind_new.asm [25.67 KiB]
Скачиваний: 338
...скорее всего я его разберу и поставлю двигатели на более интересный станок, для управления которым не хватит никакого PICа или AVRа.
Что за станок такой назревает? Что PIC-и, что AVR-ы разные бывают, исходя из чего Вы решили что их "не хватит"? Хотя если писать
Код:
... bsf TRISB,7 ; установка RB7 на вход bsf TRISB,0 ; установка RB0 на вход bsf TRISB,1 ; установка RB1 на вход bsf TRISB,2 ; установка RB2 на вход bcf TRISB,3 ; установка RB3 на выход bsf TRISB,4 ; установка RB4 на вход bsf TRISB,5 ; установка RB5 на вход bsf TRISB,6 ; установка RB6 на вход bsf TRISB,7 ; установка RB7 на вход ...
вместо
Код:
movlw 0b11110111 movwf TRISB
То можно многого добиться. А в целом стиль написания программы - верный способ выстрелить себе в ногу (многабукафф), наверное корабельниковский самоучитель Вас вдохновлял.
станок злой назревает(нестандартный электроэрозионный с осью вращения как на токарных) с четырьмя осями, и еще кучей примочек, тут без полноценного компа не обойтись match3 либо LinuxCNC рулить будет, самому такую программу пару лет писать придется))
Тут мы, кстати, оба ошиблись. В мпасме надо писать b'11110111'
Вот поэтому в шестнадцатеричной и писал все числа, в бинарнике ошибку выдавала, разбираться не стал)))
shindax, скорость вращения двигателей маловата, в задержке вывод на дисплей делается, но ускорение палка о двух концах, либо придется вывод на на восьмерки в другом месте делать, либо частоту микрухи поднимать, плюс скорее всего придется делать плавный разгон и торможение двигателей это тоже геморой. Про Карабельникова не знаю, читал мельком все, что попадалось в интернете. Стояла задача быстро собрать станочек.
P.S. Задача решена, если хотите поиздеваться, я не против, может кому на пользу пойдет, я для себя много полезного узнал, буду периодически заходить, отписываться...через пару дней доделаю подачу провода, выложу фотки, чтобы еще и над механикой поиздевались)))
Никто не издевался. Просто ваш стиль расписывать регистры, которые уже включены в inc-файл, выдают школу Корабельникова. Тем или иным образом, может не напрямую, а через кого-то вы впитали его в себя. Не надо так писать.
И, кстати, наше замечание по написанию b'01101001' относилось к тому, как вы настраивали порты. Там ничего шестнадцатиричного у вас нет - одни bsf и bcf. Если детально пройтись по исходнику, можно еще огрехи найти, но вы же не хотите слушать. Работает - и ладно.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Я понял к чему относилось замечание, я про бинарное написание чисел в целом, а почему config не понравился? как правильней задавать параметры МК? А огрехи полюбому найдутся, начиная с не проработанного алгоритма и обозначения переменных. Если придется еще что то писать для PIC-ов, я обязательно учту ваши замечания. И еще вопросик, почему тут все так не любят ентого Корабельникова, он совсем ерунду пишет? Складывается впечатление, что это какое-то ругательное слово...
Последний раз редактировалось prizrack* Ср ноя 16, 2016 19:08:13, всего редактировалось 1 раз.
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF (это пример для 628).
Объясню почему. Название этих битов в основном не меняется от одного МК к другому. Если нужно будет перенести код с одного МК на другой, это делается проще. Кроме того, если в процессе разработки по какой-то причине понадобится сменить конфиг (для простейшего 84-го это вряд ли нужно будет), проще сменить ON на OFF например, чем пересчитывать биты. Да и визуально видишь, например, что вочдог выключен, чем гадать это по битам или, еще хуже, по 16-ричному представлению.
Эти написания все в том же inc-фале на конкретный МК. Он расположен где-то в C:\Program Files (x86)\Microchip\MPLABX\v3.40\mpasmx И если в начале программы (после LIST) добавить include p16f84a.inc, то расписать STATUS equ 0x03 и прочие адреса для регистров специального назначения не понадобится.
Спасибо за объяснение, четко, коротко и доходчиво, сложно найти нужную информацию в понятном виде на просторах интернета, обычно либо слишком "заумно" пишут для узких специалистов либо разжевывают каждую итак понятную мелочь в трех томах, еще и без поиска и как выясняется еще и неправильно(это я про вашего корабликова)))))) Это как с транзисторами, электроны я могу еще понять, но вот волшебные "дырки" с моей логикой никак не клеятся, вот и получается пока сам не попробуешь не разберешься...
тоже глянул, хорошая инфа, но вот про сохранение статуса в прерывании не написано и опять через movf делают, который может поменять флаги...Я бы еще туда умножение с делением добавил, часто нужно бывает... И все ссылки опять на английском, не хотят рунетом заниматься((
Последний раз редактировалось prizrack* Ср ноя 16, 2016 19:48:10, всего редактировалось 1 раз.
Для контроллеров PIC12/PIC16/PIC18 обязательными к сохранению являются два регистра: WREG и STATUS. Остальные – в зависимости от используемого контроллера и функционала обработчика прерываний. В частности для контроллеров PIC16 с более чем одной страницей памяти программ требуется сохранять регистр PCLATH.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Последний раз редактировалось Zhuk72 Ср ноя 16, 2016 19:49:09, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения