Приветствую всех. Подскажите пожалуйста в каком файле в Marlin находятся обработчики, работающие непосредственно с пинами платы, т.е. другими словами с железом. Как я понял тут сначала парсер из файла gcode.h обрабатывает текст и получает значение команды, сначала букву, потом номер, дальше в файле Marlin_main.cpp запускается обработчик команды G кода, а вот дальше отследить логику и путь у меня пока не получилось, потому и спрашиваю. Т.е. интересует в каком файле непосредственно находятся процедуры взаимодействующие с электроникой платы? Если кто в курсе, подскажите пожалуйста.
Тоже так думал, потому и спрашиваю))). Суть заключается в том, что я хочу использовать свободные пины на плате, по своему усмотрению, например включать и выключать в конце G кода подсветку, для этого хочу написать свои G-коды в прошивку, в файле Marlin_main.cpp думаю это вполне возможно, но когда задавал вопрос не было понимания как за эти пины "дергать" из своего обработчика G-кода, однако в первом источнике, что выше прочитал, что Marlin обращается непосредственно к портам, потому и думаю что вроде как нужную инфу надыбал, осталось так сказать на практике проверить, проверять хочу светодиодом, подключенным на интересующий меня пин на плате.
Спасибо, не знал об этой команде ))), а сначала не понял, думал речь идет о пине второго вентилятора.
Добавлено спустя 9 минут 43 секунды: Я только боюсь, что для моей дешёвенькой платки этот вариант может не подойти, т.к. там можно использовать пины 10,11,12,13,14,18,32,35,36,41, часть из которых уже будет либо занята, либо попросту недоступна, хотя конечно в том же Marlin можно часть этих пинов попытаться переназначить.
С пинами я уже кажется разобрался, с картинкой они совпадают, у меня для Tevo Tarantula назначаются в файлах pins_MKS_13.h и pins_RAMPS.h, как я понял если точнее говорить, то в pins_MKS_13.h, только содержится ссылка на файл pins_RAMPS.h, а сами пины назначаются уже там.
Пока что получилось сделать так чтоб мой код F1 понял принтер и пропищал, изменения в прошивке Marlin минимальны, в файле Marlin_main.cpp В конце обработчика switch (parser.command_letter) { прописываем свой вариант с вызовом нашего обработчика команды gcode_F1()
inline void gcode_F1() //!!!! { //PORTD=PORTD|(1<<50); ни в коем случае не разкомментируйте и не пишите ничего подобного, сожжете плату или МК, т.к. физически все порты МК имеют до 16 пинов // а до 17 и выше, например до 50 как тут это уже идет эмуляция в марлине за счет программы BUZZ(1500, 50); }
После этого в файле gcode.cpp прописываем в строке нашу литеру для команд F, потому что если этого не сделать, то парсер при обработке будет выдавать сообщение неизвестная команда
// Bail if the letter is not G, M, or T switch (letter) { case 'G': case 'M': case 'T': case 'F': break; default: return; }
Это все что нужно сделать, если кому интересно выкладываю сами файлы просто для наглядности, если будете делать нечто подобное то рекомендую править файлы вашей прошивки, т.к. как я понял прошивки даже недалекие друг от друга в дате релиза, по коду могут отличаться, поэтому при простом копировании моих файлов в вашу прошивку она может стать просто не работоспособной. Все изменения можно будет найти если нажать ctrl+F и для поиска ввести !!!! ,я так мечу в файлах изменения которые проводил, на комментарии не обращайте внимания пишу для себя.
Также хочу отметить важную деталь с управлением пинами я еще не разобрался, но понял четко то что следующих конструкций в обработчиках команд быть НЕ ДОЛЖНО
//PORTD=PORTD|(1<<50); ни в коем случае не разкомментируйте и не пишите ничего подобного, сожжете плату или МК, т.к. физически все порты МК имеют до 16 пинов // а до 17 и выше, например до 50 как тут это уже идет эмуляция в марлине за счет программы
Покопался в прошивке Marlin и узнал следующее: В файле pins.h объявляется часть пинов, и есть ссылка на файл специфичный для используемой платы, в моем случае pins_MKS_13.h, где объявляется еще часть пинов, и есть ссылка на файл pins_RAMPS.h, где объявляются остальные пины. Соответствие номеров пинов в марлине, портам микроконтроллера Mega1280/Mega2560 прописано в файле fastio_1280.h, на который ссылается файл fastio.h, т.к. используется контроллер Mega2560. Соответствие прописано в комментарии в самом верху и значения из строки 1280 равны значениям строки Port. Для управления цифровыми пинами которые на рисунке с распиновкой платы обозначаются как D1,D2,...D50,... используются команды прописанные в файле fastio_1280.h
Причем доступными из 5 вольтовых, в моем случае оказались только цифровые пины D2,D15,D19, а также аналоговый пин A11, который реагирует только как цифровой, и ШИМ сигнал не выдает, даже с командой M42, остальные аналоговые пины A5,A6,A12,A15 никак не реагируют ни на одну команду, ни на тот же код M42 ни на SET_OUTPUT(12); WRITE(12,HIGH); ни на pinMode(12, OUTPUT); analogWrite(12, 255); которые используются в команде M42, реакции ноль, причем если присмотреться, то пины A15 и D15 соответствуют одному и тому же порту на микроконтроллере платы и пину в марлине, а именно 15, однако когда я подаю высокий или низкий логический уровень на 15 пин, реагирует только вывод D15 на плате, а на выводе A15 стабильно идет высокий уровень сигнала с подтяжкой :/ Также думаю стоит отметить, что при использовании свободных пинов стоит просматривать файлы pins.h; pins_MKS_13.h; pins_RAMPS.h, потому что если там свободные пины уже переназначены через директиву #define, то на ваши команды эти пины могут не отреагировать, пока вы эту директиву не закомментируете, в частности у меня было именно так, когда я переназначал выход под нагреватель экструдера. Однако с аналоговыми пинами совершенно другая история как я понимаю, если не прав, то пожалуйста поправьте.
Если кто в курсе как с аналоговыми пинами работать напишите плиз, а то совсем непонятная ситуация складывается, пины есть и не задействованы никак, но использовать их не получается, даже если в коде прошивки все ссылки на них закомментировать. Также прилагаю схему принципиальную электрическую для платы 2560, хотя конечно в основном пины на разных версиях плат совпадать будут врятли, а также нормальную картинку самой платы 2560 с пинами.
Также хочется спросить почему на пинах шаговых двигателей, когда шаговики отключены, нет напряжения вообще, даже когда пытаюсь двигать каретку по Z без подключенного шаговика напряжение на обеих катушках по 0 вольт, неужели Marlin контролирует наличие двигателя по потреблению тока?
С шаговиками прояснилось, оказывается, у тех что используются в MKS basev1.4, а конкретно модель A4982sltp, когда ток текущий через обмотки меньше определенного значения, драйвер просто уходит в режим сна и напряжения не подает, а также то что для того чтоб он заработал нужно на пин E1_ENABLE_PIN подавать 0, т.к. высокий уровень логического сигнала отключает драйвер, а я раньше думал наоборот. Также в процессе выяснения сгорела половина драйвера и теперь работает только часть драйвера, поэтому для того чтоб что то свое вешать этот разъем явно не пригоден, а вот другим шаговиком после настройки драйвера по току, управлять получится, пины шаговиков расположены в файле pins_RAMPS.h в моем случае.