Ви не увійшли.
Ой, да ладно. Я не вижу особого преимущества перед мега328. АЦП, ЦАП, кол-во ног, всё. Минус внятная документация, неизвестные баги... Какое там ещё DSP!))
LGT8FX8P Series – EFLASH Based MCU Overview v1.0.4
(Страница 60 )
运算加速器(uDSC)
16 位存储模式(LD/ST)
32 位累加器(DX)
单周期 16 位乘法器(MUL)
32 位算术逻辑运算单元(ALU)
16 位饱和运算(SD)
8 周期 32/16 除法器
单周期乘加/乘减运算(MAC/MSC)
概述
数字运算加速器(uDSC)作为 LGT8XM 内核的一个运算协处理模块,配合 LGT8XM 内核
16 位 LD/ST 模式,实现一个 16 位的数字信号处理单元。可以满足大部分控制类数字信号的
处理。
uDSC 功能内部以及功能:
1. 16 位操作数寄存器 DX/DY
2. 32 位累加寄存器 DA
3. 单周期 17 位乘法器(可以实现 16 位有/无符号乘法运算)
4. 32 位 ALU (可以实现 16/32 位的加法,减法以及移位运算)
5. 16 位饱和运算 (用于将运算结果存储到 RAM 空间)
6. 32/16 除法器,8 个周期内完成运算
Вы недооцениваете китайские производства. То, что они вам поиграть отбраковкой дают, за смешные деньги, вовсе не означает, что у них один непотреб. Этот чип, что надо! ATxmega отдыхает.
Неактивний
А еще есть китайский клон STM32 - почти совместимые с STM32, но быстрее и памяти больше. И дешевле.
Но видимо "почти" такое что никому не интересно. Китайцы конечно могут дешево сделать, но как всегда в каждой бочке меда будет еще килограмм дегтя, так что не рекомендую.
ATxmega по сравнению со всем отдыхает.
Остання редакція LynX (2018-07-11 22:15:42)
Неактивний
... ATxmega по сравнению со всем отдыхает.
Смотря с чем сравнивать. У Хмеги отличные технические характеристики и периферия как для 8-ми разрядных микроконтроллеров. И как выражается майкрочиповская реклама "Surprise free!". А это не самое последнее достоинство.
Неактивний
Нашел интересную ссылку...
http://www.ocrobot.com/doku.php?id=lear … 2017052301
#define PI 3.1415926535897932384626433832795 //定义常数π
void setup() {
pinMode(4, ANALOG); //配置DAC输出
analogReference(INTERNAL4V096); //内部基准源4.096V
}
void loop()
{
for(float i=0;i<=2;i=i+0.01) //起始点为0,终止为2π,采样率为0.01
{
float rad=PI*i;
float Sin=sin(rad);
long intSin=Sin*300; //将数据放大300倍,取整数
byte val=map(intSin,-300,300,0,255); //映射至8位DAC精度
analogWrite(4, val); //DAC输出
}
}
только не пойму почему byte val=map(intSin,-300,300,0,255);
ведь в описании - 2 ЦАП выхода на 10 бит - ???
Неактивний
А вот еще нашел !!!!!!!!!!!!!!!!
http://www.electrodragon.com/w/File:LGT … slated.pdf
По моему тема частоты на Page 36 ... если кто-то растолкует как, что и куда буду оооочень признателен...
Остання редакція renoshnik (2018-07-12 15:42:38)
Неактивний
Выдержка из криво переведенного даташита. Ссылка в предыдущем посте...
на странице 33 есть System clock prescaler control
набросал код и попытался прочитать регистры
#ifndef bit_is_set
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit)) // читаем заданый бит
#endif
bool BIT;
void setup() {
Serial.begin(57600);
//noInterrupts();
Serial.println(" Test - PMCR: 0xF2 = 1111 0010 ");
BIT = bit_is_set(PMCR, PMCE); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKFS); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKSS); Serial.print(BIT);
// BIT = bit_is_set(PMCR, WCLKS); Serial.print(BIT);
Serial.print("?");
BIT = bit_is_set(PMCR, OSCKEN); Serial.print(BIT);
// BIT = bit_is_set(PMCR, OSCMEN); Serial.print(BIT);
Serial.print("?");
BIT = bit_is_set(PMCR, RCKEN); Serial.print(BIT);
BIT = bit_is_set(PMCR, RCMEN); Serial.println(BIT);
Serial.println(" Test - CLKPR: 0x61 = 0110 0001 ");
// BIT = bit_is_set(CLKPR, WCE); Serial.print(BIT);
Serial.print("?");
// BIT = bit_is_set(CLKPR, CKOEN1); Serial.print(BIT);
Serial.print("?");
// BIT = bit_is_set(CLKPR, CKOEN0); Serial.print(BIT);
Serial.print("?");
Serial.print("-");
BIT = bit_is_set(CLKPR, CLKPS3); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS2); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS1); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS0); Serial.println(BIT);
//interrupts();
}
void loop() {
//=========================================================
}
получаю такой результат
Test - PMCR: 0xF2 = 1111 0010
000?0?11
Test - CLKPR: 0x61 = 0110 0001
???-0001
знаками ? заменил строки на которые ругается компилятор...
Arduino: 1.8.5 (Windows 7), Плата:"WEMOS XI (Retired)"
In file included from c:\users\admin\appdata\local\arduino15\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\io.h:99:0,
from c:\users\admin\appdata\local\arduino15\packages\arduino\tools\avr-gcc\4.8.1-arduino5\avr\include\avr\pgmspace.h:88,
from C:\Program Files (x86)\Arduino\hardware\wemos\XI\cores\lgt8f/Arduino.h:28,
from sketch\sketch_jul27a.ino.cpp:1:
C:\Temp\arduino_modified_sketch_552636\sketch_jul27a.ino: In function 'void setup()':
sketch_jul27a:28: error: 'CKOEN0' was not declared in this scope
BIT = bit_is_set(CLKPR, CKOEN0); Serial.print(BIT);
^
exit status 1
'CKOEN0' was not declared in this scope
Этот отчёт будет иметь больше информации свключенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
Неактивний
Вы попробуйте управление без их регистровых констант, по адресам из даташита. Или попроверяйте их определение. У нас, еще на заре AVR, была проблема из-за ошибки в фирменных заголовочных файлах констант.
Неактивний
Вы попробуйте управление без их регистровых констант, по адресам из даташита. Или попроверяйте их определение. У нас, еще на заре AVR, была проблема из-за ошибки в фирменных заголовочных файлах констант.
Выбрал в настройках "доску" LGT Nano - прочиталось немного больше информации...
#ifndef bit_is_set
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit)) // читаем заданый бит
#endif
bool BIT;
void setup() {
Serial.begin(57600);
noInterrupts();
Serial.println(" Test - PMCR: 0x01 default - 0000 0001 ");
BIT = bit_is_set(PMCR, PMCE); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKFS); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKSS); Serial.print(BIT);
// BIT = bit_is_set(PMCR, WCLKS); Serial.print(BIT);
Serial.print("?");
Serial.print(" ");
BIT = bit_is_set(PMCR, OSCKEN); Serial.print(BIT);
// BIT = bit_is_set(PMCR, OSCMEN); Serial.print(BIT);
Serial.print("?");
BIT = bit_is_set(PMCR, RCKEN); Serial.print(BIT);
BIT = bit_is_set(PMCR, RCMEN); Serial.println(BIT);
Serial.println(" Test - CLKPR: 0x03 default - 0000 0011 ");
BIT = bit_is_set(CLKPR, CLKPCE); Serial.print(BIT);
// Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN1); Serial.print(BIT);
Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN0); Serial.print(BIT);
Serial.print("?");
Serial.print("- ");
BIT = bit_is_set(CLKPR, CLKPS3); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS2); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS1); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS0); Serial.println(BIT);
interrupts();
}
void loop() {
//=========================================================
}
Получил :
Test - PMCR: 0x01 default - 0000 0001
0001 0011
Test - CLKPR: 0x03 default - 0000 0011
0??- 0001
Попробовал перевести :
Регистр управления синхронизацией часов - PMCR
PMCR - регистр управления источником синхронизации
PMCR: 0xF2 Значение по умолчанию: 0x01
PMCR PMCE CLKFS / CLKSS WCLKS OSCKEN OSCMEN RCKEN RCMEN
R / W R / W R / W R / W R / W R / W R / W R / W
0 0/0 0 0 0 0 1
Определение бит
[0] RCMEN Внутреннее 32-мегагерцовое управление мощностью генератора RC, 1 включено, 0 отключено
[1] RCKEN Внутреннее 32KHz RC-управление генератором, 1 включено, 0 отключено
[2] OSCMEN Внешнее управление частотой высокочастотного кристалла, 1 включено, 0 отключено
[3] OSCKEN Внешнее управление частотой низкочастотного кристалла разрешено, 1 включено, 0 отключено
[4] WCLKS Выбор источника сигнала WDT,
0 - выбор внутреннего 1 МГц / RC,
1 - внутренний 32 кГц
[5] CLKSS Выбор основного источника тактового сигнала, выберите тип источника синхронизации, обратитесь к блоку выбора источника синхронизации минут
[6] CLKFS Регулятор частоты основного источника синхронизации, выберите тип тактовой частоты, пожалуйста, обратитесь к выбору источника синхронизации раздел
[7] PMCE Контрольный бит разрешения изменения регистра PMCR.
Этот бит должен быть установлен первым, а затем в четыре цикла, прежде чем изменять другие местоположения PMCR
Установите значение других бит.
Рекордер главного генератора часов - CLKPR
CLKPR - регистр предварительного делителя часов
CLKPR: 0x61 По умолчанию: 0x03
CLKPR CLKPCE CLKOEN1 CLKOEN0 - CLKPS3 CLKPS2 CLKPS1 CLKPS0
R / W R / W R / W R / W - R / W R / W R / W R / W
0 0 0 - 0 0 1 1
Определение бит
[3: 0] CLKPS
Бит предварительного делителя частоты
CLKPS3 CLKPS2 CLKPS1 CLKPS0 Параметры частотного разделения
0 0 0 0 1
0 0 0 1 2
0 0 1 0 4
0 0 1 1 8 (настройка по умолчанию)
0 1 0 0 16
0 1 0 1 32
0 1 1 0 64
0 1 1 1 128
1 0 0 0 256
Другие значения зарезервированный
[4] - Не использовать
[5] CLKOEN0 Установите, будут ли системные часы выводиться на вывод PB0
[6] CLKOEN1 Установите, будут ли системные часы выводиться на вывод PE5
[7] CLKPCE Управление часами с предварительным делителем часов
Перед изменением других битов регистра CLKPR вы должны сначала установить CLKPCE в 1, соответственно. Затем установите остальные биты для следующих четырех системных циклов. После окончания четырех циклов, CLKPCE автоматически очищается.
++++++++++
Получается, что МК настроен на 32 МГц (внутренний) и делитель на ДВА ...
Если делитель изменит на ЕДИНИЦУ, то частота работы МК должна увеличиться - я правильно понимаю ?
Достаточно ли откорректировать CLKPS3, CLKPS2, CLKPS1, CLKPS0 или нужно еще где-то, что-то править ?
Остання редакція renoshnik (2018-07-29 13:43:04)
Неактивний
... Получается, что МК настроен на 32 МГц (внутренний) и делитель на ДВА ...
Если делитель изменит на ЕДИНИЦУ, то частота работы МК должна увеличиться - я правильно понимаю ?
Достаточно ли откорректировать CLKPS3, CLKPS2, CLKPS1, CLKPS0 или нужно еще где-то, что-то править ?
У вас в PMCR настройка синхронизации на внутренний RC генератор - 32МГц и вочдог от внутреннего RC - 32 кГц. А в CLKPS, прескаллере процессора, деление частоты на 2. Т.е. частота процессора 16 МГц, как в Ардуино. Все правильно понимаете. Запишите в CLKPS ноль, и частота процессора станет 32 Мгц. Гугл сносно прерводит с китайского.
Неактивний
renoshnik пише:... Получается, что МК настроен на 32 МГц (внутренний) и делитель на ДВА ...
Если делитель изменит на ЕДИНИЦУ, то частота работы МК должна увеличиться - я правильно понимаю ?
Достаточно ли откорректировать CLKPS3, CLKPS2, CLKPS1, CLKPS0 или нужно еще где-то, что-то править ?У вас в PMCR настройка синхронизации на внутренний RC генератор - 32МГц и вочдог от внутреннего RC - 32 кГц. А в CLKPS, прескаллере процессора, деление частоты на 2. Т.е. частота процессора 16 МГц, как в Ардуино. Все правильно понимаете. Запишите в CLKPS ноль, и частота процессора станет 32 Мгц. Гугл сносно прерводит с китайского.
Вот уже прогресс
А есть какой-нибудь тестовый скетч, чтобы в реале проверить изменения в скорости работы ?
Неактивний
... А есть какой-нибудь тестовый скетч, чтобы в реале проверить изменения в скорости работы ?
Может и есть, но у меня нет. Нужно сравить частоту выполения операций с известным эталоном, напрмер с RC- 32 кГц или вывести сигнал в порт и посмотреть анализатором (толко не через digitalWrite). Лучше всего написать тест на ассемблере с напосредственной записью в порт или управлением измерительным таймером.
Неактивний
#ifndef bit_is_set
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit)) // читаем заданый бит
#endif
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) // присваиваем НОЛЬ
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) // присваиваем ЕДИНИЦУ
#endif
bool BIT;
void setup() {
Serial.begin(57600);
Serial.println(" Test - PMCR: 0x01 default - 0000 0001 ");
BIT = bit_is_set(PMCR, PMCE); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKFS); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKSS); Serial.print(BIT);
// BIT = bit_is_set(PMCR, WCLKS); Serial.print(BIT);
Serial.print("?");
Serial.print(" ");
BIT = bit_is_set(PMCR, OSCKEN); Serial.print(BIT);
// BIT = bit_is_set(PMCR, OSCMEN); Serial.print(BIT);
Serial.print("?");
BIT = bit_is_set(PMCR, RCKEN); Serial.print(BIT);
BIT = bit_is_set(PMCR, RCMEN); Serial.println(BIT);
Serial.println(" Test - CLKPR: 0x03 default - 0000 0011 ");
BIT = bit_is_set(CLKPR, CLKPCE); Serial.print(BIT);
// Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN1); Serial.print(BIT);
Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN0); Serial.print(BIT);
Serial.print("?");
Serial.print("- ");
BIT = bit_is_set(CLKPR, CLKPS3); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS2); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS1); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS0); Serial.println(BIT);
}
void loop() {
sbi(CLKPR, CLKPCE);
cli(); // Disable global interrupts
cbi(CLKPR, CLKPS3);
cbi(CLKPR, CLKPS2);
cbi(CLKPR, CLKPS1);
cbi(CLKPR, CLKPS0);
sei(); // Enable global interrupts
cbi(CLKPR, CLKPCE);
Serial.println(" Test - CLKPR: korrect CLKPS* 0x00 ");
BIT = bit_is_set(CLKPR, CLKPCE); Serial.print(BIT);
// Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN1); Serial.print(BIT);
Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN0); Serial.print(BIT);
Serial.print("?");
Serial.print("- ");
BIT = bit_is_set(CLKPR, CLKPS3); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS2); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS1); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS0); Serial.println(BIT);
delay (99999999);
//=========================================================
}
Test - PMCR: 0x01 default - 0000 0001
000? 0?11
Test - CLKPR: 0x03 default - 0000 0011
0??- 0001
Test - CLKPR: korrect CLKPS* 0x00
0??- 0001
Где-то косячу !!! Но где ???
Управление преселлером системных часов
LGT8FX8P имеет встроенный системный генератор тактовых импульсов, который может управляться регистром предварительного делителя часов (CLKPR).
Эта функция может использоваться для снижения энергопотребления системы, когда система не требует очень высокой вычислительной мощности. Предустановленные параметры для поддержки системы
Источник синхронизации действителен. Предсекатор часов может влиять на часы выполнения ядра и, следовательно, на периферийные устройства синхронизации.
При переключении между различными настройками предварительного делителя часов предварительная шкала системы обеспечивает отсутствие образования волос во время процесса переключения
Thorns, но будет гарантировать, что не будет высокой частоты среднего состояния. Переключение частоты выполняется немедленно, и когда изменение регистра вступает в силу,
До 2 - 3 текущих тактовых циклов системы, системные часы переключаются на новые часы деления.
Чтобы избежать ошибочной работы в регистре делителей тактовых импульсов, модификация CLKPR должна также следовать специальному временному потокуCheng: ● Установите бит разрешения изменения предварительного делителя часов (CLKPCE) на 1, другой бит CLKPR равен 0● Напишите значение CLKPS в течение четырех циклов, а CLKPCE записывается в 0Прежде чем изменять регистр предварительного делителя часов, необходимо отключить функцию прерывания, чтобы гарантировать, что время записи может быть выполнено без изменений.
Обратитесь к разделу «Описание регистра» этого раздела для подробного определения основного регистра часового генератора CLKPR.
Остання редакція renoshnik (2018-07-29 16:27:08)
Неактивний
Возможно не успевает записать по битам. Попробуйте:
_SFR_BYTE(CLKPR) &= ~(_BV(CLKPS0)|_BV(CLKPS1)|_BV(CLKPS2)|_BV(CLKPS3));
Неактивний
Возможно не успевает записать по битам. Попробуйте:
_SFR_BYTE(CLKPR) &= ~(_BV(CLKPS0)|_BV(CLKPS1)|_BV(CLKPS2)|_BV(CLKPS3));
Пробовал разные варианты :
CLKPR = 0b10000000;
/*
cbi(CLKPR, CLKPS3);
cbi(CLKPR, CLKPS2);
cbi(CLKPR, CLKPS1);
cbi(CLKPR, CLKPS0);
*/
CLKPR &= ~(bit(CLKPS0) | bit(CLKPS1) | bit(CLKPS2) | bit(CLKPS3));
Вы правы видимо действительно времени не хватало...
Вот такой код загрузил !!!
#ifndef bit_is_set
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit)) // читаем заданый бит
#endif
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) // присваиваем НОЛЬ
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) // присваиваем ЕДИНИЦУ
#endif
bool BIT;
void setup() {
Serial.begin(57600);
Serial.println(" Test - PMCR: 0x01 default - 0000 0001 ");
BIT = bit_is_set(PMCR, PMCE); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKFS); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKSS); Serial.print(BIT);
// BIT = bit_is_set(PMCR, WCLKS); Serial.print(BIT);
Serial.print("?");
Serial.print(" ");
BIT = bit_is_set(PMCR, OSCKEN); Serial.print(BIT);
// BIT = bit_is_set(PMCR, OSCMEN); Serial.print(BIT);
Serial.print("?");
BIT = bit_is_set(PMCR, RCKEN); Serial.print(BIT);
BIT = bit_is_set(PMCR, RCMEN); Serial.println(BIT);
Serial.println(" Test - CLKPR: 0x03 default - 0000 0011 ");
BIT = bit_is_set(CLKPR, CLKPCE); Serial.print(BIT);
// Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN1); Serial.print(BIT);
Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN0); Serial.print(BIT);
Serial.print("?");
Serial.print("- ");
BIT = bit_is_set(CLKPR, CLKPS3); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS2); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS1); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS0); Serial.println(BIT);
sbi(CLKPR, CLKPCE);
cli(); // Disable global interrupts
CLKPR = 0b10000000;
/*
cbi(CLKPR, CLKPS3);
cbi(CLKPR, CLKPS2);
cbi(CLKPR, CLKPS1);
cbi(CLKPR, CLKPS0);
*/
// CLKPR &= ~(bit(CLKPS0) | bit(CLKPS1) | bit(CLKPS2) | bit(CLKPS3));
// _SFR_BYTE(CLKPR) &= ~(_BV(CLKPS0)|_BV(CLKPS1)|_BV(CLKPS2)|_BV(CLKPS3));
sei(); // Enable global interrupts
cbi(CLKPR, CLKPCE);
}
void loop() {
Serial.println(" Test - CLKPR: korrect CLKPS* 0x00 ");
BIT = bit_is_set(CLKPR, CLKPCE); Serial.print(BIT);
// Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN1); Serial.print(BIT);
Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN0); Serial.print(BIT);
Serial.print("?");
Serial.print("- ");
BIT = bit_is_set(CLKPR, CLKPS3); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS2); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS1); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS0); Serial.println(BIT);
delay (25000);
//=========================================================
}
Получил в терминале :
Test - PMCR: 0x01 default - 0000 0001
0⸮⸮⸮w8⸮⸮⸮
⸮Z⸮⸮⸮8HJ
J⸮⸮z⸮⸮!⸮⸮
⸮g⸮⸮⸮⸮J8H⸮⸮⸮⸮!⸮⸮
⸮g⸮⸮⸮⸮J8H⸮⸮⸮⸮!⸮⸮
⸮g⸮⸮⸮⸮J8H⸮⸮⸮⸮!⸮⸮
⸮g⸮⸮⸮⸮J8H⸮⸮⸮
Потом изменил скорость в терминале (в скетче НЕ менял) на 115200
Если вставить :
sbi(CLKPR, CLKPCE);
cli(); // Disable global interrupts
CLKPR = 0b10000000;
/*
cbi(CLKPR, CLKPS3);
cbi(CLKPR, CLKPS2);
cbi(CLKPR, CLKPS1);
cbi(CLKPR, CLKPS0);
*/
// CLKPR &= ~(bit(CLKPS0) | bit(CLKPS1) | bit(CLKPS2) | bit(CLKPS3));
// _SFR_BYTE(CLKPR) &= ~(_BV(CLKPS0)|_BV(CLKPS1)|_BV(CLKPS2)|_BV(CLKPS3));
sei(); // Enable global interrupts
cbi(CLKPR, CLKPCE);
в стандартный "блинк" соответственно СД мигает вдвое чаще
Неактивний
... Вы правы видимо действительно времени не хватало...
Не за что. У вас в цитате это синим написано.
Неактивний
Сделал тест :
#include <avr/boot.h>
#include <Wire.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) // присваиваем НОЛЬ
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) // присваиваем ЕДИНИЦУ
#endif
void setup()
{
// The system led is present on most Arduino boards.
pinMode(13,OUTPUT);
Serial.begin(57600);
#if defined (__AVR_ATmega32U4__)
while(!Serial); // For Leonardo, wait for serial port
#endif
// **************************************************************
// **************************************************************
sbi(CLKPR, CLKPCE);
cli(); // Disable global interrupts
CLKPR = 0b10000000;
CLKPR &= ~(bit(CLKPS0) | bit(CLKPS1) | bit(CLKPS2) | bit(CLKPS3));
sei(); // Enable global interrupts
cbi(CLKPR, CLKPCE);
// **************************************************************
// **************************************************************
Serial.println(F("Arduino ShowInfo"));
Serial.println(F("Show what the Arduino has to tell you."));
SpeedTest();
}
void loop() { }
void SpeedTest(void)
{
register int i,j;
volatile unsigned char c1,c2;
volatile int v;
volatile long l1,l2;
volatile float f1,f2;
int p,q,r;
unsigned long m,n;
float d, overhead;
char buffer[30];
Serial.println(F(""));
Serial.println(F("Speed test"));
Serial.println(F("----------"));
Serial.print(F("F_CPU = "));
Serial.print(F_CPU,DEC);
Serial.println(F(" Hz"));
Serial.print(F("1/F_CPU = "));
Serial.print((1000000.0/(float)F_CPU),4);
Serial.println(F(" us"));
#if !defined (__AVR_ATmega32U4__)
Serial.println(F("The next tests are runtime compensated for overhead"));
Serial.println(F("Interrupts are still enabled, because millis() is used for timing"));
#endif
delay(800); // Allow the Serial text to be transmitted
Serial.print(F(" nop : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<100; i++)
{
for (j=0; j<10000; j++)
{
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0; // in micro seconds
// Calculate overhead with 'nop' instruction per loop in microseconds
overhead = d - (20.0 * (1000000.0/(float)F_CPU));
d -= overhead;
d /= 20.0; // per instruction
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" avr gcc I/O : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<50; i++)
{
for (j=0; j<10000; j++)
{
// Use system led
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
PORTB |= _BV(PORTB5);
PORTB &= ~_BV(PORTB5);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" Arduino digitalRead : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<2; i++)
{
for (j=0; j<10000; j++)
{
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
digitalRead(13);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" Arduino digitalWrite : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<2; i++)
{
for (j=0; j<10000; j++)
{
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
digitalWrite(13, HIGH);
digitalWrite(13, LOW);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" pinMode : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<2; i++)
{
for (j=0; j<10000; j++)
{
pinMode(13, INPUT);
pinMode(13, OUTPUT);
pinMode(13, INPUT);
pinMode(13, OUTPUT);
pinMode(13, INPUT);
pinMode(13, OUTPUT);
pinMode(13, INPUT);
pinMode(13, OUTPUT);
pinMode(13, INPUT);
pinMode(13, OUTPUT);
pinMode(13, INPUT);
pinMode(13, OUTPUT);
pinMode(13, INPUT);
pinMode(13, OUTPUT);
pinMode(13, INPUT);
pinMode(13, OUTPUT);
pinMode(13, INPUT);
pinMode(13, OUTPUT);
pinMode(13, INPUT);
pinMode(13, OUTPUT);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" multiply byte : "));
c1 = 2;
c2 = 3;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<20; i++)
{
for (j=0; j<10000; j++)
{
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
c1 *= c2;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" divide byte : "));
c1 = 253;
c2 = 3;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<2; i++)
{
for (j=0; j<10000; j++)
{
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
c1 /= c2;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" add byte : "));
c1 = 1;
c2 = 2;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<20; i++)
{
for (j=0; j<10000; j++)
{
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
c1 += c2;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" multiply integer : "));
volatile int x,y;
x = 2;
y = 3;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<10; i++)
{
for (j=0; j<10000; j++)
{
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
x *= y;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" divide integer : "));
x = 31415;
y = 3;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<10000; j++)
{
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
x /= y;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" add integer : "));
x = 1;
y = 3;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<10; i++)
{
for (j=0; j<10000; j++)
{
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
x += y;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" multiply long : "));
l1 = 2;
l2 = 3;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<2; i++)
{
for (j=0; j<10000; j++)
{
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
l1 *= l2;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" divide long : "));
l1 = 2000000000L;
l2 = 3;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<2000; j++)
{
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
l1 /= l2;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" add long : "));
l1 = 500000000L;
l2 = 123;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<4; i++)
{
for (j=0; j<10000; j++)
{
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
l1 += l2;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" multiply float : "));
f1 = 3.24;
f2 = 1.25;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<2; i++)
{
for (j=0; j<10000; j++)
{
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
f1 *= f2;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" divide float : "));
f1 = 312645.24;
f2 = 1.21;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<2000; j++)
{
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
f1 /= f2;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" add float : "));
f1 = 9876.54;
f2 = 1.23;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<10000; j++)
{
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
f1 += f2;
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" itoa() : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<10000; j++)
{
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
itoa(i,buffer,10);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
long int l = 314159L;
Serial.print(F(" ltoa() : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<500; j++)
{
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
ltoa(l,buffer,10);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" dtostrf() : "));
float d3;
d3 = 3.14159265;
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<2; i++)
{
for (j=0; j<1000; j++)
{
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
dtostrf (d3, 6, 2, buffer);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" random() : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<2; i++)
{
for (j=0; j<1000; j++)
{
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
r=random();
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" y |= (1<<x) : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<20; i++)
{
for (j=0; j<10000; j++)
{
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
v |= _BV(12);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" bitSet() : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<20; i++)
{
for (j=0; j<10000; j++)
{
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
bitSet (v, 12);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
// #define ENABLE_ANALOGREFERENCE_TIMING
#ifdef ENABLE_ANALOGREFERENCE_TIMING
Serial.print(F(" analogReference() : "));
#if defined (__AVR_ATmega1280__) || defined (__AVR_ATmega2560__)
#define _NOT_DEFAULT_ INTERNAL1V1
#else
#define _NOT_DEFAULT_ INTERNAL
#endif
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<20; i++)
{
for (j=0; j<10000; j++)
{
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
analogReference (_NOT_DEFAULT_);
analogReference (DEFAULT);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
#endif
Serial.print(F(" analogRead() : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<1000; j++)
{
analogRead (0);
analogRead (1);
analogRead (0);
analogRead (1);
analogRead (0);
analogRead (1);
analogRead (0);
analogRead (1);
analogRead (0);
analogRead (1);
analogRead (0);
analogRead (1);
analogRead (0);
analogRead (1);
analogRead (0);
analogRead (1);
analogRead (0);
analogRead (1);
analogRead (0);
analogRead (1);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" analogWrite() PWM : "));
// Using pin 13 (system led) for output.
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<10000; j++)
{
analogWrite (13, 100);
analogWrite (13, 200);
analogWrite (13, 100);
analogWrite (13, 200);
analogWrite (13, 100);
analogWrite (13, 200);
analogWrite (13, 100);
analogWrite (13, 200);
analogWrite (13, 100);
analogWrite (13, 200);
analogWrite (13, 100);
analogWrite (13, 200);
analogWrite (13, 100);
analogWrite (13, 200);
analogWrite (13, 100);
analogWrite (13, 200);
analogWrite (13, 100);
analogWrite (13, 200);
analogWrite (13, 100);
analogWrite (13, 200);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" delay(1) : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<100; j++)
{
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
delay(1);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" delay(100) : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<2; j++)
{
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
delay(100);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" delayMicroseconds(2) : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<20; i++)
{
for (j=0; j<10000; j++)
{
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
delayMicroseconds(2);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" delayMicroseconds(5) : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<5; i++)
{
for (j=0; j<10000; j++)
{
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
delayMicroseconds(5);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.print(F(" delayMicroseconds(100) : "));
delay(70); // Allow the Serial text to be transmitted
m=millis();
for (i=0; i<1; i++)
{
for (j=0; j<1000; j++)
{
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
delayMicroseconds(100);
}
}
n=millis();
d = ((float)n - (float)m) / ((float)i * (float)j);
d *= 1000.0;
d -= overhead;
d /= 20.0;
Serial.print (d,3);
Serial.println (F(" us"));
Serial.println(F("-----------"));
}
но в обоих случаях результат одинаковый
Arduino ShowInfo
Show what the Arduino has to tell you.
Speed test
----------
F_CPU = 16000000 Hz
1/F_CPU = 0.0625 us
The next tests are runtime compensated for overhead
Interrupts are still enabled, because millis() is used for timing
nop : 0.063 us
avr gcc I/O : 0.063 us
Arduino digitalRead : 3.015 us
Arduino digitalWrite : 3.708 us
pinMode : 4.335 us
multiply byte : 0.376 us
divide byte : 4.900 us
add byte : 0.376 us
multiply integer : 0.816 us
divide integer : 13.315 us
add integer : 0.506 us
multiply long : 3.703 us
divide long : 37.315 us
add long : 1.007 us
multiply float : 4.968 us
divide float : 72.040 us
add float : 7.530 us
itoa() : 12.620 us
ltoa() : 124.290 us
dtostrf() : 70.090 us
random() : 46.390 us
y |= (1<<x) : 0.314 us
bitSet() : 0.314 us
analogRead() : 335.990 us
analogWrite() PWM : 10.545 us
delay(1) : 1006.490 us
delay(100) : 99999.984 us
delayMicroseconds(2) : 1.384 us
delayMicroseconds(5) : 3.643 us
delayMicroseconds(100) : 75.240 us
-----------
Неактивний
Сделал тест : ... но в обоих случаях результат одинаковый ... , because millis() is used for timing
Функции millis, delay и delayMicroseconds, в Ардуино, зависят от частоты тактирования процессора, т.е. базируются на ней. Системное время то в два раза быстрее стало. Естественно, что у вас ничего не вышло. Ваш эксперимент с блинком куда коректнее. Я же писал, что для замера MIPS, в Ардуино, нужен заранее известный, незавивимый от частоты синхронизации системы, эталон времени, и это не должен быть millis. Бывает.
Остання редакція Вячеслав Азаров (2018-07-30 08:07:48)
Неактивний
renoshnik пише:Сделал тест : ... но в обоих случаях результат одинаковый ... , because millis() is used for timing
Функции millis, delay и delayMicroseconds, в Ардуино, зависят от частоты тактирования процессора, т.е. базируются на ней. Системное время то в два раза быстрее стало. Естественно, что у вас ничего не вышло. Ваш эксперимент с блинком куда коректнее. Я же писал, что для замера MIPS, в Ардуино, нужен заранее известный, незавивимый от частоты синхронизации системы, эталон времени, и это не должен быть millis. Бывает.
Тоже про это подумал но позже... Просто утром тестировал, видимо не проснулся...
Неактивний
Ещё раз. Вывод в сериал на какой скорости?
в скетче 57600 установлено.
но в терминале нужно ставить 115200 ...
http://forum.arduino.ua/viewtopic.php?pid=26359#p26359
Остання редакція renoshnik (2018-07-30 09:38:50)
Неактивний
Вы попробуйте управление без их регистровых констант, по адресам из даташита. Или попроверяйте их определение. У нас, еще на заре AVR, была проблема из-за ошибки в фирменных заголовочных файлах констант.
Немного запутался...
Помогите, как прочитать / записать бит из/в известный адрес ???
В мануале указано, что PMCR: 0xF2
Хочу настроить плату на внешний кварц, а константа OSCMEN не определяется...
#ifndef bit_is_set
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit)) // читаем заданый бит
#endif
bool BIT;
void setup() {
Serial.begin(57600);
Serial.println(" Test - PMCR: 0x01 default - 0000 0001 ");
BIT = bit_is_set(PMCR, PMCE); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKFS); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKSS); Serial.print(BIT);
// BIT = bit_is_set(PMCR, WCLKS); Serial.print(BIT);
Serial.print("?");
Serial.print(" ");
BIT = bit_is_set(PMCR, OSCKEN); Serial.print(BIT);
// BIT = bit_is_set(PMCR, OSCMEN); Serial.print(BIT);
Serial.print("?");
BIT = bit_is_set(PMCR, RCKEN); Serial.print(BIT);
BIT = bit_is_set(PMCR, RCMEN); Serial.println(BIT);
Serial.println(" Test - CLKPR: 0x03 default - 0000 0011 ");
BIT = bit_is_set(CLKPR, CLKPCE); Serial.print(BIT);
// Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN1); Serial.print(BIT);
Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN0); Serial.print(BIT);
Serial.print("?");
Serial.print("- ");
BIT = bit_is_set(CLKPR, CLKPS3); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS2); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS1); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS0); Serial.println(BIT);
PMCR |= (bit(PMCE));
PMCR &= ~(bit(RCMEN));
PMCR |= (bit(OSCMEN) | bit(OSCMEN) | bit(OSCMEN) | bit(OSCMEN) | bit(OSCMEN) | bit(OSCMEN));
nop(); nop();
PMCR |= (bit(PMCE));
PMCR &= ~(bit(CLKFS)); PMCR |= (bit(CLKSS)); PMCR &= ~(bit(CLKFS)); PMCR |= (bit(CLKSS));
PMCR &= ~(bit(CLKFS)); PMCR |= (bit(CLKSS)); PMCR &= ~(bit(CLKFS)); PMCR |= (bit(CLKSS));
PMCR &= ~(bit(CLKFS)); PMCR |= (bit(CLKSS)); PMCR &= ~(bit(CLKFS)); PMCR |= (bit(CLKSS));
nop(); nop(); nop(); nop();
CLKPR |= (bit(CLKPCE));
cli(); // Disable global interrupts
// CLKPR = 0b10000000;
CLKPR &= ~(bit(CLKPS0) | bit(CLKPS1) | bit(CLKPS2) | bit(CLKPS3)); // прескаллер равен 1
// _SFR_BYTE(CLKPR) &= ~(_BV(CLKPS0)|_BV(CLKPS1)|_BV(CLKPS2)|_BV(CLKPS3));
sei(); // Enable global interrupts
CLKPR &= ~(bit(CLKPCE));
Serial.println(" Test_2 - PMCR: korrect OSCKEN* 0x01 ");
BIT = bit_is_set(PMCR, PMCE); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKFS); Serial.print(BIT);
BIT = bit_is_set(PMCR, CLKSS); Serial.print(BIT);
// BIT = bit_is_set(PMCR, WCLKS); Serial.print(BIT);
Serial.print("?");
Serial.print(" ");
BIT = bit_is_set(PMCR, OSCKEN); Serial.print(BIT);
// BIT = bit_is_set(PMCR, OSCMEN); Serial.print(BIT);
Serial.print("?");
BIT = bit_is_set(PMCR, RCKEN); Serial.print(BIT);
BIT = bit_is_set(PMCR, RCMEN); Serial.println(BIT);
Serial.println(" Test_2 - CLKPR: korrect CLKPS* 0x00 ");
BIT = bit_is_set(CLKPR, CLKPCE); Serial.print(BIT);
// Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN1); Serial.print(BIT);
Serial.print("?");
// BIT = bit_is_set(CLKPR, CLKOEN0); Serial.print(BIT);
Serial.print("?");
Serial.print("- ");
BIT = bit_is_set(CLKPR, CLKPS3); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS2); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS1); Serial.print(BIT);
BIT = bit_is_set(CLKPR, CLKPS0); Serial.println(BIT);
}
void loop() {
delay (5000);
//=========================================================
}
Остання редакція renoshnik (2018-08-02 12:59:58)
Неактивний