- PVSM.RU - https://www.pvsm.ru -
Хочу поделится с читателями, библиотекой «CyberLib», значительно ускоряющую работу ардуино.
Библиотека работает с Arduino Nano, Arduino Mega и Arduino Leonardo.
Перейду сразу к описанию.
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
}
Занимает 874 байта и выдаёт на пин 13 частоту 120 кГц.
С библиотекой «CyberLib»
#include "CyberLib.h"
void setup()
{
D13_Out;
}
void loop()
{
D13_High;
D13_Low;
}
Занимает 566 байт и выдаёт частоту 2650 кГц.
Разогналась в 22 раза.
Управление пинами:
Dx_Out; — установка пина Х как выход
Dx_In; — установка пина Х как вход
Dx_Hihg; — установка высокого уровна на пине Х
Dx_Low; — установка низкого уровня на пине Х
Dx_Read; — чтение пина Х
Dx_Inv; — инвертирует значение на пине Х
unsigned long timme;
void setup()
{
Serial.begin(57600);
}
void loop()
{
timme = micros();
float i = analogRead(0);
timme = micros()-timme;
Serial.println(timme);
delay(1000);
}
Скорость чтения 112 мкс.
С «CyberLib»
#include <CyberLib.h>
unsigned long timme;
void setup()
{
Serial.begin(57600);
}
void loop()
{
timme = micros();
float i = A0_Read;
timme = micros()-timme;
Serial.println(timme);
delay(1000);
}
Скорость чтения 68 мкс. В два раза быстрее.
Управление пинами:
Ax_Read; — чтение аналогового пина Х
byte b=255;
void setup()
{
Serial.begin(57600);
}
void loop()
{
Serial.write(b);
}
Скетч занял 1650 байт.
С «CyberLib»
#include <CyberLib.h>
byte b=255;
void setup()
{
UART_Init(57600);
}
void loop()
{
if(UART_ReadByte(b))
{
UART_SendByte(b);
}
}
Получилось 800 байт. В два раза меньше.
UART_Init(57600); — инициализация последовательного порта.
UART_ReadByte(b); — получить байт данных из последовательного порта.
UART_SendByte(b); — отправить байт данных в последовательный порт.
Буфферизируется только 1 байт данных, принятый с Serial порта.
#include <CyberLib.h>
uint8_t message[] = "geek";
void setup()
{
UART_Init(115200);
}
void loop()
{
UART_SendArray( message, 4);
}
UART_SendArray(array, size array); — отправляет в порт массив типа байт. Где array-имя вашего массива, а size array-число отправляемых байт массива.
Максимальный объем массива не должен превышать 65535 байт.
#include <CyberLib.h>
void setup()
{
D13_Out;
StartTimer1(obrobotchik, 1000000);
}
void obrobotchik()
{
D13_High;
delay_ms(100);
}
void loop()
{
D13_Low;
}
StartTimer1(obrobotchik, 1000); Первый параметр-обработчик прерывания, будет запускаться каждый раз по истечении заданного времени. Второй параметр это время, может принимать значения от 6 до 4000000 мкс., шаг 1 мкс.
StopTimer1(); — остановить таймер.
ResumeTimer1(); — возобновить отсчет после остановки.
RestartTimer1(); — перезапустить отсчет таймера заново.
#include <CyberLib.h>
void setup()
{
StartSPI(0, 8, 1); // MODE0, DIV8, MSBFIRST инициализация SPI
}
void loop()
{
SendSPI(170); //отправить один байт в шину SPI
}
Увеличена пропускная спсобность 1.85 раза.
StartSPI(0, 2, 1); — Первый параметр это режим mode от 0 до 3.
Второй — это делитель тактовой частоты, может принимать значения 2, 4, 8, 16, 32, 64, 128. Для вычисления частоты SPI нужно тактовую частоту контроллера 16000000 разделить на любой делитель из списка.
Третий параметр это какой бит пойдет первым. Если 1 то первым пойдет старший бит если 0 то первым пойдет младший бит.
Отправить байт: SendSPI(b);
Получить байт: MyData=ReadSPI();
Выключить SPI: StopSPI();
WriteEEPROM_Word(0, 4000); — записать 4000 в EEPROM по адресу 0 тип Word.
uint16_t tmp=ReadEEPROM_Word(0); — прочитать из EEPROM с адреса 0 значение типа Word.
WriteEEPROM_Byte(0, 40); — записать 40 в EEPROM по адресу 0 тип Byte.
uint8_t tmp=ReadEEPROM_Byte(0); — прочитать из EEPROM с адреса 0 значение типа Byte.
Адресует максимум 256 адресов для типа Byte
Для Word максимум 128
Для Long максимум 64
wdt_reset(); — обнулить сторожевой таймер.
wdt_disable(); — выключить сторожевой таймер.
wdt_enable(timeout); — инициализация сторожевого таймера.
Возможные значения timeout
WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_120MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S
WDTO_4S
WDTO_8S
Будте внимательны, не все ардуины корректно работают со сторожевым таймером (надо перешивать загрузчик), можно окирпичить контроллер.
#include <CyberLib.h>
void setup()
{
// что-то
}
void loop()
{
Start
// что-то выполняется
End
}
Start — Начало цикла
End — Конец цикла
Цикл выполняется внутри конструкции Start-End.
#include <CyberLib.h>
uint16_t sensor[]={10, 15, 55, 999, 10, 8, 9, 11, 700, 455, 123, 999, 543, 567, 65535, 43555, 999, 10, 43, 99, 66, 987, 999, 100};
void setup()
{
Serial.begin(115200);
uint16_t cm = find_similar(sensor, sizeof(sensor)/2, 0);
Serial.println(cm, DEC);
}
void loop() {}
Приведенный пример показывает наиболее часто встречаемое значение 999, но если изменить третий параметр вызываемой функции с 0 на 1, то функция вернет значение 10, так как посчитает значение 9 и 11 как 10
find_similar(Array, sizeArray, range);
Array — Указатель на проверяемый массив, массив может иметь тип uint16_t или uint8_t.
sizeArray — длинна массива не более 256 элементов.
range — предел погрешности(отклонение) может колебаться от 0 до 127, при значении 0 функция будет искать точные копии значений.
Например: Ультразвуковой дальномер производит 5 замеров и складывает эти показания в массив, после выполнения этой функции будет возвращено наиболее вероятное измеряемое значение.
Библиотека написана не мной, я лишь опубликовал её с разрешения автора.
Здесь [1] находится источник, автор либы Admin.
А тут [2] можно скачать сабж.
Автор: starikstd
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy-ili-sdelaj-sam/73593
Ссылки в тексте:
[1] Здесь: http://cyber-place.ru/showthread.php?t=550
[2] тут: http://cyber-place.ru/attachment.php?attachmentid=1769&d=1402999525
[3] Источник: http://geektimes.ru/post/240990/
Нажмите здесь для печати.