введите описание изображения здесь Буду очень признателен за вашу помощь.
Я студент, работающий над проектом "Ball on Beam Shield" в Arduino (IDE), но я застрял прямо сейчас.
У меня есть библиотека сэмплирования, которая полностью функциональна в смысле кода (прерывания и т. Д.), Она также может распознавать архитектуру описания изображений archenteron и, следовательно, изменять используемый таймер.
Но мне нужно отрегулировать его, - КОГДА БИБЛИОТЕКА Sampling3 ВЫХОДИТ, ЧТО СЕРВОБИБЛИОТЕКА ВКЛЮЧЕНА с AVR arch., Она распознает его и устанавливает себя на таймер 2, потому что серво использует таймер 1.
Для дальнейшего понимания темы, вот некоторая информация о том, как работает компиляция (дайте мне знать, если я ошибаюсь):
- Заголовки (.h) скомпилированы все вместе и обмениваются информацией, если включены друг в друга, чем они скомпилированы в объект - поэтому заголовок знает, что включен другой заголовок.
-Все файлы .cpp в папке библиотеки скомпилированы отдельно, и все скомпилированы в функциональные объекты !!!
См. Рис.1 - я добавил в 3 из .cpps в предложениях предупреждения библиотеки Servo (предупреждения на словацком языке) - все они скомпилированы: введите описание изображения здесь
IDE разработала макросы препроцессора (ARDUINO_ARCH_XXX). Они отличаются от токенов и могут быть распознаны даже из файлов .cpp.
Именно так библиотека Servo способна активировать только один файл .cpp из множества включенных в папку.
благодаря условию ifdef (см. рис.2) введите описание изображения здесь
Я пытался использовать ту же логику, работая только с токенами.
Вот мои папки библиотеки: (фото 4 5 6) введите описание изображения здесь
и код основного заголовка:
#include "Arduino.h"
#ifndef SAMPLING3_H_
#define SAMPLING3_H_
#if defined(ARDUINO_ARCH_AVR) && defined(Servo_h)
#include "avr_servo3/Sampli[enter image description here][4]ngTimers3.h"
#elif defined(ARDUINO_ARCH_AVR) && !defined(Servo_h)
#include "avr3/SamplingTimers3.h"
#else
#error "This library only supports boards with an AVR, SAM or SAMD
processor."
#endif
typedef void (*p_to_void_func)(); /*define a term p_to_void_func for pointer
to function, which
has a return type void and has no input
parameters*/
class SamplingClass{
public:
SamplingClass();
void period(unsigned long microseconds);
void interrupt(p_to_void_func interruptCallback);
p_to_void_func getInterruptCallback ();
float getSamplingPeriod();
private:
static void defaultInterrupt();
p_to_void_func interruptCallback;
#if defined(ARDUINO_ARCH_AVR) && !defined(Servo_h)
// Default: Timer1
const unsigned long timerResolution = 65536; // AVR
Timer 1 is 16bit
const unsigned char cpuFrequency = 16; // CPU
frequency in micro Hertz
#warning "sampling is running on timer 1"
#elif defined(ARDUINO_ARCH_AVR) && defined(Servo_h)
// Default: Timer2
const unsigned long timerResolution = 256; // AVR Timer
2 is 8bit
const unsigned char cpuFrequency = 16; // CPU
frequency in micro Hertz
#warning "sampling is running on timer 2"
#endif
float samplingPeriod; // Sampling period in seconds
bool setSamplingPeriod(unsigned long microseconds);
};
extern SamplingClass Sampling;
#endif
Архитектура Сам и сказал, что там еще нет, не обращайте на это внимания.
Проблема заключается в распознавании библиотечного токена (Servo_h) из серво-библиотеки внутри библиотеки Sampling.
Вот что происходит:
Первый шаг:
Файл .Ino компилируется (включая Servo.h) и вызывает Sampling.h, который распознает инсайдерские токены Servo и устанавливает значение timmer 2 (просто упрощенное).
Шаг второй:
Файл .cpp (все они в папке библиотеки) компилируется, и каждый из них работает по своему таймеру .... см. на рис. 3 введите описание изображения здесь
Поэтому токены совершенно бесполезны в том, чего я хочу достичь.
Пожалуйста, какие-нибудь идеи о том, как заставить это работать ???