Там нужно по Х Все разнеры подгонять. Блин долго это.
подогнал размеры всех надписей =)пока только с осликом разобрался, при входе в ддс или шим у меня почемуто сначало загорается как надо а потом тупо экран белым становится
Р.s нашел проблему почему экран становился белым))) выход ДДС генератора сидел на пине ресета экрана=) поменял пион заработало
Долго думал над тем, как ускорить скорость отрисовки на моем дисплее 240х320 ili9340, заглянул в библиотеку, оказалось функция drawLine() рисует линию отдельными пиксилями, решил написать свою фукцию которая рисует график вертикальными и горизонтальными линиями, назвал ее просто Line()
void Adafruit_ILI9340::Line(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
uint16_t color) {
bool vektor = abs(x0 - x1) > abs (y0 - y1);
if (vektor) {
if (y1 > y0) {
int h = x1 - x0 + 1;
int d = y1 - y0 + 1;
h = h / d;
for (; y0 <= y1; y0++) {
drawFastHLine(x0, y0, h, color);
x0 = x0 + h;
}
}
else {
int h = x1 - x0 + 1;
int d = y0 - y1 + 1;
h = h / d;
for (; y0 >= y1; y0--) {
drawFastHLine(x0, y0, h, color);
x0 = x0 + h;
}
}
}
else {
if (y1 > y0) {
int h = y1 - y0 + 1;
int d = x1 - x0 + 1;
h = h / d;
for (; x1 >= x0; x0++) {
drawFastVLine(x0, y0, h, color);
y0 = y0 + h;
}
}
else {
int h = y0 - y1 + 1;
int d = x1 - x0 + 1;
h = h / d;
for (; x1 >= x0; x1--) {
drawFastVLine(x1, y1, h, color);
y1 = y1 + h;
}
}
}
}
результат превзошол мои ожидания, скорость отрисовки увеличилась в несколько раз) вот видео для сравнения
такс.... в общем допилил еще шим под размеры 1.44 есть небольшие огрехи кое где накладывается снизу где скобки но это пять сек поправить в остальном работает, думаю на сегодня все=))) завтра ддс генератором займусь))
переделал формулу теперь линии нормально отображаются, вопрос к 240265 не подскажете где вы поменяли шим чтобы после 98 сразу100 не показывало никак не соображу
У меня тоже часики на таком. Экранчик нравится, но убивают массштабируемые шрифты. Например, "22 56" могло бы смотреться гораздо красивее, еслиб шриф не получался масштабированием из самого мелкого. Но это вроде лечится. Видел где-то материал по установке других шрифтов. А так...экранчик хороший, и разрешение приятное 128х128
сижу тут кручу верчу и никак не пойму почему так происходит... ДДС генератор работает непонятно либо осцилограф непонятно работает причем 2 ослика...и еще не правильно показывает частоту ШИМ, вот фотки, может кто подскажет
сижу тут кручу верчу и никак не пойму почему так происходит... ДДС генератор работает непонятно либо осцилограф непонятно работает причем 2 ослика...и еще не правильно показывает частоту ШИМ, вот фотки, может кто подскажет
сижу тут кручу верчу и никак не пойму почему так происходит... ДДС генератор работает непонятно либо осцилограф непонятно работает причем 2 ослика...и еще не правильно показывает частоту ШИМ, вот фотки, может кто подскажет
Все правилоно.
Где ваш RC-фильтр?
Он из отчсетом ШИМ формует сигнал.
точно)))) увлекся что забыл про него, спасибо)))))
переделал формулу теперь линии нормально отображаются, вопрос к 240265 не подскажете где вы поменяли шим чтобы после 98 сразу100 не показывало никак не соображу
поробовал скетч для OLED от D.I.M. (взял на страничке автора) скрестить со скетчемGhost_d (уж больно хороша идея выхода в основное меню по нажатию кнопки "ОК").
но увы - места в памяти не хватает (уже и режим терминала отключил).
пишет "Global variables use 2 334 bytes (113%) of dynamic memory, leaving -286 bytes for local variables. Maximum is 2 048 bytes."
поробовал скетч для OLED от D.I.M. (взял на страничке автора) скрестить со скетчемGhost_d (уж больно хороша идея выхода в основное меню по нажатию кнопки "ОК").
но увы - места в памяти не хватает (уже и режим терминала отключил).
пишет "Global variables use 2 334 bytes (113%) of dynamic memory, leaving -286 bytes for local variables. Maximum is 2 048 bytes."
Подкажите пожалуйста,ч его ещё выкинуть можно?
Оперативки не хватает.
массив в который сохраняет АЦП уменьшите и будет память.
вот и мой вклад в развитие=))) вроде все что можно поправил кроме нижнего меню на больших частотах перекрещиваются буквы( пока оставил так... и еще если сравнивать с ls020 пультоскопом то на 1.44 работает медленнее отрисовка ((
PULTOSCOPE_128x64_OLED_block.ino:38:21: error: variable 'sinM' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
Переделал Скетч от LS020 под Доступный экран 1.8 TFT 160x128 SPI St7735.
Есть небольшие лажи . А так вроде работает.
Не пойму какфото загрузть
Вот
К стати линии сделал тонкие в 1 пиксель.
Экран еще с пленкой.
К стати линии сделал тонкие в 1 пиксель.
Экран еще с пленкой.
Это какая версия кода?подскажу.
Не помню с какого поста, не последняя точно, кажется предпоследняя.
1-1Лажа то что график на развертке до 7 не до конца экрана , на предыдущем фото видно. росле 7 все нормально.
2- лажа в генераторе после 78 % ШИМ полоса.
Не помню с какого поста, не последняя точно, кажется предпоследняя.
1-1Лажа то что график на развертке до 7 не до конца экрана , на предыдущем фото видно. росле 7 все нормально.
2- лажа в генераторе после 78 % ШИМ полоса.
Это не лажа, а просто человек который под этот дисплей подправялял, пару мест не доглядел с размерами.
____
как я вам подскажу по толщине линии если не знаю что за скетч,
выложите тогда просто что заливали.
Ну еще в планах перевести напряжение в V/дел и развертку в mS/дел.
Времени мало.
Переделывал Я .Толщину линий специально сделал в 1 пиксель.
К стати линии сделал тонкие в 1 пиксель.
Экран еще с пленкой.
Извините, проглядел что вы уже разобрались с линиями.
добавил новые дефайны для цвета в скетч 240265 и поставил свою библиотеку для 1.44 дисплея 128х128, пока как то так=)))
Вот и мой пультоскоп.
XUMUK
Там нужно по Х Все разнеры подгонять. Блин долго это.
XUMUK
Там нужно по Х Все разнеры подгонять. Блин долго это.
подогнал размеры всех надписей =)пока только с осликом разобрался, при входе в ддс или шим у меня почемуто сначало загорается как надо а потом тупо экран белым становится
Р.s нашел проблему почему экран становился белым))) выход ДДС генератора сидел на пине ресета экрана=) поменял пион заработало
Долго думал над тем, как ускорить скорость отрисовки на моем дисплее 240х320 ili9340, заглянул в библиотеку, оказалось функция drawLine() рисует линию отдельными пиксилями, решил написать свою фукцию которая рисует график вертикальными и горизонтальными линиями, назвал ее просто Line()
void Adafruit_ILI9340::Line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) { bool vektor = abs(x0 - x1) > abs (y0 - y1); if (vektor) { if (y1 > y0) { int h = x1 - x0 + 1; int d = y1 - y0 + 1; h = h / d; for (; y0 <= y1; y0++) { drawFastHLine(x0, y0, h, color); x0 = x0 + h; } } else { int h = x1 - x0 + 1; int d = y0 - y1 + 1; h = h / d; for (; y0 >= y1; y0--) { drawFastHLine(x0, y0, h, color); x0 = x0 + h; } } } else { if (y1 > y0) { int h = y1 - y0 + 1; int d = x1 - x0 + 1; h = h / d; for (; x1 >= x0; x0++) { drawFastVLine(x0, y0, h, color); y0 = y0 + h; } } else { int h = y0 - y1 + 1; int d = x1 - x0 + 1; h = h / d; for (; x1 >= x0; x1--) { drawFastVLine(x1, y1, h, color); y1 = y1 + h; } } } }результат превзошол мои ожидания, скорость отрисовки увеличилась в несколько раз) вот видео для сравнения
как было
https://youtu.be/iH_5VHrkASo
как стало
https://youtu.be/uHQI2PCLY5g
Alex_Mirko, реально шустрее стало
============
коллеги, киньте пожалуйста, в меня скетчем под такой дисплей - хочу начать мучать АЦП =)
Alex_Mirko, реально шустрее стало
============
коллеги, киньте пожалуйста, в меня скетчем под такой дисплей - хочу начать мучать АЦП =)
вроде внизу на странице автора про пультоскоп была ссылка
такс.... в общем допилил еще шим под размеры 1.44 есть небольшие огрехи кое где накладывается снизу где скобки но это пять сек поправить в остальном работает, думаю на сегодня все=))) завтра ддс генератором займусь))
Xumuk, так ты по горизонтали разверни, может и вместится шкала ШИМа.
Xumuk, так ты по горизонтали разверни, может и вместится шкала ШИМа.
Дисплей квадратный смысла разворачивать нет)
Формулу просто под свой дисплей подкрути вот и все.
эту
Формулу просто под свой дисплей подкрути вот и все.
эту
ОК спасибо завтра попробую
XUMUK догни ШИМ до 100 и обратно , перестает 99% показывать , после 98 сразу 100.
Вот и мой пультоскоп
.
Классно получилось!
Создам галерею пультоскопов в корпусах .
Поправил шкалу ШИМ для 160х128
добавил новые дефайны для цвета в скетч 240265 и поставил свою библиотеку для 1.44 дисплея 128х128, пока как то так=)))
У меня на таком экране часики
переделал формулу теперь линии нормально отображаются, вопрос к 240265 не подскажете где вы поменяли шим чтобы после 98 сразу100 не показывало никак не соображу
У меня на таком экране часики
сижу тут кручу верчу и никак не пойму почему так происходит... ДДС генератор работает непонятно либо осцилограф непонятно работает причем 2 ослика...и еще не правильно показывает частоту ШИМ, вот фотки, может кто подскажет
сижу тут кручу верчу и никак не пойму почему так происходит... ДДС генератор работает непонятно либо осцилограф непонятно работает причем 2 ослика...и еще не правильно показывает частоту ШИМ, вот фотки, может кто подскажет
Все правилоно.
Где ваш RC-фильтр?
Он из отчсетом ШИМ формует сигнал.
сижу тут кручу верчу и никак не пойму почему так происходит... ДДС генератор работает непонятно либо осцилограф непонятно работает причем 2 ослика...и еще не правильно показывает частоту ШИМ, вот фотки, может кто подскажет
Все правилоно.
Где ваш RC-фильтр?
Он из отчсетом ШИМ формует сигнал.
точно)))) увлекся что забыл про него, спасибо)))))
переделал формулу теперь линии нормально отображаются, вопрос к 240265 не подскажете где вы поменяли шим чтобы после 98 сразу100 не показывало никак не соображу
Пока 100% не победил . Победил линию.
Пока 100% не победил . Победил линию.
У меня выводит значение эта строка,
display.print(PWM*100.0/255);
вывожу с двумя знаками после запятой.
Напишите сюда какая строка у вас выводит на дисплей, подмогну.
Разобрался с ШИМ.
Слишком быстрый инкремент и декремент ШИМ. аж на 3 единицы.
if(digitalRead(pravo)==HIGH){
PWM=PWM+3;
if(digitalRead(levo)==HIGH){
PWM=PWM-3;
После перехода через 100% значение 98% с десятичными и он округляет вниз.
выяснил когда вывел с двумя знаками после запятой.
Спасибо bodriy2014
Нужно сделать +2 и -2
Подправить в 2-х местах
поробовал скетч для OLED от D.I.M. (взял на страничке автора) скрестить со скетчем Ghost_d (уж больно хороша идея выхода в основное меню по нажатию кнопки "ОК").
но увы - места в памяти не хватает (уже и режим терминала отключил).
пишет "Global variables use 2 334 bytes (113%) of dynamic memory, leaving -286 bytes for local variables. Maximum is 2 048 bytes."
Подкажите пожалуйста,ч его ещё выкинуть можно?
поробовал скетч для OLED от D.I.M. (взял на страничке автора) скрестить со скетчем Ghost_d (уж больно хороша идея выхода в основное меню по нажатию кнопки "ОК").
но увы - места в памяти не хватает (уже и режим терминала отключил).
пишет "Global variables use 2 334 bytes (113%) of dynamic memory, leaving -286 bytes for local variables. Maximum is 2 048 bytes."
Подкажите пожалуйста,ч его ещё выкинуть можно?
Оперативки не хватает.
массив в который сохраняет АЦП уменьшите и будет память.
Или удалите одну из пил в ДДС ведь там их две.
не, удалял целиком DDS - не помогает(всего 3% добавилось).
думаю что-то с массивами таблиц. видимо куча библиотек занимает много места
#include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <FreqCount.h> #include <PWM.h> #include <SPI.h> #include <Wire.h> #include <CyberLib.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); byte menu=0;//переменная выбора меню bool opornoe=1; //флаг опорного напряжения bool paus=0; //флаг режима паузы long countX=0; float VCC=5.0; //напряжение питания, меряем мультиметром #define overclock 16 //Частота на которой работает Ардуино byte SinU=30; //уровень синхронизации 0 до 255 byte razv=6; byte mass[701]; byte sinhMASS=0; int prokr=0; int Vmax=0;// максимальное напряжение long countX=0; byte x=0; unsigned long count =0; byte hag=0; int mnog=0; boolean flag=0; byte PWM = 128;//стартовое значение ШИМ от 0 до 255 int32_t frequency = 500; //стартовое значение частоты в Гц #define led 9 //пин для генератора сигналов (не менять) #define dds 10 //пин для генератора dds (не менять) byte menuDDS=0; //масивы таблиц перенес во флеш const byte PROGMEM sinM[32]={1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1}; const byte PROGMEM pilaM[32]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255}; const byte PROGMEM RpilaM[32]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1}; const byte PROGMEM trianglM[32]={1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1}; int d=0; long speedTTL=9600; //скорость терминала //внутренние определения состояний FSM обработки кнопок //статус НИЧЕГО #define bs_none 0 //статус АНТИДРЕБЕЗГ #define bs_deBounce 1 //Статус УДЕРЖАНИЕ #define bs_hold 2 // флаги, которые нужно ловить в основной программе //значение флага НИЧЕГО #define bf_none 0 //значение флага КОРТКОЕ НАЖАТИЕ #define bf_short 1 //значение флага ДЛИННОЕ НАЖАТИЕ #define bf_long 2 //временные задержки (в мс) //дл€ антидребезга #define deBounceTime 40 //длительное удержание (секунда) #define longTime 1000 // пины подключения кнопок #define b_ok_pin 12 #define b_inc_pin 13 #define b_dec_pin 11 byte buttonState=0; //внутренняя переменная обработчика клавиш byte curButton=0; //текущая нажатая кнопка long timerButton=0; //время, нажатия текущей кнопки byte pressBut=0; byte buttonFlag=0; // название кнопок #define ok_press 1 #define inc_press 2 #define dec_press 3 //========= //именовынные режимы работы прибора для FSM #define Main_menu 0 #define Oscil 1 #define Gen_meandr 2 #define DDS_Gen 3 byte cur_FSM_state = 0; //---------------- start ReadKey ---------------- // Функция возвращает номер нажатой клавиши byte ReadKey() //функция считывает нажатие кнопки { if (digitalRead(b_ok_pin)) return ok_press; if (digitalRead(b_inc_pin)) return inc_press; if (digitalRead(b_dec_pin)) return dec_press; return 0; } //---------------- end ReadKey ---------------- //------------------------ // Start checkButton //------------------------ void checkButton() { switch (buttonState) { //----------------------------------------- case (bs_none): //если ничего не нажато curButton=ReadKey(); //считываем номер нажатой кнопки if (curButton!=0) //≈сли кнопка нажата (т.е., значение <>0) { buttonState=bs_deBounce; //следующий статус антидребезг timerButton=millis(); //запоминаем врем€ } break; //------------------------------------------ case (bs_deBounce): //антидребезг if ((ReadKey()==curButton))//если кнопка все еще нажата { if (millis()-timerButton>deBounceTime) //если прошло достаточно времени дл€ обработки антидребезга { buttonState=bs_hold; //ставим статус удержание timerButton=millis(); //опять запоминаем время pressBut=curButton; //устанавливаем значение нажатой кнопки buttonFlag=bf_short; //флаг сработки ставим ќ–ќ“ ќ≈ нажатие и пока еще удержание } } else { buttonState=bs_none; //а если кнопка уже не нажата или нажата друга€ ставим статус Ќ»„≈√ќ } break; //------------------------------------------ case (bs_hold): //Удержание if ((ReadKey()==curButton)) //если кнопка все еще нажата { if (millis()-timerButton>longTime)//если кнопка удерживаетс€ более времени дл€ длительного нажати€ { buttonFlag=bf_long; //флаг сработки = ƒЋ»“≈Ћ№Ќќ≈ нажатие } } else { buttonState=bs_none; //а если кнопка уже не нажата или нажата друга€ ставим статус Ќ»„≈√ќ } break; //------------------------------------------ } //end switch } //end checkButton //------------------------ // указываем количество пунктов меню -1 #define MAX_menu 2 //названия пунктов меню char *main_menu1="Пультоскоп"; char *main_menu2="Генератор"; char *main_menu3="DDSгенератор"; // Основное меню прибора char *main_menu[]={main_menu1, main_menu2, main_menu3}; byte cur_menu_item=0; //==================== //вывод стартового меню с выделением текущего пункта void print_menu() { display.clearDisplay(); for(byte i=0;i<=MAX_menu;i++) { display.setCursor(10,(i*10)); if (i==cur_menu_item) { display.setTextColor(WHITE, BLACK); // 'inverted' text } else display.setTextColor(BLACK); display.println(main_menu[i]); } display.display(); } //==================== void start_menu() { if ((pressBut == inc_press)&&(buttonFlag == bf_short)) { cur_menu_item++; if (cur_menu_item>MAX_menu) { cur_menu_item = 0; } buttonFlag=bf_none; print_menu(); } if ((pressBut == dec_press)&&(buttonFlag == bf_short)) { cur_menu_item--; if ((cur_menu_item<0) || (cur_menu_item>MAX_menu)) { cur_menu_item = MAX_menu; } buttonFlag=bf_none; print_menu(); } if ((pressBut == ok_press)&&(buttonFlag == bf_short)) { if (cur_menu_item ==0) //если выбран режим осцилограф инициализируем какой-то счетчик { FreqCount.begin(1000); } if (cur_menu_item ==1) // для генератора меандра { InitTimersSafe(); bool success = SetPinFrequencySafe(led, frequency); } if (cur_menu_item ==2) //для DDS генератора { InitTimersSafe(); bool success = SetPinFrequencySafe(led,200000); } buttonFlag=bf_none; cur_FSM_state=cur_menu_item+1; //следующее состояние в которое будет переход () } } //end main menu //======================== void setup() { pinMode(b_ok_pin, INPUT); pinMode(b_inc_pin, INPUT); pinMode(b_dec_pin, INPUT); display.begin(); } //==== End setup block ========== void loop() { checkButton(); //опрашиваем кнопки if ((pressBut == ok_press)&&(buttonFlag == bf_long)) //длительное удержание ОК - возврат в главное меню { cur_FSM_state=Main_menu; buttonFlag=bf_none; } switch (cur_FSM_state) //а тут ветвимся согласно указанной задаче { case (Main_menu): print_menu(); start_menu(); break; case(Oscil): Oscilloscope(); break; case(Gen_meandr): Generator(); break; case(DDS_Gen): DDSGenerator(); break; }//end switch }//end loop //============================================ //==================== //процедура заполнения буфера считанными значениями void Zamer(){ if (razv>=6){ADCSRA = 0b11100010;}//delitel 4 if (razv==5){ADCSRA = 0b11100011;}//delitel 8 if (razv==4){ADCSRA = 0b11100100;}//delitel 16 if (razv==3){ADCSRA = 0b11100101;}//delitel 32 if (razv==2){ADCSRA = 0b11100110;}//delitel 64 if (razv<2){ADCSRA = 0b11100111;}//delitel 128 if (razv==0){ for(int i=0;i<700;i++){ while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; delayMicroseconds(500); mass[i]=ADCH; } } if (razv>0){ for(int i=0;i<700;i++){ while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; mass[i]=ADCH; } } } //======================== //======================== void Oscilloscope() { if(opornoe==0){ADMUX = 0b11100011;}//выбор внутреннего опорного 1,1В if(opornoe==1){ADMUX = 0b01100011;}//Выбор внешнего опорного delay(5); if(paus==0){Zamer();} //#######################################определение точки синхронизации bool flagSINHRO=0; bool flagSINHRnull=0; for(int y=1;y<255;y++){ if(flagSINHRO==0){if(mass[y]<SinU){flagSINHRnull=1;}} if(flagSINHRO==0){if(flagSINHRnull==1){if(mass[y]>SinU){flagSINHRO=1;sinhMASS=y;}}}} //#######################################определение точки синхронизации //максимальное значение сигнала########################## Vmax=0; for(int y=1;y<255;y++){if(Vmax<mass[y]){Vmax=mass[y];} } //максимальное значение сигнала########################## //#######################################определение точки синхронизации //#######################################отрисовка графика if(paus==0){ display.clearDisplay(); display.fillCircle(80,47-SinU/7, 2, BLACK);//рисуем уровень синхронизации x=3; for(int y=sinhMASS;y<sinhMASS+80;y++){ if(razv<7){x++;} if(razv==7){x=x+2;} if(razv==8){x=x+3;} display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK); display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK); } sinhMASS=0;} if(paus==1){ display.clearDisplay(); display.drawLine(prokr/8,8,prokr/8+6,8, BLACK);//шкала прокрутки display.drawLine(prokr/8,9,prokr/8+6,9, BLACK);//шкала прокрутки x=3; for(int y=prokr;y<prokr+80;y++){ if(razv<7){x++;} if(razv==7){x=x+2;} if(razv==8){x=x+3;} display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK); display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK); }} //#######################################отрисовка графика for(byte i=47;i>5;i=i-7){display.drawPixel(0,i, BLACK);display.drawPixel(1,i, BLACK);display.drawPixel(2,i, BLACK);}//разметка экрана вертикальная //////////////////////////////////////////////////сетка for(byte i=47;i>5;i=i-3){display.drawPixel(21,i, BLACK);display.drawPixel(42,i, BLACK);display.drawPixel(63,i, BLACK);} for(byte i=3;i<84;i=i+3){display.drawPixel(i,33, BLACK);display.drawPixel(i,19, BLACK);} //////////////////////////////////////////////////сетка //#######################################отрисовка menu if(menu==0){ display.setCursor(0,0); display.setTextColor(WHITE,BLACK); if(opornoe==0){display.print("1.1");} if(opornoe==1){display.print(VCC,1);} display.setTextColor(BLACK); display.print(" "); display.print(razv); display.print(" P"); if((pressBut == dec_press)&&(buttonFlag == bf_short)){opornoe=!opornoe; buttonFlag=bf_none;} if((pressBut == inc_press)&&(buttonFlag == bf_short)){opornoe=!opornoe; buttonFlag=bf_none;} } if(menu==1){ display.setCursor(0,0); display.setTextColor( BLACK); if(opornoe==0){display.print("1.1");} if(opornoe==1){display.print(VCC,1);} display.setTextColor(WHITE, BLACK); // 'inverted' text display.print(" "); display.print(razv); display.setTextColor( BLACK); // 'inverted' text display.print(" P"); if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; razv=razv-1;if(razv==255){razv=0;}} if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; razv=razv+1;if(razv==9){razv=8;}} } if(menu==2){ display.setCursor(0,0); display.setTextColor( BLACK); if(opornoe==0){display.print("1.1");} if(opornoe==1){display.print(VCC,1);} display.print(" "); display.print(razv); display.setTextColor(WHITE, BLACK); // 'inverted' text display.print(" P"); paus=1; if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; prokr=prokr-10;if(prokr<0){prokr=0;}} if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; prokr=prokr+10;if(prokr>620){prokr=620;}} } if(menu==3){ prokr=0; paus=0; display.setCursor(0,0); display.setTextColor( BLACK); if(opornoe==0){display.print("1.1");} if(opornoe==1){display.print(VCC,1);} display.print(" "); display.print(razv); display.setTextColor(BLACK); display.print(" P"); if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; SinU=SinU-20;if(SinU<20){SinU=20;}} if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; SinU=SinU+20;if(SinU>230){SinU=230;}} display.fillCircle(80,47-SinU/7, 5, BLACK); display.fillCircle(80,47-SinU/7, 2, WHITE); } if((pressBut == ok_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; menu++;if(menu==4){menu=0;paus=0;}}//перебор меню if (FreqCount.available()) { count = FreqCount.read();}//вывод частоты по готовности счетчика //#######################################частоты сигнала byte Frec1=0; long Frec=0; bool flagFrec1=0; bool flagFrec2=0; bool flagFrec3=0; for(int y=1;y<255;y++){ if(flagFrec1==0){if(mass[y]<SinU){flagFrec2=1;}} if(flagFrec1==0){if(flagFrec2==1){if(mass[y]>SinU){flagFrec1=1;Frec1=y;}}} if(flagFrec1==1){if(mass[y]<SinU){flagFrec3=1;}} if(flagFrec3==1){if(mass[y]>SinU){ if (razv>=6){Frec=1000000/((y-Frec1-1)*3.27);}//delitel 4 if (razv==5){Frec=1000000/((y-Frec1)*3.27)/2;}//delitel 8 if (razv==4){Frec=1000000/((y-Frec1)*3.27)/4;}//delitel 16 if (razv==3){Frec=1000000/((y-Frec1)*3.27)/8;}//delitel 32 if (razv==2){Frec=1000000/((y-Frec1)*3.27)/16;}//delitel 64 if (razv==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128 if (razv==1){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128 if (razv==0){Frec=1000000/((y-Frec1)*500);}//delitel 128 flagFrec1=0;flagFrec3=0;}}} //#######################################частоты сигнала display.setTextColor( BLACK); if(opornoe==1){ if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);} if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}} if(opornoe==0){countX=Frec*(overclock/16.0);} if(countX<1000){display.print(" ");display.print(countX);display.print("Hz");} if(countX>1000){float countXK=countX/1000.0;display.print(countXK,1);display.print("KHz");} if(opornoe==1){display.setCursor(0,40);display.setTextColor(BLACK); display.print(Vmax*VCC/255,1);} if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK); display.print(Vmax*1.1/255,1);} display.print("V"); //#######################################отрисовка menu ////delay(200); display.display(); } //------- end oscillograph //#######################################режим ренератора void Generator(){ display.clearDisplay(); if (flag==0){//флаг выборов режима настройки ШИМ или Частоты if((pressBut == dec_press)&&(buttonFlag == bf_short)){ frequency=frequency-mnog; if(frequency<0){frequency=0;} bool success = SetPinFrequencySafe(led, frequency); buttonFlag = bf_none; //delay(3);//защита от дребезга } if((pressBut == inc_press)&&(buttonFlag == bf_short)){ frequency=frequency+mnog; bool success = SetPinFrequencySafe(led, frequency); buttonFlag = bf_none; //delay(3);//защита от дребезга } } if (flag==1){//флаг выборов режима настройки ШИМ или Частоты if((pressBut == dec_press)&&(buttonFlag == bf_short)){ PWM=PWM-1; if(PWM<0){PWM=255;} buttonFlag = bf_none; //delay(3);//защита от дребезга } if((pressBut == inc_press)&&(buttonFlag == bf_short)){ PWM=PWM+1; if(PWM>255){PWM=0;} buttonFlag =bf_none; //delay(3);//защита от дребезга } } if((pressBut == ok_press)&&(buttonFlag == bf_short)){//переключение разряда выбора частоты //delay(3);//защита от дребезга buttonFlag =bf_none; hag++; if(hag>=5){hag=0;} } //////////// display.setTextSize(1); display.setCursor(0,5); display.print("PWM="); display.print(PWM*100.0/255); display.print(" %"); display.drawLine(0,0,83*PWM/255.0,0, BLACK); display.drawLine(0,1,83*PWM/255.0,1, BLACK); display.drawLine(0,2,83*PWM/255.0,2, BLACK); display.drawLine(0,15,83*PWM/255.0,15, BLACK); display.drawLine(0,16,83*PWM/255.0,16, BLACK); display.drawLine(0,17,83*PWM/255.0,17, BLACK); /////////// display.setCursor(5,20); display.setTextSize(2); long frequencyX=frequency*(overclock/16.0); if(frequencyX<1000){display.print(frequencyX);display.setTextSize(1);display.println("Hz");} if(frequencyX>1000){if(frequencyX<10000){display.print((frequencyX/1000.0),2);display.setTextSize(1);display.println("KHz");}} if(frequencyX>=10000){if(frequencyX<100000){display.print((frequencyX/1000.0),1);display.setTextSize(1);display.println("KHz");}} if(frequencyX>=100000){display.print((frequencyX/1000.0),0);display.setTextSize(1);display.println("KHz");} display.setCursor(0,40); display.setTextSize(1); display.print(">>X "); if(hag==0){//выбор множителя частоты display.print(1*(overclock/16.0),1); mnog=1; flag=0; } if(hag==1){//выбор множителя частоты display.print(10*(overclock/16.0),0); mnog=10; } if(hag==2){//выбор множителя частоты display.print(100*(overclock/16.0),0); mnog=100; } if(hag==3){//выбор множителя частоты display.print(1000*(overclock/16.0),0); mnog=1000; } if(hag==4){//выбор PWM display.print("PWM "); display.print(PWM*100.0/255); display.print("%"); flag=1; } display.print("<<"); pwmWrite(led, PWM); //delay(300); display.display(); } //====================== /////////////////////DDS void DDSGenerator(){ int fr=10; if(menuDDS==0){ display.clearDisplay(); display.setTextColor(WHITE, BLACK); // 'inverted' text display.setCursor(10,0); display.println("Синус"); display.setTextColor(BLACK); display.setCursor(10,10); display.println("Треугольник"); display.setCursor(10,20); display.println("Пила"); display.setCursor(10,30); display.println("Пила Обр"); display.setTextColor(BLACK); display.setCursor(0,40); //display.print("Частота="); //display.print(57); //display.print("Гц"); delay(100); display.display(); while(D11_Read==LOW){ PWM=pgm_read_byte(&sinM[d]); pwmWrite(dds,PWM); //delayMicroseconds(fr); d++; if(d==32){d=0;}} menuDDS++; delay(200);} if(menuDDS==1){ display.clearDisplay(); display.setTextColor(BLACK); // 'inverted' text display.setCursor(10,0); display.println("Синус"); display.setTextColor(WHITE, BLACK); display.setCursor(10,10); display.println("Треугольник"); display.setTextColor(BLACK); display.setCursor(10,20); display.println("Пила"); display.setCursor(10,30); display.println("Пила Обр"); display.setTextColor(BLACK); //display.setCursor(0,40); //display.print("Частота="); // display.print(57); //display.print("Гц"); delay(100); display.display(); while(D11_Read==LOW){ PWM=pgm_read_byte(&trianglM[d]); //PWM=trianglM[d]; pwmWrite(dds,PWM); //delayMicroseconds(fr); d++; if(d==32){d=0;}} menuDDS++; delay(200);} if(menuDDS==2){ display.clearDisplay(); display.setTextColor(BLACK); // 'inverted' text display.setCursor(10,0); display.println("Синус"); display.setTextColor(BLACK); display.setCursor(10,10); display.println("Треугольник"); display.setTextColor(WHITE, BLACK); display.setCursor(10,20); display.println("Пила"); display.setTextColor(BLACK); display.setCursor(10,30); display.println("Пила Обр"); display.setTextColor(BLACK); //display.setCursor(0,40); //display.print("Частота="); // display.print(57); //display.print("Гц"); delay(100); display.display(); while(D11_Read==LOW){ PWM=pgm_read_byte(&pilaM[d]); //PWM=pilaM[d]; pwmWrite(dds,PWM); // delayMicroseconds(fr); d++; if(d==32){d=0;}} menuDDS++; delay(200);} if(menuDDS==3){ display.clearDisplay(); display.setTextColor(BLACK); // 'inverted' text display.setCursor(10,0); display.println("Синус"); display.setTextColor(BLACK); display.setCursor(10,10); display.println("Треугольник"); display.setTextColor(BLACK); display.setCursor(10,20); display.println("Пила"); display.setTextColor(WHITE, BLACK); display.setCursor(10,30); display.println("Пила Обр"); display.setTextColor(BLACK); //display.setCursor(0,40); //display.print("Частота="); // display.print(57); // display.print("Гц"); delay(100); display.display(); while(D11_Read==LOW){ PWM=pgm_read_byte(&RpilaM[d]); //PWM=RpilaM[d]; pwmWrite(dds,PWM); //delayMicroseconds(fr); d++; if(d==32){d=0;}} menuDDS++; delay(200);} if(menuDDS==4){menuDDS=0;} } /////////////////////DDSвот и мой вклад в развитие=))) вроде все что можно поправил кроме нижнего меню на больших частотах перекрещиваются буквы( пока оставил так... и еще если сравнивать с ls020 пультоскопом то на 1.44 работает медленнее отрисовка ((
karl2233
этот массив можно уменьшить , занимает 701 байт.
byte mass[701];
bodrly2014, а как это сделать? подскажи )
и эта, а щас он сколько занимает? как узнать\посмотреть?
bodrly2014, а как это сделать? подскажи )
и эта, а щас он сколько занимает? как узнать\посмотреть?
Массив из переменных типа байт,
одна переменная занимает в памяти 1 байт,
соответственно 701 займут 701байт.
Нужно изменить там где мы объявляем и везде в коде где есть запись в массив и чтение.
не получается так (byte),
byte PROGMEM sinM[32]={1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1}; byte PROGMEM pilaM[32]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255}; byte PROGMEM RpilaM[32]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1}; byte PROGMEM trianglM[32]={1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1}; int d=0;пишет
PULTOSCOPE_128x64_OLED_block.ino:38:21: error: variable 'sinM' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
говорил же, на 128 переходите:)
...или изучайте мат.часть =)
дело явно не в МК, дело в оптимизации кода которую надо постичь как Дзен
...или изучайте мат.часть =)
дело явно не в МК, дело в оптимизации кода которую надо постичь как Дзен
тогда тока asm.
вас ист дас "asm"? о_О
======
в общем, полная версия (с двумя генераторами,с одним влазит) не влазит при использовании такого дисплея (((
будет значит у меня тока Пультоскоп
Подправил код , вынес повторяющиеся фрагменты в отдельные подпрограммы.
Выиграл почти 2 Кбайта. 160х128 ST_7735
ух ты! возьму на вооружение и скопирую метод))
а что ещё можно оптимизировать? =) и ещё вопрос - какой участок отвечает за циферки слева и снизу от графика?
и ещё - 34 и 35 строки - это что за хитрость?
ух ты! возьму на вооружение и скопирую метод))
а что ещё можно оптимизировать? =) и ещё вопрос - какой участок отвечает за циферки слева и снизу от графика?
и ещё - 34 и 35 строки - это что за хитрость?
Начиная с 75 строки и пошло вниз
А 34 и 35 это наверно чтобы не путаться будет-заменять ддс и шим на пин 9
ух ты! возьму на вооружение и скопирую метод))
а что ещё можно оптимизировать? =) и ещё вопрос - какой участок отвечает за циферки слева и снизу от графика?
и ещё - 34 и 35 строки - это что за хитрость?
Да не хитрость это, а назначение пинов.
А вообще можно CS убрать с 10 пина и назначить его выходом DDS , как на 5110.