О разработке приложений на PSoC-4 фирмы Cypress
Re: О разработке приложений на PSoC-4 фирмы Cypress
Нашел ошибку! Всё оказалось крайне тривиально. Как я и говорил: собаки котам не товарищи. Виноват watchdog. А вернее, виноват я сам. Тупо скопировал строчку CySysWdtEnable(); , наивно полагая, что это просто включает функционал таймера. Оказалось - нет, это включает именно собаку, которая после трёх необслуженных переполнений вызывает сброс (тем самым прерывая процесс записи в EEPROM). Заменил эту функцию на CySysWdtDisable() и всё заработало. Да, в момент записи в EEPROM дисплей немного дёргается.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: О разработке приложений на PSoC-4 фирмы Cypress
Ну слава Богу, разобрались с EEPROM. Насчет резистора 2.2К, я попробовал поставить 4.7К на землю и действительно - МК не вышел из ресета. Но когда поставил 10К, всё заработало. Для закрытия полевика на этом выводе при ресете и 10К нормально будет.
Re: О разработке приложений на PSoC-4 фирмы Cypress
Про энкодер: ....
[/quote]
На 043 ките 2 выходных мучался с модулем QuadDec. Работать заставить удалось только без подключения сигнала Z (мне он был нужен для моего проекта, т.к. мне нужно точно измерять угол поворота и требуется стабильное начало отсчета). Пришлось обрабатывать этот сигнал отдельно. Энкодер OMRON 2000 отсчетов оптический в режиме 4х.. На 2000 оборотах (8000 импульсов на оборот) пропусков нет. Быстрее не гонял. Вообще уже всю измерительную часть наладив, подумал, что этот модуль очень много ресурсов забирает. (UDB кончились) Возможно придется что-то придумывать... Та же история с модулем PWM и таймером TCPWM - на задачах получения импульсов определенной частоты и длительности работают одинаково, а ресурсов первый требует больше, чем второй...


[/quote]
На 043 ките 2 выходных мучался с модулем QuadDec. Работать заставить удалось только без подключения сигнала Z (мне он был нужен для моего проекта, т.к. мне нужно точно измерять угол поворота и требуется стабильное начало отсчета). Пришлось обрабатывать этот сигнал отдельно. Энкодер OMRON 2000 отсчетов оптический в режиме 4х.. На 2000 оборотах (8000 импульсов на оборот) пропусков нет. Быстрее не гонял. Вообще уже всю измерительную часть наладив, подумал, что этот модуль очень много ресурсов забирает. (UDB кончились) Возможно придется что-то придумывать... Та же история с модулем PWM и таймером TCPWM - на задачах получения импульсов определенной частоты и длительности работают одинаково, а ресурсов первый требует больше, чем второй...


У кошки 4 ноги: вход, выход, земля и питание
Re: О разработке приложений на PSoC-4 фирмы Cypress
Также используем декодер и таймеры в настоящем пректе наряду с аппаратным подавителем дребезга кнопок на CY8C4245xxx. Все работает как часы. PWM, основанная на таймере, не задействует UDB, а реализована как отдельный FF модуль, которых в PSoC-4 целых 4 штуки помимо 4 или 8 UDB, в зависимости от модели.
Re: О разработке приложений на PSoC-4 фирмы Cypress
Народ помогите сэмпл SPI_design запустить это где spi мастер слейв и ЛСД. Я попытался его завести на своём CY8CKIT-059, рекомендуемого кита у меня нет. С вывода m_mosi сигнал выходит, cs не каждый раз срабатывает, осциллографом проследить это всё сложно. Соответственно на LCD нет отображения принятых данных. Хотел спросить резисторы подтягивающие как правильней сделать, подозреваю в подключении ошибка?
Re: О разработке приложений на PSoC-4 фирмы Cypress
Не понятно какие подтягивающие резисторы у SPI???
Re: О разработке приложений на PSoC-4 фирмы Cypress
Подтяжка меня интересует там должна быть? Вывод miso в низком уровне постоянно .
Как правильней на моём камне завести?
Как правильней на моём камне завести?
Re: О разработке приложений на PSoC-4 фирмы Cypress
Дайте полную схему, в частности какой у Вас дисплей. Обычно в дисплеях с SPI интерфейсом линия MISO не задействована вообще, т.к. из дисплея читать не приходится, но могут быть исключения. Если она задействована в дисплее, то подтяжка на этой линии не нужна. Лучше выложите ZIP архив всего проекта. Вы спрашиваете как сделать правильно, но неясно как это сделано сейчас. И вообще, что конкретно не работает кроме нулей на MISO? Есть-ли логический анализатор в наличии?
Re: О разработке приложений на PSoC-4 фирмы Cypress
Подробней Code Exemple пример SPI_design, дисплей там 16x2 стандартная полу битная шина которая по умолчанию в примере, с lcd всё в порядке. Анализатора в наличии нет. В схеме SPIM и SPIS которые должны быть соединены. Соединено m_ss с s_ss логическая единица только с мастера присутствует, m_sclk соединено с s _sclk осциллографом клоки чётких я так и не увидел.Писал с вывода m_mosi соединённым с s_mosi сигнал выходит. НА выводах miso логический 0. Раньше шину соединял 1к резистором, тут не знаю догадываюсь SPIS не поднялся на моём камне...
Re: О разработке приложений на PSoC-4 фирмы Cypress
Имеете в виду "полубайтная" шина с LCD? Соединены-ли m_mosi с s_mosi? Нa LCD хоть что-то отдельно вывести можете?
Мне сложно сказать что у Вас не так. Думаю, выводы LCD и/или SPI неправильно подсоединены. У меня такой платы нет, но я загрузил этот пример на другую плату с тем-же чипом (см. фото). Согласно осциллограмме логического анализатора, SPI драйвер работает как часы и на нужной частоте тактирования. LCD я не подключал, вместо него ввёл 2 массива mSPI и sSPI, содержащие принятые данные мастером и слейвом, соответственно. Как видно из распечатки, мастер и слейв девайсы обменялись своими данными, как и быть должно.
Мне сложно сказать что у Вас не так. Думаю, выводы LCD и/или SPI неправильно подсоединены. У меня такой платы нет, но я загрузил этот пример на другую плату с тем-же чипом (см. фото). Согласно осциллограмме логического анализатора, SPI драйвер работает как часы и на нужной частоте тактирования. LCD я не подключал, вместо него ввёл 2 массива mSPI и sSPI, содержащие принятые данные мастером и слейвом, соответственно. Как видно из распечатки, мастер и слейв девайсы обменялись своими данными, как и быть должно.
Re: О разработке приложений на PSoC-4 фирмы Cypress
Да, опечатался полубайтная шина. Соединены m_mosi с s mosi. Другие сэмплы на lcd выводят данные. Пока ищу анализатор....
Re: О разработке приложений на PSoC-4 фирмы Cypress
Для обмена буферами мастера и слейва соедините ещё m_miso и s_miso.
Re: О разработке приложений на PSoC-4 фирмы Cypress
Ser60 Я сегодня удалил половину пинов сделал внутреннее соединение, всё заработало, но от этого вопросов стало ещё больше. Пробовал на 3, 12, 15 порт переназначать выводы не в какую. Мысли в голове на сегодня точно кончились, я не понимаю как это возможно пример официальный только указал свой кит и в первоначальном виде не работает... Хотел побаловаться потом периферию подцепить.
Спойлер
[url=http://img.radiokot.ru/files/57476/medium/1hmbhrm20o.jpg]Re: О разработке приложений на PSoC-4 фирмы Cypress
Вывод 12 Вашего PSoC используется для SWD. Чтобы переназначить его под GPIO следует в закладке System конфигуратора ресурсов .cydwr выбрать опцию GPIO в строке Debug Select. Если я Вас неправильно понял, рекомендую перечитывать своё сообщение до его публикации и формулировать вопросы более точно. Помогло-бы выкладывания всего проекта. Я его, правда, не смогу проверить в железе по причине отсутствия у меня такой платы.
Re: О разработке приложений на PSoC-4 фирмы Cypress
Польза хелпера не в названиях пинов, а в его связи с API функциями, которые позволяют индицировать числа и другие символы на дисплее, например функция Write7SegNumber.
О, это снова я. У кого есть под рукой проверить как эта функция работает. А то у меня то ли лыжи...Делаю сейчас один маленькой проектик, со стекляшкой из самого первого сообщения. Использую плату CY8CKIT-059. Сконфигурировал две группы по 3 разряда. Потому как на дисплее будут отображаться время с точностью то миллисекунды. Целую часть буду кидать на одну группу, а дробную на другую. Ну и использую вышепомянутую функцию. У той функции есть третий параметр - отображать или нет ведущий ноль. Всё нормально работает, кроме одного момента - если нужно отобразить просто "0". Почему-то оно гасит всё! Т.е. отображается не " 0.000", а " .000". Сейчас я, конечно, workaround сделал и отображает как я хочу, но неужели в одной функции можно столько накосячить? Я тут делал поиск в даташите по словам "leading" и "zero" - было упоминание в трёх местах: при описании этой функции и два в списке изменений (исправление багов).
Глянул я на устройство этой функции. Ну что можно сказать... программисты, они такие программисты. Как поправить я знаю, но это исправление теряется каждый раз как перегенерирую аппликацию. Надо бы править в шаблоне, но я пока не искал, где это.
Код: Выделить всё
void LCD_Write7SegNumber_1(uint16 value, uint8 position, uint8 mode)
{
uint8 i;
uint8 num;
if(0u != LCD_DIGIT_NUM_1)
{
position = position % LCD_DIGIT_NUM_1;
}
/* While current digit position in the range of display keep processing the output */
for(i = position; i < LCD_DIGIT_NUM_1; i++)
{
num = (uint8)(value % 10u);
if((0u == value) && (0u == mode)) // ВОТ ТУТ ОШИБКА!!!!!!!!!!!!!
// if((0u == value) && (0u == mode) && (i != position)) // ВОТ ТАК НАДО
{
/* In case of 'no leading zeros' each extra digit will be cleared */
LCD_Write7SegDigit_1(LCD_7SEG_BLANK_DIG, i);
}
else
{
/* Display subsequent digit or '0' if 'no leading zeros' mode */
LCD_Write7SegDigit_1(num, i);
}
value /= 10u;
}
}
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: О разработке приложений на PSoC-4 фирмы Cypress
Проверил на PSoC4 - тоже самое.
Это поведение можно рассматривать на "фичу" - если задано гашение впереди стоящих нулей и само число 0, то гасится всё.
Если думаете, что это баг, то в каждой программе имеется баг, также как в каждой книге опечатки. Это реальность и от неё не уйти.
Всегда можно сделать обходной манёвр. Спасибо, что поделились своим.
Это поведение можно рассматривать на "фичу" - если задано гашение впереди стоящих нулей и само число 0, то гасится всё.
Если думаете, что это баг, то в каждой программе имеется баг, также как в каждой книге опечатки. Это реальность и от неё не уйти.
Всегда можно сделать обходной манёвр. Спасибо, что поделились своим.
Re: О разработке приложений на PSoC-4 фирмы Cypress
Я считаю, что это баг. Только, пока не искал, где написать тикет или что подобное. Но странно, что никто на это не обращает внимания (или никто не пользуется?), так как и в гугле ничего не нашел (или искал не правильными словами?).
Ну да ладно, вот новый затык - может кто свежим взглядом заметит, что я накосячил:

Вот этот узел не делает вызов в прерывание по окончании преобразования АЦП. Таймер, из тактовой частоты делает импульсы с периодом в 1мс и попутно вызывается прерывание таймера (оно работает). По этому имульсу запускается преобразование АЦП и по окончании сканирования должно возникнуть прерывание. Вот оно у меня не возникает.
Оказывается возникает. Всё что под спойлером написал, к проблеме не относится.
Делал всё по этой инструкцйии из даташита на АЦП:
Добавлено after 5 minutes 18 seconds:
Вот только не понимаю один момент. В описании функции ADC...IRQ_Enable упоминается, что чтение результата сбрасывает прерывание... Но где его читать, если результат дважды при помощи ПДП копируется в памяти?
При исследовании проблемы выяснилось, что нет запуска на преобразование АЦП. Во первых частота АЦП у меня 2МГц, а длительность TC - Один импульс от 24 МГц. А в требовании на АЦП указано, что длительность этого импульса должна быть не менее одного периода тактовой частоты АЦП. Сижу ломаю голову как это обеспечить.
Итак, вот решение:

Просто тактирование АЦП сделал внешнее и его же подал на вход таймера с соответствующим изменением коэффициента пересчета. Таким образом соблюдаются требования на параметры импульса запуска.
Ну да ладно, вот новый затык - может кто свежим взглядом заметит, что я накосячил:
Вот этот узел не делает вызов в прерывание по окончании преобразования АЦП. Таймер, из тактовой частоты делает импульсы с периодом в 1мс и попутно вызывается прерывание таймера (оно работает). По этому имульсу запускается преобразование АЦП и по окончании сканирования должно возникнуть прерывание. Вот оно у меня не возникает.
Оказывается возникает. Всё что под спойлером написал, к проблеме не относится.
Спойлер
Код: Выделить всё
CY_ISR_PROTO (ADC_IRQ_Handler);
CY_ISR_PROTO (TimerIRQ_Handler);
void dummy_handler(void) {
return;
}
void (*dma_handler)(void) = dummy_handler, (*timer_handler)(void) = dummy_handler;
void InitPeriph(void(*dma_task)(void), void(*timer_task)(void)) {
EEPROM_Start();
I2C_Start();
QuadDec_Left_Start();
QuadDec_Right_Start();
PWM_Start();
PWM_Servo_Start();
dma_handler = dma_task;
ADC_IRQ_StartEx(&ADC_IRQ_Handler);
ADC_Start();
timer_handler = timer_task;
TimerIRQ_StartEx(&TimerIRQ_Handler);
Timer_Start();
CyGlobalIntEnable; /* Enable global interrupts. */
}
CY_ISR (TimerIRQ_Handler) {
if (Timer_STATUS & Timer_STATUS_TC) {
QuadDec_Left_GetCounter();
QuadDec_Right_GetCounter();
(*timer_handler)();
}
}
CY_ISR (ADC_IRQ_Handler) {
for (unsigned int i=0; i < 8; i++) {
photo_sensor_buffer[i] = ADC_GetResult16(i);
}
(*dma_handler)();
}
Делал всё по этой инструкцйии из даташита на АЦП:
Только, мне показалось, что там нужно всё же амперсанд добалять. Во всяком случае, у таймера всё работает, а вот АЦП иногда срабатывает, но как правило - нет. Пробовал в дебаггере ставить брейкпоинт на входе этого обработчика - нет ни одного останова.Note You may use an alternative Interrupt service routine, located in your main.c file. In this case use the following template:
Implement interrupt service routine in main.c:
CY_ISR( ADC_SAR_Seq_ISR_LOC ){
/* Place your code here */
}
Enable ADC interrupt and set interrupt handler to local routine:
ADC_SAR_Seq_IRQ_StartEx(ADC_SAR_Seq_ISR_LOC);
Добавлено after 5 minutes 18 seconds:
Вот только не понимаю один момент. В описании функции ADC...IRQ_Enable упоминается, что чтение результата сбрасывает прерывание... Но где его читать, если результат дважды при помощи ПДП копируется в памяти?
При исследовании проблемы выяснилось, что нет запуска на преобразование АЦП. Во первых частота АЦП у меня 2МГц, а длительность TC - Один импульс от 24 МГц. А в требовании на АЦП указано, что длительность этого импульса должна быть не менее одного периода тактовой частоты АЦП. Сижу ломаю голову как это обеспечить.
Итак, вот решение:
Просто тактирование АЦП сделал внешнее и его же подал на вход таймера с соответствующим изменением коэффициента пересчета. Таким образом соблюдаются требования на параметры импульса запуска.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: О разработке приложений на PSoC-4 фирмы Cypress
Помимо этого можно начинать преобразование АЦП вызовом функции StartConvert() из обработчика прерывания таймера. Частота тактирования АЦП при этом может быть выше для ускорения преобразования. При аппаратном начале конвертирования можно тактировать АЦП и от своего осцилятора, также повысив его частоту. Модуль синхронизатора, похоже, лишний, у меня (правда, на PSoC-4 и PSoC-6) без него всё работает.
Re: О разработке приложений на PSoC-4 фирмы Cypress
Без этого синхронизатора получаю предупреждение:Хотя не понятно почему, ведь, эти два мегагерца делаются из тех же 24? Хм, с частотой я пожадничал - в даташите диапазон указан 1.6 - 18МГц. Поднял до 12 - вроде работает и работает неплохо.
Мне конечно, тоже дико выглядит, что есть два прерывания идущие следом друг за другом. Просто это перенесено из проекта для другого кристалла и таймерные прерывания там производились от другого таймера на другую частоту. Но тут мне жаба начала давить, что ресурсов не хватит - вот и объединил. А запуск хочу хардварный, так как после этого проекта перейду к попытке подключить ПЗС линейку, которую вы предложили в теме про TI RSLK. Я тут всё думал как сформировать столь странную последовательность импульсов и пришел к мысли, что на этом PSoC получится проще всего.
Вообще, мне 5-й PSoC понравился - ресурсов достаточно, есть где развернуться. Уже начал думать а не изготовить платы и трафарет и припаять этот QFN68... Но пошел в магазин посмотрел на цены... 16€ за кристалл и это без налога. Но потом подумал, что на платке CY8CKIT-059 за 17евро стоят два(!) кристалла - один целевой, а второй для KitProg. Я так понял, что cy8c5888 от cy8c5868 ничем особо не отличаются. И китпрог можно спокойно распотрошить, так как у меня уже есть минипрог и я закупился 10-ти контактными разъёмчиками с шагом 1.27мм.
Код: Выделить всё
Warning: sta.M0021: LineFollower_timing.html: Warning-1350: Asynchronous path(s) exist from "ClockBlock/dclk_glb_ff_1" to "ADC_Clock". See the timing report for details. Мне конечно, тоже дико выглядит, что есть два прерывания идущие следом друг за другом. Просто это перенесено из проекта для другого кристалла и таймерные прерывания там производились от другого таймера на другую частоту. Но тут мне жаба начала давить, что ресурсов не хватит - вот и объединил. А запуск хочу хардварный, так как после этого проекта перейду к попытке подключить ПЗС линейку, которую вы предложили в теме про TI RSLK. Я тут всё думал как сформировать столь странную последовательность импульсов и пришел к мысли, что на этом PSoC получится проще всего.
Вообще, мне 5-й PSoC понравился - ресурсов достаточно, есть где развернуться. Уже начал думать а не изготовить платы и трафарет и припаять этот QFN68... Но пошел в магазин посмотрел на цены... 16€ за кристалл и это без налога. Но потом подумал, что на платке CY8CKIT-059 за 17евро стоят два(!) кристалла - один целевой, а второй для KitProg. Я так понял, что cy8c5888 от cy8c5868 ничем особо не отличаются. И китпрог можно спокойно распотрошить, так как у меня уже есть минипрог и я закупился 10-ти контактными разъёмчиками с шагом 1.27мм.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: О разработке приложений на PSoC-4 фирмы Cypress
Неужели эта warning - специфика PSoC-5? У меня на 4-ке такое не возникает. Вообще, у 5-ки есть и более дешевые модели, начиная от $8. Интерессна причина Вашего выбора этого семейства. Какие именно функции его упростят проект? Если аппаратный запуск АЦП по сигналу таймера, то так и у других МК можно.