С использованием delay будет тормозить выполнение всего кода. Скачай библиотеку TimerOne там в стандартных примерах есть пример как моргать светодиодом.
С использованием delay будет тормозить выполнение всего кода. Скачай библиотеку TimerOne там в стандартных примерах есть пример как моргать светодиодом.
хороший модем должен качать пиво!
Мой проект
Все верно, уставший был, автоматом подумал про delayMicroseconds(),
насчет библиотеки: ему все равно нужно будет обрабатывать внешние прирывания а это удобнее всего сделать с помощью выше указанной библиотеки, и к тому же управление LED будет в пару строк, можно все сделать и без библиотеки но структура кода значительно усложнится.
Олег, я не совсем понял насчет pin13. На схеме на него идет сигнал с датчика скорости, в коде он настроен как индикатор LED
Leonardo имеет 5 таймеров и может обрабатывать 5 внешних прирываний на портах
int-0 pin3
int-1 pin2
int-2 pin0
int-3 pin1
int-4 pin7
Соответственно сигнал с датчика скорости надо заводить на один из этих портов.
Если возникнет идея сделать все легко и использовать функцию PulseIn() то советую отказаться.
Все попытки не давали нужного результата, значения плавают и сильно зависят от длинны коди и особенностей его выполнения.
хороший модем должен качать пиво!
Мой проект
Собственно сложность когда меня не пугает, библиотека это хорошо.
Она может запускать независимые таймеры для разных функций ?? Мне как раз этого не хватает ...
По поводу схемы - она приблизительная, что бы иметь представление, в общем (держать всё в голове не возможно) прерывание не на том пине - не успел поправить, жду дисплей!! его мля..ть нету ещё, по выше указным причинам.
Как приедет дисплей, подключу его, сделаю графическое меню и налажу внешнее прерывание (это фундаментальные "функции" от них буду плясать).
То, что пины не сходятся есть простое объяснение, сейчас пишу код для отдельных "блоков" (пины рандомные, какие удобно, так и подключил) - то бишь: контроль температуры окружающего воздуха, индикатор включенной передачи, контроль температуры двигателя + управление реле (выкладывал предварительный код), чтение и запись настроек EEPROM ... потом объединю всё вместе, так проще выявлять баги в коде...
Насчёт пинов не совсем понимаю, если допустим на 0 пине int 2! так же на этом пине SPI шина ? ...
Реально переназначить пины, подключить одновременно устроства с SPI и I2S ? или я чего то не догоняю ?!
![]()
Последний раз редактировалось Oleg_33; 07.01.2015 в 01:42.
int0 int1 int2 int3 int4 это номера прирываний timer0 timer1 timer2 timer3 timer4 здесь глянь и станет все ясно
SPI c pin0 не связанны на пинах 0,1 UART 2,3 связанны с теми что подписанны на плате SCL SDA это и есть квадратная шина, SPI выведен на отдельный разем (SPI процессора)
Например если подключаешь дисплей по SPI там в зависимости как органезованна библиотека для конкретного устройства и там же прописанны пины.
Можещь запускать и останавливать таймеры когда тебе надо, инициалезируешь таймер и при инициализации указываещь номер таймера . нужно посмотреть, как на леонардо, точнее какой таймер за что отвечает. Например timer0 системный таймер, timer1 управляет ШИМ итд... Точно посмотрю и напишу.
Посмотри здесь описание функции attachInterrupt()
Запускаем таймер при появлении сигнала и останавливаем при исчезновении, записывая длинну сигнала.
библиотека просто дает возможность задействовать мощный системный таймер. почитай здесь про библиотеку
вот пример, делал обработку сигнала с RC пульта.
ps: просьба заключать выкладываемые примеры кодов в php teg (доступен в расшыренном режиме написания сообщения)PHP код:
#include <TimerOne.h>
#define BTNPIN 2 // Вход сигнала
#define L 5 // Выход на H-Мост вращение в лево
#define R 6 // Выход на H-Мост вращение в право
volatile uint16_t startImpuls;
volatile uint16_t lengthImpuls;
volatile uint16_t timerCount=0;
void setup()
{
/* LOW — вызов прерывания всякий раз,
когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении
значения на входе;
RISING – вызов прерывания при изменении уровня
напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня
напряжения с высокого (HIGH) на низкое (LOW)*/
startImpuls=0;
lengthImpuls=0;
pinMode (BTNPIN, INPUT);
pinMode (L, OUTPUT);
pinMode (R, OUTPUT);
Serial.begin(115200);
Timer1.initialize(10); // Интервал срабатывания таймера 10мкс
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, RISING); // Запуск таймера при наличии сигнала HIGH
}
void callback() { timerCount++; }
void loop()
{
if (lengthImpuls > 0)
{
uint16_t li = lengthImpuls;
lengthImpuls=0;
if (li > 100 && li < 150) // эамер сигнала для вращения в лево
analogWrite (L, 23 - li);
if (li > 155 && li < 200) // эамер сигнала для вращения в право
analogWrite (R, 23 - li);
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
detachInterrupt(0);
startImpuls = timerCount;
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на падение
void fireDown()
{
detachInterrupt(0);
lengthImpuls = timerCount - startImpuls;
startImpuls=0;
timerCount=0;
attachInterrupt(0, fireUp, RISING);
}
Последний раз редактировалось XsanderS; 07.01.2015 в 05:10.
хороший модем должен качать пиво!
Мой проект
Итак ...из этого следует, что внешние прерывания можно подключить к любому из выводов 0-1-2-3-7, мне предпочтительнее к 0(RX) так как врятли он мне понадобится для чего то другово??
I2C интерфейс находится на выводах 2-3 и эти выводы дублируются на контакты SCL и SDA, те выводы 2 и 3 заняты I2S интерфейсом по любому, не зависимо подключился ли я к выводам SCL и SDA ??
Если я захочу подключить LED Bar, на какие выводы нужно подключать ... ?
В примере к библиотеке написано https://github.com/Seeed-Studio/LED_Bar_Suli -В описании ничего не сказанно про A4, A5 пины. Может нужно подключить к разъёму ICSP ? но там нет таких выводовPHP код:
SeeedLedBar bar(A4, A5); // CLK, DTA
![]()
Последний раз редактировалось Oleg_33; 07.01.2015 в 21:01.
По первому пункту: Да можно использовать пин0 для прирываний, но я бы посоветовал в процессе проектирования выбрать другой, например 7 потому как тебе наверняка понадобиться UART для связи с компом для отладки и просмотра данных с сенсоров, Если задействуешь пин0 то не сможешь использовать UART для связи с компом.
По второму пункту: Все верно они продублированны.
А зачем этот LED Bar? Все можно вывести на дисплей.
Насчет подключения, A4 A5 потому что библиотека для него так написана, напишешь свое управление и можешь другие пины использовать. Протокол чипа посмотри здесь
Опишу с чем придется столкнуться если ты всетаки решишь прицепить эти лыживо первых слишком много библиотек задействовано, при настройке таймеров нужно будет учитывать то какие таймеры используют все указанные библиотеки, могут быть проблемы по совместимости библиотек.
Итог: Либо надеяться что библиотеки не поругаются с библиотекой timerOne и той что будет для дисплея и пробовать, либо если поругаются то писать свое управление этим баром, в принципе можно подсмотреть в библиотеке как там все устроенно и либо свое управление смострячить, либо подправить то что конфликтует.
хороший модем должен качать пиво!
Мой проект
Лед бар хочу завести на уровень топлива, давно уже думаю о таком. Посмотрел библиотеку для Led bar, ничего особенного нашел только в функции Grove_LED_Bar::latchData() есть задержка 10 микросекунд... Зашел с планшета на сайт, нашел в гоогле библиотеку на Grove_LED_Bar, предыдущую какую-то другую нашел на LED_Bar_Suli! Правильная Grove_LED_Bar получается.
https://github.com/Seeed-Studio/Grov...evel/Level.ino в ней 9и8 пин (с шим и без шим) можно другие повесить пины?
Еще вопрос, как бороться с отключением питания, на Ардуино. Мне нужно записывать в eeprom данные о пробеге, они успеют записаться при отключении? Либо держать Ардуино включенным всегда, но тогда milis() будет переполняться...или мне эта функция не нужна? Смогу я с timerOne засекать время в стандартном формате HH:MM:SS не мешая прерыванию?
p.s. Спасибо вы мне очень помогли.
Последний раз редактировалось Oleg_33; 08.01.2015 в 01:56.
С Grove_LED_Bar.h проблем не возникнет, пины можно поменять как угодно, достаточно просто прописать их в скетче, даже аналоговые. Примечание: аналоговые настроятся как дигитальные в самой библиотеке, тоесть переделывать ничего не надо, просто прописать в скетче напримев вот так нужно прописать если используешь а0, а1, а2 потому что как мы уже говорили аналоговые пины работают и как дигитальные при настройке как дигитальные прописываются след образом: a0=14 a2=15 итд...
Насчет записи в EEPROM: не успеет, откуда ардуина узнает что ей вот вот отрубят светPHP код:
#include <Grove_LED_Bar.h>
Grove_LED_Bar bar(14, 15, 16); // Clock pin, Data pin, Orientation
void setup()
{
// nothing to initialize
}
void loop()
{
}
запись нужно организовать по какому то действию, например заглушил мотор и ардуина себе думает, ага мотор погас, мы не едем, пробег не капает, сейчас меня отрубят от сети, бах и записала все что насчитала в EEPROM
Для работы со временем возми лучше модуль DS1307 меньше гемороя на мой взгляд если хочешь реально часы или что то вроде того зделать
хороший модем должен качать пиво!
Мой проект
Насчёт записи в EEPROM ... запись должна производится по наличия и отсутствию напряжения на А5 (если судить по схеме),успеет или нет ??через этот же ввод будет замер напряжения в бортовой сети. Через резистор 55кОм и 10кОм получится примерно 700мВ при напряжении 12В.
Объясню почему 55кОм - на мотоцикле бывает сгорает РР и напряжение может скакнуть до 30В! при таком делителе при 30В на входе получится около 4,5В ...
Эту тему просматривают: 4 (пользователей: 0 , гостей: 4)