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

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

Ну Вы даете.... Еще раз

Саму ардуину и библиотеки отсюда http://srukami.inf.ua/pultoscop_v25110.html и http://srukami.inf.ua/pultoscop_v2.html . Русский шрифт находится в Adafruit GFX.

glcdfont.c

[code]
#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

[/code]

 

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

 

Что то вы не договариваете. скачал от сюда http://srukami.inf.ua/pultoscop_v25110.html скетч и библы. Убрал свои адафруит и прочее и закинул эти, скомпили, прошил. Все равно кракозябры. ладно, делаю по вашему, http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafruit-gfx-i-vyvod-russkikh-bukv-na-displei-v-kodi меняю font в адафруит, добавляю display.cp437(true); 

C:\Users\vasyna\AppData\Local\Temp\ccSoHhMZ.ltrans0.ltrans.o: In function `main':
 
ccSoHhMZ.ltrans0.o:(.text.startup+0xa0): undefined reference to `Adafruit_GFX::cp437(bool)'
 
collect2.exe: error: ld returned 1 exit status
Может все таки вы выложите свои адафруит обе (общую и под конкретный контроллер и за одно и pwm и чего там еще было). На не напрягаю, но для полноты картины. Иначе труд Ваш пропадает...
Короче весь скетч под переделку или переделывать адафруит... но меня это задрало... уже 6-й раз переписываю функции вывода, особенно с кнопками проблема, на кирилице приходится переделывать весь пересчет количества символов и размещения в кнопке.
240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

 

Все я ДОГОВАРИВАЮ думаете мне нужен "геморой" учить пользоваться программой.

Настройки и библиотеки хранятся еще здесь  C:\Users\User\AppData\Local\Arduino15

Если удалить эту папку Ардуино запустится с нуля и будет брать библиотеки из папки с  Ардуиной.

Мне выкладывать не куда. У Вас он берет скорее всего библиотеки из вышеуказанной папки, а там Вы шрифт не поменяли.

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

Выкладываю верное решени. На авторство не претендую Но скетч - болтон даже на последнем IDE.

Поехали скетч:

//страничка проекта <a href="http://srukami.inf.ua/pultoscop_v2.html" rel="nofollow">http://srukami.inf.ua/pultoscop_v2.html</a>
// форум <a href="http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783" rel="nofollow">http://arduino.ru/forum/proekty/pultoskop-na-arduino-27mgts?page=12#comment-175783</a>
// скетч и библиотеку изменил под LCD_ls020 VetalST
// скетч и библиотеку изменил под LCD 1.8 дюйма 160х128 ST7735 Владимир Иванов ( 240265 )
// LCD_ls020 подключаем:
// к ардуине на ATmega328
//**********************************************************
#include <Adafruit_GFX.h>    //https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_ST7735.h> //https://github.com/adafruit/Adafruit-ST7735-Library
#include <SPI.h>
#include <FreqCount.h> //http://www.pjrc.com/teensy/td_libs_FreqCount.html
#include <PWM.h> //https://puzzlebox.io/orbit/development/browser/orbit/arduino/libraries/PWM/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
int32_t 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;
int 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;

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}


//********************* ОТРИСОВКА ЛИНИИ *********************************
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(utf8rus("СИНУС"));
    tft.setCursor(35, 50);
    tft.println(utf8rus("ТРЕУГОЛЬНИК"));
    tft.setCursor(35, 70);
    tft.println(utf8rus("ПИЛА"));
    tft.setCursor(35, 90);
    tft.println(utf8rus("ПИЛА ОБР"));
}

//***************** ОТРИСОВКА В ПАУЗЕ ОСЦИЛОГРАФА *******************
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( utf8rus("Разв"));
        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(utf8rus("Осцилограф"));
       tft.setCursor(35, 55);
       tft.println(utf8rus("Генератор PWM"));
       tft.setCursor(35, 85);
        tft.println(utf8rus("Генератор DDS"));
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println(utf8rus("Батарея ="));
      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(){
  tft.cp437(true);
  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(utf8rus("Осцилограф"));

    }

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

     if(pultoskop==3){
      GlavMenu ();
       tft.setCursor(35, 85);
       tft.setTextColor(ST7735_RED);
       tft.println(utf8rus("Генератор 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( utf8rus("Синх-ция"));
        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( utf8rus("ПАУЗА"));
      }
        }

      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>=6){
          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=0;

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

        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){//выбор  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=10;

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

    delay(400);
    while(!(PIND & (1<<PIND2))){
    PWM=sinM[d];
    pwmWrite(dds,PWM);
    //delayMicroseconds(fr);
    d++;
    if(d==32){d=0;}}
     menuDDS++;
  }
if(menuDDS==1){
  DDS_Menu ();
    tft.setCursor(35, 50);
    tft.setTextColor(ST7735_RED);
    tft.println(utf8rus("ТРЕУГОЛЬНИК"));

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
  }
if(menuDDS==2){
  DDS_Menu ();

    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70);
    tft.println(utf8rus("ПИЛА"));

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==3){
  DDS_Menu ();

    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_RED);
    tft.println(utf8rus("ПИЛА ОБР"));

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
  }
if(menuDDS==4){menuDDS=0;}
}
}
/////////////////////DDS
}

Отдельно выложу либы: https://www.dropbox.com/s/ymq79p9fpucdkdv/lib.7z?dl=0

Они же с источников

 
Использовал простую версию, от туда же взял и glcdfont.c
#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, 
0x3E, 0x55, 0x51, 0x55, 0x3E, 
0x3E, 0x6B, 0x6F, 0x6B, 0x3E, 
0x0C, 0x1E, 0x3C, 0x1E, 0x0C, 
0x08, 0x1C, 0x3E, 0x1C, 0x08, 
0x1C, 0x4A, 0x7F, 0x4A, 0x1C, 
0x18, 0x5C, 0x7F, 0x5C, 0x18, 
0x00, 0x1C, 0x1C, 0x1C, 0x00, 
0x7F, 0x63, 0x63, 0x63, 0x7F, 
0x00, 0x1C, 0x14, 0x1C, 0x00, 
0x7F, 0x63, 0x6B, 0x63, 0x7F, 
0x30, 0x48, 0x4D, 0x33, 0x07, 
0x06, 0x29, 0x79, 0x29, 0x06, 
0x20, 0x50, 0x3F, 0x02, 0x0C, 
0x60, 0x7F, 0x05, 0x35, 0x3F, 
0x2A, 0x1C, 0x77, 0x1C, 0x2A, 
0x00, 0x7F, 0x3E, 0x1C, 0x08, 
0x08, 0x1C, 0x3E, 0x7F, 0x00, 
0x14, 0x22, 0x7F, 0x22, 0x14, 
0x00, 0x5F, 0x00, 0x5F, 0x00, 
0x06, 0x09, 0x7F, 0x01, 0x7F, 
0x4A, 0x55, 0x55, 0x55, 0x29, 
0x60, 0x60, 0x60, 0x60, 0x60, 
0x54, 0x62, 0x7F, 0x62, 0x54, 
0x08, 0x04, 0x7E, 0x04, 0x08, 
0x08, 0x10, 0x3F, 0x10, 0x08, 
0x08, 0x08, 0x2A, 0x1C, 0x08, 
0x08, 0x1C, 0x2A, 0x08, 0x08, 
0x1C, 0x10, 0x10, 0x10, 0x10, 
0x1C, 0x3E, 0x08, 0x3E, 0x1C, 
0x30, 0x3C, 0x3F, 0x3C, 0x30, 
0x06, 0x1E, 0x7E, 0x1E, 0x06, 
0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x5F, 0x00, 0x00, 
0x00, 0x07, 0x00, 0x07, 0x00, 
0x14, 0x7F, 0x14, 0x7F, 0x14, 
0x24, 0x2A, 0x7F, 0x2A, 0x12, 
0x23, 0x13, 0x08, 0x64, 0x62, 
0x36, 0x49, 0x56, 0x20, 0x50, 
0x00, 0x00, 0x07, 0x00, 0x00, 
0x00, 0x1C, 0x22, 0x41, 0x00, 
0x00, 0x41, 0x22, 0x1C, 0x00, 
0x14, 0x08, 0x3E, 0x08, 0x14, 
0x08, 0x08, 0x3E, 0x08, 0x08, 
0x00, 0xA0, 0x60, 0x00, 0x00, 
0x08, 0x08, 0x08, 0x08, 0x08, 
0x00, 0x60, 0x60, 0x00, 0x00, 
0x20, 0x10, 0x08, 0x04, 0x02, 
0x3E, 0x51, 0x49, 0x45, 0x3E, 
0x44, 0x42, 0x7F, 0x40, 0x40, 
0x42, 0x61, 0x51, 0x49, 0x46, 
0x21, 0x41, 0x45, 0x4B, 0x31, 
0x18, 0x14, 0x12, 0x7F, 0x10, 
0x27, 0x45, 0x45, 0x45, 0x39, 
0x3C, 0x4A, 0x49, 0x49, 0x30, 
0x01, 0x71, 0x09, 0x05, 0x03, 
0x36, 0x49, 0x49, 0x49, 0x36, 
0x06, 0x49, 0x49, 0x29, 0x1E, 
0x00, 0x6C, 0x6C, 0x00, 0x00, 
0x00, 0xAC, 0x6C, 0x00, 0x00, 
0x08, 0x14, 0x22, 0x41, 0x00, 
0x14, 0x14, 0x14, 0x14, 0x14, 
0x00, 0x41, 0x22, 0x14, 0x08, 
0x02, 0x01, 0x51, 0x09, 0x06, 
0x3E, 0x41, 0x5D, 0x55, 0x5E, 
0x7C, 0x12, 0x11, 0x12, 0x7C, 
0x7F, 0x49, 0x49, 0x49, 0x36, 
0x3E, 0x41, 0x41, 0x41, 0x22, 
0x7F, 0x41, 0x41, 0x22, 0x1C, 
0x7F, 0x49, 0x49, 0x49, 0x41, 
0x7F, 0x09, 0x09, 0x09, 0x01, 
0x3E, 0x41, 0x49, 0x49, 0x7A, 
0x7F, 0x08, 0x08, 0x08, 0x7F, 
0x00, 0x41, 0x7F, 0x41, 0x00, 
0x20, 0x40, 0x41, 0x3F, 0x01, 
0x7F, 0x08, 0x14, 0x22, 0x41, 
0x7F, 0x40, 0x40, 0x40, 0x60, 
0x7F, 0x02, 0x0C, 0x02, 0x7F, 
0x7F, 0x04, 0x08, 0x10, 0x7F, 
0x3E, 0x41, 0x41, 0x41, 0x3E, 
0x7F, 0x09, 0x09, 0x09, 0x06, 
0x3E, 0x41, 0x51, 0x21, 0x5E, 
0x7F, 0x09, 0x19, 0x29, 0x46, 
0x46, 0x49, 0x49, 0x49, 0x31, 
0x03, 0x01, 0x7F, 0x01, 0x03, 
0x3F, 0x40, 0x40, 0x40, 0x3F, 
0x1F, 0x20, 0x40, 0x20, 0x1F, 
0x3F, 0x40, 0x3C, 0x40, 0x3F, 
0x63, 0x14, 0x08, 0x14, 0x63, 
0x07, 0x08, 0x70, 0x08, 0x07, 
0x61, 0x51, 0x49, 0x45, 0x43, 
0x00, 0x7F, 0x41, 0x41, 0x00, 
0x02, 0x04, 0x08, 0x10, 0x20, 
0x00, 0x41, 0x41, 0x7F, 0x00, 
0x04, 0x02, 0x01, 0x02, 0x04, 
0x40, 0x40, 0x40, 0x40, 0x40, 
0x00, 0x01, 0x02, 0x04, 0x00, 
0x20, 0x54, 0x54, 0x54, 0x78, 
0x7F, 0x48, 0x44, 0x44, 0x38, 
0x38, 0x44, 0x44, 0x44, 0x48, 
0x38, 0x44, 0x44, 0x48, 0x7F, 
0x38, 0x54, 0x54, 0x54, 0x18, 
0x08, 0x7E, 0x09, 0x01, 0x02, 
0x08, 0x54, 0x54, 0x58, 0x3C, 
0x7F, 0x08, 0x04, 0x04, 0x78, 
0x00, 0x44, 0x7D, 0x40, 0x00, 
0x20, 0x40, 0x44, 0x3D, 0x00, 
0x7F, 0x10, 0x10, 0x28, 0x44, 
0x00, 0x41, 0x7F, 0x40, 0x00, 
0x7C, 0x04, 0x78, 0x04, 0x78, 
0x7C, 0x08, 0x04, 0x04, 0x78, 
0x38, 0x44, 0x44, 0x44, 0x38, 
0x7C, 0x14, 0x14, 0x14, 0x08, 
0x08, 0x14, 0x14, 0x0C, 0x7C, 
0x7C, 0x08, 0x04, 0x04, 0x08, 
0x48, 0x54, 0x54, 0x54, 0x24, 
0x04, 0x3F, 0x44, 0x40, 0x20, 
0x3C, 0x40, 0x40, 0x20, 0x7C, 
0x1C, 0x20, 0x40, 0x20, 0x1C, 
0x3C, 0x40, 0x38, 0x40, 0x3C, 
0x44, 0x28, 0x10, 0x28, 0x44, 
0x0C, 0x50, 0x50, 0x50, 0x3C, 
0x44, 0x64, 0x54, 0x4C, 0x44, 
0x00, 0x08, 0x36, 0x41, 0x00, 
0x00, 0x00, 0x7F, 0x00, 0x00, 
0x00, 0x41, 0x36, 0x08, 0x00, 
0x02, 0x01, 0x02, 0x04, 0x02, 
0x70, 0x48, 0x44, 0x48, 0x70, 
0x00, 0x0E, 0x11, 0x0E, 0x00, 
0x00, 0x12, 0x1F, 0x10, 0x00, 
0x00, 0x12, 0x19, 0x16, 0x00, 
0x00, 0x11, 0x15, 0x0B, 0x00, 
0x00, 0x07, 0x04, 0x1F, 0x00, 
0x00, 0x17, 0x15, 0x09, 0x00, 
0x00, 0x0E, 0x15, 0x09, 0x00, 
0x00, 0x01, 0x1D, 0x03, 0x00, 
0x00, 0x0A, 0x15, 0x0A, 0x00, 
0x00, 0x12, 0x15, 0x0E, 0x00, 
0x00, 0x04, 0x04, 0x04, 0x00, 
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
0x3E, 0x00, 0x00, 0x00, 0x00, 
0x3E, 0x3E, 0x00, 0x00, 0x00, 
0x3E, 0x3E, 0x00, 0x3E, 0x00, 
0x3E, 0x3E, 0x00, 0x3E, 0x3E, 
0x80, 0x80, 0x80, 0x80, 0x80, 
0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 
0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 
0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 
0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 
0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 
0x40, 0x00, 0x40, 0x00, 0x40, 
0x60, 0x00, 0x40, 0x00, 0x40, 
0x60, 0x00, 0x70, 0x00, 0x40, 
0x60, 0x00, 0x70, 0x00, 0x78, 
0x7C, 0x00, 0x40, 0x00, 0x40, 
0x7C, 0x00, 0x7E, 0x00, 0x40, 
0x7C, 0x00, 0x7E, 0x00, 0x7F, 
0x1C, 0x77, 0x41, 0x41, 0x41, 
0x41, 0x41, 0x41, 0x41, 0x41, 
0x41, 0x41, 0x41, 0x7F, 0x00, 
0x1C, 0x77, 0x41, 0x5D, 0x5D, 
0x41, 0x41, 0x41, 0x5D, 0x5D, 
0x5D, 0x5D, 0x41, 0x5D, 0x5D, 
0x5D, 0x5D, 0x41, 0x7F, 0x00, 
0x22, 0x1C, 0x14, 0x1C, 0x22, 
0x00, 0x08, 0x1C, 0x08, 0x00, 
0x00, 0x00, 0x77, 0x00, 0x00, 
0x46, 0x5D, 0x55, 0x5D, 0x31, 
0x7C, 0x55, 0x54, 0x55, 0x44, 
0x08, 0x08, 0x2A, 0x08, 0x08, 
0x00, 0x14, 0x08, 0x14, 0x00, 
0x08, 0x14, 0x22, 0x08, 0x14, 
0x7F, 0x41, 0x71, 0x31, 0x1F, 
0x03, 0x05, 0x7F, 0x05, 0x03, 
0x22, 0x14, 0x7F, 0x55, 0x22, 
0x02, 0x55, 0x7D, 0x05, 0x02, 
0x06, 0x09, 0x09, 0x06, 0x00, 
0x44, 0x44, 0x5F, 0x44, 0x44, 
0x1C, 0x14, 0x1C, 0x22, 0x7F, 
0x20, 0x3E, 0x61, 0x3E, 0x20, 
0x20, 0x50, 0x3F, 0x02, 0x0C, 
0x80, 0x7C, 0x20, 0x3C, 0x40, 
0x44, 0x3C, 0x04, 0x7C, 0x44, 
0x00, 0x00, 0x08, 0x00, 0x00, 
0x38, 0x55, 0x54, 0x55, 0x18, 
0x7E, 0x08, 0x10, 0x7F, 0x01, 
0x08, 0x10, 0x08, 0x04, 0x02, 
0x14, 0x08, 0x22, 0x14, 0x08, 
0x0E, 0x06, 0x0A, 0x10, 0x20, 
0x20, 0x10, 0x0A, 0x06, 0x0E, 
0x38, 0x30, 0x28, 0x04, 0x02, 
0x02, 0x04, 0x28, 0x30, 0x38, 
0x7E, 0x11, 0x11, 0x11, 0x7E, 
0x7F, 0x49, 0x49, 0x49, 0x31, 
0x7F, 0x49, 0x49, 0x49, 0x36, 
0x7F, 0x01, 0x01, 0x01, 0x03, 
0xC0, 0x7F, 0x41, 0x7F, 0xC0, 
0x7F, 0x49, 0x49, 0x49, 0x41, 
0x77, 0x08, 0x7F, 0x08, 0x77, 
0x41, 0x49, 0x49, 0x49, 0x36, 
0x7F, 0x10, 0x08, 0x04, 0x7F, 
0x7C, 0x21, 0x12, 0x09, 0x7C, 
0x7F, 0x08, 0x14, 0x22, 0x41, 
0x40, 0x3E, 0x01, 0x01, 0x7F, 
0x7F, 0x02, 0x0C, 0x02, 0x7F, 
0x7F, 0x08, 0x08, 0x08, 0x7F, 
0x3E, 0x41, 0x41, 0x41, 0x3E, 
0x7F, 0x01, 0x01, 0x01, 0x7F, 
0x7F, 0x09, 0x09, 0x09, 0x06, 
0x3E, 0x41, 0x41, 0x41, 0x22, 
0x01, 0x01, 0x7F, 0x01, 0x01, 
0x07, 0x48, 0x48, 0x48, 0x3F, 
0x0E, 0x11, 0x7F, 0x11, 0x0E, 
0x63, 0x14, 0x08, 0x14, 0x63, 
0x7F, 0x40, 0x40, 0x7F, 0xC0, 
0x07, 0x08, 0x08, 0x08, 0x7F, 
0x7F, 0x40, 0x7F, 0x40, 0x7F, 
0x7F, 0x40, 0x7F, 0x40, 0xFF, 
0x01, 0x7F, 0x48, 0x48, 0x30, 
0x7F, 0x48, 0x48, 0x30, 0x7F, 
0x7F, 0x48, 0x48, 0x48, 0x30, 
0x22, 0x41, 0x49, 0x49, 0x3E, 
0x7F, 0x08, 0x3E, 0x41, 0x3E, 
0x46, 0x29, 0x19, 0x09, 0x7F, 
0x20, 0x54, 0x54, 0x54, 0x78, 
0x3C, 0x4A, 0x4A, 0x49, 0x31, 
0x7C, 0x54, 0x54, 0x54, 0x28, 
0x7C, 0x04, 0x04, 0x04, 0x0C, 
0xC0, 0x78, 0x44, 0x7C, 0xC0, 
0x38, 0x54, 0x54, 0x54, 0x18, 
0x6C, 0x10, 0x7C, 0x10, 0x6C, 
0x44, 0x54, 0x54, 0x54, 0x28, 
0x7C, 0x20, 0x10, 0x08, 0x7C, 
0x7C, 0x40, 0x26, 0x10, 0x7C, 
0x7C, 0x10, 0x10, 0x28, 0x44, 
0x40, 0x38, 0x04, 0x04, 0x7C, 
0x7C, 0x08, 0x10, 0x08, 0x7C, 
0x7C, 0x10, 0x10, 0x10, 0x7C, 
0x38, 0x44, 0x44, 0x44, 0x38, 
0x7C, 0x04, 0x04, 0x04, 0x7C, 
0x7C, 0x14, 0x14, 0x14, 0x08, 
0x38, 0x44, 0x44, 0x44, 0x48, 
0x04, 0x04, 0x7C, 0x04, 0x04, 
0x0C, 0x50, 0x50, 0x50, 0x3C, 
0x18, 0x24, 0xFC, 0x24, 0x18, 
0x44, 0x28, 0x10, 0x28, 0x44, 
0x7C, 0x40, 0x40, 0x7C, 0xC0, 
0x0C, 0x10, 0x10, 0x10, 0x7C, 
0x7C, 0x40, 0x7C, 0x40, 0x7C, 
0x7C, 0x40, 0x7C, 0x40, 0xFC, 
0x04, 0x7C, 0x50, 0x50, 0x20, 
0x7C, 0x50, 0x50, 0x20, 0x7C, 
0x7C, 0x50, 0x50, 0x50, 0x20, 
0x28, 0x44, 0x54, 0x54, 0x38, 
0x7C, 0x10, 0x38, 0x44, 0x38, 
0x48, 0x34, 0x14, 0x14, 0x7C
};
#endif // FONT5X7_H

 

Все скомпилено на 1.6.13 и все отменно работает. Сходу видно некоторые места где используется одни и те же стринги которые можно былобы задефайнить, но я синюшный в дрын и ломает... сам аппарат покажу как будет спроектирован и отпечатан корпус.

Вот схема подключения:

 

Еще раз - на авторство не претендую. Камраду 240265, спасибо огромное. Все таки уследил, а я забросил.

PS. Корпус планируется со свободным местом и православным BNC разъемом с местом под схему ОУ, если к таковой по итогу кто-то дельно определится. Всем кто работал над пультоскопом спасибо!

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

240265 пишет:

 

Все я ДОГОВАРИВАЮ думаете мне нужен "геморой" учить пользоваться программой.

Настройки и библиотеки хранятся еще здесь  C:\Users\User\AppData\Local\Arduino15

Если удалить эту папку Ардуино запустится с нуля и будет брать библиотеки из папки с  Ардуиной.

Мне выкладывать не куда. У Вас он берет скорее всего библиотеки из вышеуказанной папки, а там Вы шрифт не поменяли.

Библы хранятся у меня в одной папке.

Такой папки C:\Users\User\AppData\Local\Arduino15 у меня и нет. Все настройки ардуино иде лежат в папке с дунькой, либы лежат в папке в дропбоксе. Решение задачи болт он выше. Вам спасибо, но в след раз доведите дело до конца. Я буду Вам в 2 раза больше пизнательней.

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

Не знаю как у Вас , но у меня все без "болтов" работает.

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

240265 пишет:

Не знаю как у Вас , но у меня все без "болтов" работает.

Еще раз. Скет Ваш откомпилился, но пришлось в сток докинуть 4 библиотеки. А следовательно их надо было еще найти. Потом оказалось что надо или русифицировать по нормальному adafruit (я уже е раз переделывал бибу под русификатор, чтобы не заморачиваться с лишним вызовом перекодировки, но я более или менее слежу за обновлениями библиотек и временами забываю сделать бэкап и потом просто перенести эти места правки в новую версию, да и задрало, за год 4 раза уже это делал). Т.е. не взял и расслабился, а допилинг и допилинг. Я де выложил полностью болтон решение. Скачай и радуйся.

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

Так Я же давал ссылку на сайт Автора. Там есть все нужные либы и русифцираваная тоже.

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

240265 пишет:

Так Я же давал ссылку на сайт Автора. Там есть все нужные либы и русифцираваная тоже.

Нет там руссифицированной версии.

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

Скачайте весь пакет ардуины arduino-1.6.5-r5 там ЕСТЬ русский glcdfont.c я его выкладывал пост 2351.

Вот еще раз из того архива  Adafruit_GFX_Library - glcdfont.c

#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

 

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Полагаю, разногласия по библиотекам могут быть (и очень даже бывают) изза того, что они (библиотеки), к сожалению, бывают в двух местах (а если добавлен ещё и "stm32duino" блок, то и в трёх). За этим надо следить. При чём, если соглашатся на авто апдейты библиотек, то там опять не факт куда пойдёт новая версия. Я, если не уверен, что творитса с библиотеками, откладываю в сторонку все нужные библиотекти, снимаю софт Arduino, стираю вручную Program Files (x86)/Arduino, AppData/Local/Arduino(XX), Documents/Arduino, ну и ставим по новой, и следим где держть библиотеки.

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

240265 пишет:

Скачайте весь пакет ардуины arduino-1.6.5-r5 там ЕСТЬ русский glcdfont.c я его выкладывал пост 2351.

Вот еще раз из того архива  Adafruit_GFX_Library - glcdfont.c

Да, но толку от шрифта если библа нормально кирилицу не хавает. Для этого и есть функция utf8rus. Я ее встаривал во все функции адафруита где выводится текст. Но надоело.

Ладно. Больше не будем отвлекаться и мусорить. Готовый пакет есть и этого хватит.

zz11ss
Offline
Зарегистрирован: 19.12.2016

Ну вроде получилось, сейчас сам выбирает осциллограф в меню, все настройки в EEPROM, коэффициент делителя и коэффициент заполнения показует и главное работоспособен.Скрин вот:

bpl
Offline
Зарегистрирован: 15.02.2016

Крутотень

А остальной функционал на месте.

О скетче, схеме и библах, будем мечтать.

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

zz11ss пишет:

Ну вроде получилось, сейчас сам выбирает осциллограф в меню, все настройки в EEPROM, коэффициент делителя и коэффициент заполнения показует и главное работоспособен.Скрин вот:

приколько получилось, не поделитесь исходниками?)приехал сегодня дисплей 5110 думаю маленький ослик еще сделать

zz11ss
Offline
Зарегистрирован: 19.12.2016

Ну адаптировал скетч под экран без выкрутасов, у меня сами видете как,поэтому не проверял, если что подправить не сложно,кратенько-при первом запуске пишет в eeprom настройки и по адресу 0 eeprom,запоминает что уже запускался,поэтому если в ячейке 1 то нужно комментировать строки 85 и 93 запустить и после опять запрограммировать исходник, A1 - контакт управления подсветкой, все остальное стандартно, коэффициент заполнения считывается при появлении импульсов затем просто переписывается без подсчета пока не исчезнет сигнал и появится вновь.

//Страница проэкта  http://srukami.inf.ua/pultoscop_v25110.html
#include <EEPROM.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <FreqCount.h> 
#include <PWM.h>
#include <CyberLib.h>
#define led  9   //пин для генератора сигналов (не менять)
#define dds  10   //пин для генератора dds (не менять)
//#################№№№№№№####пользовательские настройки
//#define power 8   //пин который опрашивает кнопку включения
#define OFF 14    //пин который управляет ключем питания
#define  timepowerON 50 //время удержания кнопки выключения
#define levo 4   //кнопка ЛЕВО(можно любой пин)
#define ok 3     //кнопка ОК(можно любой пин)
#define pravo 2  //кнопка ПРАВО(можно любой пин)
#define akb A2    //любой своюодный аналоговый пин для измерения напряжения АКБ
#define LCDPin A1 //выход на контакт подсветки LCD 
#define overclock 16  //Частота на которой работает Ардуино 
//Adafruit_PCD8544(CLK, DIN, DC, CS, RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(13, 12, 7, A0, 8);//пины к которым у вас подключен дисплей         
byte cont=52;     //контрастность дисплея
byte SinU=30;     //уровень синхронизации 0 до 255
byte mode=0;      //первое включение mode=255 в EEPROM  
int PWM = 128;    //стартовое значение ШИМ от 0 до 255        
int32_t frequency = 500; //стартовое значение частоты в Гц
float VCC=5.0;    //напряжение питания, меряем мультиметром
//###########################################################
int d=0;
byte menuDDS=0; 
byte menuLight=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};
int powerON=0;//состояние кнопки питания
byte hag=0;
int mnog=0;
boolean flag=0;
byte mass[701];
byte x=0; 
byte menu=0;//переменная выбора меню 
bool opornoe=1; //флаг опорного напряжения
bool kzap=0; //флаг коэффициента заполнения
bool paus=0; //флаг режима паузы
byte pultoskop=0; //флаг выбора генератора или осциллографа
byte razv=6;  
unsigned long count =0;
byte sinX=30; 
byte meaX=83;
int Vmax=0;         // максимальное напряжение 
int mno=1;
byte sinhMASS=0;
long countX=0;
long speedTTL=9600; //скорость терминала 
int prokr=0;
int osc=150;
int s_mno= 1;
boolean lcd=false;
uint32_t tic1;
uint32_t tic2;
int duty;

 // /*
 void reads(){
  razv = EEPROM.read(1);    // читаем длину разверстки из еепром
  SinU = EEPROM.read(2);    // читаем режим разверстки из еепром
  menu = EEPROM.read(3);    // читаем menu из еепром
  s_mno = EEPROM.read(4);
  lcd = EEPROM.read(5);     // читаем режим подсветки из еепром
  }
 // */ 

void setup(){ 
pinMode(A4,INPUT);
pinMode(LCDPin, OUTPUT);  // подсветка дисплея
digitalWrite(OFF,HIGH);   //включем питание 
//Serial.begin(9600);
display.begin();
display.setContrast(cont);
//display.setRotation(true);
 // /*
      //При 1-м включении запомнить в EEPROM длину разверстки
  mode = EEPROM.read(0);    // читаем режим из еепром
  if (mode =! 1) {          //. закомментировать если не программируется
  mode = 1;                 // проверяем значение в еепром
   EEPROM.write(1, razv);
   EEPROM.write(2, SinU);
   EEPROM.write(3, menu);
   EEPROM.write(4, s_mno);
   EEPROM.write(5, lcd);
   EEPROM.write(0, mode);              // пишим его в еепром
  }                         //. закомментировать если не программируется
   reads(); 
    if (lcd==true) digitalWrite(LCDPin,HIGH);
     else digitalWrite(LCDPin,LOW);
 // */  
                  
while(digitalRead(ok)==LOW){
  
     // Если не нажата 10 сек кнопка ок в режим осцилоографа автоматом
   osc--;
    if (osc==0) break;
/////////////////////////////////////////удержание кнопки отключения
//if(digitalRead(power)==HIGH){powerON++;delay(10);}  
//if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения
        
  if(pultoskop==0){
    display.clearDisplay();
    display.setCursor(10,0);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Осциллограф");
    display.setCursor(10,10);
    display.setTextColor(BLACK); 
    display.println("Генератор");
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setCursor(10,30);
    display.println("Подсветка");
    display.setCursor(0,40);
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");    
  }
    if(pultoskop==1){
    display.clearDisplay();
    display.setCursor(10,0);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Осциллограф");
    display.setCursor(10,10);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Генератор");
    display.setTextColor(BLACK); // 'inverted' text;
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setCursor(10,30);
    display.println("Подсветка");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");   
  } 
    if(pultoskop==2){
    display.clearDisplay();
    display.setCursor(10,00);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Осциллограф");
    display.setCursor(10,10);
    display.println("Генератор");
    display.setTextColor(WHITE, BLACK); // 'inverted' text;
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setTextColor(BLACK);
    display.setCursor(10,30);
    display.println("Подсветка");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");   
    }
        if(pultoskop==3){
    display.clearDisplay();
    display.setCursor(10,00);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Осциллограф");
    display.setCursor(10,10);
    display.println("Генератор");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("DDSгенератор");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,30);
    display.println("Подсветка");
    display.setCursor(0,40);
    display.setTextColor(BLACK); 
    display.print("Батарея=");
    display.print(analogRead(akb)*5.0/1024);
    display.print("В");   
    }
if(digitalRead(levo)==HIGH){delay(300);pultoskop=pultoskop+1;}
if(digitalRead(pravo)==HIGH){delay(300);pultoskop=pultoskop+1;}
if(pultoskop>3){pultoskop=0;}
delay(50);  
display.display(); }
if(pultoskop==2){InitTimersSafe(); bool success = SetPinFrequencySafe(led,200000);}
if(pultoskop==0){FreqCount.begin(1000);}
if(pultoskop==1){InitTimersSafe(); bool success = SetPinFrequencySafe(led, frequency);}
display.setTextColor(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<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 loop() {
/////////////////////////////////////////удержание кнопки отключения
//if(digitalRead(power)==HIGH){powerON++;delay(10);}  
//if(powerON>=timepowerON){digitalWrite(OFF,LOW);}///отключаем питание
/////////////////////////////////////////удержание кнопки отключения    
if(pultoskop==0){  
if(opornoe==0){ADMUX = 0b11100011;}//выбор внутреннего опорного 1,1В & A3 пин осциллографа
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(78,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);
    if (s_mno==1) {mno=1;display.print("x1");}
    if (s_mno==2) {mno=3;display.print("x3");}
    if (s_mno==3) {mno=3;display.print("x9");}
    display.print("П");
    if(digitalRead(levo)==HIGH){opornoe=!opornoe;}
    if(digitalRead(pravo)==HIGH){opornoe=!opornoe;}    
}
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
    if (s_mno==1) {mno=1;display.print("x1");}
    if (s_mno==2) {mno=3;display.print("x3");}
    if (s_mno==3) {mno=10;display.print("x9");}
    display.print("П");
    if(digitalRead(levo)==HIGH){razv=razv-1;if(razv==255){razv=0;}EEPROM.write(1, razv);}
    if(digitalRead(pravo)==HIGH){razv=razv+1;if(razv==9){razv=8;}EEPROM.write(1, razv);}
}
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
    if (s_mno==1) {mno=1;display.print("x1");}
    if (s_mno==2) {mno=3;display.print("x3");}
    if (s_mno==3) {mno=10;display.print("x9");}
    display.setTextColor( BLACK); // 'inverted' text 
    display.print("П");
    if(digitalRead(levo)==HIGH){s_mno--;if (s_mno<1) s_mno=1;EEPROM.write(4, s_mno);}
    if(digitalRead(pravo)==HIGH){s_mno++;if (s_mno>3) s_mno=3;EEPROM.write(4, s_mno);}   
}
if(menu==3){
    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);
    if (s_mno==1) {mno=1;display.print("x1");}
    if (s_mno==2) {mno=3;display.print("x3");}
    if (s_mno==3) {mno=10;display.print("x9");}
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print("П");
    paus=1;
    if(digitalRead(levo)==HIGH){prokr=prokr-10;if(prokr<0){prokr=0;}}
    if(digitalRead(pravo)==HIGH){prokr=prokr+10;if(prokr>620){prokr=620;}}    
}
if(menu==4){
    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);
    if (s_mno==1) {mno=1;display.print("x1");}
    if (s_mno==2) {mno=3;display.print("x3");}
    if (s_mno==3) {mno=10;display.print("x9");}
    display.setTextColor(BLACK);
    display.print("П");
    if(digitalRead(levo)==HIGH){SinU=SinU-20;if(SinU<20){SinU=20;}EEPROM.write(2, SinU);}
    if(digitalRead(pravo)==HIGH){SinU=SinU+20;if(SinU>230){SinU=230;}EEPROM.write(2, SinU);}   
    display.fillCircle(78,47-SinU/7, 5, BLACK);
    display.fillCircle(78,47-SinU/7, 2, WHITE); 
}
if(digitalRead(ok)==HIGH){menu++;if(menu==5){menu=0;paus=0;}EEPROM.write(3, menu);}//перебор меню
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(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)*mno,1);}
if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK);
display.print((Vmax*1.1/255)*mno,1);}
display.print("v");
if (countX < 10) kzap=true;
if (kzap==true && countX > 10){
FreqCount.end();
tic1 = asm_func(1);
tic2 = asm_func(0);
duty=(1/((float)tic1/tic2))*100;
kzap=false;
FreqCount.begin(1000);
}
if (kzap==false && countX > 10 && duty < 100){
display.setCursor(4,9);
display.setTextColor(BLACK);
display.print(duty);
display.print("%"); 
}
//#######################################отрисовка menu
delay(150);  
display.display();
}
if(pultoskop==1){Generator();}
if(pultoskop==2){DDSGenerator();}
if(pultoskop==3){Light();}
}
//#######################################режим ренератора
void Generator(){
display.clearDisplay();  
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }
            if(digitalRead(pravo)==HIGH){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
            if(digitalRead(levo)==HIGH){
              PWM=PWM-1;
              if(PWM<0){PWM=255;} 
              delay(3);//защита от дребезга
            
            }
            if(digitalRead(pravo)==HIGH){
              PWM=PWM+1;
              if(PWM>255){PWM=0;} 
              delay(3);//защита от дребезга 
            }  
}      
if(digitalRead(ok)==HIGH){//переключение разряда выбора частоты 
  delay(3);//защита от дребезга
  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=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=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=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=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==4){menuDDS=0;}

}
/////////////////////DDS
void(* resetFunc) (void) = 0;             // объявляем функцию reset с адресом 0
/////////////////////Меню Light
void Light(){
    if(menuLight==0){
    display.clearDisplay();
    display.setCursor(3,5);
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.println("Подсветка LCD");
    display.setCursor(26,16);
    display.setTextColor(BLACK);
     if (lcd==true) {display.println(" ON");
      }else display.println("OFF");
    display.setCursor(3,25);
    display.println("Reboot");
    }
    if(menuLight==1){
    display.clearDisplay();
    display.setCursor(3,5);
    display.setTextColor(BLACK); // 'inverted' text
    display.println("Подсветка LCD");
    display.setCursor(26,16);
     if (lcd==true) {display.println(" ON");
      }else display.println("OFF");
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.setCursor(3,25);
    display.println("Reboot");
    }    
if(digitalRead(ok)==HIGH){delay(150);menuLight=menuLight+1;}
if(menuLight>1){menuLight=0;}
if ((menuLight==0)&&(digitalRead(pravo)==HIGH)) {lcd=true;digitalWrite(LCDPin,HIGH);EEPROM.write(5, lcd);}
if ((menuLight==0)&&(digitalRead(levo)==HIGH))  {lcd=false;digitalWrite(LCDPin,LOW);EEPROM.write(5, lcd);}
if ((menuLight==1)&&(digitalRead(pravo)==HIGH)) resetFunc();
if ((menuLight==1)&&(digitalRead(levo)==HIGH))  resetFunc();                   //вызываем reset
delay(150);  
display.display();  
}
/////////////////////Меню Light

/////////////////////Коэффициент заполнения
uint32_t asm_func(uint8_t flag){
asm volatile (         
"cli"                    "\n\t"
"mov r21,%0"    "\n\t" // флаг что считывать
//сохранение конфигурация таймеров
"in  r30,0x23"            "\n\t" // r30 <- GTCCR
"ldi r18,0x83"            "\n\t" // GTCCR=0x83
"out 0x23,r18"            "\n\t" // GTCCR=0x83
"lds r26,0x80"            "\n\t" // r26 <- TCCR1A
"sts 0x80,__zero_reg__"   "\n\t" // TCCR1A=0
"lds r27,0x81"            "\n\t" // r27 <- TCCR1B
"ldi r19,0x4"             "\n\t" 
"sts 0x81,r19"            "\n\t" // TCCR1B=1<<CS12
"sts 0x85, __zero_reg__"  "\n\t" //TCNT1L=0
"sts 0x84, __zero_reg__"  "\n\t" //TCNT1H=0
"lds r28,0xB0"            "\n\t" // r28 <- TCCR2A
"sts 0xB0,__zero_reg__"   "\n\t" // TCCR2A=0
"lds r29,0xB1"            "\n\t" // r29 <- TCCR2B
"ldi r20,0x1"             "\n\t" 
"sts 0xB1,r20"            "\n\t" // TCCR2B=1<<CS20
"sts 0xB2,__zero_reg__"   "\n\t" // TCNT2=0
"lds r31,0x70"            "\n\t" // r31 <- TIMSK2
"sts 0x70,__zero_reg__"   "\n\t" // TIMSK2=0
////*******************************************
// пройти если ноль
"wait_begin:"             "\n\t"
"sbic 0x09,5"             "\n\t" // Порт D5
"rjmp wait_begin"         "\n\t"
// пройти если единица -> первый импульс
"wait_start:"             "\n\t"
"sbis 0x9,5"              "\n\t"
"rjmp wait_start"         "\n\t"
"sts 0x43,__zero_reg__"   "\n\t" // GTCCR=0 старт синхра
 // импульс пошёл, ждём ноль
"wait_pause:"             "\n\t"
"sbic 0x09,5"             "\n\t"
"rjmp wait_pause"         "\n\t"
"cpi r21,__zero_reg__"    "\n\t" //
"brne duty"  "\n\t"
// импульс кончился, ждём  конца периода (единицу)
"wait_end:"               "\n\t"
"sbis 0x9,5"              "\n\t"
"rjmp wait_end"           "\n\t"
"duty:"                   "\n\t"
////******************************************* 
//восстановление таймеров
"sts 0x80,r26"            "\n\t" // TCCR1B 
"sts 0x81,r27"            "\n\t" // TCCR1B 
"sts 0xB0,r28"            "\n\t" // TCCR2A
"sts 0xB1,r29"            "\n\t" // TCCR2B
"sts 0x70,r31"            "\n\t" // TIMSK2
"out 0x23,r30"            "\n\t" // GTCCR  старт таймеры
//вывод 3х байт
"lds r22, 0xB2"           "\n\t" //  tctn2  0 байт
"lds r23, 0x84"           "\n\t"  // TCNT1L 1 байт
"lds r24, 0x85"           "\n\t"  // TCNT1H 2 байт
"lds r25, __zero_reg__"   "\n\t" // пустой  3 байт
"sei"                     "\n\t"
::"r" (flag): ); }



/////////////////////Коэффициент заполнения



 

bpl
Offline
Зарегистрирован: 15.02.2016

zz11ss     Спасибо

Скетч скомпилировался без проблем. IDE  Arduino  1.8.1.

Используем библиотеку EEPROM версии 2.0 из папки: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM

Используем библиотеку Adafruit_GFX_Library версии 1.0.2 из папки: C:\Users\Admin\Documents\Arduino\libraries\Adafruit_GFX_Library

Используем библиотеку Adafruit-PCD8544-Nokia-5110-LCD-library-master версии 1.0.1 из папки: C:\Users\Admin\Documents\Arduino\libraries\Adafruit-PCD8544-Nokia-5110-LCD-library-master

Используем библиотеку SPI версии 1.0 из папки: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI

Используем библиотеку FreqCount версии 1.2 из папки: C:\Users\Admin\Documents\Arduino\libraries\FreqCount

Используем библиотеку PWM в папке: C:\Users\Admin\Documents\Arduino\libraries\PWM (legacy)

Используем библиотеку CyberLib в папке: C:\Users\Admin\Documents\Arduino\libraries\CyberLib (legacy)

Скетч использует 18638 байт (57%) памяти устройства. Всего доступно 32256 байт.

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

Т.е. в реальном времени если шим меняет скважность, ослик это не покажет в процентах ?

 

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

воткнул наконец в корпус, пока не все доделано, нет всех переключателей, делители и т д

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Xumuk пишет:
воткнул наконец в корпус, пока не все доделано, нет всех переключателей, делители и т д

Поздравляю с закорпусованностью! :) Может, для однозначности, можете подписать, с какого поста там прошивка, ни может ещё какие важности. Знаете как, многие могут с конце ветку читать, ит.п. :) Спасибо!

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

Juris пишет:

Xumuk пишет:
воткнул наконец в корпус, пока не все доделано, нет всех переключателей, делители и т д

Поздравляю с закорпусованностью! :) Может, для однозначности, можете подписать, с какого поста там прошивка, ни может ещё какие важности. Знаете как, многие могут с конце ветку читать, ит.п. :) Спасибо!

#1443 вот тут скетч помоему,важностей нет вроде никаких))) вместо схемы отключения пока что сделана кнопка на А1 массу подает, тем самым ребутает дисплей, в наличии просто нет pnp транзисторов=)

Electronik83
Offline
Зарегистрирован: 06.12.2015

На ssd1306 есть версия пультоскопа?

bpl
Offline
Зарегистрирован: 15.02.2016

Версия для OLED 128x64 SSD1306. I2C, есть на страничке автора     http://srukami.inf.ua/pultoscop_v25110.html

Скетч под OLED 128*64 дисплей доработана форумчанином D.I.M  Видео работы

Electronik83
Offline
Зарегистрирован: 06.12.2015

Только версия без dds генератора и uart приемника...

bpl
Offline
Зарегистрирован: 15.02.2016

Да, другой версии вроде нет.

Electronik83
Offline
Зарегистрирован: 06.12.2015

Могу изобразить, если кому-нибудь это надо вообще..

bpl
Offline
Зарегистрирован: 15.02.2016

Полную версию пультоскопа на OLED 128x64 SSD1306. I2C  очень надо, как раз сть 1.3", на 0.96" собирал версию от . D.I.M.  

Electronik83
Offline
Зарегистрирован: 06.12.2015

Понял. Будут новости - тут сообщу.

flachnn
Offline
Зарегистрирован: 20.01.2017

Еще летом собрал пультоскоп.

вот видео, если кому интересно https://youtu.be/5tGoBKO_CR8

Для себя изменил:
Автоматическое отключение при достижении напряжения питания ниже 2,8в.
Подача двойного звукового сигнала каждые 10 минут (таблетка от забывчивости).
Установка через меню состояния подсветки постоянно ВКЛ или выкл через установленное время.(дискретность 5сек)
Установка через меню опорного напряжения.
Установка через меню контрастности дисплея.
Установка через меню звукового сопровождение нажатие клавиш.
В пультоскопе: запоминание значений развертки, уровня синхронизации.
В генераторе: запоминание значений скважности, частоты, выбранного множителя частоты.
В терминале: выбор скорости терминала через кейсы от 300 бод до 256000 бод, запоминание значения.

Пультоскоп считаю очень удобным. Спасибо автору за идею и код!
 

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

flachnn пишет:

Еще летом собрал пультоскоп....


Уважаемый flachnn, было бы здорово, если были бы доступны Ваши вариант скетча, плата. Если у Вас нет каких соображений против того. Заранее Спасибо!

flachnn
Offline
Зарегистрирован: 20.01.2017

Да, конечно... Я дописывал скейтч еще летом, на прототипе, и вот что-то найти не могу... Неакуратно отношусь к наработкам :)

В крайнем случае, перепишу по новой и опубликую здесь.

Схема как у автора, единственно добавил схему преобразователя на MC34063 и делители. А так же закрыл входы осцила и терминала стабилитронами на 5,1В.

По поводу стабилитронов, не лучшее решение, но качесвто эпюры меня не сильно интересует, а вот паленые порты сильно. Ткнул в генератор авто, а делитель не переключил :)

Так же бывает, что нужно посмотреть в терминале, а логические уровни выше 5 вольт. Стабилитроны спасали уже :)

pter
Offline
Зарегистрирован: 15.02.2016

Здравствуйте,flachnn можете поделиться печаткой,заранее благодарю.

flachnn
Offline
Зарегистрирован: 20.01.2017

pter пишет:

flachnn можете поделиться печаткой

 

Здравствуйте, можно конечно. https://yadi.sk/d/mOTHIJ7539zvzp

Забыл сказать, в схему добавлена зарядка от USB на ТС4056 :)

 

Но по чесноку, если бы я разводил по новой, то так плотно бы не стал, решил текстолит экономить. :)

Собрать собрал, но монтаж получился плотный.

snake9x
Offline
Зарегистрирован: 21.01.2017

Добрый день, возникла необходимость в осцилографе начального уровня,для проверки работоспособности кварцевого резонатора на МП и флешек памяти BIOS, выбор пал на dso138 но после того как почитал и посмотрел понял что он мягко говоря, не очень. Наткнулся на Пультоскоп который как я понял лучше и дешевле вышеупомянутого китайца Захотел собрать и тут разные версии с разными конфигурациями дисплеев под которые нужны свои драйвера. Ниже составил смету для сборки данного осцилографа. Просьба к форумчанам подскажите исходя из вашего опыта, может какие то детали плохо работают или есть какие то подводные камни при работе с ними или что то неучел. Спасибо

Основные
Arduino Uno или Pro Mini
1x Дисплей 2,4'' TFT LCD 240х320 (читал есть версии которые медленно обновляют дисплей)
4x Кнопки
1x старый аккумулятор 3,5 в

Дополнительные
1x BNC разьем
1x BNC коннектор если щупы будут самодельные
1x корпус можно и самодельный
1x модуль для зарядки li-ion
 

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

snake9x пишет:

Добрый день, возникла необходимость в осцилографе начального уровня,для проверки работоспособности кварцевого резонатора на МП и флешек памяти BIOS, выбор пал на dso138 но после того как почитал и посмотрел понял что он мягко говоря, не очень. Наткнулся на Пультоскоп который как я понял лучше и дешевле вышеупомянутого китайца Захотел собрать и тут разные версии с разными конфигурациями дисплеев под которые нужны свои драйвера. Ниже составил смету для сборки данного осцилографа. Просьба к форумчанам подскажите исходя из вашего опыта, может какие то детали плохо работают или есть какие то подводные камни при работе с ними или что то неучел. Спасибо

Основные
Arduino Uno или Pro Mini
1x Дисплей 2,4'' TFT LCD 240х320 (читал есть версии которые медленно обновляют дисплей)
4x Кнопки
1x старый аккумулятор 3,5 в

Дополнительные
1x BNC разьем
1x BNC коннектор если щупы будут самодельные
1x корпус можно и самодельный
1x модуль для зарядки li-ion

Как бы я не любил свою разработку но Пультоскоп медленнее медленнее чем DSO dso138

Вот данные

dso138 скорость АЦП 1МSp/s

Пультоскоп база скорость АЦП 0,32МSp/s

Пультоскоп разгон(27Мгц) скорость АЦП 0,6МSp/s

Просто чтоб потом не разочаровались.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

snake9x пишет:

Добрый день, возникла необходимость в осцилографе начального уровня,для проверки работоспособности кварцевого резонатора на МП и флешек памяти BIOS,
 

Для таких задач вам нужно  осциллограф с полосой не менее 100МГц . Это не начального уровня, это могуть быть младшие модели профессионального уровня, >= 1000 $

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

dimax пишет:

snake9x пишет:

Добрый день, возникла необходимость в осцилографе начального уровня,для проверки работоспособности кварцевого резонатора на МП и флешек памяти BIOS,
 

Для таких задач вам нужно  осциллограф с полосой не менее 100МГц . Это не начального уровня, это могуть быть младшие модели профессионального уровня, >= 1000 $

А я тоже как-то не туда. МП 24МГц кварц! 100МГц - это только 4 точки на такт, а если кварц загналс. то там такое может быть... 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sirota пишет:

А я тоже как-то не туда. МП 24МГц кварц! 100МГц - это только 4 точки на такт, а если кварц загналс. то там такое может быть... 

Почему 4 ? Считают же исходя из скорострельности АЦП. Например  у моего осциллографа полоса 300Mhz, а выборка 2 GSample/sec, соответссно количество точек будет 2E9/24E6= ~83 точки. А по вашей методике получилось бы лишь 300/24 = ~12 точек  :)

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

dimax пишет:

sirota пишет:

А я тоже как-то не туда. МП 24МГц кварц! 100МГц - это только 4 точки на такт, а если кварц загналс. то там такое может быть... 

Почему 4 ? Считают же исходя из скорострельности АЦП. Например  у моего осциллографа полоса 300Mhz, а выборка 2 GSample/sec, соответссно количество точек будет 2E9/24E6= ~83 точки. А по вашей методике получилось бы лишь 300/24 = ~12 точек  :)

Вот эти вот полосы и выборки... Я все время их путаю )

snake9x
Offline
Зарегистрирован: 21.01.2017

Значит, все - таки лучше купить китайца в сборе, чем собирать на ардуине? А осциллограф хамелеон намного мощнее dsoO62? Осц 062 не сильно по цене отличается от 138, можно его взять так как на хамелеон экранчик не найти. П.С. Делать точные расчеты с помощью осциллографа не собираюсь, нужно лишь для диагностики МП, то есть на уровне сигнал идет , значит МП не заводится не из за плохого кварца, ремонт МП не является основной работой, просто интересно в них ковырятьсч

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

snake9x пишет:
Значит, все - таки лучше купить китайца в сборе, чем собирать на ардуине? А осциллограф хамелеон намного мощнее dsoO62? Осц 062 не сильно по цене отличается от 138, можно его взять так как на хамелеон экранчик не найти. П.С. Делать точные расчеты с помощью осциллографа не собираюсь, нужно лишь для диагностики МП, то есть на уровне сигнал идет , значит МП не заводится не из за плохого кварца, ремонт МП не является основной работой, просто интересно в них ковырятьсч

Предлагаю Вам купить 2 десятка кварцев и не любить людям мозг. Нельзя на подобном пробнике увидеть работу ваших кварцев.

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

snake9x пишет:
Значит, все - таки лучше купить китайца в сборе, чем собирать на ардуине? А осциллограф хамелеон намного мощнее dsoO62? Осц 062 не сильно по цене отличается от 138, можно его взять так как на хамелеон экранчик не найти. П.С. Делать точные расчеты с помощью осциллографа не собираюсь, нужно лишь для диагностики МП, то есть на уровне сигнал идет , значит МП не заводится не из за плохого кварца, ремонт МП не является основной работой, просто интересно в них ковырятьсч

Я видео снял на эту тему.

Там статья еще есть под видео,

может поможет.

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

а логгер ни кто не пытался прикрутить к осцилографу или терминалу? былобы очень удобно.

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

Stashevskiy68 пишет:

а логгер ни кто не пытался прикрутить к осцилографу или терминалу? былобы очень удобно.

Растолкуйте что конкретно логгировать?

состояние цифрового пина или аналоговый сигнал? или еще что?

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

 Я думаю следует логировать аналоговый сигнал . места занимает конечно больше но универсальней. к тому-же   328  позволяет использовать SD более 2Г. а затем просматривать на экране. идей много. Жаль я позно включился  в микроконтролерную тему. есть идея   вывести  на внешний разьем  SPI шину + питание,   и  легко без разбора корпуса можно перепрошить и  подключать модули  общающиеся через SPI. так-же при надобности на вход прикрутить  доп. усилитель или делитель. мне по работе нужно  и  токовый (0-5ма) проверить и  ИРПС и RS232 и RS485,  частоту и амплитуду сигнала. так-же  нужен источник напряжения от 0 до 50 мВ с возможностью атоматичаского повышения и понижения уровня (ГКЧ только очень медленный  1 мин на период - приблизительно).я все это конечно  реализую со временим и выложу только разберусь с нормальной IDE  и С++ - родная оболочка полный отстой  ( в далекой молодости лет 10 писал на Clipper  базы данных  (под DOS) и лет 5 занимался 1С-бухгалтерия, да и сыну в этом году помогал  писать диплом  для технаря на PHP (фреймворки , классы - пришлось поработать мозгами, но опыт не пропьешь). сейчас в основном для работы Excel использую но VB не лезу. а тут такая возможность для творчества . класный  проект! молодцы.     

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

 пока в процесе изготовления. уже  переделал под дисплей Nokia 5200 (развернуты буквы, изображение), и сейчас собираю модульный  вариант на 5110 для  отработки требуемых мне функций. сейчас разберусь как на форуме фотки прикручивать и выложу парочку  

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017