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

GenaSPB

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

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

  • Посещение

  • Победитель дней

    2

Весь контент GenaSPB


  1. Тут правильно сказали - если не тащить петель по плате - всё тихо работает. Вот на фото - приёмник. Клавиатура - 12 кнопок - подключеня к трём входам АЦП. Кварц на 12 МГц на процессоре AT91SAM7S64 - забыл предусмотреть припайку корпуса к земле - так я его слышу только тогда, гда к корпусу кварца прикасаюсь отвёрткой. Гораздо бероятнее получить наводки от контроллеа в индикаторе типа 1602. Из советов - уменьшать напряжение питания до минимума, в управляющие цепи включать последовательно резисторы, не жалеть фееритовых блочков и дросслей. http://forum.cqham.ru/download.php?id=52159
  2. Мне кажется, если не найти на помойке микросхему от cypress, то указанным Вами требованиям (кроме частоты) соответствует AD9834 - у неё есть выход последнего разряда сумматора, при тактовой до 75 МГц можно получать до 32.5 МГц.
  3. Тогда не просто коммутатор, а два - и управлять квадратурными сигналами. Писать двумя каналами звуковухи. Или все-таки не потеряется?
  4. Хоть разберётесь как должны выглядеть дескрипторы аудиоустройств и что именно должны делать функции-обработчики. Ещё один вариант - считать дескрипторы с какого-нибудь работающего usb audio устройства и побитно разобраться что зачем нужно. Желательно при этом иметь под рукой документ с usb.org. А что именно обеспечивает передачу данных по usb это совсем другая проблема. Зачем PCM3000 Вам нужен? На другой чип выдачу звука сделаете. Хотя бы для начала просто "проглатыватель" данных сделайте. ps: перечитал первй вопрос - Вам вообще ввод звука нужен. Загоните хотя бы синусоиду, сгенерированную программно в компютер. Потом АЦП прицепите.
  5. Загляните сюда - http://www.circuitcellar.com/AVR2004/HA3553.html Я начинал с разбирательств с этим проектом. Аккуратно, код написан студентом!
  6. Это тоже пример "шаловливых ручек". Зачем? Крутите потом, когда разберетесь с загрузкой файлов - когда сможете контролировать результат. Разнца между загрузкой в ОЗУ и программированием ПЗУ Вам понятна?
  7. В область 0 - скорее всего ничего не произойдёт. Вернее, надо прочитать повнимательней про маппинг после сброса у at91sam7sXXX - может оно в ОЗУ направляется? А при просто записи в область ПЗУ ничего не происходит, его содержимое не меняется и всё остаётся как и прежде. Если код, предназначенный для работы с абсолютного адреса 0 загручить со смещением - не знаю, зависит от кодогенератора. Сейчас я не знаю ассемблера АРМ настолько (и не собираюсь его изучать пока), чтоб сказать точно что будет, но, скорее всего, код выполняться будет из-за используемой в основном относительной адресации. НО, адрес ОЗУ прописан начинающимся с 0x200000 - и код, скорее всего, если используется что-то в ОЗУ - будет испорчен. Для отладки в ОЗУ попробуйте самостоятельно выделть два непересекающихся участка в ОЗУ и скомпилировать программу под эту конфгурацию (например, модифицировать конфигурацию debug того проекта, что я выложил). Ещё, есть предопределённые места в адресном пространстве - например, таблица векторов прерываний - и их прото так не переместишь. Мой пример не использует прерывания.
  8. Я же сказал - не записывается в ПЗУ. Только грузится естественно без результата. Адрес для кода в линкере я поставил с 0 - это надо каким-нибудь "флэшером" прожигать. IAR не делает этого. А "стартап" неявно подключается - о его наличии говорит содержимое .map файла после завершения построения проекта. Бинарник работающий, не беспокойтесь. Попробуйте .hex с помощью какой-нибудь утилиты вроде тех, что идут вместе с jtag адаптером прошить - и посмотрите на вывод PA8. У меня с частотой около полугерца машет. Возмоте мой проект и забудьте пока про стартап - он есть! Ну не даёт iar к нему доступа - так для начинающего продукт (на мой взгляд после знакомства с тем, что я вчера скачал).
  9. Посмотрел на результат препроцессирования (-E)... Только не понятно с такими ошибками, как же тогда offsetof в константных инициалзиаторах работает? Или тогда дефайлы для SFR надо было бы сделать так же... Кто объяснит это автору? ps: а для случая со смещениями в структурах придумано __builtin_offsetof - интересно, что-то делающее l-value из числа встроенное есть?
  10. Скачал IAR Embedded Workbench for ARM 5.40 Kickstart, в ней добился того, что собирается работоспособный проект. Средствами среды не нашёл способа прошивать во flash скомпилированную программу (только загрузка и выполнение из озу возможно). Вернее, не смог правильно сконфигурирвать предлагаемые flash loader-ы. В соответствующих каталогах проекта лежат .hex файлы, дёргающие PA8 с небольшой скоростью. Программировал flash отдельной программой - всё работает.
  11. Что не так в версии: template <uint8_t volatile & ctl, uint8_t volatile & port, const char bit> class mypin { public: __inline mypin(){ctl|=(1<<bit);} static __inline void set() {port|=(1<<bit);} }; mypin<DDRA,PORTA, PA4> mypinname; mypinname.set();
  12. А не надо делать предположения об адресе регистра управления направлением. Заведите явный параметр для регистра управления направлением и настанет благодать...
  13. Одна маленькая тонкость - в этой программе отсутствует разрешение реагирования процессора на сигнал сброса - то есть, попробуйте выключить питание отладочной платы, а затем включить опять. Обычно это разрешение делается startup, но не всегда нужно (оно, конечно, удобно при отладке, но в реальной жизни может и не требоваться).
  14. Держите на C. Подставить имя бита, который можете посмотреть осциллографом. #include "AT91SAM7S64.h" /* Главная функция программы */ int main(void) { AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // запретить сторожевую собаку #define WORKMASK AT91C_PIO_PA15 // битовая маска, определяет каким выводом шевелить AT91C_BASE_PMC->PMC_PCER = (1UL << AT91C_ID_PIOA); // enable periph clock for PIO controller AT91C_BASE_PIOA->PIO_PPUDR = WORKMASK; // disable pull-up resistors AT91C_BASE_PIOA->PIO_OER = WORKMASK; // эти выводы на вывод for (;;) { AT91C_BASE_PIOA->PIO_SODR = WORKMASK; AT91C_BASE_PIOA->PIO_CODR = WORKMASK; } #undef WORKMASK return 0; }
  15. Попробуйте в шаблоне не делать предположения о том, что uint8_t это unsigned char, а оставить этот тип. За справками в файл stdint.h, строка 121. И поделитесь результатами. зы: а попробуйте как улучшение сделать параметром ссылку вместо указателя.
  16. Есть предложение найти проект соответствующий версии компилятора, что у Вас есть. Или заставить среду создать проект под Ваш процессор, компилирующийся без ошибок (возможно, с пустой функцией main) и вбить в него обльно валяющиеся даже на этом форуме последовательности инициализации порта на вывод и мерцания светодиодом.
  17. Почитайте чужой опыт приручения прцессора ARM - http://microsin.ru/content/view/653/1/ - где-то на пункте 34 затрагивается тема startup. У меня программа скомпилированная для 64-го вполне работала в старших моделях - пока не заморачивайтесь. У вас ошбки не из-за этого. {offtopis on}Мне вот не понять, как можно столько времени бится головой об стену? У меня ножкой процессор начал махать где-то через пару часов после того, как я при наличии jtag программатра wiggler и спаянного на макетке просессора начал править под свои нужды startup, шедьший в примерах к yagarto (автор, в свою очередь, жестоко правил под себя соответствующий файл от NutOS). Уже потом я задавался вопросами - а правильно ли я программирую тактовый генератор и тому подобными вопросами (о чём я на этом форуме справшивал и мне конкретно помогли). Ну ведь готовые проекты есть, если не понятно что-то с настройками - оставьте изменение ключиков компилятора и опций проекта на тот момент, когда всё заработает! {offtopis off} Вспомнился баннер в песочнице - "бригада опытных телепатов ответит на все ваши вопросы". Вам ассемблер указал на номера строк. Что за инструкции в этих строках (и предшествующих) находится? Привели бы, не у всех IAR стоит.
  18. Добавлю-ка я вариант с учетверением количества импульсов валкодера. indent-ы в исходном тексте съела форма ответа на сообщение... static uint_least8_t old_val; void spool_encinterrupt(void) { uint_least8_t new_val = hardware_get_encoder_bits(); /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */ // dimensions are: // old_bits new_bits const static int_least8_t v [4][4] = { { +0, /* 00 -> 00 stopped */ -1, /* 00 -> 01 rotate left */ +1, /* 00 -> 10 rotate right */ +0, /* 00 -> 11 invalid combination */ }, { +1, /* 01 -> 00 rotate right */ +0, /* 01 -> 01 stopped */ +0, /* 01 -> 10 invalid combination */ -1, /* 01 -> 11 rotate left */ }, { -1, /* 10 -> 00 rotate left */ +0, /* 10 -> 01 invalid combination */ +0, /* 10 -> 10 stopped */ +1, /* 10 -> 11 rotate right */ }, { +0, /* 11 -> 00 invalid combination */ +1, /* 11 -> 01 rotate right */ -1, /* 11 -> 10 rotate left */ +0, /* 11 -> 11 stopped */ }, }; rotate += v [old_val][new_val]; old_val = new_val; } ISR(INT0_vect) { spool_encinterrupt(); } ISR(INT1_vect) { spool_encinterrupt(); } void encoder_clear(void) { rotate2 = 0; disableIRQ(); rotate = 0; tickcount = TICKCOUNT_MAX; enableIRQ(); } /* получение количества шагов и времени с последнего вызова. */ int encoder_snapshot( uint_least8_t * ticks, uint_least8_t derate) { div_t h; int hrotate; disableIRQ(); if (tickcount != 0) { * ticks = tickcount; tickcount = 0; hrotate = rotate; rotate = 0; } else { * ticks = 1; hrotate = 0; //hrotate = rotate; //rotate = 0; } enableIRQ(); /* Ументшение разрешения валкодера в зависимости от установок в меню */ h = div(hrotate + rotate2, derate); rotate2 = h.rem; return h.quot; } /* получение "редуцированного" количества прерываний от валкодера. * То что осталось после деления на scale, остается в накопителе */ int getRotateLoRes(void) { uint_least8_t ticks; return encoder_snapshot(& ticks, ROTATE_LORES_DIV * hiresdiv); }
  19. Коллеги, речь о том, что два генератора в одинаковых условиях измерения показали на 20 дБ отличающийся уровень шумов. Наверное, при изменении полосы разница в уровне не изменится?
  20. там, вроде, комментарии в файле keyboard.c на русском языке были, когд я писал. Функция hardware_ged_pressed_key() из файла hardware.c возвращает прзнак того, нажата ли какая-либо из кнопок и, собственно, номер (код) кнопки. Никаких ожиданий в этой функкции нет, так как она вызывается из обработчика таймерного прерывания около ста раз в секунду. Там, где она вызывается (ищется любым текстовым редактором) в файле keyboard.c - учитывается текущее состояние клавиатуры и давится дребезг (а так же определяется состойние "зажатой" кнопки - для отработки автоповтора (две скорости) или возврата признака "длинного" нажатия в вызывающую программу через функцию /* получение скан-кода клавиши или 0 в случае отсутствия. * если клавиша удержана, возвращается скан-код с добавленным битом 0x80 */ uint_least8_t kbd_scan(uint_least8_t * key, uint_least8_t * repeat) { ... }
  21. vhk, поскольку у тебя сейчас есть макет генератора на биполярном транзисторе, попробуй припаять второй паралельно первому (база с базой и так далее) и померяй - без изменения резисторов, задающих режим и, если есть возможность - увеличив суммарный ток транзисторов.
  22. Вот в этом архиве есть файл keyboard.c - в нём программное подавление дддребезга. А в файле hardware.c (hardware_ged_pressed_key()) - два варианта опроса клавиатуры - или кнопки, замыкающие вход процессора на массу или набор до четырёх кнопок, через резисторную цепочку подключенных ко входу АЦП на процессоре (до четырёх кнопок на один вход АЦП). Схемы резисторной цепочки в файле doc\keyboard_matrix.pdf http://electronix.ru/forum/index.php?act=a...st&id=37570
  23. Переход AVR to ARM

    Если бы вы, как внимательные читатели, не обратили внимание на этот кусок, так бы оно и неслось по волнам истории, не опускаясь на дно... короче, чтобы закончить жизнь этого наследия, пишу так: const unsigned int divisor = baud_rate * 16; return (main_clock + divisor / 2) / divisor; Интересно, поможет ли начать программировать под ARM это кому-нибудь? Прочитал про копи-пэйст. Поскольку осваивать пришлось весьма спешно, специально начал с минимального файла (единственный main и последовательность кода для ножкодрыгательства), без использования этого набора функций от атмела. Через некоторое время стала понятна идеология разработчиков периферии, уже знал что и где искать в даташите. Startup сначала был от yagarto, потом слегка переделывал.
  24. Переход AVR to ARM

    Ох ничего себе! Честно говоря, этот кусок скопипастил сам знаете откуда... Срочно поправил на unsigned int baud_value = main_clock / baud_rate; return ((baud_value + 8) / 16);
  25. Переход AVR to ARM

    Держите. Надеюь, из состояния писанины "студенческих" исходников я уже вырос... Хотя, возможны недоработки в плане структуры программы. Между прочим, как раз пример того, как я переходил с AVR (ATMega32) на ARM (AT91SAM7S64). Тема здесь - http://forum.cqham.ru/viewtopic.php?t=17803 Для сборки ARM версии используется YAGARTO, для AVR - WinAVR.
×
×
  • Создать...