Jump to content

    

theBMV

Свой
  • Content Count

    131
  • Joined

  • Last visited

Community Reputation

0 Обычный

About theBMV

  • Rank
    Частый гость
  • Birthday 07/22/1986

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Добрый день! Ищу продвинутый даташит на сабж. В даташите, что на сайте, приведена только краткая информация: пинаут, функциональная схема и т.п. Информации о внутренних регистрах нет, как нет и рекомендуемой схемы подключения, возможно, рекомендуемой трассировке. Невозможно использовать данный даташит при разработках нового устройства. Прошу помочь найти или подсказать где ещё посмотреть. Спасибо!
  2. А чем простой enum без typedef и имени не нравится? Сделайте префикс всем именам и после набора префикса нажимайте ctrl+пробел в mplabx. Ещё удобство: если сделать переменную типа enum и использовать её в switch case, то компилятор предупредит об отсутствующих кейсах, если не для всех полей enum'а они сделаны
  3. 3 PICа по RS485

    Вы сейчас говорите о контроле потока. Существуют разные методы контроля: программные (например XON XOFF) и аппаратные (например CTS/RTS в RS-232), в которых сигналы готов/занят передаются по отдельным проводам. В случае простого полудуплексного RS-485 никто конечно же никого ждать не будет.
  4. АЦП PIC32MX

    Добрый день. Имею PIC32MX150F128B и пытаюсь на нем запустить АЦП в режиме сканирования одного (пока одного) канала с автосэмплированием. Частота периферии 24 МГц. Tad = 83 нс (д. б. > 63 нс по даташиту). Ts = 166 нс (д. б. > 132 нс по даташиту). Мой код #include <xc.h> #include <sys/attribs.h> #include "peripheral/peripheral.h" void main() { PLIB_INT_MultiVectorSelect(INT_ID_0); PLIB_INT_Enable(INT_ID_0); // Fin = 48 MHz, Fp = 24 MHz PLIB_DEVCON_SystemUnlock(DEVCON_ID_0); PLIB_OSC_SysPLLMultiplierSelect(OSC_ID_0, 24); PLIB_OSC_SysPLLOutputDivisorSet(OSC_ID_0, OSC_SYSPLL_OUT_DIV_2); PLIB_OSC_PBClockDivisorSet(OSC_ID_0, OSC_PERIPHERAL_BUS_1, 2); PLIB_DEVCON_SystemLock(DEVCON_ID_0); // Порт на вход, аналоговый режим PLIB_PORTS_DirectionInputSet(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_1); PLIB_PORTS_PinModePerPortSelect(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_1, PORTS_PIN_MODE_ANALOG); // Вкл АЦП, автоматическое по 1 сэмплу на прерывание, сканирование 1 канала PLIB_ADC_Enable(ADC_ID_1); AD1CON3bits.ADCS = 0; // Tad = Tpb * 2 = 83 ns (> 65 ns) AD1CON3bits.SAMC = 2; // Ts = Tad * 2 = 166 ns (> 132 ns) PLIB_ADC_InputScanMaskAdd(ADC_ID_1, ADC_INPUT_SCAN_AN11); PLIB_ADC_ConversionStopSequenceEnable(ADC_ID_1); PLIB_ADC_ConversionTriggerSourceSelect(ADC_ID_1, ADC_CONVERSION_TRIGGER_INTERNAL_COUNT); PLIB_ADC_SamplesPerInterruptSelect(ADC_ID_1, ADC_1SAMPLE_PER_INTERRUPT); PLIB_ADC_MuxAInputScanEnable(ADC_ID_1); // Прерывание приоритет 5 подприоритет 2 PLIB_INT_VectorPrioritySet(INT_ID_0, INT_VECTOR_AD1, INT_PRIORITY_LEVEL5); PLIB_INT_VectorSubPrioritySet(INT_ID_0, INT_VECTOR_AD1, INT_SUBPRIORITY_LEVEL2); PLIB_INT_SourceEnable(INT_ID_0, INT_SOURCE_ADC_1); // Запуск PLIB_ADC_SampleAutoStartEnable(ADC_ID_1); while(1); } void __ISR(_ADC_VECTOR , IPL5SOFT) ADCInterruptServiceRoutine() { // Пустое чтение PLIB_ADC_ResultGetByIndex(ADC_ID_1, 0); Nop(); PLIB_INT_SourceFlagClear(INT_ID_0, INT_SOURCE_ADC_1); // Перезапуск PLIB_ADC_SampleAutoStartEnable(ADC_ID_1); } Проблема в следующем: когда код запущен в режиме отладки и я выставляю брейкпоинт на Nop(); в прерывании, а затем смотрю в регистр ADC1BUF0, то вижу значение, например, 14 (на ножке действительно есть какое-то напряжение). А когда по F5 запускаю программу от брейкпоинта до брейкпоинта, то получаю совсем другое значение 635. И обратно: стоит убрать брейкпоинт и запустить программу, а затем опять поставить, опять получаю 14.
  5. Однако... сложная логическая цепочка. :) Не поделитесь? И нет, не для автомобиля.
  6. По вопросам аналоговой схемотехники я не отличаюсь профессионализмом, поэтому и пишу сюда. Следствием первого для меня достаточно проблематичным будет расчет схемы из рассыпухи, поэтому преимущество отдается готовому решению. По току, да ошибка. Ток предполагался не более 0,3 А даже 0,2 А. Нестабилизированное напряжение нужно, поскольку далее будет стоять DC/DC без гальванической развязки, а невозможнось установки сразу гальванически развязанного DC/DC обусловлена наличием дополнительного входа питания. Т.е. один DC/DC и два входа: один гальванически развязан, другой нет. При появлении питания на первом, второй отключается.
  7. Да, выходит дороже. Вы правы. Наверное, дешевле и "оптимальнее" решения (в плане количества деталей, расчетов, защиты), чем на MAX не найти. Всем спасибо.
  8. Здравствуйте! Ищу дешевые варианты гальванической развязки питания. Входное напряжение: 10-28 В постоянного тока. Выходное напряжение: примерно такое-же, как и входное. Т.е. стабилизация не требуется, просто развязка. Ток: не более 0,5 А Нашел вариант MAX13256, очень понравился! Вернее понравилось всё, корме цены на этот MAX. Может быть есть какое-нибудь аналоговое решение, не требующее дорогостоящих микросхем? Спасибо.
  9. Думаю, что разобрался. Надо использовать space(prog) и разместить табличку где-нибудь в конце: const int (*foo)()[] = { foo1, foo2, foo3 }__attribute__(space(prog), (address(0x9D000F00)));
  10. Вы можете изменить свой скрипт компоновщика таким образом, чтобы Ваше прерывание умещалось непосредственно в таблице векторов прерываний (exception mem).
  11. Добрый день! Решаю вопрос о взаимодействии двух программ в памяти одного микроконтроллера, а именно загрузчика и основной программы. Основная программа должна иметь возможность вызывать функции загрузчика. Реализаций тут я вижу 3: 1. Явное указание адресов функций в загрузчике __attribute__((address(0x9D000000))) int foo() { ... } Но при таком методе нужно следить за размерами функций, если их больше одной. Чтобы не налезали друг на друга и чтобы между ними не было неиспользуемых участков памяти. А это двойная компиляция (1-й раз определить размер, 2-й раз подогнать адреса) и исправления в проекте основной программы. Либо просто, без явного указания адресов функций, компиляция с последующим определением адресов функций и исправлением в проекте основной программы. 2. То же, что и 1-й вариант, но будет всего одна функция, 1-ым параметром которой будет индекс нужной функции из какого-нибудь списка. 3. Явное указание адреса массива указателей на функции __attribute__((address(0x9D000000))) const int (*foo)()[] = { foo1, foo2, foo3 }; int foo1() { ... } int foo2() { ... } int foo3() { ... } но так у меня почему-то программа выпадает в exception, скорее всего из-за того, что эта константа выбивается из секции констант или я что-то неправильно делаю. Подскажите, что сделать, чтобы работало, т.к. этот вариант мне нравится больше всего. Подскажите, как сделать наиболее грамотно?
  12. Добрый день! Есть необходимость создания проекта библиотеки (Microchip Embedded -> Library Project) в MPLAB X 2.05. Установил только XC8 1.21. Но вот беда: среда разработки не позволяет использовать XC8 для создания проектов библиотек! Только C18 или ASM. Теперь движемся дальше: в папке xc8\v1.21\bin лежат и mcc18.exe и mplib.exe. "ОК",-говорю я и иду в Tools->Options, вкладка Embedded, Build Tools. Add... Пытаюсь принудительно добавить toolchain с Base Directory: "xc8\v1.21\bin" и Type: "C18" на что получаю вполне закономерный Base directory is currently used by another toolchain. Удаляю XC8 toolchain и таки создаю toolchain C18. Папка определяется как C18 (v10.21) указываю пути до компилятора и ассемблера. Не работает (да и не должно, наверное): "make[1]: *** No rule to make target `.build-conf'. Stop." Хотя при установке XC8 я специально ставил галочки: Update MPLAB IDE to use the XC8 compiler for all existing C18 (mcc18) projects и Use XC8 for the C18 Linker, Librarian and Assembler Короче, как быть, товарищи? Может я чего-то не допонимаю? Прошу помочь. Как создать проект библиотеки желательно без установки чего-то ещё?
  13. Не не не, CLKOUT я получаю из контроллера с порта. А генератор внутренний. Но тем не менее разобрался. Проблема оказалась в другом: к линии был подключен рез. делитель на вход АЦП и емкость длинной линии пагубно влияла на внутреннюю землю в контроллере через этот вход, вызывая увод частоты. Всё решено.
  14. Добрый день! Использую PIC18F26K20 в качестве драйвера линии, который портами управляет биполярными транзисторами, формируя уровни 0 и 1 на линии. При подключении длинной линии при формировании уровня нуля (разряда линии), открывая транзистор на землю, наблюдаю сильное изменение частоты HFINTOSC на короткий промежуток времени. При выключенном HFOFST: HFINTOSC Fast Start-up (ожидание стабилизации частоты после включения) HFINTOSC вообще отсоединяется от ядра до момента стабилизации. Частоту наблюдаю осциллографом с порта CLKOUT. Изменения частоты: падение с 16 МГц до 4 МГц Теперь что проверялось: -HFOFST вкл/выкл: с выкл частота просто пропадает (ядро и периферия останавливаются) на короткий промежуток времени (до стабилизации), с вкл наблюдается изменение частоты -PLL вкл/выкл: без изменений -разная частота HFINTOSC (по сути разный делитель): без изменений -назначение других портов на управление линией: без изменений -измерение токов баз: без изменений -напряжение питания: без изменений Хотелось бы понять природу явления и что же всё таки влияет на подобный эффект? Жду советов по борьбе с этим "явлением" и/или объяснения причин возникновения. Спасибо!
  15. Добрый день! Использую XC8 для PIC16 и для некоторой оптимизации по объему занимаемой памяти хочу избавиться от banksel везде, где это возможно, определяя переменные в Common RAM. С ассемблером всё понятно, но как быть с C? Описанная в мануале int i @ 0x70; не работает. Вопрос: как определить переменные по конкретным адресам в XC8?