Зарегистрирован: Пн май 02, 2022 04:12:13 Сообщений: 3
Рейтинг сообщения:0
Ради интереса установил MPASM X IDE v5.35 и при компиляции получил сообщение, что: MPASM is not supported on 64 bit Operating Systems. Please consider migrating your project "QWERTY" configuration "default" to XC8 Assembler or continue to use a previously released IDE. Видно в этом вся "закавыка" и была. Ну да ладно, для меня пока и MPLAB X IDE v2.35 с избытком хватит. За совет спасибо, обязательно изучим рекомендованный ресурс.
Ради интереса установил MPASM X IDE v5.35 и при компиляции получил сообщение, что: MPASM is not supported on 64 bit Operating Systems.
Вам это сообщение как то помешало работать? У вас не собрался работающий проект? Или вам не о чем поговорить? Милейший, у меня примерно полсотни 8-битных коммерческих проектов сейчас собраны именно на 5.35 и только 16-разрядные на 5.45 и то лишь потому, что некоторые из них сделаны на новейших чипах поддерживаемых в полной мере, начиная с 5.45 и старше. Всё на АСМе. Один из них, который есть на домашнем компе:
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
sunjob, binfmts работает как демон(служба в фоне), оно отслеживает любой указанный формат при исполнении его, если в заголовке ELF(исполняемого линукс) файла найдет HEX код, который указан в формате ("x7f\x45\....") -- оно будет запускать/заменять любой сервис, подменяя этот файл на тот, который указали(или например исполнять этот файл через какой-нибудь отладчик, к примеру).
У меня binfmts работал для запуска 32битных исполняемых файлов в 64бит системе(можете найти в интернете инструкцию) - практически также работает как этот кряк.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Здраствуйте уважаемые коты, при изучении MPLAB X IDE вроде начало получатся, уже накидал несколько функций кода, вроде всё работало пока не начал объединять всё воедино. А именно написал функцию Delay_ms(), всё ок, запустил прерывания от таймера тоже всё ОК. Когда сложил всё вместе и тут всё поплыло, если работает Delay_ms() то программа вылетает в рестарт или работает не корректно, при использовании цикла for(i=0;i<800000;i++) (long i) тоже начинает работать некорректно(почему то цикл ускоряется раз в 10 ). Стоит выключить прерывание от таймера и всё начинает работать как надо 0_о Ссылка на проект: https://drive.google.com/file/d/12bHBic ... sp=sharing Если надо могу выложить в виде текста на странице, там просто несколько файлов, объединённых в один проект.
Добавлено after 31 minute 44 seconds: Цикл пауза реализован был так:
alex_, что-то вы намудрили с таймером. Там проще некуда, желательно делать как все делают, прерывание в скажем 1мс записывать в long переменную millis. Например как устроен таймер у меня в main(я не разделял всё, т.к. там несколько строчек)
Код:
.... .... #define _XTAL_FREQ 8000000 // Required for Timer1(millis,delay) and Timer2(PWM) (specify clock 8MHz) #include <xc.h>
volatile unsigned long millis = 0;
void __interrupt() isr(void) { if (TMR1IF) { TMR1IF = 0; //Clear interrupt Timer1 flag unsigned short tpr = _XTAL_FREQ/1000; tpr = 0xFFFF - tpr; TMR1H = tpr >> 8; //Set Initial Value of Timer1 TMR1L = tpr & 0xFF; //* millis++; } }
unsigned long _millis(void) { return millis; }
void _delay_ms(unsigned long value) { unsigned long curMillis = millis; while((millis - curMillis) < value); millis = curMillis; }
// Set up TIMER1 to tick at 1ms intervals. // The oscillator of Timer1 ticks at FOSC(without prescaler). // That is 8MHz or 1/8000000 seconds per tick. // or 0.000000125s, or 0.000125ms, so 1 ms is 8000 ticks. TMR1CS1 = 0; //System Clock (FOSC) for Timer1 TMR1CS0 = 1; //* unsigned short tpr = _XTAL_FREQ/1000; tpr = 0xFFFF - tpr; TMR1H = tpr >> 8; //Set Initial Value of Timer1 TMR1L = tpr & 0xFF; //* TMR1IF = 0; //Clear interrupt Timer1 flag TMR1IE = 1; //Enable Timer1 Overflow Interrupt TMR1ON = 1; //Turn on TMR1
// Enable the interrupt system PEIE = 1; // Enable Peripheral Interrupt GIE = 1; // Enable Global Interrupt }
void main(void) { setup_timer1();
while(1) {
} .... ....
Помимо полноценной функции _delay_ms тут есть еще _millis которой можно сравнивать время(например она нужна для работы с кнопками(дребезг и задержка нажатия)) У меня частота прямая 8Mhz, Если у Вас прескаляр, то нужно делить еще это значение.
Не исключено, но судя по примеру вроде делал все тоже самое, и самое интересное что ведь работает, пока ещё чего нибудь не добавишь С другой стороны, чего это надо добавить в таймер чтобы while заглючило В примере просто 2 таймера первый пока выкл, пока со вторым не разобрался, + прерывание по входу но пока тоже выкл, хотя оно когда было вкл вроде не мешало
Прерывание завелось, после того как поменял одно слово в обработчике прерывания
было void __ISR (_TIMER_2_VECTOR, IPL4SRS ) T2Interrupt(void) стало void __ISR (_TIMER_2_VECTOR, IPL4AUTO) T2Interrupt(void)
Пока ещё не разобрался по чему, но в режиме SRS контроллер входит в прерывание, далее пару микросекунд и вылетаем на перезагрузку Deoptim, тут дело уже в векторном прерывании, на 8 битный контроллерах всё было тоже ок, а тут не туда вектор запулишь и усё. Сокращение вышеописанного цикла в while(1) тоже было связано с бесконечным рестартом, не успевал досчитать до конца.
Что то совсем сюда никто не заходит Копая IDE наткнулся на очередные грабли: была написана функция Delay(ms, us, cyc). Посчитав и прогнав через симулятор выставил коэффициенты чтобы +- попадало, рассчитано было исходя из тактовой частоты 80МГц -> nop 12.5 ns. Но при заливке я сильно удивился когда увидел что nop затрачивает 100ns в 8 раз больше И самое интересное что таймеры были посчитаны исходя из 80МГц и там всё совпало, как будто где то какой то предделитель пропустил Пример кода:
Значение регистра OSCCON=0х 01 45 33 22, на выходе получаем частоту 50КГц 10мкс на фронт и 10мкс на спад, по 100ns на NOP COSC = 011 => Primary Oscillator with PLL module (XTPLL, HSPLL or ECPLL) 8МГц FPLLIDIV = 001 = Divide by 2 8/2=4МГц PLL Multiplier = 20x Multiplier 4*20=80Мгц PLL Output Divider = PLL Divide by 1 =80МГц Ну и вроде это всё, что связано с настройкой системной частоты, или я что то пропустил
Что то совсем сюда никто не заходит.....или я что то пропустил
Пропустили конечно. Можно только догадываться, что речь идет о PIC32. Кстати, там есть немного разные ядра MIPS32. Поэтому следовало бы указать о каком чипе речь. Не вникал в даташит, но в регистре управляющем редукцией ядра часто дефолт совсем не единичный делитель... Плюс к этому, чтобы понять почему у вас задержка не реализуется согласно расчету, следует посмотреть листинг дизасма. Особенно в части реализации ЦИКЛА. Ну и не надо столько нопов городить. Достаточно нескольких (2...3) с разным количеством по нулю и единице в порту.
PIC32MX460f512L, нопов наставил чтобы проблему было видно наверняка(если прошить контроллер), в жизни столько нопов само собой не поставлю Дизасм пришлю завтра. но самое интересное в компиляторе микроси(недоардуина) нопы выполняются положенные им 12,5 нс, начал копать дизасм(микроси) но пока не силён в асме и не выявил корень проблемы.
Там все просто. Есть инструкции не выполняющие ветвления - эти почти все одноцикловые. А вот с ветвлениями все сложно из-за перезагрузки конвейера. Там может быть много циклов... Поэтому я и говорю про дизасм ЦИКЛА. Или нужно сравнивать ветви с разным количеством нопов. Вывод в порт тоже не быстрый.
Как бы да, но пока не особо разбираюсь. Предварительно (не утверждаю в последней инстанции) но в цикле ветвления не увидел(дизасм), хотя могу и ошибаться. Нопов специально накидал много чтобы периферия оказывала как можно меньше влияния на расчёты в том числе и переход while(1). Весь материал на работе сейчас не могу его предоставить (
Решил приложить осциллограммы для правдоподобности
MPLAB
MikroC
Из дизассемблера видно что код один и тот же, в микроси только перед стартом идёт некая конфигурация, которая и позволяет работать чипу на положенных ему 80МГц. Конфигурационная строка чипа в обоих случаях одинаковая: :102FF000FFFFFFFFD979F8FF7BC96DFFFFFFFF7F60 и была расписана выше.
Похоже 32 пиками мало кто балуется, судя по куче ответов ( Гугл конечно в помощь, но несколько дней стучания головой об стену это, что то с чем то. КРАМ, был в какой то степени прав, тут уже далеко не простое АЛУ, где послал команду и он тебе посчитал за n'ое количество тактов. Тут есть кеш, сопроцессор и задерржка чтения шлеш памяти, если это не настроишь то и получишь то же что и у меня. Раньше это решалось строкой: SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE); Сейчас фиг, надо доб библиотетеку хармони ставить, а ручками пока ещё не разобрался как и что нужно настроить
По пикам похоже сказать некому, или не там запостил. Ладно вопрос по теме: Есть глобальные переменные которые находятся в файле Global.h Всё объявлено через #ifndef, чтобы было подключено только 1 раз, чтобы файлы .с имели доступ к объявленным переменным. Почти в каждом .c файле идёт подключение к файлу Global.h, в компиляторе XC32v2.5 всё работало отлично, но после обновления компилятора до версии 4.1 вываливает кучу ошибок на тему многократного определения переменных как будто #ifndef не работает. И ещё выпилили функцию itoa()
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения