LED

Suren
Offline
Зарегистрирован: 19.12.2017

Привет всем. 

Вот уже 2 года не могу решить по моему мненю простую задачу.Раскажу на примере.

Есть светодиод 1 и светодиод 2. Хочу, чтобы одновременно моргали но с разными частотами.Скажем 1-ый моргал в каждую 100мс, второй моргал в каждую 110мс. Они должны моргать в независимости от друг друга, но одновременно.

Спасибо...

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#6   #9

Suren
Offline
Зарегистрирован: 19.12.2017

Посмотрел.Честно говоря, не понял.

На моем примере можете обьяснить?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Suren пишет:

Посмотрел.Честно говоря, не понял.

На моем примере можете обьяснить?

Зачем. Все что можно я уже объяснил в теме. Смысл повторять в других темах тоже самое.

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

Suren пишет:

 1-ый моргал в каждую 100мс, второй моргал в каждую 110мс. Они должны моргать в независимости от друг друга, но одновременно.

напоминает кусок из знаменитого:

" .... Нам нужно нарисовать семь красных линий. Все они должны быть строго перпендикулярны, и кроме того, некоторые нужно нарисовать зеленым цветом, а еще некоторые — прозрачным. ..."

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
#include "TTimerList.h"

#define LED1PIN 13    // один светлодиод на 13-м пине
#define LED2PIN 12    // второй - на 12-м

#define LED1PERIOD 100  // первый мигает с периодом 100 ms
#define LED2PERIOD 110  // второй - 110 ms


extern TTimerList TimerList;


THandle hTimer1Led, hTimer2Led;


void tmr1Led() {
	static bool state = true;
	digitalWrite(LED1PIN, state);
	state = !state;
}

void tmr2Led() {
	static bool state = true;
	digitalWrite(LED2PIN, state);
	state = !state;
}


void setup() {
	pinMode(LED1PIN, OUTPUT);
	pinMode(LED2PIN, OUTPUT);

	hTimer1Led = TimerList.Add(tmr1Led, LED1PERIOD); 
	hTimer2Led = TimerList.Add(tmr2Led, LED2PERIOD); 
}

void loop() {

}

 

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

Мигают по-разному, но одновременна.  Если интересно, спроси меня где взять TTimerList.h

sva_khv
Offline
Зарегистрирован: 19.12.2016

Suren пишет:
Вот уже 2 года не могу решить по моему мненю простую задачу.Раскажу на примере.

 Они должны моргать в независимости от друг друга, но одновременно.

За два года такую задачу никто не сможет решить! Моргать ОДНОВРЕМЕННО, но в РАЗНЫЕ моменты времени!

:-(

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

Suren
Offline
Зарегистрирован: 19.12.2017

Да,простите и где можно найти TTimerList.h?

Я искал,кое что нашел,но не работает 

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

Спасибо работает, но только на ATmega328

На ATmega168 не работает

Ошибка (MAXTIMERCOUNT was not declared in the scope). Посмотрел ТТimerlist.h , ничего странного.

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

Дефайны надо поправить

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

в .h файл вставить 

#ifdef __AVR_ATmega168P__
#define  MAXTIMERSCOUNT		12		// 	Максимальное число зарегистрированных таймеров для прочих Uno - 12
#define	 TIMER0_ONE_MS	240
											//#define	 ARDUINO_AVR_UNO
#endif

а в .cpp 

куданить в середину обьявления TTimerList.Init

#elif defined(__AVR_ATmega168P__)
void TTimerList::Init()
{
	byte oldSREG = SREG;
	cli();

	TCCR0A = TCCR0A & 0b11111100;
	OCR0A = TIMER0_ONE_MS;
	TIMSK0 |= 0x3;
	TIFR0 = TIFR0 | 0x2;

	SREG = oldSREG;

}

 

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

У мня просто 168-х не осталось, я с ними не тестировал.  На 8, 328 и 2560 работают, как надо. 

Suren
Offline
Зарегистрирован: 19.12.2017

Спасибо, проверю

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

Я на github-е поправил уже, залил.  можно оттуда скачать опять, проверить.