Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.03.2013, 14:05   #31
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
Сообщение от HiddenPilot Посмотреть сообщение
Респект за продолжение данной разработки.
Сильно не вдавался в алгоритм реализации данных функций, но они вроде как уже реализованы в стандартной бибилиотеке GCC/avr-libc. Цепляются через <util/delay.h>
Реализованы, но мне не удобно каждый раз вспоминать и прописывать кучу #include
Я хочу еще добавить к nanopins функцию SPI, он тоже есть в библиотеках по умолчанию, но как я уже писал выше мне удобнее обходится одним #include

Цитата:
А вот функция получения времени в мили(микро)секундах с автоматическим расчетом относительно заданной F_CPU без использования ардуиновской библиотеки было бы удобно. такой функции в avr-libc я не нашел.
Это про какую функцию идет речь?
Для подсчета времени придется использовать таймер и это будет не совсем правильно. Если отнять таймер у встроенных функций? то потеряем все стандартные функции связаные с Timer0
Если использовать другой таймер, то для пользователя останется свободным всего один таймер
Admin вне форума   Ответить с цитированием
Старый 07.03.2013, 14:11   #32
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Это про какую функцию идет речь?
if((micros() - startTime) < hold) break; // Still holding; keep buffering
HiddenPilot вне форума   Ответить с цитированием
Старый 07.03.2013, 14:20   #33
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Для подсчета времени придется использовать таймер и это будет не совсем правильно
ну если не жестко привязываться к конкретному таймеру, а дополнительно сделать функцию инициализации для привязки к любому из 3х таймеров.... или смотреть на текущий делитель таймера выставленный на регистрах.... эххх... чет остапа понесло))))
HiddenPilot вне форума   Ответить с цитированием
Старый 07.03.2013, 15:10   #34
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Может быть проще будет подправить стандартную либу?
Код:
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))
#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000)
#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3)
#define FRACT_MAX (1000 >> 3)

volatile unsigned long timer0_overflow_count = 0;
volatile unsigned long timer0_millis = 0;
static unsigned char timer0_fract = 0;

SIGNAL(TIMER0_OVF_vect)
{
	// copy these to local variables so they can be stored in registers
	// (volatile variables must be read from memory on every access)
	unsigned long m = timer0_millis;
	unsigned char f = timer0_fract;

	m += MILLIS_INC;
	f += FRACT_INC;
	if (f >= FRACT_MAX) {
		f -= FRACT_MAX;
		m += 1;
	}

	timer0_fract = f;
	timer0_millis = m;
	timer0_overflow_count++;
}

unsigned long millis()
{
	unsigned long m;
	uint8_t oldSREG = SREG;

	// disable interrupts while we read timer0_millis or we might get an
	// inconsistent value (e.g. in the middle of a write to timer0_millis)
	cli();
	m = timer0_millis;
	SREG = oldSREG;

	return m;
}

unsigned long micros() {
	unsigned long m;
	uint8_t oldSREG = SREG, t;
	
	cli();
	m = timer0_overflow_count;
#if defined(TCNT0)
	t = TCNT0;
#elif defined(TCNT0L)
	t = TCNT0L;
#else
	#error TIMER 0 not defined
#endif
Еще можно попробовать использовать таймер в однократном режиме.
Допустим сохранил стандартные настроки таймера, запустил таймер со своими настройками, отработал и опять вернул стандартные настройки
Admin вне форума   Ответить с цитированием
Старый 07.03.2013, 20:02   #35
HiddenPilot
Member
 
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0
HiddenPilot is an unknown quantity at this point
По умолчанию

Действительно, кк я пропустил, в стандартной библиотеке WinAVR есть millis() и micros(). Подключаются через wiring.h а я их пропустил при разработке pixelight. Cпасибо за наводку....
на счет переключать идея хорошая, но иногда не возможная, т.к. на этом таймере может вистеть активный ШИМ )
HiddenPilot вне форума   Ответить с цитированием
Старый 10.03.2013, 05:37   #36
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию

Эдуард, большое Тебе спасибо за труд!!!
stD вне форума   Ответить с цитированием
Старый 10.03.2013, 06:04   #37
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию

А имена пинам не получится присваивать?

PHP код:
int pin12 12;
void setup() 
 {
    
pinMode(pin12OUTPUT);
 } 
А то кода дофига переписывать!
stD вне форума   Ответить с цитированием
Старый 10.03.2013, 09:43   #38
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
А имена пинам не получится присваивать?
Здесь нужно выбирать: между скоростью и удобством.
Можно реализовать так как ты хочешь, но при этом уже потеряется смысл, скорость выполнения функции упадет
Проще тогда пользоваться стандартной либой
Admin вне форума   Ответить с цитированием
Старый 11.03.2013, 01:57   #39
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию

Я лучше код перепишу! Спасибо, крутая либа!!!
stD вне форума   Ответить с цитированием
Старый 11.03.2013, 11:28   #40
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Обновил библиотеку в шапке.
Добавил работу с таймером Timer1. Теперь настройку прерываний таймера можно настривать от 6мкс. до 4000000мкс.(4сек.) с шагом 1мкс.
запуск таймера производится так: StartTimer1(obrobotchik, 1000); Где первый параметр это Ваш обработчик прерывания, который будет
запускаться каждый раз по истечении заданного Вами времени. Второй параметр это время, может принимать значения от 6 до 4000000
Выключить таймер можно так: StopTimer1();

Добавил функцию работы с SPI. Увеличил пропускную способность в 1,85 раза, при работе на одной и той же частоте
Еще один плюс, SPI теперь можно настроить и запустить одной строкой : StartSPI(0, 2, 1); Где первый параметр это режим mode от 0 до 3
Второй параметр это делитель тактовой частоты, может принимать значения 2, 4, 8, 16, 32, 64, 128. Если Вы хотите выяснить частоту SPI то должны
тактовую частоту контроллера 16000000 разделить на любой делитель из списка. И последний параметр это какой бит пойдет первым. Если 1 то первым пойдет старший бит
если 0 то первым пойдет младший бит. Отправить байт данных в шину SPI можно так: SendSPI(12); Получить байт данных MyData=ReadSPI(); Выключить SPI можно так: StopSPI():

Примеры выложу позже.
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 15 (пользователей: 0 , гостей: 15)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 22:45. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика