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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.10.2014, 00:18   #121
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию Re: Ускоряем работу Arduino

Спасибо.
stD вне форума   Ответить с цитированием
Старый 12.10.2014, 01:14   #122
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию Re: Ускоряем работу Arduino

Работа с цифровыми портами
Стандартный скетч Blink, только без delay():
PHP код:
void setup()
{
   
pinMode(13OUTPUT);
}

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

Занимает 874 байта и выдаёт на пин 13 частоту 120 кГц.

С библиотекой "CyberLib"
PHP код:
#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; - инвертирует значение на пине Х

Чтение аналогового входа
Стандартный скетч:
PHP код:
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"
PHP код:
#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; - чтение аналогового пина Х

Чтение и запись Serial
Стандартный скетч:
PHP код:
byte b=255;

void setup() 
 {
    
Serial.begin(57600);
 }

void loop() 
 { 
    
Serial.write(b);
 } 
Скетч занял 1650 байт.

С "CyberLib"
PHP код:
#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); - отправить байт данных в последовательный порт.

Отправка массива в Serial
PHP код:
#include <CyberLib.h>  
uint8_t message[] = "Cyber"

void setup()  
 {   
    
UART_Init(115200);
 }  
void loop()  
 {  
    
UART_SendArraymessage5); 
 } 
UART_SendArray(array, size array); - отправляет в порт массив типа байт. Где array-имя вашего массива, а size array-число отправляемых байт массива.
Максимальный объем массива не должен превышать 65535 байт.

Альтернатива стандартным функциям delayMicroseconds() и delay()

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

Работа с Timer1

StartTimer1(obrobotchik, 1000); Первый параметр-обработчик прерывания, будет
запускаться каждый раз по истечении заданного времени. Второй параметр это время, может принимать значения от 6 до 4000000 мкс., шаг 1 мкс.
StopTimer1(); - остановить таймер.
ResumeTimer1(); - возобновить отсчет после остановки.
RestartTimer1(); - перезапустить отсчет таймера заново.
Пример:
PHP код:
#include <CyberLib.h> 

void setup() 
{  
   
D13_Out
   
StartTimer1(obrobotchik1000000);  


void obrobotchik() 

  
D13_High
  
delay_ms(100);


void loop()
{
  
D13_Low;

Работа с SPI

Увеличена пропускная спсобность 1.85 раза.
StartSPI(0, 2, 1); - Первый параметр это режим mode от 0 до 3.
Второй это делитель тактовой частоты, может принимать значения 2, 4, 8, 16, 32, 64, 128. Для вычисления частоты SPI нужно тактовую частоту контроллера 16000000 разделить на любой делитель из списка.
Третий параметр это какой бит пойдет первым. Если 1 то первым пойдет старший бит если 0 то первым пойдет младший бит.
Отправить байт: SendSPI(1);
Получить байт: MyData=ReadSPI();
Выключить SPI: StopSPI();

Работа с EEPROM

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

WriteEEPROM_Long(0, 4000000); - записать 4000000 в EEPROM по адресу 0 тип Long.
uint32_t tmp=ReadEEPROM_Long(0); - прочитать из EEPROM с адреса 0 значение типа Long.

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.

Генератор звука

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

Сторожевой таймер

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

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

Бесконечный цикл

Start - Начало цикла
End - Конец цикла

Цикл выполняется внутри конструкции Start-End.

Фильтр для удаления шума или ложных срабатываний

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

Последний раз редактировалось stD; 05.11.2014 в 09:28.
stD вне форума   Ответить с цитированием
Старый 12.10.2014, 01:29   #123
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
По умолчанию Re: Ускоряем работу Arduino

А когда ты статью в песочницу выкладывал?
Я ее там не видел

Еще можно добавить к статье
Цитата:
Фильтр для удаления шума или ложных срабатываний из массива показаний датчика
Функция возвращает наиболее часто встречаемое в массиве значение, тем самым отбраковывает ложные данные
Удобно фильтровать показания датчиков
Например: Ультразвуковой дальномер производит 5 замеров и складывает эти показания в массив
После выполнения этой функции будет возвращено наиболее вероятное измеряемое значение


find_similar(Array, sizeArray, range);
Array - Указатель на проверяемый массив, массив может иметь тип uint16_t или uint8_t
sizeArray - длинна массива не более 256 элементов
range - предел погрешности(отклонен� �� �е) может колебаться от 0 до 127, при значении 0 функция будет искать точные копии значений
Admin вне форума   Ответить с цитированием
Старый 12.10.2014, 01:49   #124
Oris
Junior Member
 
Регистрация: 17.08.2014
Сообщений: 2
Вес репутации: 0
Oris is an unknown quantity at this point
По умолчанию Re: Ускоряем работу Arduino

Ax_Read на Mega2560 не работает?
Oris вне форума   Ответить с цитированием
Старый 12.10.2014, 02:15   #125
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
По умолчанию Re: Ускоряем работу Arduino

К сожалению пока не работает
Admin вне форума   Ответить с цитированием
Старый 12.10.2014, 02:17   #126
Oris
Junior Member
 
Регистрация: 17.08.2014
Сообщений: 2
Вес репутации: 0
Oris is an unknown quantity at this point
По умолчанию Re: Ускоряем работу Arduino

жаль, очень помогло бы в работе в системе ПИД-регулятора
Oris вне форума   Ответить с цитированием
Старый 12.10.2014, 02:18   #127
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
По умолчанию Re: Ускоряем работу Arduino

Я извиняюсь, проверил библиотеку, работает от A0 до A5
З что спасибо Bulatovor
Admin вне форума   Ответить с цитированием
Старый 14.10.2014, 21:43   #128
bwn
Junior Member
 
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0
bwn is an unknown quantity at this point
Unhappy Re: Ускоряем работу Arduino

Доброго вечера. Вопрос к автору библиотеки. При использовании функции WriteEEPROM_xxx, кроме записи в конкретную ячейку, разбрасывает значения по всему адресному полю EEPROM. Возможно ли подлечить? Спасибо.
bwn вне форума   Ответить с цитированием
Старый 14.10.2014, 21:49   #129
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
По умолчанию Re: Ускоряем работу Arduino

Не понял, каким образом функция расбрасывает по всему полю? Если ей не задать адрес то она запишет по адресу 0
Admin вне форума   Ответить с цитированием
Старый 14.10.2014, 22:45   #130
bwn
Junior Member
 
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0
bwn is an unknown quantity at this point
По умолчанию Re: Ускоряем работу Arduino

Цитата:
Сообщение от Admin Посмотреть сообщение
Не понял, каким образом функция расбрасывает по всему полю? Если ей не задать адрес то она запишет по адресу 0
IDE 0018, Atmega328, Duemilanove. Столкнулся с проблемой когда начал сохранять адреса датчиков DS18. Один не определялся. Начал рыть EEPROM, обнаружил, что после применения конструкции

if (ReadEEPROM_Word(0)<400) {WriteEEPROM_Word(0, 510);} //Значение клавиши Set
if (ReadEEPROM_Word(2)<400) {WriteEEPROM_Word(2, 825);} //Значение клавиши UP
if (ReadEEPROM_Word(4)<400) {WriteEEPROM_Word(4, 690);} //Значение клавиши DOWN
if (ReadEEPROM_Byte(8)<1||ReadEEPROM_Byte(8 )>20) {WriteEEPROM_Byte(8, 5);} //Время освещения по умолчанию
if (ReadEEPROM_Byte(9)<8||ReadEEPROM_Byte(9 )>20) {WriteEEPROM_Byte(9, 10);} //Температура по умолчанию
if (ReadEEPROM_Byte(10)<30||ReadEEPROM_Byte (10)>80) {WriteEEPROM_Byte(10, 40);} //Влажность по умолчанию
if (ReadEEPROM_Long(11)<-29||ReadEEPROM_Long(11)>29) {WriteEEPROM_Long(11, 0);} //Корр. времени по умолчанию
if (ReadEEPROM_Long(15)<-5||ReadEEPROM_Long(15)>5) {WriteEEPROM_Long(15, 0);} //Корр. темп.помещения низ даллас
if (ReadEEPROM_Long(19)<-5||ReadEEPROM_Long(19)>5) {WriteEEPROM_Long(19, 0);} //Корр.темп.улица даллас
if (ReadEEPROM_Long(23)<-5||ReadEEPROM_Long(23)>5) {WriteEEPROM_Long(23, 0);} //Корр.темп.помещение DHT
if (ReadEEPROM_Long(27)<-15||ReadEEPROM_Long(27)>15) {WriteEEPROM_Long(27, 0);} //Корр.влажности DHT

один из адресов датчиков записанный побайтово с 40 ячейки в ячейках 44-47 содержит 00. После чего записал всю память FF, считал - все верно. Применил вышеозначенную конструкцию, таже байда. Комментишь строку
if (ReadEEPROM_Long(11)<-29||ReadEEPROM_Long(11)>29) {WriteEEPROM_Long(11, 0);} //Корр. времени по умолчанию
адрес не затирается.

Просмотр памяти после заполнения FF и применения вышеозначенной конструкции+запись адресов датчиков DS показала заполнение части памяти различными значениями, в т.ч. присутствуют и адреса датчиков DS18 (легко опознавать).
Просматривал в цикле 0-1024 командой
Serial.print(i,DEC);
Serial.print(" ");
Serial.println(ReadEEPROM_Byte(i),HEX);
bwn вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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