07.03.2013, 14:05 | #31 | ||
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Цитата:
Я хочу еще добавить к nanopins функцию SPI, он тоже есть в библиотеках по умолчанию, но как я уже писал выше мне удобнее обходится одним #include Цитата:
Для подсчета времени придется использовать таймер и это будет не совсем правильно. Если отнять таймер у встроенных функций? то потеряем все стандартные функции связаные с Timer0 Если использовать другой таймер, то для пользователя останется свободным всего один таймер |
||
07.03.2013, 14:11 | #32 |
Member
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0 |
|
07.03.2013, 14:20 | #33 |
Member
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0 |
ну если не жестко привязываться к конкретному таймеру, а дополнительно сделать функцию инициализации для привязки к любому из 3х таймеров.... или смотреть на текущий делитель таймера выставленный на регистрах.... эххх... чет остапа понесло))))
|
07.03.2013, 15:10 | #34 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Может быть проще будет подправить стандартную либу?
Код:
#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 Допустим сохранил стандартные настроки таймера, запустил таймер со своими настройками, отработал и опять вернул стандартные настройки |
07.03.2013, 20:02 | #35 |
Member
Регистрация: 07.03.2013
Сообщений: 75
Вес репутации: 0 |
Действительно, кк я пропустил, в стандартной библиотеке WinAVR есть millis() и micros(). Подключаются через wiring.h а я их пропустил при разработке pixelight. Cпасибо за наводку....
на счет переключать идея хорошая, но иногда не возможная, т.к. на этом таймере может вистеть активный ШИМ ) |
10.03.2013, 05:37 | #36 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Эдуард, большое Тебе спасибо за труд!!!
|
10.03.2013, 06:04 | #37 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
А имена пинам не получится присваивать?
PHP код:
|
10.03.2013, 09:43 | #38 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Цитата:
Можно реализовать так как ты хочешь, но при этом уже потеряется смысл, скорость выполнения функции упадет Проще тогда пользоваться стандартной либой |
|
11.03.2013, 01:57 | #39 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Я лучше код перепишу! Спасибо, крутая либа!!!
|
11.03.2013, 11:28 | #40 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Обновил библиотеку в шапке.
Добавил работу с таймером 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(): Примеры выложу позже. |
Здесь присутствуют: 15 (пользователей: 0 , гостей: 15) | |
|
|