Очень глупый вопрос по таймерам
- Войдите на сайт для отправки комментариев
Вс, 05/04/2020 - 22:54
Добрый день, сложилась такая ситуация, что необходимо в обработчике прерывания int0 каким то волшебным образом "засечь" время выставить на ногу лог 0, и ровно через 2.5мс этот сигнал инвертировать в независимости от любых других условий.
тактовая частота 16мгц, есть свободный таймер1, выходит частота 400Герц, как сделать что то придумать не могу.
и не приходилось с таймерами играться раньше..
#define SetPulse() PORTC &= ~(1<<1) #define RemovePulse() PORTC |= (1<<1) #define Timer1_Init() TCCR1A = (1<<WGM21);\ TCCR1B = (1<<CS20)|(1<<CS21); // 16MHz/32 = 500kHz .. надо бы настроить на 400-600 Гц #define EnableINT0() EIMSK |= (1 << INT0) #define DisableINT0() EIMSK &= ~(1 << INT0) #define Init_INT0_Any() EICRA = B00000001 // По обоим уровням void setup() { Init_INT0_Any(); EnableINT0(); } ISR (TIMER1_COMPA_vect) { RemovePulse(); } ISR(INT0_vect) { SetPulse(); } void loop() { //всякое }
дефайн Timer1_Init() определили - а не используете. Кто за вас будет запускать таймер?
что ж все такие умные то....
я вопрос задал, как мне его инициализировать чтоб прерывание вываливалось строго через 2-3 мс, настраиваемо, при том запускать его нужно в основном прерывании, знал бы как правильно не спрашивал, специально скелет набросал , а не 10000 строк ненужного кода
В общем я не знаю как правильно
что ж все такие умные то....
что-ж ты глупенький то такой???
такие интервалы проще на 8-битных таймерах реализовать. подбирай делители и уставки. можешь на кодевижн или аврстудии посчитать автоматически. чо блее сложного то???????
А миллис Вас точно не устраивает? Именно таймер нужен?
я написал именно то что мне нужно, и на чем нужно, как сделать на ассемблере я занаю, как написать на чистом си то же знаю. нужно сделать именно так, чтоб было понятно, как и зачем так сделано, без использования сторонних костылей.
как сделать на mllis delay меня не интересует, вопрос изложен в первом сообщении, примерную реализацию, как я вижу изобразил выше, но я не очень разбираюсь в языке виринг, и мне сложно пока.
Потому если Вы можете ответить по существу, буду признателен.
Спасибо
Ваша программа не на вайринге. На нём то что Вы хотите написать в принципе не возможно. Это надстройка над СИ, где для начинающих спрятали работу с регистрами процессора. Вы же пытаетесь пройти глубже. Сделать то что Вы хотите просто. Подготавливаете таймер 1 для срабатывания через 2.5 мс и запуск прерывания, но не запускаете. В прерывании int0 запускаете таймер 1. Через 2.5 мс сработает прерывание таймера 1. В нём останавливаете таймер 1, обнуляете его счётчик, инвертируете Ваш сигнал. Система готова для следующего цикла.
я это знаю, потому приходится дописывать свои библиотеки на си, прямое управление регистрами, но как из прерывания запускать и тормозить таймер ... либо что то не понял либо делаю не так.
В двух словах ставлю таймер на делителе 16М/1024, задаю константу которой подбираю значение по осциллографу, чтоб было поточнее, и дальше вроде бы все понятно. это программа написана в основном на доступном языке, совсем мало си, и немного си ++,
если что исходники на чипмейкер выложил
я написал именно то что мне нужно, и на чем нужно, как сделать на ассемблере я занаю, как написать на чистом си то же знаю.
ну так и напишите на "чистом Си", раз знаете. Только я думаю что про асм и про Си - это вранье, знали бы - уже написали бы
В ардуино используется Си/С++. вайринг это не отдельный язык, а лишь библиотека, типа string.h
В двух словах ставлю таймер на делителе 16М/1024, задаю константу которой подбираю значение по осциллографу, чтоб было поточнее
ну и бредятина... таймер - это числовой счетчик, зачем подбирать константу "на осциллографе", когда она вычисляется в одно действие???
на асме? или на Си? - если последнее - выложите сюда
нет желания сюда,
по осциллографу потому что нужно по времени реакции драйвера подбирать
Через губу с нами, убогими, ТС разговаривает. Противны мы ему.
Нет желания сюда, нет желания, нет. 6 строчек кода чисто записи в регистры таймера. Ну тогда сам пытайся.
Вы прям лицо этого форума. Оба.
не актуально, можно закрыть
не актуально, можно закрыть
ну так надо было спрашивать правильно - как настроить таймер на прерывание раз в 2.5мс. И спрашивать не на форуме, а у гугля. Получили бы ответ в пару минут
Вы прям лицо этого форума. Оба.
Мы-то лицо, а вот ты - жопа. Обиженная на весь мир, по ходу.
Уважаемый, прочитайте ответы, на единственный конкретный и очень лаконично заданый вопрос, который уже содержал 90% правильного ответа.
я не программировал на объектных и прикладных языках больше 20 лет, решил сыну поделку сделать,...
я не программист но на C#, C++, ASM, TASM, MASM, могу выражать свои мысли, применительно к разным вычислительным и не очень средам..
однако столкнулся именно тут с кучей убогих лицемеров
https://www.chipmaker.ru/files/file/17241/
однако столкнулся именно тут с кучей убогих лицемеров
Тебе корона не жмёт, человече? Придти, начать СРАЗУ разговаривать через губу (ровно второе твоё сообщение в этой теме - и уже полно презрения к червям), потом обосрать всех ещё несколько раз. Нормально, ага.
Иди-ка ты нахер отсюда, кусок невоспитанного недоразумения.
Уважаемый, прочитайте ответы, на единственный конкретный и очень лаконично заданый вопрос, который уже содержал 90% правильного ответа.
это тот, что в заглавном сообщении? Там где вы мямлите что-то про "сложилась такая ситуация..." - это вы называете "конкретный и очень лаконично заданый вопрос" ? :)
Вы себе льстите.
Что нужно было спрашивать - я вам написал в сообщении 15. На чемпионство по "конкретности и лаконичности" не претендую. но явно короче и четче. чем у вас. И, важно, если вбить мой вопрос в гугль - получишь кучу ответов, а на ваш конкретно-лаконичный - очень сомневаюсь.