Перейти к содержанию
    

budda_cognac

Участник
  • Постов

    16
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о budda_cognac

  • Звание
    Участник
    Участник
  • День рождения 13.07.1991

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Здравствуйте! Я использую USB как отладочный интерфейс на плате с ATXmega32a4u. В основном цикле программы я опрашиваю АЦП и подсчитываю количество выборок. Раз в 20 мс срабатывает внешнее прерывание на одном из портов общего назначения. По прерыванию я провожу вычисления, а результаты вычислений и количество отсчётов я помещаю в строку, которую затем буду передавать по USB. Проблема: если отключить модуль USB совсем, я успеваю получить около 900 отсчётов, как и было задумано, но с USB в большинстве случаев 0, иногда около 450. Такие значения оказываются в строке, да и отладка светодиодом показывает то же самое. В прерывании включаю светодиод, если отсчётов > 800, выключаю, если меньше. Если USB-кабель подключен - не горит, отключаю - горит. Функция main: box#include <asf.h> #include <ctype.h> #include <math.h> #include <string.h> #include "main.h" volatile uint64_t g_squared_sum; volatile uint16_t g_samples; volatile uint8_t g_signal_phase; volatile uint8_t g_duty_cycle = 50; volatile char g_usb_string[81]; volatile bool g_usb_timeout_is_counted = false; ISR(PORTD_INT0_vect); ISR(BADISR_vect); ISR(TCC0_OVF_vect); ISR(TCC0_CCA_vect); ISR(TCC0_CCB_vect); ISR(TCC1_OVF_vect); void vbus_event(bool vbus); uint32_t get_RMS(void); uint32_t average(uint32_t new_RMS); int main (void) { int32_t adc_result; irq_initialize_vectors(); // enable all irq priorities sei(); sysclk_init(); // turns off all peripheral. It reduces noise to ADC sysclk_enable_module(SYSCLK_PORT_A, SYSCLK_ADC); // turn on ADC on port A sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_TC0); // turn on TC0 clock sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_TC1); // turn on TC1 clock #ifdef DEBUG2 stdio_usb_init(); // enables and attaches USB, readdress std streams to USB #endif board_init(); // LEDs,buttons, ADC, TC0 settings while(1) { if(ADCA.CH0.INTFLAGS) { adc_result = (int32_t)ADCA.CH0.RES - ADC_OFFSET - BOARD_OFFSET; cli(); // need cli and sei to avoid executing irq g_samples += 1; // between changing g_samples and g_squared_sum g_squared_sum += (uint64_t) (adc_result * adc_result); sei(); // now irq enabled ADCA.CH0.INTFLAGS = 1; // clean flag } } } Вот прерывание: ISR(PORTD_INT0_vect) { average(get_RMS()); tcc0_restart(); PORTB.OUTCLR = PIN3_bm; g_signal_phase = 0; } Формирование строки для USB происходит в функции get_RMS() uint32_t get_RMS(void) { // count RMS based on global variables g_squared_sum, g_samples, // that are accumulated in a main loop uint32_t result = 0; if(g_samples) result = (uint32_t) sqrt(g_squared_sum/g_samples);// to avoid dividing by zero #ifdef DEBUG2 sprintf(g_usb_string, "result= %lu, sq_sum = 0x%lX%lX, samples = %u\r\n", result, (uint32_t)(g_squared_sum>>32), (uint32_t)g_squared_sum, g_samples); #endif g_samples = g_squared_sum = 0; // reset accumulated sum and samples counter return result; } Для работы с USB использую библиотеку ASF. Устройство нормально подключается, опознаётся. Чтобы получить строку, я отправляю через Putty символ, на что мне оно отвечает заранее подготовленной строкой из функции обратного вызова от драйвера интерфейса по получении данных в USB. void my_callback_rx_notify(uint8_t port) { char c; stdio_usb_getchar(0, &c); stdio_usb_write(g_usb_string, strlen(g_usb_string)); } Может ли USB так влиять? Опять же отладка светодиодами показала, что большую часть времени процессор проводит всё же в цикле main, а не в прерываниях USB. Может, я как-то не так передаю значение счётчика? Объявлен глобальной переменной со спецификатором volatile. Помогите, пожалуйста!
  2. Здравствуйте! У меня есть отладочная плата ПЛИС DE0-Nano на Cyclone IV, и я пытаюсь записать данные и считать из EEPROM на этой плате, которая общается по I2C. К этой плате идет программа Control Panel, которая позволяет проверить периферию платы. С её помощью я проверила, что данные, которые я отправляла, действительно были записаны. А вот считать своей программой у меня не получается. Прилагаю временные диаграммы. Подскажите пожалуйста, что я делаю не так? Диаграмма записи Между записью и чтением выдержано 3мс. Диаграмма чтения
  3. Мне нужно в ПЗУ записать песенку в формате ИКМ. Для этого я открываю wav-файл в Matlab, провожу децимацию и оставшиеся выборки квантую. Так у меня получается массив ИКМ значений, который я копипащу в редактор файлов инициализации Квартуса.
  4. Так, с первым вопросом я уже разобралась. Теперь я создаю .hex файл для инициализации не Matlabom, а встроенным редактором Quartus II. И при компиляции появляется сообщение о том, что он нормально читается. Вот с моделированием мне по-прежнему не всё ясно. В настройках Qsys стоит галочка на опции simulation, и в Modelsim'е я добавляю в проект сгенерированный Qsys'ом .tcl файл из каталога simulation/mentor. Получает ли Modelsim содержимое файла инициализации при добавлении этого .tcl?
  5. Здравствуйте! Я создала в Qsys onchip ROM (8 разр, 20 кБ, инициализируется из мною созданного файла). Файл для инициализации был получен из .wav (прочитан Matlab'ом и сохранен в .hex). У меня возникли следующие вопросы: - Что будет, если размеры памяти и файла для инициализации различаются (20 кБ и 21 кБ)? Не возникнет ли ошибки? Смущает, что в warning'ах ни слова нет о том, был ли прочитан .hex или нет. - Есть ли какая-нибудь документация на этот компонент, кроме того, что я уже прочла в "SOPC Buider User Guide"? Просто мне не понятно, зачем нужны ROM сигналы write и writedata, если я уже указала, из чего её инициализировать? Что и в каком случае тогда в нее можно записать? - Как мне промоделировать весь проект с учетом содержимого файла для инициализации? Помогите, пожалуйста!
  6. Забыла, конечно же )) Сначала я настроила вот так: sys_clock_timer > sys_clock_timer timestamp_timer > sys_clock_timer Программа запустилась, но сработала с ошибкой "no timestamp device available". Тогда я перенастроила: sys_clock_timer > none timestamp_timer > sys_clock_timer Заработало, как надо, хотя я не очень понимаю, что творю, и почему для того, и для другого не мог быть выбран один и тот же таймер Спасибо за помощь!!
  7. Здравствуйте! Впервые столкнулась с Nios II. В Qsys была создана система со следующими параметрами: - Nios II/standard - onchip mem 20 кБ - jtag uart - таймер (разрядность 32, full-featured) - блок system id - 8 параллельных выходов на индикаторы Проблемы возникли с программкой, представляющей собой немного модифицированный пример работы с таймером в режиме timestamp. #include <stdlib.h> #include <string.h> #include "system.h" #include "sys/alt_timestamp.h" #include "alt_types.h" int main (void) { char *string = "Who is faster?"; alt_u32 time1; alt_u32 time2; if (alt_timestamp_start() < 0) { printf ("No timestamp device available\n"); } else { time1 = alt_timestamp(); qsort (string, sizeof(*string), 1, strcmp); time2 = alt_timestamp(); printf ("%s", *string); printf ("time in func1 = %u ticks\n", (unsigned int) (time2 - time1)); printf ("Number of ticks per second = %u\n", (unsigned int)alt_timestamp_freq()); } while (1) {} return 0; } Функции alt_timestamp_start, alt_timestamp, alt_timestamp_freq оказались не определны. Я нашла файл altera_avalon_timer_ts.c, где описываются эти функции. Происходит это только, если выполняется некое условие #if (ALT_TIMESTAMP_CLK_BASE != none_BASE) Почему оно может не выполянться? Что могло произойти? Помогите, пожалуйста!
  8. Ммм, как раз на каждой итерации цикла вдвигается в аккумулятор по одному биту data. А вообще, я подсмотрела этот алгоритм в хорошей книжке Росса Уильямса "Элементарное руководство по CRC-алгоритмам обнаружения ошибок" CRC.pdf Если вдруг интересно =)
  9. Правда, не поняла я, почему в вышеприведенном коде xor делается после сдвига? Я сделала наоборот: сдвиг после xor'a, и получилось вот так: function check_sum(poly, initial_value, data:std_logic_vector)return std_logic_vector is variable i:integer; variable a, crc:std_logic_vector(initial_value'range); begin crc := initial_value; for i in data'reverse_range loop if crc(crc'high) = '1' then crc := crc xor poly; end if; crc := std_logic_vector(shl(unsigned(crc), "1")) + data (data'high - i); end loop; return crc; end function; Но это уже обсуждение из другой оперы =)
  10. Да, зря я , наверное, с самого начала поленилась написать вычисление crc... Спасибо всем, кто ответил!
  11. Но это то, что я поняла из этого документа. На деле оказалось не так: я залила в ПЛИС time_limited.sof, и появилось сообщение с вопросом, когда прекратить действие OpenCore feature. До того, как жмешь "ок" - все работает, как полагается. Но time_limited.sof удалось создать, используя только crc-генератор, так как лицензия от OpenCore Plus выдалась только ему, а crc-check'erу - нет. Странно, ведь и генератор, и чекер созданы с помощью одной и той же мегафункции...
  12. Так, я поняла, что сразу после конфигурирования ПЛИС, пока она подключена кабелем, я нахожусь в режиме JTAG-отладки. Но если я отключу кабель, я выйду из этого режима, и мой design как раз этот час и проработает. Но у меня отладочная плата DE0-Nano питается от этого кабеля! Если я хочу выйти из режима отладки, надо отключить кабель, но тогда и питание пропадет...
  13. Здравствуйте! Я генерирую ряд чисел, записываю их в SDR SDRAM (самописный мастер управляет альтеровским контроллером), в ходе генерации постепенно вычисляю контрольную сумму (crc-генератор создан при помощи мегафункции CRC Compiler v11.1), дозаписываю её в SDRAM. Когда все вычислено-записано, начинаю считывать из SDRAM эти же числа + контрольную сумму. Корректность проверяет crc-check'er, созданный той же мегафункцией. Когда я пытаюсь запрограммировать ПЛИС, появляется сообщение о том, что проект содержит мегафункции, использующие OpenCore Plus, и время их работы в железе ограничено (в warning'ах написано 1 час). Часа мне вполне достаточно. Warning (265069): Megafunction that supports OpenCore Plus feature will stop functioning in 1 hour after device is programmed Также в warning'ах написано, что вообще нельзя создать файлы для программирования: Warning (115003): Can't generate programming files for your current project because you do not have a valid license for the following IP core or cores. В итоге, после конфигурации ПЛИС я вижу, что не работает вообще ничего. Даже 1 час. Даже то, что работало, если выкинуть проверку контрольной суммы. Кто-нибудь сталкивался? Что с этим можно сделать, не покупая лицензию?)) Подскажите, пожалуйста!
  14. Только моделирую, потому что проверить в железе возможности пока нет. Спасибо за совет и объяснение! Стало понятно!
  15. Спасибо, Кирилл! Я использовала первый вариант с переменной, и он сработал! =) Я правильно всё поняла: если использовать сигнал - проверяется значение, полученное в предыдущем такте, а если переменную, то только что полученное?
×
×
  • Создать...