11.10.2014, 00:18 | #121 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Re: Ускоряем работу Arduino
Спасибо.
|
12.10.2014, 01:14 | #122 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1311 |
Re: Ускоряем работу Arduino
Работа с цифровыми портами
Стандартный скетч Blink, только без delay(): PHP код:
С библиотекой "CyberLib" PHP код:
Разогналась в 22 раза. Управление пинами: Dx_Out; - установка пина Х как выход Dx_In; - установка пина Х как вход Dx_Hihg;- установка высокого уровна на пине Х Dx_Low; - установка низкого уровня на пине Х Dx_Read; - чтение пина Х Dx_Inv; - инвертирует значение на пине Х Чтение аналогового входа Стандартный скетч: PHP код:
С "CyberLib" PHP код:
Управление пинами: Ax_Read; - чтение аналогового пина Х Чтение и запись Serial Стандартный скетч: PHP код:
С "CyberLib" PHP код:
UART_Init(57600); - инициализация последовательного порта. UART_ReadByte(b); - получить байт данных из последовательного порта. UART_SendByte(b); - отправить байт данных в последовательный порт. Отправка массива в Serial PHP код:
Максимальный объем массива не должен превышать 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 код:
Увеличена пропускная спсобность 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. |
12.10.2014, 01:29 | #123 | |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ускоряем работу Arduino
А когда ты статью в песочницу выкладывал?
Я ее там не видел Еще можно добавить к статье Цитата:
|
|
12.10.2014, 01:49 | #124 |
Junior Member
Регистрация: 17.08.2014
Сообщений: 2
Вес репутации: 0 |
Re: Ускоряем работу Arduino
Ax_Read на Mega2560 не работает?
|
12.10.2014, 02:15 | #125 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ускоряем работу Arduino
К сожалению пока не работает
|
12.10.2014, 02:17 | #126 |
Junior Member
Регистрация: 17.08.2014
Сообщений: 2
Вес репутации: 0 |
Re: Ускоряем работу Arduino
жаль, очень помогло бы в работе в системе ПИД-регулятора
|
12.10.2014, 02:18 | #127 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ускоряем работу Arduino
Я извиняюсь, проверил библиотеку, работает от A0 до A5
З что спасибо Bulatovor |
14.10.2014, 21:43 | #128 |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 |
Re: Ускоряем работу Arduino
Доброго вечера. Вопрос к автору библиотеки. При использовании функции WriteEEPROM_xxx, кроме записи в конкретную ячейку, разбрасывает значения по всему адресному полю EEPROM. Возможно ли подлечить? Спасибо.
|
14.10.2014, 21:49 | #129 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Ускоряем работу Arduino
Не понял, каким образом функция расбрасывает по всему полю? Если ей не задать адрес то она запишет по адресу 0
|
14.10.2014, 22:45 | #130 | |
Junior Member
Регистрация: 14.10.2014
Сообщений: 7
Вес репутации: 0 |
Re: Ускоряем работу Arduino
Цитата:
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); |
|
Здесь присутствуют: 10 (пользователей: 0 , гостей: 10) | |
|
|