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

MaxiMuz

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

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

  • Посещение

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


  1. Подбираю транзистор в качестве ключа. Управление осуществляется с МК U = 2,8..3,3 В Коммутируемый ток от 0,5А до 1,5А в пике. Частота коммутации около 30...100 кГц. Решил что полевой транзистор для этого будет в самый раз.. По характеристикам подобрал IRFZ44 : http://tec.org.ru/board/irfz44n/49-1-0-1125 Но его нет в продаже. Есть ли у него какие нибудь аналоги ?
  2. Первый вопрос: вы отключили бит CKDIV8 ?
  3. Принцип понял, но непонятен механизм. i=0 ,получаем адрес ((pbuff+i)&ADDR_MSK) = (0х00001000+0)&0x000FF000 = 0х00001000 i=1 : ((pbuff+i)&ADDR_MSK) = (0х00001000+1)&0x000FF000 = 0х00001000 тот же самый адрес, или я чего то не так понял ?
  4. Обьявлял массив в прерывании , и там же читал из него в глобальную volatile-переменную , которая использовалась в main-е. При этом в map файле упоминания массива я не нашел. Потом, переместил массив в обл.глобальных переменных, RO увеличилось на несколько единиц, но в map-файле указание на область data - это значит область данных ? CodeKey 0x0800125e Data 12 А, понял! адрес 0x0800125e - область кода. Как только убираю const , переменная перемещается в SRAM
  5. Значение ячеек не меняю и вывод делаю по : размеры областей не мяняются
  6. Попробывал 3 варианта: - массив без const - массив c const - баз массива. Меняется только размер кода , RO , RW и ZI - остаются прежними. Вывод: независимо от квалификатора const массив адресуется из флеш-памяти.
  7. Под AVR GCC как раз так и происходило , пока на добавишь квалификатор PROGMEM
  8. Интересует под Keil где описывается правило размещения данных или массива данных обьявленных как const. Размещаются ли они в ОЗУ или в памяти программ ? Например: const u8 CodeKey[12]={1,4,7,11,2,5,8,10,3,6,9,12};
  9. Только в этой функции, я думаю , не увеличение tail а набоборот: signed int getArray(void) { signed int res = -1; if(head == 0) return res; //нет данных - возвращаем -1 res = buff[tail]; tail--; return res; //возвращаем данные }
  10. Если чем нибудь поможет : 1) вызов или занятие встречной АТС - 1200Гц, t=170..250 мс. 2) Ответ вызванного абонента - 1200 Гц, t=170..250 мс. 3) Набор номера - 1200 Гц, t=~55 мс. 4) Обой - 1600 Гц, t=700+-150 мс. Подробная инфа о параметрах можете найти в сканах документации что я вам привел. _ Если вы хотите чтобы ваше оборудование было совместимо с другим подобным оборудованием. Но если вы хотите сделать собственную закрытую систему , то проще сделать , к примеру, вызов 1200 Гц , отбой 1600 Гц . Этим вы сильно упростите себе задачу распознавания двух частот. Но если всеже вам нужен именно АДАСЭ , то тут два варианта: 1. Аппаратно делать на фильтрах апппаратный приемник тонального набора (ПТН на рис.) - детектор частот. 2. программно на микроконтроллере с помощью БПФ. Как раз для двух и более частот используется БПФ.
  11. нужно прошить штук 20 контроллеров и забыть
  12. http://chel.pulscen.ru/products/pickit_3_17430823 "Программатор PICkit 3 в - 1 450 руб./комплект" да за такие деньги я азбукой Морзе его зашью !
  13. Приветствую ! Встала задача перешить PIC16F886, старый добрый PonyProg не поддерживает данный чип. А с пиками я не работал. Буду благодарен если посоветуете какую нибудь схемку.
  14. Посоветуйте где купить модуль подобный вот этому: http://tqfp.org/auction/item/99 Контроллер любой из линейки STM32F. Количество ног от 18 до 40 , более получиться громоздко. Нужен один модуль для пробы, с возможностью в дальнейшем заказать несколько десятков штук. Буду благодарен если кто подкинет ссылки. Кроме той что выше ничего путного не нашел
  15. Да действительно , программа тут не причем. Еще порекомендую по питанию и по входу поставить кроме электролитов керамические кондеры 0,1-0,01мкФ
  16. При беглом просмотре программки, сделал вывод что при каждом появлении 1 на PA0 у вас включается программный счетчик и считает пока эта 1 не пропадет. Соответственно единица пропала - сколько там насчитал счетчик неизвестно! Проверьте алгоритм , подтяните вывод резистором к нулю чтобы при отсутствии напряжения на нем гарантированно был "0" и к примеру кнопкой подавайте на него питание +5в. И смотрите что у вас получиться
  17. Задача своевременного запуска обработчика таймера решена. Но хочу разобраться как связан бит UG c формированием запроса не прерывание . Согласно описанию : Т.е. чтобы вызвать появление Update event (UEV) нужно чтобы счетчик досчитал до ARR. Поэтому я перед тем как Разрешить прерывание запускаю счетчик и естественным путем вызываю Update event (UEV) , а потом сбрасываю запрос на прерывание : TIM2->ARR=(1); TIM2->PSC=(65535-1); TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера //TIM2->EGR = TIM_EGR_UG; // генерим событие таймера __NOP(); __NOP(); __NOP(); TIM2->SR =~(TIM_SR_UIF);// сброс ф.прерывания __NOP(); NVIC_ClearPendingIRQ (TIM2_IRQn); /* Разрешение прерывания TIM2 */ NVIC_EnableIRQ(TIM2_IRQn); Почему тогда в этом случае , не происходит сброс запроса на прерывание ?
  18. Выясненно опытным путем с использованием документа "Cortex-M3 programming manual". Сброс флага статусного регистра TIM2->SR =~(TIM_SR_UIF); не приводит к сбросу самого запроса на прерывание. Чтобы сбросить запрос на прерывания делаем: 1. После загрузки временных прарметров разрешаем прерывание по срабатыванию таймера 2. генерим событие таймера UG 3. Ждем один такт и только потом сбрасиываем флаг прерывания в регистре статуса таймера 4. Запускаем Таймер 5. Очищаем Interrupt clear-pending registers (NVIC_ICPRx) 6. И только потом включаем разрешение на прерывание /* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */ TIM2->ARR=(1500); // загрузка рег-ра для сравнения ~ 366/1500=0,244 Hz TIM2->PSC=(65535-1); // предделитель CK_CNT=24000000/65536=366,2109375 Hz TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера TIM2->EGR = TIM_EGR_UG; // генерим событие таймера __NOP(); TIM2->SR =~(TIM_SR_UIF);// сброс ф.прерывания TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера NVIC_ClearPendingIRQ (TIM2_IRQn); /* Разрешение прерывания TIM2 */ NVIC_EnableIRQ(TIM2_IRQn); Если закоментить nop, то сброс события таймера не проходит. Собственно вопрос такой , если мы в конце сбрасываем бит запроса на прерывания от таймера2 , тогда уже не важно какие события произошли до этого , прерывание по идее не ожидается, правильно ? Но если я убираю команду TIM2->EGR = TIM_EGR_UG; // генерим событие таймера , то таймер сразу после разрешения прерывания запускается.
  19. тоже самое Похоже что TIM2->SR =~(TIM_SR_UIF); не сбразывает сам "запрос" на прерывание
  20. пробывал вот так: /* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */ TIM2->ARR=(6500); // загрузка рег-ра для сравнения 366,2109375/350=1 Hz TIM2->PSC=(65535-1); // предделитель CK_CNT=24000000/65536=366,2109375 Hz TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера TIM2->EGR = TIM_EGR_UG; TIM2->SR =~(TIM_SR_UIF);// сброс ф.прерывания TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера /* Разрешение прерывания TIM2 */ NVIC_EnableIRQ(TIM2_IRQn); Не работает, таймер также запускается при ресет
  21. Да , действительно , если в свойствах битов регистра "rc_w0" -означает очистка 0 , то корректнее очищать флаг: REG= ~(BIT_MASK); Но если используется всего один флаг , то так TIM2->SR &=~(TIM_SR_UIF); тоже правильно
  22. SAM4L

    а с чего вы решили что она постоянно равна 1 ? упс! похоже вопрос решен B)
  23. Запрограммировал таймер на отчет временных интервалов: /* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */ TIM2->ARR=(8000); // загрузка рег-ра для сравнения 366/8000=0,046 Hz TIM2->PSC=(65536-1); // предделитель CK_CNT=24000000/65536=366 Hz TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера TIM2->CNT=1; TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера /* Разрешение прерывания TIM2 */ NVIC_EnableIRQ(TIM2_IRQn); Период србатывания ~21сек. В обработчике поставил маркер срабатывания: void TIM2_IRQHandler (void) { u32 i; TIM2->SR &=~(TIM_SR_UIF);// сброс ф.прерывания SWITCH_PIN(PC8); } При запуске программы почемуто сразу срабатывает прерывание. С какого это оно срабатывает , если событие не наступило? Как сделать чтобы первое срабатывание было только по совпадению с рег-ом ARR ?
×
×
  • Создать...