Да проблем пока нет, я буквально пару дней только занимаюсь PSoC, изучаю документацию. Думал, может у Вас есть какие то наработки по поводу измерения частоты на PSoC. Буду пытаться что то сделать, если возникнут вопросы, напишу. Спасибо за помощь.
Снова немного растерялся... хочу сделать периодические прерывание от WDT и нарисовал такую картинку (до этого был делавши без картинки, как в статье): И вот теперь ломаю голову, как написать обработчик прерывания. В даташите написано, что по умолчанию, обработчик будет называться ISR_Scan_Interrupt. Но, компилятор заявляет, что такая функция уже есть. И да, эта функция уже есть в сгенерированных файлах. Почитал даташит...
Цитата:
void ISR_Interrupt(void) Description: The default ISR for the component. Add custom code between the START and END comments to keep the next version of this file from over-writing your code.
Похоже, предлагается писать там внутри. Но как я туда перетащу все свои переменные, чтобы они не затёрлись при следующей перегенерации?
В заметках написано, что я должен использовать функцию ISR_Scan_StartEx. Но еще не проверял. Плата еще только паяется. кристалл Cy8c4014sxi-421.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Ну, я там смотрел в первую очередь. Потому и показал различие в подходах. Вы прямо в коде конфигурируете, а я через... не знаю как это назвать... сниппеты? Ну да ладно. С этим может разберусь. У меня встала гораздо более серьёзная проблема.
Я не могу зашить cy8c4014sxi-421. Использую отломанный от cy8ckit-059 программатор. SWDIO подключил к 1 выводу, SWDCLK ко второму, землю к 8, а питание к 7 выводам. RST - никуда не подключил. И вот, запрограммировать не могу. Не могу придумать куда подключить RST - у этого кристалла нет вывода XRES. Он есть только у 24-х и 28-ми пиновых микросхем. А в PSoC Programmer переключить "Programming Mode" и "Connector" - не могу - селекторы неактивны.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Да, я конфигурировал WDT в коде потому что для моих чипов WDT не конфигурируется через IDE. Для Вашего чипа это не так и IDE предлагает пример того, что делать с картинкой: именно как сконфигурировать ISR. Привожу файл main.c из этого примера ниже. Спойлер/******************************************************************************* * File: main.c * * Version: 1.0 * * Description: * This example project demonstrates the basic operation of the WDT: device * reset and periodic interrupt generation. * ******************************************************************************** * Copyright 2013-2014, Cypress Semiconductor Corporation. All rights reserved. * This software is owned by Cypress Semiconductor Corporation and is protected * by and subject to worldwide patent and copyright laws and treaties. * Therefore, you may use this software only as provided in the license agreement * accompanying the software package from which you obtained this software. * CYPRESS AND ITS SUPPLIERS MAKE NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * WITH REGARD TO THIS SOFTWARE, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. *******************************************************************************/ #include <device.h>
/* The prototype of the WDT ISR */ CY_ISR_PROTO(isr_wdt);
int main() { /* Enabling global interrupts. */ CyGlobalIntEnable;
/* Turn on Red LED for 2 seconds if reset caused by WDT */ if (CY_SYS_RESET_WDT == CySysGetResetReason(CY_SYS_RESET_WDT)) { /* Update flag in order to clear WDT in the ISR */ resetFlag = RESET_FLAG_ACTIVE;
/* Toggle with Red LED to indicate WDT reset */ LED_Red_Reset_Write(0u); CyDelay(2000u); LED_Red_Reset_Write(1u); } else { LED_Blue_ISR_2_Write(0u); }
/* Configure WDT ISR */ wdt_isr_StartEx(isr_wdt);
/* Once watchdog counter reaches match value interrupt is generated */ CySysWdtWriteMatch(WDT_MATCH_VALUE);
/* Configure WDT to be 15-bit wraparound up-counter - 1 MSb is ignored */ CySysWdtWriteIgnoreBits(1u);
/* Start the WDT */ CySysWdtEnable();
/* Make sure that interrupt is forwarded to the CPU */ CySysWdtUnmaskInterrupt();
for(;;) {
} }
CY_ISR(isr_wdt) { /* Clear WDT only after device reset caused by WDT */ if(RESET_FLAG_ACTIVE == resetFlag) { LED_Green_ISR_0_Write(!(LED_Green_ISR_0_Read()));
/* Clear the watchdog interrupt */ CySysWdtClearInterrupt();
/* Clear interrupt status in an interrupt controller */ wdt_isr_ClearPending();
/* WDT match value is updated in order to obtain periodic interrupts. */ CySysWdtWriteMatch(CySysWdtReadMatch() + WDT_MATCH_VALUE); } }
/* [] END OF FILE */ Насчёт проблемы с программатором - похоже KitProg не поддерживает программный режим не через reset. Я проверил на своём KitProg2 - тоже самое. Однако, с MiniProg3 проблем нет. Может и есть обходной путь с KitProg - я-бы написал в Тех-поддержку на Cypress.
Вложение:
Комментарий к файлу: MiniProg3 settings Untitled.png [32.59 KiB]
Скачиваний: 594
Нашел топик с похожей проблемой.... бла-бла-бла cy8ckit-040 может только ресет моду бла-бла-бла нужен минипрог с ревизией Б - бла-бла-бла - а у меня ревизия Б, но всё равно ничего не программирует.
Вот теперь и не знаю что делать. Мало того что этот минипрог с неизвестной ревизией стоит 100 евро, так еще и неизвестно, поможет ли он.
Блинн. кусок текстолита и времени собаке под хвост.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
На том блоге человек с ревизией Б MiniProg-а написал парой постов ниже, что всё у него заработало и просто было КЗ на плате. Кстати, у меня MiniProg3 версии 2.05, никакой Б в ревизии не упомянуто и он, согласно IDE, позволяет переключить себя в режим Power Cycle. У меня пока нет чипа это проверить. Однако, как раз сейчас я готовлю заказ на DigiKey и куплю Ваш чип для экспериментов. Потом, не позже чем через неделю, отпишусь, удалось-ли его запрограммировать моим мини-прогом.
А пока можно попробовать следующее: портировать Ваш проект в Keil и воспользоваться стандартным Segger JLink программатором для ARM (если есть) с соответствующим плагином как описано в документации на портирование. Мне кажется, что я где-то читал, что первое программирование PSoC возможно только штатным кипарисовским программатором. На одном из семинаров этим летом я задал лектору вопрос действительно-ли это так. Он сказал, что я не прав и что Jlink должен запрограммировать без проблем, но по тому как он это сказал, сомнения мои не развеялись. Однако, сколько я не искал потом откуда я это взял - найти не смог. Так что сейчас уже думаю, что может мне это и приснилось. Есть у Вас JLink, чтобы попробовать? Посмотрите сюда. Также небезынтересно почитать этот блог, особенно где-то с середины.
Согласен, MiniProg3 недёшев и стоит оригинально $89. Однако, я получил свой в составе набора CY5672 стоимостью почти в 2 раза меньше. Помимо этого, недавно я купил ещё один Кит CY5682 за те-же деньги, в состав которого также входит MiniProg3. Может в Вашей стране стоит поискать эти Киты по более сносной цене у официальных дистрибъютов Cypress.
P.S. Только что обнаружил на обратной стороне моего MiniProg, что он ревизии Б. Думаю, что если созреете на его покупку, у дистрибъютора можно будет спросить про ревизию. Однако, т.к. вышеупомянутые Киты появились где-то годом позже после MiniProg3, фактически не сомневаюсь, что туда вложили последнюю его ревизию.
Вложение:
Комментарий к файлу: Revision B revB.jpg [46.83 KiB]
Скачиваний: 582
Заказал RDK cy5682 на Mouser, посмотрим, удастся ли запрограммировать... через недельку-другую, когда оно до меня доберется.
Тем временем, всплыла еще одна проблема. В конструкции используется I2C Master для обмена с RTC ds3231. Всё бы ничего... да вот перед инициализацией i2c рекомендуется (и это реально надо, судя по моему опыту) проверить состояние линии SDA и если она вдруг притянута к земле, поклокать SCL пока она не будет отпущена - тогда сигнал Start её введёт в правильное состояние.
Дык вот. А как добраться до этих пинов? Я так полагаю, пока я не выполнил I2C_Start() оно еще должно быть доступно как GPIO. Вот только все даташиты описывают доступ по имени. А имя я назначить не могу. И двух свободных пинов, чтобы подключить параллельно, у меня тоже нет.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Рад за Вас, что Вы на правильном пути с программатором. Проблем с I2C применительно к Ds3231 у меня никогда не возникало, чего не могу сказать про другие I2C устройства. Однако, если хочется перестраховаться, как только пин сконфигурирован на работу с I2C модулем, достать его через GPIO напрямую не получится. Я вижу 3 выхода. Первый - посмотреть на сайпровские API для I2C - может там имеются функции для непосредственной манипуляции линий. Я сейчас не дома, нет доков под рукой. Второй - конфигурировать I2C пин на GPIO изначально, затем дрыгать ногами для освобождения SDA и потом переконфигурировать пины программно под I2C. Как добраться до пинов написано в мануале на GPIO, доступного через конфигуратор пинов. Наконец, сконфигурировать пины изначально под I2C, а вместо дрыгания SCL посылать в слейв один байт с его адресом несколько раз и ожидать ACK. При этом SCL будет дрыгаться соответствующе.
Долго рылся по поиску, наконец нашел. Сначала обнаружил, что есть в сгенеренном API i2c_sda/i2c_scl функции Write. Т.е. i2c_scl_Write(). Правда вызов их никакого эффекта не давал. начал тогда искать в гугле по этой строке "cypress i2c_scl_Write" и первая же ссылка: http://www.cypress.com/forum/psoc-4-arc ... /reset-i2c дала ответ:
Код:
I2C_SET_I2C_SCL_HSIOM_SEL(I2C_HSIOM_GPIO_SEL); // Switch to GPIO
Хе, и даже работает (на пионере cy8ckit-042 попробовал).
P.s. Рано радовался. Попробовал вставить в свой проект - не компилит. В работающем тестовом проекте поменял кристалл на cy8c4014sxi-421 - тоже перестал компилиться:
Код:
PSoC\Blinking LED\Blinking LED.cydsn/main.c:78: undefined reference to `I2C_SET_I2C_SCL_HSIOM_SEL'
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
/* Clear the watchdog interrupt */ CySysWdtClearInterrupt();
/* Clear interrupt status in an interrupt controller */ wdt_isr_ClearPending();
/* WDT match value is updated in order to obtain periodic interrupts. */ CySysWdtWriteMatch(CySysWdtReadMatch() + WDT_MATCH_VALUE); }
Всё нормально программируется и работает: Спойлер Желаю и Вам удачи с этим. Сейчас мне надо позаниматься другими делами, посмотрю I2C подробнее завтра-послезавтра.
Эта функция экранируется таким #if-ом I2C_CY_SCBIP_V0. Правда, странно. Если сделать команду перейти к определению - переходит в I2C_Pins.h в ту часть, которая типа неактивна по #if.
Мнда, похоже в этих кристаллах можно делать лишь то, что есть в API. Пытался было залезть грязными ручками напрямую в регистры GPIO_PRT1_PC (точно уже не помню) - компилятор сказал, что такого регистра не знает. Да и описание, какое-то скудное мне показалось. особенно после stm32.
Собственно, созрел перейти к запасному плану - пожертвую одной ножкой, чтобы дёргать scl. Надеюсь, что читать sda мне всё же удастся - так как больше ног нет.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Успеете пин пожетрвовать. В CY8C4014 выводы I2C выведены на P1[2] (SCL) и P1[3] (SDA). Переключение пинов корпуса на альтернативные функции производится с помощью HSIOM (High Speed I/O Matrix). За функцию пинов порта P1 отвечает регистр CYREG_HSIOM_PORT_SEL1, где каждому из 8-ми пинов порта отводится 4 бита под код функции. При этом функции GPIO соответствует код 0, а функции I2C модуля SCB - код Е (hex). Я проверил живьём на лог. анализаторе следующий код после конфигурирования I2C ног, который переконфигурирует I2C пины под GPIO и затем в цикле дрыгает 10 раз пином SCL на пине P1[2]. Чтение пина SDA на P1[3] можно произвести с помощью функции CY_SYS_PINS_READ_PIN(CYREG_PRT1_PS, 3) После цикла пины переключаются обратно под работу с I2C. Надеюсь, этой информации будет достаточно для Ваших целей. Описание регистров PSoC приведено в документе PSoC 4 Registers TRM
Код:
CY_SET_REG32(CYREG_HSIOM_PORT_SEL1, 0x0000); // assign I2C pins to GPIO uint32 i; for (i=0; i<10; i++) // toggle SCL pin 10 times { CY_SYS_PINS_CLEAR_PIN(CYREG_PRT1_DR, 2); // set SCL pin low CyDelay(1); CY_SYS_PINS_SET_PIN(CYREG_PRT1_DR, 2); // set SCL pin high CyDelay(1); } CY_SET_REG32(CYREG_HSIOM_PORT_SEL1, 0xEE00); // assign I2C pins to SCB
О. Пришел RDK с программатором внутрях - 7,4 секунды и всё запрограммировано. Только разъём пришлось перепаять.
Спасибо за вашу помощь понять как достучаться до регистров. Как-то непривычно, что в даташите регистр называется так, а в коде надо спереди дописывать CYREG_. Потому как я уже пытался добраться до портовых регистров, но так компилятор такого имени не знал, то я и не стал дальше искать, где могло бы быть их описание. Хотя у STM8L у меня уже была засада, в даташите в названии регистра или бита был "0" (ноль), а в хедерах "O" (или наоборот, точно уже не помню).
Странная тенденция. С каждым другим микроконтроллером, нужно всё большим числом документов орудовать. У микрочипа достаточно одного ПДФ-а на конкретный кристалл - там есть всё со всеми оговорками у какого кристалла что есть, а чего нет. У MSP430 и STM8/32 надо два: на конкретный кристалл и общий reference manual. А здесь еще и второй разделили на еще 2: просто RM и RM на регистры.
Вот интересно со структурами. Попытался написать формально константу 0xEE00. С одной стороны есть определение I2C_HSIOM_I2C_SEL равное 0x0E. Но вот найти константу сдвигающую её на 8 и 12 бит не нашел. Есть I2C_SCL_PIN_INDEX и I2C_SDA_PIN_INDEX. Но они равны 0 и 1, соответственно. Поэтому пока нарисовал
Рад, что смог помочь. Величина сдвига 12 и 8 бит для линий SDA и SCL определены как константы I2C_sda_0_SHIFT и I2C_scl_0_SHIFT, определённые в файлах I2C_sda_aliases.h и I2C_scl_aliases.h, значения которых (12 и определены через дефайны как I2C_sda__0__HSIOM_SHIFT и I2C_scl__0__HSIOM_SHIFT в файле cyfitter.h. Явно прослеживается автоматическая генерация кода - человек в здравом рассудке такое вряд-ли сделал-бы.
Проблемы у меня на проблемах. Взбрело мне в голову использовать модуль EM_EEPROM. Вот только при попытке перезаписи ячейки у меня всё перестаёт работать. Даже таймер TCPWM перестаёт выдавать импульсы, что чревато.
Вроде как ничего сложного, при выполнении этого куска значение leadingzero должно измениться с 0 на 1 или наоборот. Но при выполнении этого фрагмента всё останавливается и помогает только перепрошивка.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Да вроде всё делаю по примерам... Вот еще нашел: http://www.cypress.com/forum/psoc-4-arc ... =community в пятом сообщении. Начинаю подозревать, что возможная проблема связана не с записью как таковой, а отчего-то другого. Пока на ум приходит, что причина, возможно, в watchdog. Так как запись идёт 15мс, а watchdog у меня сконфигурирован на FreeRunning с периодом 1.6мс и вызывает с таким периодом прерывание. Т.е. за время записи может произойти 10-11 прерываний. То, что они пропустятся - чёрт с ними, а вот если они все встанут и забьют стек? Хуже то, что слетает TCPWM - если он слетает, то у меня горят транзисторы. Хорошо что блок питания имеет ограничение по току. Поэтому, пока думаю, как сэмулировать этот фрагмент, чтобы не было так больно.
Изыскания продолжаются. Вставил запись в самое начало:
CySysWdtEnable(); /* Make sure that interrupt is forwarded to the CPU */ CySysWdtUnmaskInterrupt();
CyGlobalIntEnable; /* Enable global interrupts. */
Вот этот код ещё работает. Стоит EEPROM_Write перенести на строчку ниже - завис. И даже не могу зайти в отладчик глянуть. Так что, похоже, что виновата собака. Наверное я её неправильно инициализирую.
Попробовал увеличить период WDT c 1.6мс вверх. При 102.4мс - стало нормально работать (во всяком случае дошло до основного цикла).
Попутно всплыла еще одна проблема. Ну, это я сделал плюху - не предусмотрел резисторы подтягивающие к земле затворы транзисторов подключенных с TCPWM, чтобы по неактивности эти транзисторы не открылись и не жгли всё подряд. Решил исправиться - взял пару резисторов 2.2к и напаял сверху. Результат - ничего не запускается. Читаю даташит: 14 вывод имеет "альтернативную" функцию Internal Reset и в даташите написано 1. Must not have load to ground during POR (should be an output). Как же быть? эти выходы невозможно посадить на другие выводы. Ну и самое обидное, фраза Internal Reset в даташите встречается 2 раза, а TRM - один раз. Т.е. не понимаю, что это и для чего оно нужно.
_________________ А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения