Пультоскоп на Arduino 27МГц!!!

Лекс 59
Лекс 59 аватар
Offline
Зарегистрирован: 02.04.2016

ywor пишет:

вот надыбал интереную страичку

Уверяю вас, вы надыбали еще далеко не все. Их достаточно много, интересных страничек такого рода. Я не знаю, как себя чувствует Автор Пультоскопа, но мне бы не понравилось ваше сообщение на его месте. Дело не в том, что оно не информативно, а в том, что подобные скачки делают любую обширную тему (а с Пультоскопом именно так) практически не читаемой. И сейчас уже достаточно сложно отыскать нужное в данной теме, а если бросимся обсуждать все существующие варианты (несколько десятков минимум) то тема точно станет свалкой и умрет.

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

alexandr55 пишет:

Пиветствую можете подилится схемой и скетчем

И звените что не потеме

адрес почты дайте

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да, таких разработок много, но почему бы и нет? Да и "интересного" тут - это решение ровно 1 вопроса: "как подключить конкретно мой дисплей" к пультоскопу. Все остальное - это процедура "zamer()", которая ничего особенного из себя не представляет... :)

Куда как интересней решить вопрос с "уровнем синхронизации", "добавлением каналов" и т.д. Или поднять скорость замеров до 592к на Меге и без "гона" .. на родных 16Мгц, как к примеру мне это "теоретически" удалось .. практически - допиливаю тестовую программку, которая должна быть способна тактировать АЦП на 8Мгц и при 13.5 тактах АЦП иметь вчистую 592 килозамера в сек. Вопрос как их перенести в память вовремя и все - вроде бы решил, вопрос как стартовать с "синхроуровня" по спаду/нарастанию - тоже. Систематическая задержка 3.375мксек. Много конечно, но её можно достаточно точно выравнивать по 3 такта ЦПУ, что на этой скорости дает 9 кратный строб эффект или частоту дискретизации около 400нсек. .. или 5.33Мгц.

Кому-как, а по мне так - пусть будут "иные" пультоскопы.. ;)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

В разделе программирование завел тему по проблемам линковки асм-вставки.

В варианте "С" удалось получить скорость оцифровки в 445 килозамеров в сек. на Мега 2560, делитель АЦП 1:2. Но этот вариант дольше на несколько тактов и поэтому часть замеров похоже пропускает. Новая процедура "замер" позволяет снимать с заданного уровня (проверено), снимать несколько каналов (2шт - проверено) и делать сдвиг образцов кратно 3-4 тактам ЦПУ, что позволяет повысить частоту дискретизации периодических сигналов в 7-9 раз.

Но "победить" линковщика с опцией "-flto" мне пока не удалось. Кому интересно - помогайте, моя фантазия - похоже иссякла.

apeks1
apeks1 аватар
Offline
Зарегистрирован: 19.05.2016

ywor пишет:

вот надыбал интереную страичку может кому интересно https://sites.google.com/site/cvssav/avr/mini-oscillograf-atxmega32a4-display-s5230  

при личном общении с автором он не рекомендовал эту версию для сборки,"проба пера" так сказать,после недолгого баловства был разобран и дисплей автор использовал кажется в домашней метеостанции

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Arhat109-2 пишет:

Там X-mega + AD9280. Тактовая 32Мгц, АЦП способен выдавать данные тоже на 32Мгц, + есть канал ПДП .. чему удивляться-то?

Даже если тактирование 32МГц все равно не сходится, этому АЦП для полного преобразования 4 такта нужно это 8MSps получается.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не нашел такого в даташите, зато нашел что он имеет режим "оверсемплинга" со скоростями до 135Мгц .. :)

alexandr55
Offline
Зарегистрирован: 26.03.2017

240265 пишет:

адрес почты дайте

[/quote]

a.ling@mail.ru

man_200
Offline
Зарегистрирован: 29.04.2016

Я делал эту версию на ATXmega 32. Красиво смотрится, но не смог победить свернутое посреди экрана изображение, возможно из-за неоригинального экрана. http://radiokot.ru/forum/viewtopic.php?f=61&t=44185&start=1280. на стр.65 фото есть

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

bodriy2014, не подскажете, вы еще планируете переделывать прошивку или желания уже нету? просто давненько новостей нет(

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Xumuk пишет:
bodriy2014, не подскажете, вы еще планируете переделывать прошивку или желания уже нету? просто давненько новостей нет(

Привет. Обещания плодить не люблю, давненько для себя уже кое что смастерил но все не как не оформлю код и видео не сниму, то одно то другое(((

точнее никак.

grif66
Offline
Зарегистрирован: 28.04.2017

ну вот теперь совсем заинтриговал...ждем)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

bodriy2014, до 500кгц оцифровки - добрались? а до 600? Как у Вас влияет 2,3-канальность на скорость и точность оцифровки при переключении каналов перед каждым съемом, получается или сильно падает точность на канал? С какого выходного сопротивления источника каналы начинают переключаться и удалось ли получить 250Кгц "на канал" при 2-х канальном режиме?

Как решили проблему выдержки задержки после нахождения синхроуровня до начала съема для стробоскопического увеличения частоты дискретизации? А решали?

В общем, интересно сравнить что получилось у Вас со своими изысканиями...

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Arhat109-2 пишет:

bodriy2014, до 500кгц оцифровки - добрались? а до 600? Как у Вас влияет 2,3-канальность на скорость и точность оцифровки при переключении каналов перед каждым съемом, получается или сильно падает точность на канал? С какого выходного сопротивления источника каналы начинают переключаться и удалось ли получить 250Кгц "на канал" при 2-х канальном режиме?

Как решили проблему выдержки задержки после нахождения синхроуровня до начала съема для стробоскопического увеличения частоты дискретизации? А решали?

В общем, интересно сравнить что получилось у Вас со своими изысканиями...

Привет.

О какой двух канальности может идти речь если АЦП всего одно?

Два канале тем ценны что можно параллельно обрабатывать разные сигналы, если делать это одним АЦП по очереди, то это будет все равно что перемещать щуп с одного сигнала на другой.

На одном АЦП нельзя сделать два канала.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

А по остальным вопросам - что-то пробовали, получилось?

Mik.Bond.
Mik.Bond. аватар
Offline
Зарегистрирован: 06.06.2017

пришел новый 2.4 лсд      - работает нормально    с прошивкой на стр.64

tolkach
Offline
Зарегистрирован: 05.02.2017

Всем здравствовать.Танцы с бубном продолжаются.Пытаюсь залить скетч для экрана 5110 но при компиляции ругается на строку D11_Read.Заменил строки где есть D11 как указано в сообщении 1343.Скетч начинает грузиться но получаем девственно белый экран.Тестировал ардуинку и экран скетчем на странице Zelectro-все работает.В библиотеке ничего нет лишнего только то что скачано с проекта.Читал все страницы проекта но ответа не нашел.Куда копать?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

tolkach пишет:

Всем здравствовать.Танцы с бубном продолжаются.Пытаюсь залить скетч для экрана 5110 но при компиляции ругается на строку D11_Read.Заменил строки где есть D11 как указано в сообщении 1343.Скетч начинает грузиться но получаем девственно белый экран.Тестировал ардуинку и экран скетчем на странице Zelectro-все работает.В библиотеке ничего нет лишнего только то что скачано с проекта.Читал все страницы проекта но ответа не нашел.Куда копать?

Если библиотеки все, тогда ИДЕ виной, возьмите мое портабл и с него скомпилируйте.

http://srukami.inf.ua/pultoscop_v25110.html

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Раз "200" уже этот вопрос поднимался (про ИДЕ с сайта Автора) и опять "грабли".  Совсем народ читать не хочет....

1707
Offline
Зарегистрирован: 08.02.2017

Доброго дня. Тыкнете носом в последнюю версию печатки без использования готового модуля Ардуино и с ним. Спасибо.

И

tolkach
Offline
Зарегистрирован: 05.02.2017

240265 Не считал сколько раз читал комментарии и на каких сайтах.Ниже будет понятно что я делаю.

bodriy2014 Все делаю как Вы советуете и как пишут в комментариях.Ваш портабл выдает ошибку-Cannot run program runtime tools.avr-gcc.path,ошибку я переводил гуглом но она мне ни о чем не говорит.Если использую IDE1.0.1 то выдает ошибку-class adafruit_PCD8544 has no member named setCursor.Где я неправ?Сейчас выложу перевод ошибок гуглом.

tolkach
Offline
Зарегистрирован: 05.02.2017

Не может работать во время выполнения программы.АВЗ-НКУ путь.

Adafruit_PCD8544 класс имеет член с именем SetCursor.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Если не получится скомпилоровать, в архиве есть готовый hex залей его.

tolkach
Offline
Зарегистрирован: 05.02.2017

bodriy2014 Но насколько я понимаю прошивать нужно через программатор.Программатором пользоваться умею и он у меня есть.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

tolkach пишет:

bodriy2014 Но насколько я понимаю прошивать нужно через программатор.Программатором пользоваться умею и он у меня есть.

---Если умеете через программатор можно через него, не меняя фьюзов. Просто заливаете hex, но ардуиновский загрузчик затрется.

---Если нет программатора тоже не беда, есть такие проги как XLoader они шьют Ардуинки через их же загрузчик hex-сами не затирая загрузчик без программатора прямо с USB

tolkach
Offline
Зарегистрирован: 05.02.2017

bodriy2014Спасибо за подсказку.Залил hex через usbasp программатор,увидел изображение на экране.Самопроизвольно переключаются режимы и есть лишние символы.На подключенные кнопки не реагирует.Попытался перепрошить но по ходу накрылась ардуинка непонятно зачем.Уже поздно,завтра буду плясать дальше.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

tolkach пишет:

bodriy2014Спасибо за подсказку.Залил hex через usbasp программатор,увидел изображение на экране.Самопроизвольно переключаются режимы и есть лишние символы.На подключенные кнопки не реагирует.Попытался перепрошить но по ходу накрылась ардуинка непонятно зачем.Уже поздно,завтра буду плясать дальше.

Самопроизвольное нажатие видимо от того что кнопки не подтянуты и ловят все как антенны.

tolkach
Offline
Зарегистрирован: 05.02.2017

bodriy2014Спасибо еще раз.Все завелось на другой ардуинке через hex  файл.Переключение между пультоскопом и другими режимами возможно только после сброса ардуинки,это правильно?Справо на экране есть точка цвет которой можно менять и перемещать,слево вверху можно перемещать черточку.Пока с этим не разобрался.Кварц стоит 16Мгц маленький,пока не перепаял.С чувством выполненного иду спать.

sokrat-11
Offline
Зарегистрирован: 11.06.2016

man_200   Вот как раз это оригинал,просто надо сделать полную инициализацию и всё будет норм.

man_200
Offline
Зарегистрирован: 29.04.2016

Делал и полную и частичную инициализацию, вводил разные коэфициенты. Избавился от шума, но заворот среди экрана не уходит. Забросил до лучших времен, но экранчик классный!

Mik.Bond.
Mik.Bond. аватар
Offline
Зарегистрирован: 06.06.2017

=я конечно таки дико извиняюсь=   вот здесь много интересного 
если кто-то желает сделать измерительный комплекс =настольный=

или найдет для себя программные решения

https://ja2nkd.blogspot.ru/2017/02/rf-analyzer-case-in-ver10.html

надо только что-бы браузер был с переводчиком  а кому-то переводчик и не ненужен

и доработать сброс показаний при окончании свипинга частоты. Это присутствует у АЧХометра и антенного анализатора

 

 

sokrat-11
Offline
Зарегистрирован: 11.06.2016

  man_200 если нужно выложу.

tolkach
Offline
Зарегистрирован: 05.02.2017

man_200 sokrat-11 Дико извиняюсь,что такое полная инициализация и как её сделать.Может я что-то пропустил?

man_200
Offline
Зарегистрирован: 29.04.2016
sokrat-11
Offline
Зарегистрирован: 11.06.2016

main_200 да о нём,я тоже пытаюсь собрать этот осцик, с экраном всё в порядке отображает осцик как надо, только никак руки не дойду перерисовать схему в лауте.разобраться с пинами контролёра что куда идет.схема что дана не полная.

man_200
Offline
Зарегистрирован: 29.04.2016

Схема действительно не совсем полная, но в этой же ветке я задавал вопросы автору, где он отвечал на них. Поищи http://radiokot.ru/forum/viewtopic.php?f=59&t=103803&start=100. В моем варианте экранчик запустился по другой схеме подключения к МК, которая не соответствовала и его печатке. Довольно сложновато было впаять разъем экрана, но работает шустро и выглядит красиво! Кроме того, переключение режима пост/перем, не предусмотрено прошивкой и схемой, поэтому сразу ставь там механический переключатель. И еще - частое снятие/установка экрана может привести к повреждению шлейфа. Много перемычек на плате не есть хорошо

sokrat-11
Offline
Зарегистрирован: 11.06.2016

main_200   на двухсторонним чтоб перемычек небыло,с пост/перем я видел, не врублюсь куда цеплять /adc clk/,и/DAC 1.5v/ и по прошивке что за выходы А6.А7 подскажи если можеш?

sirota
Offline
Зарегистрирован: 18.08.2015

Создайте свою ветку. Не флудите!

man_200
Offline
Зарегистрирован: 29.04.2016

Clk на Е3 (33). А6, А7 - в воздухе, информации нет. DAC - делается регулируемый делитель с выходом 1.5V - это для подстройки нуля линии на экране (у меня он в воздухе поскольку аналоговую часть не делал). 

Чтобы здесь не флудить не по теме, в личку - zadorin57@mail.ru

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

Приветствую. собираю второй приборчик на 1,8 tft ST7735. Хочу залить скетч из поста #1552 (стр.№32) авторства 240265. Парни, есть у кого изменённые библиотеки под этот скетч ? 

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Там из изменений только glcfont  русский.

Возмите ИДЕ http://srukami.inf.ua/pultoscop_v25110.html  добавьте  Adafruit_ST7735 библиотеку.

Вот скетч с неольшими доработками

//страничка проекта http://srukami.inf.ua/pultoscop_v2.html
// форум http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comm...
// скетч и библиотеку изменил под LCD_ls020 VetalST
// скетч  изменил под LCD 1.8 дюйма 160х128 ST7735 Владимир Иванов ( 240265 )
// LCD_ls020 подключаем: 
// к ардуине на ATmega328
//**********************************************************
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <FreqCount.h>
#include <PWM.h>

// For the breakout, you can use any 2 or 3 pins
// These pins will also work for the 1.8" TFT shield
#define TFT_CS    10
#define TFT_RST   A0
#define TFT_DC     8

// Option 1 (recommended): must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

// Option 2: use any pins but a little slower!
//#define TFT_SCLK 13   // set these to be whatever pins you like!
//#define TFT_MOSI 11   // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

#define Out  9   //пин для генератор сигналов и DSS(не менять)
#define dds  9   //пин для генератора dds (не менять)

//#################№№№№№№####пользовательские настройки!
#define levo 4
#define ok 3
#define pravo 2
#define akb A3 //любой своюодный аналоговый пин для измерения напряжения АКБ
#define delit 6 //включен или отключен делитель на х10
#define overclock 16 //Частота на которой работает Ардуино 
byte SinU=30; // =30;   //уровень синхронизации 0 до 255
int PWM = 128;//стартовое значение ШИМ от 0 до 255        
long frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0;  //напряжение питания, меряем мультиметром
byte pultoskop=1; //флаг выбора генератора или осциллографа
//###########################################################

byte menuDDS=0; 
byte 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 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 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 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};
byte hag=0;
long mnog=0;
boolean flag=0;
byte mass[256];//массив АЦП
//byte massDEL[401];
byte menu=1;//переменная верхнего меню
byte razv=5;//значение развертки
byte x=30; //счетчик оси Х
int Vmax=0;// максимальное напряжение 
unsigned long pause=0;//переменная для замены Delay
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool clen_p=0;//флаг чистки паузы
long countX=0;
byte sinhMASS=0;
unsigned long count =0;
int prokr=0;
char str[10]; 
int temp;
float armcurrent;
int d=0;

//********************* ОТРИСОВКА ЛИНИИ *********************************
void 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++) {
       tft. 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--) {
       tft. 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++) {
       tft. 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--) {
        tft.drawFastVLine(x1, y1, h, color);
        y1 = y1 + h;
      }
    }
  }
}

//********************* МЕНЮ DDS *********************
void DDS_Menu () {
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("СИНУС 500 Гц");     
    tft.setCursor(35, 50);
    tft.println("ТРЕУГОЛЬНИК 500 Гц");
    tft.setCursor(35, 70); 
    tft.println("ПИЛА 50 Гц");
    tft.setCursor(35, 90);
    tft.println("ПИЛА ОБР 50 Гц");       
}

//***************** ОТРИСОВКА В ПАУЗЕ ОСЦИЛОГРАФА *******************
void Pause(){
        tft.fillRect(0, 12, 160, 3, ST7735_BLACK);//стиране шкалы прокрутки
          tft.fillRect(6, 12, 154, 99, ST7735_BLACK);//стиране поле графика
         // tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ 
          //////////////////////////////////////////////////////////////
          tft.drawLine(prokr/4,12,prokr/4+25,12, ST7735_YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,13,prokr/4+25,13, ST7735_YELLOW);//шкала прокрутки
          tft.drawLine(prokr/4,14,prokr/4+25,14, ST7735_YELLOW);//шкала прокрутки
          
          //++++++++++++++++ СЕТКА
          for(byte i=110;i>18;i=i-3){
            tft.drawPixel(6,i, ST7735_BLUE);
            tft.drawPixel(25,i, ST7735_BLUE); 
            tft.drawPixel(44,i, ST7735_BLUE); 
            tft.drawPixel(63,i, ST7735_BLUE); 
            tft.drawPixel(82,i, ST7735_BLUE); 
            tft.drawPixel(101,i, ST7735_BLUE);
            tft.drawPixel(120,i, ST7735_BLUE); 
            tft.drawPixel(139,i, ST7735_BLUE); 
            tft.drawPixel(158,i, ST7735_BLUE);
           // tft.drawPixel(159,i, ST7735_BLUE);
          }
          for(byte i=6;i<160;i=i+3){
            tft.drawPixel(i,25, ST7735_BLUE);
            tft.drawPixel(i,42, ST7735_BLUE); 
            tft.drawPixel(i,59, ST7735_BLUE);
            tft.drawPixel(i,76, ST7735_BLUE); 
            tft.drawPixel(i,93, ST7735_BLUE); 
            tft.drawPixel(i,110, ST7735_BLUE);
          }
          //////////////////////////////////////////////////////
          x=5;
          for(int y=prokr;y<prokr+146;y++){
            if(razv<7){ x++;}
            if(razv==7){x=x+2;}
            if(razv==8){ x=x+3; }
            if(razv==9){ x=x+4; }
            if(razv==10){ x=x+5; }
            if(x>160){ x=160; }
          // tft.drawPixel(x,110-mass[y]/3,ST7735_GREEN);
           tft.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
          }
      }

//************* ОТРИСОВКА ВЕРХНЕГО МЕНЮ ************************      
void PrintVmenu(){
tft.fillRect(0, 0, 45, 9, ST7735_BLACK);
          if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
                    
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
    tft.println( "2.2V/d");
        }
        if(opornoe==1){
                   
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "10V/d");
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "0.22V/d");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "1V/d");
        }
      }

       tft.setCursor(55, 1);
    tft.println( "Разв");
        sprintf(str, "%d", razv); 
    tft.setCursor(91, 1);
    tft.println( str);

}

//******************* ОТРИСОВКА ГЛАВНОГО МЕНЮ *****************  

void GlavMenu (){

     tft.setTextSize(1);
      tft.setTextColor(ST7735_WHITE);
      tft.setCursor(35, 25);
      tft.println("Осцилограф");
       tft.setCursor(35, 55);
       tft.println("Генератор PWM");
       tft.setCursor(35, 85);
        tft.println("Генератор DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Батарея =");
      armcurrent = analogRead(akb)*VCC/1023;//проверка напряжения на АКБ
      temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
      sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));      
      tft.fillRect(90,110,24,10,ST7735_BLACK);
       tft.setTextColor(ST7735_BLUE);
       tft.setCursor(90, 110);
       tft.println(str);
  
}
  


void setup(){  
  if(opornoe==0){
    ADMUX = 0b11100100;
  }//выбор внутреннего опорного 1,1В
  if(opornoe==1){
    ADMUX = 0b01100100;
  }//Выбор внешнего опорного
SPI.begin;
 SPI.setClockDivider(SPI_CLOCK_DIV2);

  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
 tft.setRotation(3);              //  повернуть по горизонту
  tft.fillScreen(ST7735_BLACK);
  tft.drawRect(0,0,160,128,ST7735_WHITE); // рисуем рамку
  tft.drawRect(2,2,156,125,ST7735_BLUE); // рисуем рамку
  tft.drawRect(4,3,152,121,ST7735_RED); // рисуем рамку
  
 while(digitalRead(ok)==LOW){  
    if(digitalRead(pravo)==HIGH){
     // delay (10);
      while((digitalRead(pravo)==HIGH));
      pultoskop=pultoskop-1;
      if(pultoskop<1)pultoskop=3;
    }
    if(digitalRead(levo)==HIGH){
     // delay (10);
      while((digitalRead(levo)==HIGH));
      pultoskop=pultoskop+1;
      if(pultoskop>3)pultoskop=1;
    }


    if(pultoskop==1){
      GlavMenu ();
 //     tft.setTextSize(1);
      tft.setTextColor(ST7735_RED);
      tft.setCursor(35, 25);
      tft.println("Осцилограф");

    }
    
    if(pultoskop==2){
     GlavMenu ();
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_RED);
       tft.println("Генератор PWM");
    } 
    
     if(pultoskop==3){
      GlavMenu ();   
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_RED);
       tft.println("Генератор DDS");
    } 
 delay(200); 
  
}  

     tft.fillScreen(ST7735_BLACK);//очистка дисплея
  if(pultoskop==1){
    FreqCount.begin(1000); 
 //   tft.fillScreen(ST7735_BLACK);//очистка дисплея      
  }
  if(pultoskop==2){
    InitTimersSafe(); 
    bool success = SetPinFrequencySafe(Out, frequency);
 //   tft.fillScreen(ST7735_BLACK);//очистка дисплея  
  }
  if(pultoskop==3){
   InitTimersSafe(); 
   bool success = SetPinFrequencySafe(Out,200000);
//   tft.fillScreen(ST7735_BLACK);//очистка дисплея   
  }
delay(500);  
}

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<255;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<255;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }
  
}

void MenuT(){//перерисовка нижнего меню    

  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)-0.2; }//-0.2 КОРЕКЦИЯ ПОКАЗАНИЙ ЧАСТОТЫ ГЦ //delitel 128
        flagFrec1=0;
        flagFrec3=0;
      }
    }
  }

  //#######################################частоты сигнала

   tft.setTextColor(ST7735_WHITE);
   tft.setCursor(1, 120);
    tft.println( "F=");
    
  if(opornoe==1){
    if((Vmax*VCC/255)>2.8){ countX=count*(overclock/16.0); }
    if((Vmax*VCC/255)<=2.8){ countX=Frec*(overclock/16.0); }
  }
  if(opornoe==0){ countX=Frec*(overclock/16.0); }
  if(countX<1000){
    sprintf(str, "%d Hz", countX);
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(18, 120);
    tft.println( str);  
  }
  if(countX>=1000){
  float countXK=countX/1000.0;
  temp = (countXK - (int)countXK) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д
  sprintf(str, "%d.%03d kHz", (int)countXK, abs(temp));
  tft.setTextColor(ST7735_WHITE);
  tft.setCursor(18, 120);
  tft.println( str);  
  }
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(18, 120);
    tft.println( str);  
    
    //--------- Напряжение --------------------
  if(digitalRead(delit)==HIGH){//включен или отключен делитель
      if(opornoe==0){ armcurrent = (Vmax*1.1/255)*10; }
     if(opornoe==1){ armcurrent = (Vmax*VCC/255)*10;  }
  }
   else {
     if(opornoe==0){ armcurrent = Vmax*1.1/255; }
     if(opornoe==1){ armcurrent = Vmax*VCC/255;  }
   }
  tft.setTextColor(ST7735_WHITE);
   tft.setCursor(100, 120);
    tft.println( "U=");  
    temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
    sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));
   tft.setTextColor(ST7735_WHITE);
   tft.setCursor(118, 120);
    tft.println( str);  
}

void loop() { 
  if(pultoskop==1){
    while(1){

      //********** ОТРИСОВКА И ПЕРЕБОР ВЕРХНЕГО МЕНЮ ***************************
      
      //***************** опорное  **************************
      if(menu==0){ 
        tft.fillRect(0, 0, 45, 9, ST7735_RED);
       PrintVmenu(); 

        if(digitalRead(pravo)==HIGH){
         tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
          opornoe=1;
        }
        if(digitalRead(levo)==HIGH){ 
          tft.fillRect(0, 12, 30, 120, ST7735_BLACK);//стирание напряжения
          opornoe=0;
        }
      }
      /////////////////////////// развертка /////////////////////////////
      if(menu==1){
        tft.fillRect(48, 0, 57, 9, ST7735_RED);
     PrintVmenu();

        if(digitalRead(pravo)==HIGH){//добавть скорость
        delay (30);
        while((digitalRead(pravo)==HIGH));
          razv++;
          if(razv==11){ razv=10;} 
        }
        if(digitalRead(levo)==HIGH){//убавить скорость
        delay (30);
        while((digitalRead(levo)==HIGH));
          razv--;
          if(razv==255){ razv=0; } 
        } 
      }
      ///////////////////// синхронизация /////////////////////////////////
      if(menu==2){  
        prokr=0;
        paus=0;
    PrintVmenu();

  tft.fillRect(105, 0, 174, 9, ST7735_RED); 
  tft.setCursor(112, 1);        
  tft.println( "Синх-ция");      
        if(digitalRead(levo)==HIGH){
          SinU=SinU-10;
          if(SinU<10){ SinU=10; }
        }
        if(digitalRead(pravo)==HIGH){
          SinU=SinU+10;
          if(SinU>240){ SinU=240; }
        }

        tft.fillCircle(155,110-SinU/3, 3, ST7735_RED);       
        tft.fillCircle(155,110-SinU/3, 1, ST7735_BLACK);
      }      
      ///////////////////// пауза //////////////////////////////////
      if(menu==3){
        paus=1;
        if(clen_p==0){
         clen_p=1; 
         
         tft.fillRect(105, 0, 174, 9, ST7735_RED);
    PrintVmenu();

    tft.setCursor(112, 1);
    tft.println( "ПАУЗА");      
      }   
        }    

      if(digitalRead(ok)==HIGH){
        delay (30);
        while((digitalRead(ok)==HIGH));
        menu++;
        tft.fillRect(6, 16, 154, 99, ST7735_BLACK);//стиране поле графика
        tft.fillRect(0,116, 160, 12, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ 
        if(menu==4){
          menu=0;
          paus=0;
          clen_p=0;
        }
        tft.fillRect(0, 0, 160, 15, ST7735_BLACK);//стиране ВЕРХ МЕНЮ
      }

      //************** ОСЬ НАПРЯЖЕНИЯ ##########################################
      tft.drawLine(2, 20, 2, 114, ST7735_BLUE);
      tft.drawLine(2, 25, 5, 25, ST7735_BLUE); 
      tft.drawLine(2, 42, 5, 42, ST7735_BLUE); 
      tft.drawLine(2, 59, 5, 59, ST7735_BLUE); 
      tft.drawLine(2, 76, 5, 76, ST7735_BLUE); 
      tft.drawLine(2, 93, 5, 93, ST7735_BLUE); 
      tft.drawLine(2, 110,5, 110, ST7735_BLUE); 

      //************ ОСЬ РАЗВЕРТКИ ##########################################
      tft.drawLine(2, 115,158, 115, ST7735_BLUE); 
      //  Черточки ******************     
            for(byte i=6;i<160;i=i+19){
            tft.drawPixel(i,114, ST7735_BLUE); 
            tft.drawPixel(i,113, ST7735_BLUE);
            tft.drawPixel(i,112, ST7735_BLUE); 
 }
      //***************выбор внутреннего опорного 1,1В ########################################
      if(opornoe==0){ ADMUX = 0b11100100; }
      //**************Выбор внешнего опорного ***************************
      if(opornoe==1){ ADMUX = 0b01100100; }
      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<151;y++){ if(Vmax<mass[y]){ Vmax=mass[y]; } }
      //максимальное значение сигнала ##########################
      
      //************************ ОТРИСОВКА ГРАФИКА *************************
      if(paus==0){       
        tft.fillRect(6, 25, 154, 86, ST7735_BLACK);//стиране поле графика        
//***//*************** стиране НИЖНЕГО МЕНЮ **********************
     tft.fillRect(18, 120, 80, 8, ST7735_BLACK);
     tft.fillRect(118, 120, 25, 8, ST7735_BLACK);
//*****************************************************************
        tft.fillCircle(10,110-SinU/3, 2, ST7735_YELLOW);//рисуем уровень синхронизации 
        tft.fillCircle(10,110-SinU/3, 3, ST7735_YELLOW);//рисуем уровень синхронизации        
           x=5;
       for(int y=sinhMASS-1;y<sinhMASS+151;y++){ 

           if(razv<7){ x++; }
          if(razv==7){ x=x+2; }
          if(razv==8){ x=x+3; } 
          if(razv==9){ x=x+4; }
          if(razv==10){ x=x+5; }
          if(x>159){ x=159; } 
   
        Line(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график через Line (быстрее в 2 раза)
        }     
        MenuT();  
      }
     ///////////////////////////// режим паузы //////////////////////////////////////////////// 
     
    if(paus==1){
    
        if(digitalRead(pravo)==HIGH){//листаем
          prokr=prokr+2;
          if(prokr>554){prokr=0; }
      Pause();
        }
      if(digitalRead(levo)==HIGH){//листаем
          prokr=prokr-2;
          if(prokr<0){prokr=554; }
      Pause();
        } 
      }
     // delay(300); // можно удалить или подобрать по скорости обновления экрана
    }
  }
  
  //************************************************************************************************
  //#######################################  режим ренератора от 1 Гц до 2 МГц
  if(pultoskop==2){
    while(1){
      if (flag==0){//флаг выборов режима настройки  Частоты
        if(digitalRead(levo)==HIGH){
          frequency=frequency-mnog;
          if(frequency<0){
            frequency=0;
          }
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга 
          tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля
        }
        if(digitalRead(pravo)==HIGH){
          frequency=frequency+mnog;
          bool success = SetPinFrequencySafe(Out, frequency);
          delay(3);//защита от дребезга 
          tft.fillRect(6, 60, 160, 80, ST7735_BLACK);//стирание поля закрашиваем
        }  
      }
      if (flag==1){//флаг выборов режима настройки ШИМ 
        if(digitalRead(levo)==HIGH){
          PWM=PWM-2;
          if(PWM<0){
            PWM=255;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля
          tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }
        if(digitalRead(pravo)==HIGH){
          PWM=PWM+2;
          if(PWM>255){
            PWM=0;
          } 
          delay(3);//защита от дребезга
          tft.fillRect(6, 6, 160, 40, ST7735_BLACK);//стирание поля 
          tft.fillRect(90, 100, 129, 125, ST7735_BLACK);//стирание в низу число шим
        }  
      }      

      if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты 
        delay (30);
        while((digitalRead(ok)==HIGH));
        hag++;
        if(hag>=7){
          hag=0;
        }
        tft.fillRect(6, 100, 154, 28, ST7735_BLACK);//стирание поля
      }
      ////////////

      tft.setCursor(10, 19);
      tft.setTextColor(ST7735_GREEN);
      tft.setTextSize(2);
      tft.println("PWM =");                                      
     // temp = PWM*100/255;
      tft.setCursor(80, 19);
      tft.println( PWM*100/255,1);      
      tft.setCursor(122, 19);
      tft.println( "%");
      
      armcurrent = (127*PWM/255)+25; // вычисляем длинны линии

      tft.drawLine(6,10,armcurrent,10, ST7735_YELLOW);
      tft.drawLine(6,11,armcurrent,11, ST7735_YELLOW);
      tft.drawLine(6,12,armcurrent,12, ST7735_YELLOW);
      tft.drawLine(6,13,armcurrent,13, ST7735_YELLOW);
      tft.drawLine(6,14,armcurrent,14, ST7735_YELLOW);

      tft.drawLine(6,37,armcurrent,37, ST7735_YELLOW);
      tft.drawLine(6,38,armcurrent,38, ST7735_YELLOW);
      tft.drawLine(6,39,armcurrent,39, ST7735_YELLOW);
      tft.drawLine(6,40,armcurrent,40, ST7735_YELLOW);
      tft.drawLine(6,41,armcurrent,41, ST7735_YELLOW);

      ///////////////////////////////////    
      long frequencyX=frequency*(overclock/16.0);
       tft.setTextSize(2);
      if(frequencyX<1000){
        sprintf(str, "%d Hz", frequencyX);
        tft.setCursor(30, 60);
        tft.setTextColor(ST7735_WHITE);      
        tft.println(str);                  
        tft.setTextSize(1); 
      }
     
      if(frequencyX>=1000&&frequencyX<1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(15, 60);
        tft.setTextColor(ST7735_WHITE);        
        tft.println(str);                
       tft.setTextSize(1);
      }
     
      if(frequencyX>=1000000){
        tft.setTextSize(2);
        armcurrent=frequencyX/1000000.0;
        temp = (armcurrent - (int)armcurrent) * 1000; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%003d MHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 60);
        tft.setTextColor(ST7735_WHITE);        
        tft.println(str);          
       tft.setTextSize(1);
       
      }  
      if(frequencyX>2000000)frequency=2000000;

      ////////////////////////////////////////////////////////////// 

        tft.setCursor(5, 100);
        tft.setTextColor(ST7735_BLUE);
        tft.setTextSize(1);
        tft.println(">>");          
    
      if(hag==0){//выбор множителя частоты 
        mnog=1;
        flag=0;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);          

      }
      if(hag==1){//выбор множителя частоты
        mnog=10;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      }
      if(hag==2){//выбор множителя частоты
        mnog=100;
        armcurrent = 100*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d Hz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      }
      if(hag==3){//выбор множителя частоты
        mnog=1000;
        armcurrent = 1*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      } 
      if(hag==4){//выбор множителя частоты
        mnog=10000;
        armcurrent = 10*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      } 
       if(hag==5){//выбор множителя частоты
        mnog=100000;
        armcurrent = 100*(overclock/16.0);
        tft.setTextSize(2);
        temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
        sprintf(str, "%d.%d kHz", (int)armcurrent, abs(temp));
        tft.setCursor(30, 100);
        tft.setTextColor(ST7735_YELLOW);        
        tft.println(str);        
      } 
      if(hag==6){//выбор  PWM 
        flag=1;
        tft.setTextSize(2);
        tft.setCursor(25, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println("PWM =");               
       // temp = PWM*100/255;
        tft.setCursor(95, 100);
        tft.setTextColor(ST7735_YELLOW);      
        tft.println(PWM*100/255,1);                   
        tft.setCursor(132, 100);
        tft.setTextColor(ST7735_YELLOW);
        tft.println("%");               
      }
        tft.setCursor(145, 100);
        tft.setTextColor(ST7735_BLUE);
        tft.setTextSize(1);
        tft.println("<<");         
     

      pwmWrite(Out, PWM);
      delay(50);  
    }
  }
 //************************************************************************************************
  //#######################################  режим DDS ренератор
if(pultoskop==3){
  while(1){
//int fr=575;

if(menuDDS==0){
  DDS_Menu ();
    tft.setCursor(35, 30);
    tft.setTextColor (ST7735_GREEN);    
 //   tft.setTextSize(1);
    tft.println("СИНУС 500 Гц");      

    delay(400); 
    while(!(PIND & (1<<PIND4))){
    PWM=sinM[d];
    pwmWrite(dds,PWM);
    delayMicroseconds(18); // Задержка для 500 ГЦ
    d++;
    if(d==32){d=0;}}
     menuDDS++;
  }
if(menuDDS==1){
  DDS_Menu ();
    tft.setCursor(35, 50);    
    tft.setTextColor(ST7735_GREEN);
    tft.println("ТРЕУГОЛЬНИК 500 Гц");

    delay(400);
    while(!(PIND & (1<<PIND4))){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      delayMicroseconds(18); // Задержка для 500 ГЦ
      d++;
      if(d==32){d=0;}}
    menuDDS++;
  }
if(menuDDS==2){
  DDS_Menu ();

    tft.setTextColor(ST7735_GREEN);
    tft.setCursor(35, 70); 
    tft.println("ПИЛА 50 Гц");
    
    delay(400);
    while(!(PIND & (1<<PIND4))){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
      delayMicroseconds(575); // Задержка для 50 ГЦ
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==3){
  DDS_Menu ();

    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_GREEN);
    tft.println("ПИЛА ОБР 50 Гц");       

    delay(400);  
    while(!(PIND & (1<<PIND4))){
      PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      delayMicroseconds(575); // Задержка для 50 ГЦ
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}

 

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

Вот спасибище огромное. То есть просто библиотеку стандартную добавить, а изменения в скетче ? Схема без изменений ?

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

В скетче добавлен режим шага в режиме генератора 100 КГц и в ДДС я сделал пилу 50 Гц а синус и треугольник 500 Гц. Схему не трогал.

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

Попробуем. Спасибо

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

50 Гц пилу сделал т.к. нужно было отладить схему коррекции растра дпя кинескопного ТВ

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

На всякий случай РУССКИЙ glcfont.c из Adafruit_GFX_Library

#ifndef FONT5X7_H
#define FONT5X7_H

#ifdef __AVR__
 #include <avr/io.h>
 #include <avr/pgmspace.h>
#else
 #define PROGMEM
#endif
 
// Standard ASCII 5x7 font РУССКИЙ

static const unsigned char font[] PROGMEM = {
	0x00, 0x00, 0x00, 0x00, 0x00,// (space) 0x20
	0x00, 0x00, 0x5F, 0x00, 0x00,// !	0x21
	0x00, 0x07, 0x00, 0x07, 0x00,// "	0x22
	0x14, 0x7F, 0x14, 0x7F, 0x14,// #	0x23
	0x24, 0x2A, 0x7F, 0x2A, 0x12,// $	0x24
	0x23, 0x13, 0x08, 0x64, 0x62,// %	0x25
	0x36, 0x49, 0x55, 0x22, 0x50,// &	0x26
	0x00, 0x05, 0x03, 0x00, 0x00,// '	0x27
	0x00, 0x1C, 0x22, 0x41, 0x00,// (	0x28
	0x00, 0x41, 0x22, 0x1C, 0x00,// )	0x29
	0x08, 0x2A, 0x1C, 0x2A, 0x08,// *	0x2A
	0x08, 0x08, 0x3E, 0x08, 0x08,// +	0x2B
	0x00, 0x50, 0x30, 0x00, 0x00,// ,	0x2C
	0x08, 0x08, 0x08, 0x08, 0x08,// -	0x2D
	0x00, 0x60, 0x60, 0x00, 0x00,// .	0x2E
	0x20, 0x10, 0x08, 0x04, 0x02,// /	0x2F
	0x3E, 0x51, 0x49, 0x45, 0x3E,// 0	0x30
	0x00, 0x42, 0x7F, 0x40, 0x00,// 1	0x31
	0x42, 0x61, 0x51, 0x49, 0x46,// 2	0x32
	0x21, 0x41, 0x45, 0x4B, 0x31,// 3	0x33
	0x18, 0x14, 0x12, 0x7F, 0x10,// 4	0x34
	0x27, 0x45, 0x45, 0x45, 0x39,// 5	0x35
	0x3C, 0x4A, 0x49, 0x49, 0x30,// 6	0x36
	0x01, 0x71, 0x09, 0x05, 0x03,// 7	0x37
	0x36, 0x49, 0x49, 0x49, 0x36,// 8	0x38
	0x06, 0x49, 0x49, 0x29, 0x1E,// 9	0x39
	0x00, 0x36, 0x36, 0x00, 0x00,// :	0x3A
	0x00, 0x56, 0x36, 0x00, 0x00,// ;	0x3B
	0x00, 0x08, 0x14, 0x22, 0x41,// <	0x3C
	0x14, 0x14, 0x14, 0x14, 0x14,// =	0x3D
	0x41, 0x22, 0x14, 0x08, 0x00,// >	0x3E
	0x02, 0x01, 0x51, 0x09, 0x06,// ?	0x3F
	0x32, 0x49, 0x79, 0x41, 0x3E,// @	0x40
	0x7E, 0x11, 0x11, 0x11, 0x7E,// A	0x41
	0x7F, 0x49, 0x49, 0x49, 0x36,// B	0x42
	0x3E, 0x41, 0x41, 0x41, 0x22,// C	0x43
	0x7F, 0x41, 0x41, 0x22, 0x1C,// D	0x44
	0x7F, 0x49, 0x49, 0x49, 0x41,// E	0x45
	0x7F, 0x09, 0x09, 0x01, 0x01,// F	0x46
	0x3E, 0x41, 0x41, 0x51, 0x32,// G	0x47
	0x7F, 0x08, 0x08, 0x08, 0x7F,// H	0x48
	0x00, 0x41, 0x7F, 0x41, 0x00,// I	0x49
	0x20, 0x40, 0x41, 0x3F, 0x01,// J	0x4A
	0x7F, 0x08, 0x14, 0x22, 0x41,// K	0x4B
	0x7F, 0x40, 0x40, 0x40, 0x40,// L	0x4C
	0x7F, 0x02, 0x04, 0x02, 0x7F,// M	0x4D
	0x7F, 0x04, 0x08, 0x10, 0x7F,// N	0x4E
	0x3E, 0x41, 0x41, 0x41, 0x3E,// O	0x4F
	0x7F, 0x09, 0x09, 0x09, 0x06,// P	0x50
	0x3E, 0x41, 0x51, 0x21, 0x5E,// Q	0x51
	0x7F, 0x09, 0x19, 0x29, 0x46,// R	0x52
	0x46, 0x49, 0x49, 0x49, 0x31,// S	0x53
	0x01, 0x01, 0x7F, 0x01, 0x01,// T	0x54
	0x3F, 0x40, 0x40, 0x40, 0x3F,// U	0x55
	0x1F, 0x20, 0x40, 0x20, 0x1F,// V	0x56
	0x7F, 0x20, 0x18, 0x20, 0x7F,// W	0x57
	0x63, 0x14, 0x08, 0x14, 0x63,// X	0x58
	0x03, 0x04, 0x78, 0x04, 0x03,// Y	0x59
	0x61, 0x51, 0x49, 0x45, 0x43,// Z	0x5A
	0x00, 0x00, 0x7F, 0x41, 0x41,// [	0x5B
	0x02, 0x04, 0x08, 0x10, 0x20,// "\"	0x5C
	0x41, 0x41, 0x7F, 0x00, 0x00,// ]	0x5D
	0x04, 0x02, 0x01, 0x02, 0x04,// ^	0x5E
	0x40, 0x40, 0x40, 0x40, 0x40,// _	0x5F
	0x00, 0x01, 0x02, 0x04, 0x00,// `	0x60
	0x20, 0x54, 0x54, 0x54, 0x78,// a	0x61
	0x7F, 0x48, 0x44, 0x44, 0x38,// b	0x62
	0x38, 0x44, 0x44, 0x44, 0x20,// c	0x63
	0x38, 0x44, 0x44, 0x48, 0x7F,// d	0x64
	0x38, 0x54, 0x54, 0x54, 0x18,// e	0x65
	0x08, 0x7E, 0x09, 0x01, 0x02,// f	0x66
	0x08, 0x14, 0x54, 0x54, 0x3C,// g	0x67
	0x7F, 0x08, 0x04, 0x04, 0x78,// h	0x68
	0x00, 0x44, 0x7D, 0x40, 0x00,// i	0x69
	0x20, 0x40, 0x44, 0x3D, 0x00,// j	0x6A
	0x00, 0x7F, 0x10, 0x28, 0x44,// k	0x6B
	0x00, 0x41, 0x7F, 0x40, 0x00,// l	0x6C
	0x7C, 0x04, 0x18, 0x04, 0x78,// m	0x6D
	0x7C, 0x08, 0x04, 0x04, 0x78,// n	0x6E
	0x38, 0x44, 0x44, 0x44, 0x38,// o	0x6F
	0x7C, 0x14, 0x14, 0x14, 0x08,// p	0x70
	0x08, 0x14, 0x14, 0x18, 0x7C,// q	0x71
	0x7C, 0x08, 0x04, 0x04, 0x08,// r	0x72
	0x48, 0x54, 0x54, 0x54, 0x20,// s	0x73
	0x04, 0x3F, 0x44, 0x40, 0x20,// t	0x74
	0x3C, 0x40, 0x40, 0x20, 0x7C,// u	0x75
	0x1C, 0x20, 0x40, 0x20, 0x1C,// v	0x76
	0x3C, 0x40, 0x30, 0x40, 0x3C,// w	0x77
	0x44, 0x28, 0x10, 0x28, 0x44,// x	0x78
	0x0C, 0x50, 0x50, 0x50, 0x3C,// y	0x79
	0x44, 0x64, 0x54, 0x4C, 0x44,// z	0x7A
	0x00, 0x08, 0x36, 0x41, 0x00,// {	0x7B
	0x00, 0x00, 0x7F, 0x00, 0x00,// |	0x7C
	0x00, 0x41, 0x36, 0x08, 0x00,// }	0x7D
	0x08, 0x08, 0x2A, 0x1C, 0x08,// ->	0x7E
	0x08, 0x1C, 0x2A, 0x08, 0x08, // <-	0x7F
	0x7C, 0x14, 0x14, 0x14, 0x08,//p 	0x80
	0x38, 0x44, 0x44, 0x44, 0x20,//c	0x81
	0x04, 0x04, 0x7c, 0x04, 0x04,//т	0x82
	0x0C, 0x50, 0x50, 0x50, 0x3C,//у	0x83
	0x30, 0x48, 0xfc, 0x48, 0x30,//ф	0x84
	0x44, 0x28, 0x10, 0x28, 0x44,//x	0x85
	0x7c, 0x40, 0x40, 0x40, 0xfc,//ц	0x86
	0x0c, 0x10, 0x10, 0x10, 0x7c,//ч	0x87
	0x7c, 0x40, 0x7c, 0x40, 0x7c,//ш	0x88
	0x7c, 0x40, 0x7c, 0x40, 0xfc,//щ	0x89
	0x04, 0x7c, 0x50, 0x50, 0x20,//ъ	0x8A
	0x7c, 0x50, 0x50, 0x20, 0x7c,//ы	0x8B
	0x7c, 0x50, 0x50, 0x20, 0x00,//ь	0x8C
	0x28, 0x44, 0x54, 0x54, 0x38,//э	0x8D
	0x7c, 0x10, 0x38, 0x44, 0x38,//ю	0x8E
	0x08, 0x54, 0x34, 0x14, 0x7c,//я	0x8F	
	0x7e, 0x11, 0x11, 0x11, 0x7e,//A	0x90
	0x7f, 0x49, 0x49, 0x49, 0x33,//Б	0x91
	0x7f, 0x49, 0x49, 0x49, 0x36,//В	0x92
	0x7f, 0x01, 0x01, 0x01, 0x03,//Г	0x93
	0xe0, 0x51, 0x4f, 0x41, 0xff,//Д	0x94
	0x7f, 0x49, 0x49, 0x49, 0x41,//E	0x95
	0x77, 0x08, 0x7f, 0x08, 0x77,//Ж	0x96
	0x41, 0x49, 0x49, 0x49, 0x36,//З	0x97
	0x7f, 0x10, 0x08, 0x04, 0x7f,//И	0x98
	0x7c, 0x21, 0x12, 0x09, 0x7c,//Й	0x99
	0x7f, 0x08, 0x14, 0x22, 0x41,//K	0x9A
	0x20, 0x41, 0x3f, 0x01, 0x7f,//Л	0x9B
	0x7f, 0x02, 0x0c, 0x02, 0x7f,//M	0x9C
	0x7f, 0x08, 0x08, 0x08, 0x7f,//H	0x9D
	0x3e, 0x41, 0x41, 0x41, 0x3e,//O	0x9E
	0x7f, 0x01, 0x01, 0x01, 0x7f,//П	0x9F
	0x7f, 0x09, 0x09, 0x09, 0x06,//P	0xA0
	0x3e, 0x41, 0x41, 0x41, 0x22,//C	0xA1
	0x01, 0x01, 0x7f, 0x01, 0x01,//T	0xA2
	0x47, 0x28, 0x10, 0x08, 0x07,//У	0xA3
	0x1c, 0x22, 0x7f, 0x22, 0x1c,//Ф	0xA4
	0x63, 0x14, 0x08, 0x14, 0x63,//X	0xA5
	0x7f, 0x40, 0x40, 0x40, 0xff,//Ц	0xA6
	0x07, 0x08, 0x08, 0x08, 0x7f,//Ч	0xA7
	0x7f, 0x40, 0x7f, 0x40, 0x7f,//Ш	0xA8
	0x7f, 0x40, 0x7f, 0x40, 0xff,//Щ	0xA9
	0x01, 0x7f, 0x48, 0x48, 0x30,//Ъ	0xAA
	0x7f, 0x48, 0x30, 0x00, 0x7f,//Ы	0xAB
	0x00, 0x7f, 0x48, 0x48, 0x30,//Э	0xAC
	0x22, 0x41, 0x49, 0x49, 0x3e,//Ь	0xAD
	0x7f, 0x08, 0x3e, 0x41, 0x3e,//Ю	0xAE
	0x46, 0x29, 0x19, 0x09, 0x7f,//Я	0xAF
 	0x20, 0x54, 0x54, 0x54, 0x78,//a	0xB0
	0x3c, 0x4a, 0x4a, 0x49, 0x31,//б	0xB1
	0x7c, 0x54, 0x54, 0x28, 0x00,//в	0xB2
	0x7c, 0x04, 0x04, 0x04, 0x0c,//г	0xB3
	0xe0, 0x54, 0x4c, 0x44, 0xfc,//д	0xB4
	0x38, 0x54, 0x54, 0x54, 0x18,//e	0xB5
	0x6c, 0x10, 0x7c, 0x10, 0x6c,//ж	0xB6
	0x44, 0x44, 0x54, 0x54, 0x28,//з	0xB7
	0x7c, 0x20, 0x10, 0x08, 0x7c,//и	0xB8
	0x7c, 0x41, 0x22, 0x11, 0x7c,//й	0xB9
	0x7c, 0x10, 0x28, 0x44, 0x00,//к	0xBA
	0x20, 0x44, 0x3c, 0x04, 0x7c,//л	0xBB
	0x7c, 0x08, 0x10, 0x08, 0x7c,//м	0xBC
	0x7c, 0x10, 0x10, 0x10, 0x7c,//н	0xBD
	0x38, 0x44, 0x44, 0x44, 0x38,//o	0xBE
	0x7c, 0x04, 0x04, 0x04, 0x7c,//п	0xBF
	};
#endif // FONT5X7_H

 

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

Super

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

Вот такая китайская грамота.

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Если Вы использовали Иде по ссылке выше попробуйте удалить папку Adafruit-GFX-Library-master из библиотек и папку Arduino15 из C:\Users\User\AppData\Local . Потом запустить arduino.exe из папки  с ИДЕ , а из нее открыть скетч, установить настройки Ардуино по новой и скомпилировать.

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Там в папке Adafruit-GFX-Library-master похоже нет русского , а ИДЕ ее подхватывает. Это можно посмотреть по логу компиляции внизу окна ИДЕ.