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

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, 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 Кб, 14499 просмотров)
Admin вне форума   Ответить с цитированием
Старый 13.02.2013, 09:39   #2
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

А если вот так попробовать замерить или при компиляции с библиотекой получается тоже самое? Ну так чтоб убедиться.
PHP код:
#include "nanopins.h"

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

void loop()
{
label:  
 
 
PORTB &=B11011111;
 
PORTB|=B00100000;
 
goto 
label

Bulatovor вне форума   Ответить с цитированием
Старый 13.02.2013, 10:41   #3
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
По умолчанию

Получится тоже самое
Перед компиляцией кода, Препроцессор будет искать все директивы предназначенные для него и начинаются со знака #
#define это директива Макро-подстановки, первая запить после команды это идентификатор, вместо нее в код будет подследственна вторая запись(значение)

Синтакс
#define идентификатор значение
Admin вне форума   Ответить с цитированием
Старый 03.03.2013, 07:10   #4
fot
Junior Member
 
Регистрация: 24.11.2012
Адрес: Новосибирск
Сообщений: 14
Вес репутации: 0
fot is an unknown quantity at this point
По умолчанию

В библиотеке есть такая запись:

//***************Output Pins*************
#define MotorA0 DDRD |=B00010000
#define MotorA1 DDRD |=B00100000
#define MotorB0 DDRD |=B01000000
#define MotorB1 DDRD |=B10000000

Вопрос:
1) MotorA0, MotorA1, MotorB0, MotorB1 - это что ?

2) Правильно ли написать :
void setup()
{ D5_In;
D5_High;
}
для подключения внутреннего подтягивающего
резистора у входа D5 ?

Последний раз редактировалось fot; 03.03.2013 в 07:20.
fot вне форума   Ответить с цитированием
Старый 03.03.2013, 09:56   #5
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
По умолчанию

Цитата:
MotorA0, MotorA1, MotorB0, MotorB1 - это что ?
Не обращайте внимание. Например MotorA0 это тоже самое что и D4_Out

Цитата:
Правильно ли написать :
void setup()
{ D5_In;
D5_High;
}
для подключения внутреннего подтягивающего
резистора у входа D5
Да
Admin вне форума   Ответить с цитированием
Старый 03.03.2013, 11:08   #6
fot
Junior Member
 
Регистрация: 24.11.2012
Адрес: Новосибирск
Сообщений: 14
Вес репутации: 0
fot is an unknown quantity at this point
По умолчанию

Вот бы ещё A0 - A5 перевести,
да с analogRead () командой...
А ещё analogWrite(D5), например, для PWM.
fot вне форума   Ответить с цитированием
Старый 03.03.2013, 11:42   #7
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
По умолчанию

Цитата:
Вот бы ещё A0 - A5 перевести,
Они в библиотеке используются, только как цифровые вх./выхъ

Цитата:
да с analogRead () командой...
А ещё analogWrite(D5), например, для PWM.
Можно, но там одной строкой не получится
Без настройки регистров
ADCSRA и ADMUX не обойтись

В примере читается порт A0 циклически в фоновом режиме
PHP код:
//http://cyber-place.ru  
volatile uint8_t A0;  

void setup()    
{   
   
ADCSRA=(1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS1)|(1<<ADPS0);  
   
ADMUX=(1<<ADLAR)|(1<<REFS1)|(1<<REFS0);  
}  

void loop()    



ISR(ADC_vect)  
{  
   
A0 ADCH;    

Можно без прерываний обойтись, но к концепции nanopin уже не подойдет
PHP код:
#include "nanopins.h"

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

void loop()
{
Serial.println(A0_Read(), HEX);
delay(300);

}

uint16_t A0_Read() 
{
  
uint16_t An;
  
ADMUX=B01000000;
  
ADCSRA=B11000110;
  while (
ADCSRA & (<< ADSC)) {An ADCH;} //ждем окончания преобразования 
  
An = (An<<8) + ADCL//сдвигаем в лево старшие 2 бита, читаем и прибавляем младшие 8 бит
  
return An;

Admin вне форума   Ответить с цитированием
Старый 03.03.2013, 12:09   #8
fot
Junior Member
 
Регистрация: 24.11.2012
Адрес: Новосибирск
Сообщений: 14
Вес репутации: 0
fot is an unknown quantity at this point
По умолчанию

Влоб попробовал поменять :
PHP код:
#include <nanopins.h>
int a=0;
int j 0;
int flag=0
int flag1=0;
int flag2=0;
int flag3=0;
int flag4=0;
int flag5=0;

void setup() { 
   
D3_Out;
   
D3_Low;

   
D4_Out;
   
D4_Low;

   
D6_In;
   
D7_In;
   
D8_In;
   
D9_In;

   
D6_High;
   
D7_High;
   
D8_High;
   
D9_High;

   
D14_In;     //(A0)
   
D14_High;

   
D15_In;     //(A1)
   
D15_High;  
 }
void loop(){

   if(
D7_Read==LOW&&flag==0)
    {(
j=j+500); flag=1;} 
   if(
D7_Read==HIGH&&flag==1)
    {
flag=0;}
      
   if(
digitalRead(8)==LOW&&flag1==0)
    {(
j=j-500); flag1=1;} 
   if(
digitalRead(8)==HIGH&&flag1==1)
    {
flag1=0;}

   if(
digitalRead(A0)==LOW&&flag4==0)              //датчик Холла левый
    
{a=0D4_LowD3_Lowflag4=1;} 
   if(
digitalRead(A0)==HIGH&&flag4==1)
    {
flag4=0;}
      
   if(
D15_Read==LOW&&flag5==0)                     //датчик Холла правый
    
{a=0D4_LowD3_Highflag5=1;} 
   if(
D15_Read==HIGH&&flag5==1)
    {
flag5=0;}

D8 - хочет старую конструкцию, с новой не работает.
A0 - то же самое.
А, вот A1 как (D15) - работает.
Остальные пины, из нужных (см.setup()) - работают адекватно.
Плата Seeeduino, кристалл Atmega 328 .
fot вне форума   Ответить с цитированием
Старый 03.03.2013, 12:29   #9
fot
Junior Member
 
Регистрация: 24.11.2012
Адрес: Новосибирск
Сообщений: 14
Вес репутации: 0
fot is an unknown quantity at this point
По умолчанию

A0 мне нужен как цифровой вход , но что-то не хочет он быть D14-м.

Всё равно - большое спасибо за науку!

Завтра попробую АЦП оба варианта.

Последний раз редактировалось fot; 03.03.2013 в 13:24.
fot вне форума   Ответить с цитированием
Старый 03.03.2013, 15:29   #10
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
По умолчанию

Проверил D8 у меня работает
Цитата:
#include "nanopins.h"
void setup()
{
D8_Out;
}

void loop()
{
D8_Low;
delay(500);
D8_High;
delay(500);
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 8 (пользователей: 0 , гостей: 8)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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


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


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