Jump to content

    

Galizin

Участник
  • Content Count

    14
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. stm32 ADC Hard_Fault

    http://infocenter.arm.com/help/index.jsp?t...a/CIHFDJCA.html Может поможет локализовать
  2. В документе по таймерам 3 серии сказано что в для tim17, tim16 в качестве trigger out используется OC.
  3. Здравствуйте. У меня тот же плейер и та же ситуация. Получилось у Вас что нибудь с compact flash?
  4. EOCIE в регистре ADC_CR1 ? Или что то типа ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE) согласно Вашему стилю? Правда это все для 1 серии. Но для второй наверняка так же.
  5. тормозит DMA - 2

    Может кроме DMA использовать таймер дополнительно. ДМА будет писать в теневой регистр. По таймеру аппаратно будет запускаться DAC - данные из теневого регистра будут переноситься регистр DAC. Нужно реализовать небольшое отставание записи данных в DAC от запуска самого преобразования. Тогда сигнал будет выводится с отставанием почти в период, зато случайные небольшие задержки не будут влиять на результат - есть почти целый период, что бы выполнить эту операцию. Если ЦАП внешний возможно придется организовать внешнюю защелку. Из защелки в DAC данные должны попадать по сигналу таймера (ШИМ).
  6. Вот эти два предложения противоречат друг другу. С одной стороны чип тот же, с другой - другой идентификатор. 1F1F выглядит странно. Попробуйте уменьшить скорость порта.
  7. Да есть. http://we.easyelectronics.ru/STM32/ispolzo...-stm32f100.html Маленькая программка зашилась.
  8. Почти. Требуется доработка конфигурационных файлов http://we.easyelectronics.ru/STM32/ispolzo...-stm32f100.html st3232 datasheet Hello world я через него залил. Программу ~14k не удалось залить - не проходит проверку. Возможно нужны провода минимальной длины или спалил чего. Поскольку купил stm32vldiscovery - в причинах не разбирался.
  9. Proteus+MSP430

    В 7.6 proteus появилась модель MSP430. Похоже WD таймет в интервальном режиме там не работает. IO ports вроде работают. Утверждается, что загружается ELF, но на самом деле пишет, что не поддерживает этот формат. C hex работает. Но отлаживать неудобно. Есть дизассемблер.
  10. DTOA на MSP430

    Вот еще маленькая функция преобразования float в char* Это не окончательный вариант и может не работать. Но идея прозрачна - выделение целой части потом вычитание этого целого и умножение на 10 и так в цикле.display_float.zip
  11. Я столкнулся с тем что порядок настройки регистров тоже имеет значение. Сделал установку всех битов в беспорядке - прерывание не генерировалось. Скопировал с примеров - все работает как часы. Примеры от gcc. В одном из них есть работа по прерыванию от порта. Такое впечатление что P2IE должен устанавливаться в последнюю очередь, что бы генерировалось прерывание.
  12. Библиотека 32 разрядной плавающей точки MSP430 для gcc без аппаратного умножителя. Для работы нужно слинковаться с библиотекой. Добавляет чуть больше 1к кода но это гораздо меньше чем стандартная библиотека gcc. Переработанный пакет FPP из состава iar. Внутри считается как и в оригинале. Перед и после работы каждая функция выполняет преобразование к iee754. Определены 2 набора функций - один описан в fpp.h. Второй совпадает с набором названий gcc. Нет проверки на ошибки.
  13. Да таймер тактируется с ACLK - это место в коде закомментарено. TASSEL2 в msp430f1121 не используется. Обозначен как unused bite slau049.pdf описание TACTLx 10 Capture on falling edge То есть если первый бит установлен - то по спаду. Есть всего два макроса для CM - CM1 и CM0 предполагаю, что CM1 является более старшим битом. Но частота то на CCI есть. Синхронный режим не включен - сам CCI мог бы и тактировать. А если частота CCI превышает чатоту таймера - эначит не каждый спад CCI будет распознан? Как то криво получается. Я полагал что такое получается только в случае синхронной работы захвата. А в асинхрнном режиме флаг прерывания выставляетс я асинхронно и независимо от тактирвоания TA. На то он и асинхронный режим.
  14. Здравствуйте. Я пытаюсь мерить частоту с помощью таймера А. На вход таймера я подаю искомую чатоту - для примера SMCLK или ACLK. На вход захвата TACCR0 подаю сигнал с частотой 42,3 ( 128/3 ) Hz. В первом прерывании по захвату я сохраняю захваченное значение. По истечении 64 прерываний я снова читаю захваченное значение Нахожу разность с сохраненным - это количество входных импульсов за 3/128*64 Sec. На основании этого делением расчитываю частоту. При бездействии ухожу в lpm0. Если входная частота есть - то все меряется как следует. А вот если входная частота отсутствует - то не происходит вызова прерывания по CCR0 - Контроллер как бы подвисает. Вот исходный код - если тактировать от ACLK без кварца(закомментарено) - то 0 частота не меряется. LONG TimerSavedValue; WORD Capt0SavedCount; WORD CurrentHiTimer; WORD Capt0Count; LONG CountFromPrevTime; void main() { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer P1DIR |= LCD_CLK|LCD_DI; // Set P1.0 to output direction P2DIR |= LCD_POWER; P2OUT |= LCD_POWER; // LCD Power on P1OUT &= ~(LCD_CLK|LCD_DI); P1SEL = CLOCK42HZ; // P1.1 to timer DCOCTL = DCO0|DCO1|DCO2; TACCTL0 = CM1|CAP|CCIE; // Capture on_falling CCI0A interrupts // Clock from SMCLK - measure frenq of DCO - must use LPM1 for active DCO TACTL = TASSEL1|MC1|TAIE|TACLR; //SMCLK Continuous interrupt_on_overflow clear //TACTL = TASSEL0|MC1|TAIE|TACLR; //ACLK Continuous interrupt_on_overflow clear _EINT(); do { _BIS_SR(LPM0_bits); /* Wait end of measure */ _NOP(); { FLOAT F; F = CountFromPrevTime * 128.0 / 3 /Capt0SavedCount; DisplayFloat(F); if ( (BUTTON_POWER & P1IN) == 0 ) { DCOCTL = DCOCTL + DCO0; if ( DCOCTL == 0 ) { BCSCTL1 = (BCSCTL1&~(RSEL0|RSEL1|RSEL2)) + ((BCSCTL1+RSEL0)&(RSEL0|RSEL1|RSEL2)); } } } }while(1); } static WORD GetHiTAWord(WORD TACaptValue) { WORD RetVal = CurrentHiTimer; if ( (SWORD)TACaptValue > 0 && ( (TACTL & TAIFG) ) ) { RetVal++; /* Correct TA owerflow if need */ } return RetVal; } /* Owerflow TA ISR */ #if !defined(__GNUC__) interrupt [TIMERA1_VECTOR] void TAOwerflow(void) #else interrupt (TIMERA1_VECTOR) TAOwerflow(void) #endif { if ( TAIV ) // Pseudo Reading TAIV !!!! CurrentHiTimer++; } /* CCR0 capture vector */ #if !defined(__GNUC__) interrupt [TIMERA0_VECTOR] void TACapture(void) #else interrupt (TIMERA0_VECTOR) TACapture(void) #endif { Capt0Count++; if ( Capt0Count >= 64 ) { t_Timer Value; Value.Word[LO] = TACCR0; Value.Word[HI] = GetHiTAWord( Value.Word[LO] ); // Calculate tick count from prev time CountFromPrevTime = Value.Long - TimerSavedValue; // Save previon value TimerSavedValue = Value.Long; // Save time measure interval ticks. Capt0SavedCount = Capt0Count; Capt0Count = 0; _BIC_SR_IRQ(LPM4_bits); /* Exit from all LPM */ } }