Очень глупый вопрос по таймерам

Dmitriy.A.
Offline
Зарегистрирован: 05.04.2020

Добрый день, сложилась такая ситуация, что необходимо в обработчике прерывания 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()
{
//всякое
}

 

b707
Offline
Зарегистрирован: 26.05.2017

дефайн Timer1_Init() определили - а не используете. Кто за вас будет запускать таймер?

Dmitriy.A.
Offline
Зарегистрирован: 05.04.2020

что ж все такие умные то....

я вопрос задал, как мне его инициализировать чтоб прерывание вываливалось строго через 2-3 мс, настраиваемо, при том запускать его нужно в основном прерывании, знал бы как правильно не спрашивал, специально скелет набросал , а не 10000 строк ненужного кода

Dmitriy.A.
Offline
Зарегистрирован: 05.04.2020
#define SetPulse()           PORTC &= ~(1<<1)    
#define RemovePulse()   PORTC |= (1<<1)   
#define Timer1_Init()          TCCR1A = (1<<WGM12);\
                               TCCR1B = (1<<CS20)|(1<<CS21); // надо бы настроить на 400-600 Гц
#define EnableINT0()          EIMSK |= (1 << INT0)
#define DisableINT0()         EIMSK &= ~(1 << INT0)
#define Init_INT0_Any()       EICRA = B00000001     // По обоим уровням
volatile int t=10
void Timer1_Set(int);{
OCR1A = t;
Timer1_Init();
}
void setup()
{
   Init_INT0_Any();
  EnableINT0();
}

ISR (TIMER1_COMPA_vect)
{
RemovePulse();
//возможно тут необходимо остановить таймер...
TIMSK1 = 0;
}

ISR(INT0_vect)
{
SetPulse();
/*тут по идее нужно как то стартануть таймер, чтоб он отработал через установленное время от 1-до 5 мс однократно,
 до следующего попадания сюда

Timer1_Set(t); // типа так, или как то иначе 
*/
}

void loop()
{
//всякое
}

В общем я не знаю как правильно

-NMi-
Offline
Зарегистрирован: 20.08.2018

Dmitriy.A. пишет:

что ж все такие умные то....

что-ж ты глупенький то такой???

такие интервалы проще на 8-битных таймерах реализовать. подбирай делители и уставки. можешь на кодевижн или аврстудии посчитать автоматически. чо блее сложного то???????

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А миллис Вас точно не устраивает? Именно таймер нужен?

Dmitriy.A.
Offline
Зарегистрирован: 05.04.2020

я написал именно то что мне нужно, и на чем нужно, как сделать на ассемблере я занаю, как написать на чистом си то же знаю. нужно сделать именно так, чтоб было понятно, как и зачем так сделано, без использования сторонних костылей.

как сделать на mllis delay меня не интересует, вопрос изложен в первом сообщении, примерную реализацию, как я вижу изобразил выше, но я не очень разбираюсь в языке виринг, и мне сложно пока.

Потому если Вы можете ответить по существу, буду признателен.

Спасибо

nik182
Offline
Зарегистрирован: 04.05.2015

Ваша программа не на вайринге. На нём то что Вы хотите написать в принципе не возможно. Это надстройка над СИ, где для начинающих спрятали работу с регистрами процессора. Вы же пытаетесь пройти глубже. Сделать то что Вы хотите просто. Подготавливаете таймер 1 для срабатывания через 2.5 мс и запуск прерывания, но не запускаете. В прерывании int0 запускаете таймер 1. Через 2.5 мс сработает прерывание таймера 1. В нём останавливаете таймер 1, обнуляете его счётчик, инвертируете Ваш сигнал. Система готова для следующего цикла.      

Dmitriy.A.
Offline
Зарегистрирован: 05.04.2020

я это знаю, потому приходится дописывать свои библиотеки на си, прямое управление регистрами, но как из прерывания запускать и тормозить таймер ... либо что то не понял либо делаю не так.

 

В двух словах ставлю таймер на делителе 16М/1024, задаю константу которой подбираю значение по осциллографу, чтоб было поточнее, и дальше вроде бы все понятно. это программа написана в основном на доступном языке, совсем мало си, и немного си ++,

если что исходники на чипмейкер выложил

b707
Offline
Зарегистрирован: 26.05.2017

Dmitriy.A. пишет:

я написал именно то что мне нужно, и на чем нужно, как сделать на ассемблере я занаю, как написать на чистом си то же знаю.

ну так и напишите на "чистом Си", раз знаете. Только я думаю что про асм и про Си - это вранье, знали бы - уже написали бы

В ардуино используется Си/С++. вайринг это не отдельный язык, а лишь библиотека, типа string.h

b707
Offline
Зарегистрирован: 26.05.2017

Dmitriy.A. пишет:

В двух словах ставлю таймер на делителе 16М/1024, задаю константу которой подбираю значение по осциллографу, чтоб было поточнее

ну и бредятина... таймер - это числовой счетчик, зачем подбирать константу "на осциллографе", когда она вычисляется в одно действие???

Цитата:
если что исходники на чипмейкер выложил

на асме? или на Си? - если последнее - выложите сюда

Dmitriy.A.
Offline
Зарегистрирован: 05.04.2020

нет желания сюда,

по осциллографу потому что нужно по времени реакции драйвера подбирать

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Через губу с нами, убогими, ТС разговаривает. Противны мы ему.

nik182
Offline
Зарегистрирован: 04.05.2015

Нет желания сюда, нет желания, нет. 6 строчек кода чисто записи в регистры таймера. Ну тогда сам пытайся. 

Dmitriy.A.
Offline
Зарегистрирован: 05.04.2020

Вы прям лицо этого форума. Оба.

не актуально, можно закрыть

b707
Offline
Зарегистрирован: 26.05.2017

Dmitriy.A. пишет:

не актуально, можно закрыть

ну так надо было спрашивать правильно - как настроить таймер на прерывание раз в 2.5мс. И спрашивать не на форуме, а у гугля. Получили бы ответ в пару минут

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Dmitriy.A. пишет:

Вы прям лицо этого форума. Оба.

Мы-то лицо, а вот ты - жопа. Обиженная на весь мир, по ходу.

Dmitriy.A.
Offline
Зарегистрирован: 05.04.2020

Уважаемый, прочитайте ответы, на единственный конкретный и очень лаконично заданый вопрос, который уже содержал 90% правильного ответа.

я не программировал на объектных и прикладных языках больше 20 лет, решил сыну поделку сделать,...

я не программист но на C#, C++, ASM, TASM, MASM, могу выражать свои мысли, применительно к разным вычислительным и не очень средам..

однако столкнулся именно тут с кучей убогих лицемеров

https://www.chipmaker.ru/files/file/17241/

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Dmitriy.A. пишет:

однако столкнулся именно тут с кучей убогих лицемеров

Тебе корона не жмёт, человече? Придти, начать СРАЗУ разговаривать через губу (ровно второе твоё сообщение в этой теме - и уже полно презрения к червям), потом обосрать всех ещё несколько раз. Нормально, ага.

Иди-ка ты нахер отсюда, кусок невоспитанного недоразумения.

b707
Offline
Зарегистрирован: 26.05.2017

Dmitriy.A. пишет:

Уважаемый, прочитайте ответы, на единственный конкретный и очень лаконично заданый вопрос, который уже содержал 90% правильного ответа.

это тот, что в заглавном сообщении? Там где вы мямлите что-то про "сложилась такая ситуация..." - это вы называете "конкретный и очень лаконично заданый вопрос" ? :)

Вы себе льстите.

Что нужно было спрашивать - я вам написал в сообщении 15. На чемпионство по "конкретности и лаконичности" не претендую. но явно короче и четче. чем у вас. И, важно, если вбить мой вопрос в гугль - получишь кучу ответов, а на ваш конкретно-лаконичный - очень сомневаюсь.