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

GenaSPB

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

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

  • Посещение

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

    2

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


  1. Переходящим с AVR на ARM

    Решил поделиться опытом и картинкой с настройкам. Сделав по одной из схем wiggler и получив надежную работу в компании с программой H-JTAG, решил воспользоваться возможностями произвольного конфигурирования назначения выводов LPT порта и прикрутить адаптер STK200 (один из его клонов со слегка расширенной функциональностью - с добавленной линией передачи тактового сигнала на программируемый процессор через вывод 5 десятиконтактного разъёма. Их подводных камней - если ARM попробует выдать reset на вывод, подключенный к STK-200... если не будет токоограничвающих ресисторов в адаптере - будет грустно (наверное). Так что, этот вариант лучше использовать если есть "правильный" адаптер, а не упрощённый. Среди приаттаченных файлов скриншот с p-cad - решил такой вариант разводки делать на платах с AT91SAM7Sxxx для заливки прошивки. В общем-то мне большего от j-tag не надо, возможности отладки не проверял. Вид всех разъемов (10-ти и 20-ти контактных) - со стороны выводов. Да, работоспособность этого варианта зависит от того, что держит H-JTAG на неупомянутой в конфигурации ножке - у STK200 сигнад D3 (вывод 5 на DB-25) единицей переводит выходы в третье состояние. Надо бы предложить автору H-JTAG это вариант ввести в свою программу как предопределенный... http://www.hjtag.com/
  2. Проверил - всё точно, не ошибся я с программированием pll. Спасибо большое за подсказки. зы: что-то не удается фотографию тестовой платы приатачить. Експлорер уходит в себя, иногда bad gateway пишет.
  3. Я еще не научился программировать таймеры... да, внмательно просмотрел тот пример от атмела, в котором программируется генератор на 96-с-копейками для работы с USB при использовании кварца на 18.4312 - там как рвз учитывается, что писать в регистр умножителя pll надо уменьшенное число - оно просто используется, 72, без комментария, что в расчетах будет 73...
  4. Интересно! Первый нулевой импульс имеет около 80 нан в нуле. Остальные в последовательности формирубт строгий меандр с периодом около 125 наносекунд - тоесть, по те самые 62 наносекунды. Короче, теперь я уверен, что тактовая точно 48 мегагерц! Пока впечетления самые приятные.
  5. Про три такта - это где написано? Из чего это время складывается? Не, про такты и время на инструкции я понимаю. Может, работа через set/reset на середине такта на выводы попадает? Я, в общем-то, тоже ожидал увидеть что-то, кратное тактовой частоте с периодом примерно 21 наносекунда. А у меня получилось 2.5 такта... Я делал так: // пример функции, для скорости помещаемой в SRAM void RAMFUNC_NONILINE fast_clock_test(void) { for (;;) { AT91C_BASE_PIOA->PIO_CODR = mask; AT91C_BASE_PIOA->PIO_SODR = mask; } } Вот в "короткой" части этого цикла (между сбросом и установкой бита) осцилограф TDS-1012 показывает около 52 наносекунд.
  6. Начал я использовать AT91SAM7S32 - получил, при исполнении программы "ножкодрыгательства" из SRAM при тактовой частоте 48 МГц минимальное время между переключениями состояния вывода около 53 наносекунд. Нормально ли это? дело в том, что не смотря на упоминание в даташите того факта, что умножитель PLL записанный в соответствующий регистор используется увеличенный на единицу, 90% всех увиденных мною примеров в Интернете игнорируют это. Соответственно, у меня вопрос - кто-нибудь проверял, как оно на самом деле? Проект (использовал yagarto, слегка доработал crt.s и скрипты линкера для поддержки ramfunc и инициализированных переменных) в аттачменте.
  7. 6666 это уже 32-битное число. Соответственно, надо const char format[] = "%u/%u/%u %u:%u:%lu";
  8. В аттачменте к этому ответу - расчеты субоктавного преселектора 1.6...60 Мгц от недавно сделаной мною конструкции. Вход-выход - 200 Ом (в 50-омный тракт включается через два трансформатора TC4-1T). Это, по-моему, несколько уменьшает влияние сопротивлений диодов ключей и потрь в контурах. Я расчитывал на добротность катушек 30 - при этом, единственная беда - затухание в полосе пропускания у таких фильтров около 2..3 дБ. Если архитектура приемника позволяет такое решение - то почему бы и не применить? Перекрестные искажение в этой конструкции наступят скорее всего позже, чем "наестся" первый смеситель. Получил сильный завал только от двух трансформаторв за 50 МГц (скорее всего, что-то с разводкой налажал). Можно снизить порядок фильтра, можно расширить полосу - эти методы уменьшают потери в полосе при неидеальных индуктивностях. Тема, где описание и схемы премника лежат - более новая версия, чем на этой фотографии
  9. Вот тут http://forum.cqham.ru/viewtopic.php?t=17803 лежат исходники программы управления и проект в p-cad 2002 устройства с прменением ad9951. Ничего не меняется при применении 9954. В программе есть и установка множителей и управление регистрами. Если чего не хватит - легко доделать. Файл AD9951.C называется.
  10. MEGA+энкодер

    Ух ты... А тема ещй жива... Попробую предложиьть изящный (с моей точки зрения) способ реализации этого алгоритма. Используется с оптическими валкодерами, проблемы с подавлением дребезга механических датчиков в данном месте решал бы только с помощью RC-цепочки и триггера Шмидта. Начальное значение old_val - считанное значение из функции, дающей состояние битов прерываний. Входы прерываний программируются на срабатывание по любому перепаду. Ничего (кроме максимальной скорости вращения) не изменится, если функцию вызывать и из таймерного прерывания. static uint8_t old_val; void spool_encinterrupt(void) { uint8_t new_val = hardware_get_encoder_bits(); // dimensions are: // old_bits new_bits const static signed char 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; } #if defined (CPUSTYLE_ATMEGA128) ISR(INT4_vect) { spool_encinterrupt(); } ISR(INT5_vect) { spool_encinterrupt(); } #elif defined (CPUSTYLE_ATMEGA32) ISR(INT0_vect) { spool_encinterrupt(); } ISR(INT1_vect) { spool_encinterrupt(); } #else #error Undefined processor #endif /* получение накопленного значения прерываний от валкодера. накопитель сбрасывается */ uint_least16_t getRotateHiRes( uint_least32_t * jumpsize, uint_least16_t granulation) { #if ENCODER_HIRES #define BIGJUMPSIZE (10000UL / 4) static const uint8_t velotable [] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; #else #define BIGJUMPSIZE (10000UL) static const uint8_t velotable [] = { 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; #endif div_t d, h; uint8_t ticks; uint16_t nrotate, hrotate; cli(); if (tickcount != 0) { ticks = tickcount; tickcount = 0; hrotate = rotate; rotate = 0; } else { ticks = 1; hrotate = 0; } sei(); /* Уменьшение разрешения валкодера в зависимости от установок в меню */ h = div(hrotate, hiresdiv); cli(); rotate += h.rem; sei(); nrotate = h.quot; d = div(nrotate + stepcount, ticks); stepcount += d.rem; /* остаток пригодится в следующий раз */ if (d.quot < 0) d.quot = - d.quot; if (d.quot < (sizeof velotable / sizeof velotable [0])) * jumpsize = (uint32_t) granulation * velotable [d.quot]; else if (noaccelerate != 0) * jumpsize = (uint32_t) granulation * velotable [(sizeof velotable / sizeof velotable [0]) - 1]; else * jumpsize = BIGJUMPSIZE; return nrotate; } /* получение "редуцированного" количества прерываний от валкодера. * То что осталось после деления на scale, остается в накопителе */ int getRotateLoRes(void) { int nrotate; div_t d; cli(); nrotate = rotate; rotate = 0; sei(); d = div(nrotate, ROTATE_LORES_DIV); cli(); rotate += d.rem; sei(); return d.quot; } void encoder_initialize(void) { rotate = 0; stepcount = 0; tickcount = TICKCOUNT_MAX; hardware_encoder_initialize(); #if ENCODER_MULTICLICK old_val = hardware_get_encoder_bits(); #endif // ENCODER_MULTICLICK } Проект лежит здесь - http://forum.cqham.ru/viewtopic.php?t=15274 и в аттаче.
  11. AD7476 и ATmega32

    попробуйте, для начала, поуправлять АЦП "в ручную" - подёргать битики SPI программно. Вот пара моих кусочков кода для разных АЦП - по аналогии попробуйте... Для ad7276: unsigned long BoardReadADC() { unsigned long val = 0; prog_select(targetadc1, 1); SCLK_SET(); SCLK_CLR(); for (int i = 0; i < 12; ++ i) { SCLK_SET(); SCLK_CLR(); unsigned v = (lpt_readb_status() & 0x08) == 0; val = (val << 1) | v; } prog_select(targetadc1, 0); return val; } Для ad7810 void sclk_pulse(void) { SCLK_CLR(); SCLK_SET(); } // ADC conversion start signal void convstart_pulse(void) { prog_select(targetadc1, 1); prog_select(targetadc1, 0); } unsigned ad7810_read( void //unsigned char target /* addressing to chip */ ) { unsigned val = 0; // ADC conversion start signal convstart_pulse(); // for (int i = 0; i < 10; ++ i) { unsigned v; sclk_pulse(); // //v = (PIND & 0x08) != 0; v = (lpt_readb_status() & 0x08) == 0; val = (val * 2) | v; } // sclk_pulse(); sclk_pulse(); return val; }
  12. Странно... есть же на данном форуме тема с чужим готовым кодом... void lcd_menu_value( unsigned long freq, unsigned char width, // full width unsigned char comma, // comma position (from right, inside width) unsigned char rj // right truncated ) { //PROGMEM static const unsigned long vals [] = { 10000000, 1000000, 100000, 10000, 1000, 100, 10, 1, }; const unsigned char j = (sizeof vals /sizeof vals [0]) - rj; unsigned char i = (j - width); unsigned char z = 1; // only zeroes ws1602_gotoxy(0, 0); // курсор в начало первой строки for (; i < j; ++ i) { //ldiv_t res = ldiv(freq, pgm_read_dword(& vals [i])); ldiv_t res = ldiv(freq, vals [i]); if (comma == (j - i)) ws1602_wrdata('.'); if (z == 1 && (i + 1) < j && res.quot == 0) ws1602_wrdata(' '); // supress zero else { z = 0; ws1602_wrdata('0' + res.quot); } freq = res.rem; } } void ws1602_dispfreq(unsigned long freq) { lcd_menu_value(freq, 7, 2, 1); }
  13. AVR и AT клавиатура

    Кусок из работающего проекта. // PD7 - clock to host // PD2 - clock from keyboard // PB2 - data from keyboard // PB1 - data to host // PB0 - MUX control: 1 - pass trough static const uint8_t mask8 [8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; enum { PS2_STATE_DISABLED, // Ignore all interrupts from keyboard lines PS2_STATE_WAIT, // ready for receieve start bit PS2_STATE_SHIFT, // shift eight bits (bit osition is ps2_shift_count). PS2_STATE_PARITY, PS2_STATE_STOP }; static volatile uint8_t ps2_state; static volatile uint8_t ps2_shift_count; static volatile uint8_t ps2_shift_acc; static volatile uint8_t ps2_ones; // count ones in rcvd. byte and parity. Is non-zero if even parity #define PS2_FIFO_SIZE 32 static volatile uint8_t ps2_fifo [PS2_FIFO_SIZE]; static volatile uint8_t ps2_fifo_put; static volatile uint8_t ps2_fifo_get; // Keyboard subroutinues initialize void ps2_init(void) { ps2_state = PS2_STATE_DISABLED; ps2_fifo_put = ps2_fifo_get = 0; CLR_BIT(DDRD, PD2); // clock from keyboard is input, also INT0 input CLR_BIT(DDRB, PB2); // data from keyboard is input SET_BIT(MCUCR, ISC01); // ext. int. activated by falling edge CLR_BIT(MCUCR, ISC00); GIFR = (1<<INTF0); // clear ext. int. flag SET_BIT(GICR, INT0); // enable ext. int. } void ps2_enable() { cli(); ps2_state = PS2_STATE_WAIT; ps2_fifo_put = ps2_fifo_get = 0; sei(); } void ps2_disable() { cli(); ps2_state = PS2_STATE_DISABLED; ps2_fifo_put = ps2_fifo_get = 0; sei(); } ISR(INT0_vect) { switch (ps2_state) { case PS2_STATE_DISABLED: // Ignore all interrupts from keyboard lines break; case PS2_STATE_WAIT: // ready for receieve start bit if (PINB & (1<<PINB2)) break; ps2_state = PS2_STATE_SHIFT; ps2_shift_count = 0; ps2_shift_acc = 0x00; ps2_ones = 0; break; case PS2_STATE_SHIFT: // shift eight bits (bit osition is ps2_shift_count). if (PINB & (1<<PINB2)) { ps2_shift_acc |= mask8 [ps2_shift_count]; ps2_ones = ! ps2_ones; } if (++ ps2_shift_count >= 8) ps2_state = PS2_STATE_PARITY; break; case PS2_STATE_PARITY: if (PINB & (1<<PINB2)) { ps2_ones = ! ps2_ones; } ps2_state = PS2_STATE_STOP; break; case PS2_STATE_STOP: if (PINB & (1<<PINB2)) { if (ps2_ones != 0) { // place to output budffer uint8_t nextput = ((ps2_fifo_put + 1) == PS2_FIFO_SIZE) ? 0 : (ps2_fifo_put + 1); if (nextput != ps2_fifo_get) { ps2_fifo [ps2_fifo_put] = ps2_shift_acc; ps2_fifo_put = nextput; } } } ps2_state = PS2_STATE_WAIT; break; } } uint8_t ps2_get(void) { uint8_t scancode; cli(); scancode = ps2_fifo [ps2_fifo_get]; if (ps2_fifo_get == ps2_fifo_put) { scancode = 0x00; } else { ps2_fifo_get = ((ps2_fifo_get + 1) == PS2_FIFO_SIZE) ? 0 : (ps2_fifo_get + 1); } sei(); return scancode; }
  14. AvrStudio + WINAVR, чистый C Програма управления премником с синтезатором. С большой библиотекой подпрограмм для управления разнообразными микросхемами DDS и PLL. Програмный SPI, в минимальном виде обслуживание RAMTRON FRAM, примитивная клавиатура и инкрементный валкодер. Еще одна версия обслуживания HD1602. Аттачмент - TC1-.... ---------------- На китайском форуме нашелся полный проект прерходника USB-RS232 - стандартное CDC устройство. ATMEGA8 + Philips/NXP PDIUSBD12. Исходники и схема в аттачменте. Проект минималистский, но похоже рабочий. Во всяком случае, мне помогло кое-в чем разобраться, как с USB бороться. Оригинал лежит на http://blog.chinaunix.net/u/3272/showart_245587.html ---------------- Еще один проект ATMEGA162 + Philips/NXP PDIUSBD12. Внешняя USB звуковая плата для воспроизведения звуком. С кучей ошибок в коде (кое-где перепутаны выдача кода и данных в Philips), но мне помог на самом начальном этапе. Ввести звук в компютер мне так и не удалось заставить эту программу. http://www.circuitcellar.com/AVR2004/HA3553.html A3553.ZIP
  15. Да, есть теперь такое у них. Я могу предположить - у кого-то на участке насморк или кашель и он чихает. Капельки как раз в размер. Один раз удалось отследить партию, в которой это делалось - сообщил куда предлагают - но в последующем продолжали появляться. Это всё на срочном.
  16. Отбой.... Нашел у китайских ембеддеров проект, дескриптор из которого решил все мои проблемы. Проект с исходниками и схемами, если кому надо (переходник USB->RS232, ATMEGA8+PDIUSBD12).
  17. Здравствуйте. Я вот сейчас делаю то же самое, что и вы (макет на атмега162 уже был, сейчас атмега128). Правда нужны только данные, DTR/DSR и остальное не нужны... Несколько попыток (на остове апноутов атмеловских) для процов с набортным USB давали поведение типа - вис на инсталляции драйвера в систему (если вытащить усб кабель - заканчивалось нормально). Другие особенности - нет передачи даннхых (иногда - один пакет проходит и всё) в терминал, запущенный на хосте. Передача данных по виртуальному ком-порту от хоста к устройству идет нормально (как мне кажется). Честно говоря, очень многих проблем удалось бы уже избежать, если можно было бы взглянуть на Ваш проект (программу). Или, хотя бы на декрипторы однопортовой версии (со всеми константами). [email protected] Я начинающий в области usb-программирования. На фото - как выглядит макет (это АЧХ-метр для радиолюбительских целей).
  18. с hourglass разобрался (меня ткнули в статью в хелпе filter solutions, которая не находилась поиском), что интересовало там прочитал. Интересовал не расчет а, скажем так, сумма особенностей этой версии фильтра. Насчет расчета - у меня была идея сделать калькулятор для расчета сразу "семейства" фильтров - простые Чебышева, с возможной подстройкой границ диапазона и ожидаемой неравномерности в динамике - для получения наиболее близких к стандартным номиналам индуктивностей. Если поможете программой - идея когда-нибудь превратиться в программу. Сейчас интерация расчета по выбранным границам диапазонов занимает день (12-ти диапазонный блок фильтров). Фото на "мертвый" блок (с ошибками в разработке) ...под рукой не найти. Это для радиолюбительской связной техники, 11 диапазонов от 1.5 до 60 МГц + ФНЧ - 12 блоков фильтров, увч и еще один блок фильтров. Плата 100*200 мм. Адрес - mgs2001 на сервере pochtamt точка ru
  19. Не знаю у кого спросить... Гугль молчит. В Nuhertz Filter Solutions встретил такое название - посчитал - помоделировал - собрал - ФНЧ дает просто ровную как стол характеристику в полосе прозрачности (затухание за полосой, оно наверное отличается). Топология как у Чебышева-2 (инверсный Чебышева) или эллиптического - но идеален для измерительных приборов. Да и в приемнике отсутствие полуторадецибельного завала у ФНЧ на 1/4 полосы пропускания мне тоже понравилось - по сравнению с эллиптическими. Возможно, меньше влияение добротностей реальный катушек? Так вот вопрос - как этот прототип называется по русски, чтобы хоть что-то про особенности таких фильтров прочитать (типа краткой аннотации). тогда найду в учебнике. Или расскажите. В тех программах-калькуляторах где есть хелп с ликбезом, нет такого прототипа. а где есть фильтр - нет хелпа. в Ханзеле про это нет. В Викепедии тоже.
  20. HMC394LP4

    В случае данного устройства физический смысл относится к присоединению нескольких устройств к выходу этого счетчика. к стати, у TTL тоже такой параметр, как нагрузочная способность есть. Итак, вернемся к нашим элементарным счетчикам. Один счетчит делит частоту - за ним два устройства - полосовой фильтр и фазовый детектор, например. Потребители имеют 50-ом входы. Для согласования в таком случае можно использовать сплиттер на трех резтсторах 16..18 ом - который на каждом выходе обеспечивает -6 dB от входного уровня. Вот тут то уровни мощности (с учетом формы сигнала) и вылезут.
  21. HMC394LP4

    Может быть Вам поможет описание конструкции с применением такой микросхемы? http://www.thegleam.com/ke5fx/hpll.htm Если есть вопросы по применению - автор вполне отвечает на письма. ps: посмотрел в документ - у микросхемы выходной сигнал не меандр, соответственно, может быть ошибка при измерении прибором, ожидающим синусоидального сигнала?
  22. Насчет высоковольтных на выходе - это наверное в согласующем устройстве где-то? На форуме radioscanner было обсуждение обоснованности цены относительно малогабаритной рамочной антенны, устанавливаемой на крыше автомобиля. производит их фирма, находящаяся в ОАЭ. Так вот, представитель этой фирмы с ником ua6lfj писал довольно пространные посты, в которых упоминались действительно мощные конденсаторы - и, самое ценное, упоминались их производители (к сожалению, с космическими ценами на этот вид изделий). Поищите там. В остальных случаях имеет смысл расчитать и применить набор из постоянных.
  23. Извините, там, где Вы нашли, было только описание или код? Если код (да еще и на C!), не подскажете ссылочку?
×
×
  • Создать...