Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.02.2013, 23:53   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Ускоряем работу Arduino

Ускоряем работу Arduino Nano и Arduino UNO
Альтернативная и улучшенная библиотека от Arhat109

Спасибо Bulatovor, за помощь в создании библиотеки CyberLib
Благодаря ему теперь библиотека получила описание и поддержку работы с портами
в Arduino Mega и Arduino Leonardo

Сегодня вооружившись осциллографом, я решил провести наглядное тестирование встроенной фукции digitalWrite();
и работу с портами библиотеки CyberLib

Залил ниже приведенный код для проверки встроенной в IDE функции
Код:
void setup()
{
pinMode(13, OUTPUT);
}

void loop()
{
 
 digitalWrite(13, HIGH);
 digitalWrite(13, LOW);

}
Скетч занял 816 байт в памяти контроллера и на выходе пина 13 получили частоту 120 кГц
Слабовато!

Ускоряем, зациклив функцией goto
Код:
void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
label:  
 
 digitalWrite(13, HIGH);
 digitalWrite(13, LOW);

goto label; 
}
Подозрительно, но занимаемый объем скетча не изменился, он составил 816 байт и на выходе пина 13 получили частоту 128 кГц. Немножко быстрее , но все равно это плохой результат

Теперь попробуем с использованием библиотеки CyberLib.h
Код:
#include "CyberLib.h"

void setup()
{
  D13_Out; //Настраиваем пин D13 на выход
}

void loop()
{
label:  
 
 D13_High;
 D13_Low;
 
goto label; 
}
Скетч занял 456 байт в памяти контроллера, что почти в двое меньше и на выходе пина 13 получили частоту 2650 кГц.
Теперь результат впечатляет, скорость работы отличается в 22 раза

В следующий раз проверю скорость работы функции чтения порта

Спасибо Bulatovor, за то что создал описание функций библиотеки CyberLib
PHP код:
********Управление пинами:
Dx_Out;  - установка пина Х как выход
Dx_In
; - установка пина Х  как вход
Dx_Hihg
;-  установка высокого уровна на пине Х
Dx_Low
; - установка низкого уровня на пине Х
Ax_Read
; - чтение аналогового пина Х

********SmallUart
UART_Init
(115200);//инициализация последовательного порта
UART_ReadByte(byte);//получить байт данных из последовательного порта
UART_SendByte(byte);//отправить байт данных в последовательный порт
UART_SendArray(array, size array);// Функция отправляет в UART порт, массив типа байт, максимальный объем которого не должен превышать 65535 байт, минимальный объем массива 1 байт
Можно также отправлять часть массива
array-имя вашего массива
size array-число отправляемых байт массива

******** delay_us() и delay_ms()
Функции delay_us() и delay_ms() можно применять в прерываниях так как они не используют таймерно следует не забывать что точность этих функций зависит от использования в коде обработчиков прерыванийЕсли Вы не используете в коде прерывания то и точность будет высокая
delay_us
(n); //где n - задержка в мкс, максимальная задержка может быть не больше 16000мкс
delay_ms(n); //где n - задержка в мс, максимальная задержка может быть не больше 65000мс это равно 65сек

******* Timer1
Настройку прерываний таймера можно настривать от 6мксдо 4000000мкс.(4сек.) с шагом 1мкс.
StartTimer1(obrobotchik1000);// запуск таймера, первый параметр это Ваш обработчик прерывания, второй параметр это время, может принимать значения от 6 до 4000000
StopTimer1();// Выключить таймер
ResumeTimer1(); возобновить отсчет после остановки
RestartTimer1
(); перезапустить отсчет таймера заново


********SPIУвеличил пропускную способность в 1,85 разапри работе на одной и той же частоте
SPI теперь можно настроить и запустить одной строкой 
StartSPI(021); Где первый параметр это режим mode от 0 до 3
Второй параметр это делитель тактовой частоты
может принимать значения 248163264128. Если Вы хотите выяснить частоту SPI то должны 
тактовую частоту контроллера 16000000 разделить на любой делитель из списка
И последний параметр это какой бит пойдет первымЕсли 1 то первым пойдет старший бит
если 0 то первым пойдет младший бит
Отправить байт данных в шину SPI можно такSendSPI(12); Получить байт данных MyData=ReadSPI(); Выключить SPI можно такStopSPI():

*********
EEPROM
Ограничение
адресует максимум 256 адресов для типа Byte
Для Word максимум 128
Для Long максимум 64

Сохранить значение 4000000 в EEPROM по адресу 0 тип Long
WriteEEPROM_Long
(04000000); 

Прочитать из EEPROM с адреса 0 значение типа Long
uint32_t tmp
=ReadEEPROM_Long(0);

Сохранить значение 4000 в EEPROM по адресу 0 тип Word
WriteEEPROM_Word
(04000); 

Прочитать из EEPROM с адреса 0 значение типа Word
uint16_t tmp
=ReadEEPROM_Word(0);

Сохранить значение 400 в EEPROM по адресу 0 тип Byte
WriteEEPROM_Byte
(0200); 

Прочитать из EEPROM с адреса 0 значение типа Byte
uint8_t tmp
=ReadEEPROM_Byte(0);

********
find_similar(Array, sizeArrayrange);
Фильтр удаления шума и ложных срабатываний 
Функция возвращает наиболее часто встречаемое в массиве значение 
Array - Указатель на проверяемый массивмассив может иметь тип uint16_t или uint8_t
sizeArray 
длинна массива не более 256 элементов
range 
предел погрешности(отклонен� �еможет колебаться от 0 до 127при значении 0 функция будет искать точные копии значений

********beep
beep
(uint16_t duruint16_t frq);
Генерирует звуковые колебанияна любом пине с заданной частотой и длительностью
dur 
длительность от 50мс до 65535 мс
frq 
частота от 10 Гц до 2000 Гц

*********Soft Reset
reset
(); - программный сброс контроллера 
При помощи этой функции можно отправить контроллер в ребут в любом месте выполняемой программы

*********Бесконечный цикл
Start 
Начало цикла
End 
Конец цикла

********* Работа со сторожевым таймером     
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 
Вложения
Тип файла: rar CyberLib.rar (9.5 Кб, 14476 просмотров)
Admin вне форума   Ответить с цитированием
 


Здесь присутствуют: 64 (пользователей: 0 , гостей: 64)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:10. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика