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

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

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

Dimax - поправьте, если я блондинка и туплю, и пространство возможностей по таймерам (на одном [same] таймере, например T1) больше, всмысле если после меня его могут настраивать и навешивать свои процессы другие пользователи, и мои процессы не претерпят изменений.

Что надо: bitbang ШИМить один вывод (из 0-A5), который можно высунуть наружу библиотеки, короче сделать некий аналог функции analogWrite() на любой вывод. Я лично хочу обойтись без таймера просто micros() т. к. всё равно частота модуляции там будет 50-100 Гц. Но хз, может быть можно как-то цивильно оформить.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Из того что нашлось соответственно моим желаниям:

void setup(){ 
  OCR0A = 0xAF;
  TIMSK0 |= _BV(OCIE0A);
}  
SIGNAL(TIMER0_COMPA_vect){
// process
}

1. А чё AF? А можно другое число? А можно не трогать? По-идее всё равно периодом будет полный пробег таймера (задаю любое число, от 0 до 255 где-нибудь да придётся на него, с периодом 1/256)

2. Как этот код влияет на millis()? Начнёт ли цикл фризить системные функции, замедляя время?

3. Если вектор TIMER0_COMPA_vect уже существует, то как корректно дописать в него свой код?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Если у тя в таймере0 будет стоять режим сброс по совпадению, то переполнение никада не наступит.  Миллис прекратит свою работу. 

Я в таком случае делал прям в прерывании вручную TCNT0=255, тогда прерывание по переполнению срабатывает, только миллис врёть. Но ведь можно не 255 поставить, а число на 1 больше чем то, с чем сравниваешь для совпадения. 

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

То есть если навешивать, то на таймеры T1, T2. Как это сделать чтобы допустим не мешалось другим либам на этих таймерах? Типа Manchester или IRRemote. Или либо то либо то?

А насколько миллис врёт? Как скомпенсировать можно, изменяя его глобальную переменную в прерывании? А то все спрашивают про обнуление миллис, я хоть чот-полезное буду таким макаром делать.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Voodoo Doll пишет:

То есть если навешивать, то на таймеры T1, T2. Как это сделать чтобы допустим не мешалось другим либам на этих таймерах? Типа Manchester или IRRemote. Или либо то либо то?

А насколько миллис врёт? Как скомпенсировать можно, изменяя его глобальную переменную в прерывании? А то все спрашивают про обнуление миллис, я хоть чот-полезное буду таким макаром делать.

на Т1 и Т2 навешивать - бессмысленно, все равно некоторые биб-ки эти таймеры под себя меняют .  

если Т0 настроен на сброс по совпадению, то чем ближе сравниваемое значение к TOP (0xFF), тем меньше вреть миллис. Это при условии, что делители оставлены как есть.  Тут надо выбирать, что хочется, либо интервал, который надо мерить, был как можно более точен, либо миллис.  

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

мне вот надо было срабатывание каждую 1 миллисекунду, у меня значение на совпадение таймера0  OCR1A= 247.  

До 255 совсем немного, миллис вреть на (8/255)*100 ( 3% примерно) 

Ну и надо в прерывании по совпадению присвоить TCNT0 = 255, чтобы на следующем тике  прерывание по переполнению выполнилось. 

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Хз, тяжело для меня это всё. Пример есть какой-то, 2 кГц на T0 допустим. Но всё равно неясно, как это повлияет на системные функции.

void setup(){
  TCCR0A=0;    // азачем? чем старые настройки мешают?
  TCCR0B=0;    // апачиму? а можно эти регистры НЕ ТРОГАТЬ и
               // получить некий перид, ну пусть не 2 кГц или
               // сколько мне надо, а потом подкинуть свою
               // цифру в регистр сравнения? и прерывания
               // потихоньку получать
  TCNT0=0;     // тут ноу комментс, была арда стала AVR
  OCR0A=124;   // 50 мс, изменю. ориентировочно надо 0-50% ШИМ 75 Гц
  sbi(TCCR0A,WGM01);
  sbi(TCCR0B,CS01);
  sbi(TCCR0B,CS00);
  sbi(TIMSK0,OCIE0A);
}

ISR(TIMER0_COMPA_vect){
//process
}

В общем и пики точёные, и х█и др█чёные, а мне бы и сгухой и мёдом обмазаться. Одновременно, без хлеба.

Хотелось бы приспособить как-то под COMPB, там где выполняется tone(). Ибо если tone() отвалится - то меня устраивает, я всё равно подобные вещи делаю снаружи, на 555.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

tone живёт на Timer2