по переменным таймера FlexiTimer2

RANDREY
Offline
Зарегистрирован: 10.06.2012

Пытаюсьзапустить таймер с частотой 1000-3000гц, на пин повешен светодиод (позже будет пьезо, пока не нашел).

Регулировка методом значений freq=0...255, выставляю кнопками.

lcd.print (1000+freq*10);

FlexiTimer2::stop();
FlexiTimer2::set(freq, flash_led);

при 0 - светодиод горит, частота видимо большая, а при 255 (типа частота 3000гц), а светодиод моргает, как будто частота низкая.

http://playground.arduino.cc/Main/FlexiTimer2

FlexiTimer2::set(unsigned long units, double resolution, void (*f)())

this function sets a time on ms (1/1000th of a second) 

function above with resolution = 0.001.

 
maksim
Offline
Зарегистрирован: 12.02.2012

Бред какой-то. Почитайте tone().

RANDREY
Offline
Зарегистрирован: 10.06.2012

не бред, функция прерывания двойного действия, дергает пин, и ещё кое-какую работу делает.

Тоне будет работать, но только для генерации волны.

Пьезо нашел, работает, при значении 0 - высокий звук, при 255 - низкий, стучит.

maksim
Offline
Зарегистрирован: 12.02.2012

RANDREY пишет:

не бред, функция прерывания двойного действия, дергает пин, и ещё кое-какую работу делает.

И?

Вы лучше почитайте таймерами пользоваться...

RANDREY
Offline
Зарегистрирован: 10.06.2012

почитал, но не понял как переводить частоту вызыва ф-ции с частотой дергания, ведь установка в ON/ OFF

происходит за 2 вызова, т.е частота уменьшается вдвое. и макс  частота для этого таймера 1/500th of a second.

В будущем хочу приделать LTC6904 - 1kHz - 68MHz Serial Port Programmable Oscillator

1kHz to 68MHz Square Wave Output, только в мануале плохо расписано как им управлять

maksim
Offline
Зарегистрирован: 12.02.2012

RANDREY пишет:

не бред, функция прерывания двойного действия, дергает пин, и ещё кое-какую работу делает.

Тоне будет работать, но только для генерации волны.

Вы так на вопрос не ответили - И? Если не понятно, то какую еще работу делает?

maksim
Offline
Зарегистрирован: 12.02.2012
RANDREY
Offline
Зарегистрирован: 10.06.2012

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

ещё моргает светодиодом, на низких частотах в такт подмигивает

RANDREY
Offline
Зарегистрирован: 10.06.2012

Продолжение темы. Библиотека успешно работала, а теперь не компилится. При использовании родной библиотеки #include <FlexiTimer2.h> цыпятся ошибка вида:

FlexiTimer2\FlexiTimer2.cpp.o: In function `FlexiTimer2::set(unsigned long, double, void (*)())':

D:\Programm Files\arduino-1.0.5-r2\libraries\FlexiTimer2/FlexiTimer2.cpp:46: multiple definition of `FlexiTimer2::set(unsigned long, double, void (*)())'

FlexiTimer2.cpp.o:C:\DOCUME~1\IX\LOCALS~1\Temp\build3464858231907329902.tmp/FlexiTimer2.cpp:46: first defined here

d:/programm files/arduino-1.0.5-r2/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions и ещё куча.

Перевожу в свой код.

Но не понимаю отмеченные места, на которых не компилится. 

void Set ( unsigned long units,void (*f)())
func = f;  <<<<<<<<<<<<<<<

void _overflow() {
(*func)(); <<<<<<<<<<<<<<<<<<

Как видно хочет указатели, но классов нету. *f - это функция которая должна вызываться через определенное время. _overflow - видимо сама считалка в цикле.

 

 

RANDREY
Offline
Зарегистрирован: 10.06.2012

Починил работу библиотеки без выдирания кода оттуда в свой. Причину нашел!

Не держать файлы библиотеки в корне своего проекта! Удалить файлы FlexiTimer2.* в корне и все компилится)