SapegoAL 0 3 апреля, 2014 Опубликовано 3 апреля, 2014 · Жалоба Доброго времени суток. Есть вопрос. Немного не учёл особенности однокристалки stm32f407. Короче мне надо использовать захват таймера. Но плата разведена на таймер 8. Он 16-ти битный. Мне для расчётов нужен 32-ух битный. Я сделал расширение таймера за счёт 4-го таймера. При захвате вызываю прерывание где читаю регистр захвата TIM8 и регистр CNT таймера расширения TIM4. Вижу потенциальные грабли в том, что пока вызывается прерывание, можно нарваться на "ненужное" переполнение. То есть фактически тот же неатомарный доступ только для таймеров. Кто-нибудь разруливал данную ситуацию? Я могу как-то захватить оба таймера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
e-serg 0 3 апреля, 2014 Опубликовано 3 апреля, 2014 · Жалоба Я могу как-то захватить оба таймера? Пробовал на stm32f107 два таймера, захват на каждом, есть сомнение в синхронности. Для вашего варианта можно посмотреть в сторону DMA. По событиям от TIM8, запускать чтение(запись) регистров TIM2 или TIM5. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 3 апреля, 2014 Опубликовано 3 апреля, 2014 · Жалоба Для AVR приходилось тоже извращаться (программно-аппаратное увеличение разрядности регистра захвата таймера). Не смог найти оригинальный источник с этой идеей на этом сайте. Поищите, может вы найдёте... Вот что у меня получилось после творческой переработки: ISR(COMP_VECTOR) { compare_isr(); } //============================================================================= // Подпрограмма выгребания события из регистра ICR. // Приоритет выше чем у переполнения и сравнения, поэтому такие сложности... //============================================================================= ISR(CAPT_VECTOR) { uint16_t icr = ICR; if ((icr<0x8000) && (TIFR & (1<<OCF))) { TIFR = (1<<OCF); // clr compare flag by writing 1 to its bits location. compare_isr(); } ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 3 апреля, 2014 Опубликовано 3 апреля, 2014 · Жалоба у вас переполнение первого таймера вызывает тик второго, такая схема? и вы боитесь что пока читаете один, тикнет другой? Если я все правильно понял то решается двойным чтением младший1 старший1 младший2 старший2 если младший2 больше младший1, то значит переполнения небыло, и старший1 - верное значение, полное число старший1+младший1, иначе - было переполнение, и правильное число старший2+младший2. Так как старший 2 считан позже младшего2, и если переполенние было на младишй2, то и старший2 точно корректен. вот и все, 4 чтения + 1 сравнение... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 4 апреля, 2014 Опубликовано 4 апреля, 2014 · Жалоба Всем спасибо. )) Не ожидал такого числа ответов. Идея с DMA мне в голову не приходила. Похоже она прокатывает, но переделывать много. Не очень хочется. Всё равно спасибо. Идею demiurg_spb, стыдно признаться - не понял. А Golikov A. подсказал мысль толковую. Можно текущий счётчик таймера сравнивать с регистром захвата. Попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 4 апреля, 2014 Опубликовано 4 апреля, 2014 · Жалоба DMA на самом деле тоже через одну шину читает, и ему надо будет шину захватывать, так что тоже чтение будет не одновременное по 2 каналам... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sKWO 0 4 апреля, 2014 Опубликовано 4 апреля, 2014 · Жалоба Для AVR приходилось тоже извращаться (программно-аппаратное увеличение разрядности регистра захвата таймера). Не смог найти оригинальный источник с этой идеей на этом сайте. Поищите, может вы найдёте... В своё время мне помогла вот эта ветка, сама идея заключалась в дополнительной проверке флага переполнения. Я прав, она? А именно && (TIFR & (1<<OCF) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 4 апреля, 2014 Опубликовано 4 апреля, 2014 · Жалоба Я прав, она?Да. Похоже она. Идею demiurg_spb, стыдно признаться - не понял.compare_isr() инкрементирует старшее слово (программное), а из ICR читается младшее слово. Таким образом получается 32 разряда. А условие ((icr<0x8000) && (TIFR & (1<<OCF))) проверяет, что переполнение случилось недавно. Давность можно регулировать, задав вместо 0x8000 другое значение. На STM32 таких проблем как с AVR быть не должно, т.к. можно конфигурировать NVIC и разруливать приоритеты по собственному желанию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 4 апреля, 2014 Опубликовано 4 апреля, 2014 · Жалоба сама идея заключалась в дополнительной проверке флага переполнения. Не могу понять как это может помочь. Переполнение от таймера идёт слэйв таймеру. В момент захвата этих переполнений вагон и маленькая тележка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 апреля, 2014 Опубликовано 4 апреля, 2014 · Жалоба младший1 старший1 младший2 старший2 Для PIC когда-то было предложено. Читать старший, читать младший, читать старший. Если оба прочтения старшего одинаковые, значит, переполнения не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 4 апреля, 2014 Опубликовано 4 апреля, 2014 · Жалоба Не могу понять как это может помочь. Переполнение от таймера идёт слэйв таймеру. В момент захвата этих переполнений вагон и маленькая тележка. Это может помочь если будете использовать только один таймер (не соединяя никаких таймеров). Задайте тактирование не слишком большой частотой (скажем 9МГц) и переполнения будут происходить на частоте 9.0E6 / 2^16 = 137Гц, что в целом не слишком напряжно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 4 апреля, 2014 Опубликовано 4 апреля, 2014 · Жалоба Это всё понятно. У меня частота 14 и соответственно 213.6. Вопрос о напряжности сложный, если это прибор коммерческого учёта. )) Придётся всёже переразвести на 32-ух битный таймер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 4 апреля, 2014 Опубликовано 4 апреля, 2014 · Жалоба Для PIC когда-то было предложено. Читать старший, читать младший, читать старший. Если оба прочтения старшего одинаковые, значит, переполнения не было. а если старшие не равны, то надо читать новый младший и все теже 4 считывания получаются%), это все та же старая стандартная идея, с разными типами проверки Это всё понятно. У меня частота 14 и соответственно 213.6. Вопрос о напряжности сложный, если это прибор коммерческого учёта. )) Придётся всёже переразвести на 32-ух битный таймер. мне тут в личку написали, смысл идеи с ДМА, перепишу суда своими словами. вы запускаете таймер 32 разрядный, настраиваете ДМА на чтение этого таймера по 1 тику вашего 8 разрядного таймера что идет наружу. И настраиваете запуск этого 8 разрядного таймера по внешнему сигналу. В результате с появлением внешнего сигнала, таймер делает тик, и запускает чтение 32 разрядного таймера по ДМА. Фактически это тоже что запустить 32 битный таймер и по сигналу его запомнить +- пару тактов... хотя если есть возможность переразвести, лучше сразу сделать нормально. или отладить на этой все остальное, и уже переразвести исправив все ошибки, а не только эту... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться