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

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

С 75 строки подпрограмма вывода в режме ПАУЗА.

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

Переделал на русский текст.

Все . хватит , пора в корпус заталкивать :)).

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

// For the breakout, you can use any 2 or 3 pins
// These pins will also work for the 1.8" TFT shield
#define TFT_CS     10
#define TFT_RST    12
//#define TFT_RST   9  // you can also connect this to the Arduino reset
                      // in which case, set this #define pin to 0!
#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[701];//массив АЦП
byte menu=1;//переменная верхнего меню
byte razv=5;//значение развертки
byte x=30; //счетчик оси Х
int Vmax=0;// максимальное напряжение 
unsigned long pause=0;//переменная для замены Delay
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool clen_p=0;//флаг чистки паузы
long countX=0;
byte sinhMASS=0;
unsigned long count =0;
int prokr=0;
char str[10]; 
int temp;
float armcurrent;
int d=0;

void 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(23,i, ST7735_BLUE); 
            tft.drawPixel(40,i, ST7735_BLUE); 
            tft.drawPixel(57,i, ST7735_BLUE); 
            tft.drawPixel(74,i, ST7735_BLUE); 
            tft.drawPixel(91,i, ST7735_BLUE);
            tft.drawPixel(108,i, ST7735_BLUE); 
            tft.drawPixel(125,i, ST7735_BLUE); 
            tft.drawPixel(142,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=6;
          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(){
          if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
    tft.println( "2.2V/d");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "10V/d");
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "0.22V/d");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "1V/d");
        }
      }

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

}

  


void setup(){  
  if(opornoe==0){
    ADMUX = 0b11100100;
  }//выбор внутреннего опорного 1,1В
  if(opornoe==1){
    ADMUX = 0b01100100;
  }//Выбор внешнего опорного
  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(levo)==HIGH){
      delay (30);
      while((digitalRead(levo)==HIGH));
      pultoskop=pultoskop-1;
      if(pultoskop<1)pultoskop=3;
    }
    if(digitalRead(pravo)==HIGH){
      delay (30);
      while((digitalRead(pravo)==HIGH));
      pultoskop=pultoskop+1;
      if(pultoskop>3)pultoskop=1;
    }
    
    if(pultoskop==1){
      tft.setTextSize(1);
      tft.setTextColor(ST7735_RED);
      tft.setCursor(35, 25);
      tft.println("Осцилограф");
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_WHITE);
       tft.println("Генератор PWM");
       tft.setCursor(35, 85);
        tft.println("Генератор DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Батарея =");
      armcurrent = analogRead(akb)*VCC/1023;//проверка напряжения на АКБ
      temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
      sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));      
      tft.fillRect(90,110,24,10,ST7735_BLACK);
       tft.setTextColor(ST7735_BLUE);
       tft.setCursor(90, 110);
       tft.println(str);

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

  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<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 MenuT(){//перерисовка нижнего меню    

    tft.fillRect(0, 120, 160, 128, ST7735_BLACK);
  if (FreqCount.available()) { 
    count = FreqCount.read();
  }
  //вывод частоты по готовности счетчика
  //#######################################частоты сигнала
  byte Frec1=0;
  long Frec=0;
  bool flagFrec1=0;
  bool flagFrec2=0;
  bool flagFrec3=0;
  for(int y=1;y<255;y++){
    if(flagFrec1==0){
      if(mass[y]<SinU){
        flagFrec2=1;
      }
    }
    if(flagFrec1==0){
      if(flagFrec2==1){
        if(mass[y]>SinU){
          flagFrec1=1;
          Frec1=y;
        }
      }
    }
    if(flagFrec1==1){
      if(mass[y]<SinU){
        flagFrec3=1;
      }
    }
    if(flagFrec3==1){
      if(mass[y]>SinU){
        if (razv>=6){
          Frec=1000000/((y-Frec1-1)*3.27);
        }//delitel 4
        if (razv==5){
          Frec=1000000/((y-Frec1)*3.27)/2;
        }//delitel 8
        if (razv==4){
          Frec=1000000/((y-Frec1)*3.27)/4;
        }//delitel 16
        if (razv==3){
          Frec=1000000/((y-Frec1)*3.27)/8;
        }//delitel 32
        if (razv==2){
          Frec=1000000/((y-Frec1)*3.27)/16;
        }//delitel 64
        if (razv==2){
          Frec=1000000/((y-Frec1)*3.27)/32;
        }//delitel 128
        if (razv==1){
          Frec=1000000/((y-Frec1)*3.27)/32;
        }//delitel 128
        if (razv==0){
          Frec=1000000/((y-Frec1)*500)-0.2;//-0.2 КОРЕКЦИЯ ПОКАЗАНИЙ ЧАСТОТЫ ГЦ
        }//delitel 128
        flagFrec1=0;
        flagFrec3=0;
      }
    }
  }

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

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

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

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

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

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

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

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

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

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

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

      //************ ОСЬ РАЗВЕРТКИ ##########################################
      tft.drawLine(2, 115,158, 115, ST7735_BLUE); 
      //  Черточки ******************     
            for(byte i=6;i<160;i=i+17){
            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<255;y++){
        if(Vmax<mass[y]){
          Vmax=mass[y];
        } 
      }
      //максимальное значение сигнала ##########################
      
      //************************ ОТРИСОВКА ГРАФИКА *************************
      if(paus==0){
       // tft.fillRect(0, 12, 160, 3, ST7735_BLACK);//стиране /шкалы прокрутки
        tft.fillRect(6, 25, 153, 86, ST7735_BLACK);//стиране поле графика
        tft.fillRect(0,120, 159, 8, ST7735_BLACK);//стиране НИЖНЕГО МЕНЮ 

        tft.fillCircle(10,110-SinU/3, 2, ST7735_YELLOW);//рисуем уровень синхронизации 
        tft.fillCircle(10,110-SinU/3, 3, ST7735_YELLOW);//рисуем уровень синхронизации 
        x=6;
        for(int y=sinhMASS;y<sinhMASS+145;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.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
        }
        sinhMASS=0;  
        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);
      //lcd.fillRect(10, 60, 175, 80, BLACK);//стирание поля
      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){
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_RED);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Treugolnik");
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       
   

    delay(400); 
    while(!(PIND & (1<<PIND2))){
    PWM=sinM[d];
    pwmWrite(dds,PWM);
    //delayMicroseconds(fr);
    d++;
    if(d==32){d=0;}}
     menuDDS++;
    //delay(200);
  }
if(menuDDS==1){
   tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);    
    tft.setTextColor(ST7735_RED);
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    //delay(400);
  }
if(menuDDS==2){
  tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Pila Obr");       

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
      //delay(400);
  }
if(menuDDS==3){
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");    
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_RED);
    tft.println("Pila Obr");       

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

[/code]

И Напряжение показывает в Воль на деление ( V/d )

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

Humuk

У Вас как Я понял Дисплей ILI9163C.

Вы с моей Библиотекой не пробовали запускать ?

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

240265 пишет:

karl2233 пишет:

ух ты! возьму на вооружение и скопирую метод))

а что ещё можно оптимизировать? =) и ещё вопрос - какой участок отвечает за циферки слева и снизу от графика? 

и ещё - 34 и 35 строки - это что за хитрость?

Да не хитрость это, а назначение пинов.

А вообще можно CS убрать с 10 пина и назначить его выходом DDS , как на 5110.

мне кажется так будет удобнее чем делать переходник ШИМ-->DDS

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

240265 пишет:

Humuk

У Вас как Я понял Дисплей ILI9163C.

Вы с моей Библиотекой не пробовали запускать ?

нет не пробовал, думаете пойдет?)

мне очень не понравилось то что медленно отрисоввывает график((( видимо библиотека такая тормозная, было бы побольше знаний переписал бы, тут кто-то переделывал библиотеку под тфт

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

240265 пишет:

С 75 строки подпрограмма вывода в режме ПАУЗА.

с телефона сидел видимо проглядел, тогда наверно вот это я так полагаю

371   //#######################################частоты сигнала
372  
373    tft.setTextColor(ST7735_WHITE);
374    tft.setCursor(1, 120);
375     tft.println( "F=");
376     
377   if(opornoe==1){
378     if((Vmax*VCC/255)>2.8){
379       countX=count*(overclock/16.0);
380     }
381     if((Vmax*VCC/255)<=2.8){
382       countX=Frec*(overclock/16.0);
383     }
384   }
385   if(opornoe==0){
386     countX=Frec*(overclock/16.0);
387   }
388   if(countX<1000){
389     sprintf(str, "%d Hz", countX);
390     tft.setTextColor(ST7735_WHITE);
391     tft.setCursor(18, 120);
392     tft.println( str); 
393   }

 

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

Это вывод частоты сигнала внизу экрана осцилографа.

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

На счет библиотек .

Вот залил Ваш скетч. НИЧЕГО НЕ МЕНЯЛ.

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

240265 пишет:

На счет библиотек .

Вот залил Ваш скетч. НИЧЕГО НЕ МЕНЯЛ.


клева=))) только вашу придется корректировать видимо чтобы не было смещения на дисплее 128х128, у вас быстрое обновление графика?

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

Xumuk пишет:

мне очень не понравилось то что медленно отрисоввывает график((( видимо библиотека такая тормозная, было бы побольше знаний переписал бы, тут кто-то переделывал библиотеку под тфт

С кварцем 27 Мгц будет побыстрее.

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

Xumuk пишет:
240265 пишет:

На счет библиотек .

Вот залил Ваш скетч. НИЧЕГО НЕ МЕНЯЛ.

клева=))) только вашу придется корректировать видимо чтобы не было смещения на дисплее 128х128, у вас быстрое обновление графика?

Да только разиер по Х

И Цвет красный с синим поменять.

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

Обновление чуть быстрее.

Вот самая последняя версия (если будете переделывать )

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

// For the breakout, you can use any 2 or 3 pins
// These pins will also work for the 1.8" TFT shield
#define TFT_CS     10
#define TFT_RST    12
//#define TFT_RST   9  // you can also connect this to the Arduino reset
                      // in which case, set this #define pin to 0!
#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[701];//массив АЦП
byte menu=1;//переменная верхнего меню
byte razv=5;//значение развертки
byte x=30; //счетчик оси Х
int Vmax=0;// максимальное напряжение 
unsigned long pause=0;//переменная для замены Delay
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
bool clen_p=0;//флаг чистки паузы
long countX=0;
byte sinhMASS=0;
unsigned long count =0;
int prokr=0;
char str[10]; 
int temp;
float armcurrent;
int d=0;

void 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(23,i, ST7735_BLUE); 
            tft.drawPixel(40,i, ST7735_BLUE); 
            tft.drawPixel(57,i, ST7735_BLUE); 
            tft.drawPixel(74,i, ST7735_BLUE); 
            tft.drawPixel(91,i, ST7735_BLUE);
            tft.drawPixel(108,i, ST7735_BLUE); 
            tft.drawPixel(125,i, ST7735_BLUE); 
            tft.drawPixel(142,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=6;
          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(){
          if(digitalRead(delit)==HIGH){//включен или отключен делитель
        if(opornoe==0){
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
    tft.println( "2.2V/d");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "10V/d");
        }
      }
      else {//включен или отключен делитель
        if(opornoe==0){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "0.22V/d");
        }
        if(opornoe==1){
          tft.setTextColor(ST7735_WHITE);
    tft.setCursor(3, 1);
          tft.println( "1V/d");
        }
      }

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

}

  


void setup(){  
  if(opornoe==0){
    ADMUX = 0b11100100;
  }//выбор внутреннего опорного 1,1В
  if(opornoe==1){
    ADMUX = 0b01100100;
  }//Выбор внешнего опорного
  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(levo)==HIGH){
      delay (30);
      while((digitalRead(levo)==HIGH));
      pultoskop=pultoskop-1;
      if(pultoskop<1)pultoskop=3;
    }
    if(digitalRead(pravo)==HIGH){
      delay (30);
      while((digitalRead(pravo)==HIGH));
      pultoskop=pultoskop+1;
      if(pultoskop>3)pultoskop=1;
    }
    
    if(pultoskop==1){
      tft.setTextSize(1);
      tft.setTextColor(ST7735_RED);
      tft.setCursor(35, 25);
      tft.println("Осцилограф");
       tft.setCursor(35, 55);
       tft.setTextColor(ST7735_WHITE);
       tft.println("Генератор PWM");
       tft.setCursor(35, 85);
        tft.println("Генератор DDS");
      tft.setTextColor(ST7735_BLUE);
       tft.setCursor(30, 110);
       tft.println("Батарея =");
      armcurrent = analogRead(akb)*VCC/1023;//проверка напряжения на АКБ
      temp = (armcurrent - (int)armcurrent) * 100; // множитель - число знаков после запятой. 10 - 1, 100 - 2, 1000 - 3 и т.д.
      sprintf(str, "%d.%02d V", (int)armcurrent, abs(temp));      
      tft.fillRect(90,110,24,10,ST7735_BLACK);
       tft.setTextColor(ST7735_BLUE);
       tft.setCursor(90, 110);
       tft.println(str);

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

  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<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 MenuT(){//перерисовка нижнего меню    

  if (FreqCount.available()) { 
    count = FreqCount.read();
  }
  //вывод частоты по готовности счетчика
  //#######################################частоты сигнала
  byte Frec1=0;
  long Frec=0;
  bool flagFrec1=0;
  bool flagFrec2=0;
  bool flagFrec3=0;
  for(int y=1;y<255;y++){
    if(flagFrec1==0){
      if(mass[y]<SinU){
        flagFrec2=1;
      }
    }
    if(flagFrec1==0){
      if(flagFrec2==1){
        if(mass[y]>SinU){
          flagFrec1=1;
          Frec1=y;
        }
      }
    }
    if(flagFrec1==1){
      if(mass[y]<SinU){
        flagFrec3=1;
      }
    }
    if(flagFrec3==1){
      if(mass[y]>SinU){
        if (razv>=6){
          Frec=1000000/((y-Frec1-1)*3.27);
        }//delitel 4
        if (razv==5){
          Frec=1000000/((y-Frec1)*3.27)/2;
        }//delitel 8
        if (razv==4){
          Frec=1000000/((y-Frec1)*3.27)/4;
        }//delitel 16
        if (razv==3){
          Frec=1000000/((y-Frec1)*3.27)/8;
        }//delitel 32
        if (razv==2){
          Frec=1000000/((y-Frec1)*3.27)/16;
        }//delitel 64
        if (razv==2){
          Frec=1000000/((y-Frec1)*3.27)/32;
        }//delitel 128
        if (razv==1){
          Frec=1000000/((y-Frec1)*3.27)/32;
        }//delitel 128
        if (razv==0){
          Frec=1000000/((y-Frec1)*500)-0.2;//-0.2 КОРЕКЦИЯ ПОКАЗАНИЙ ЧАСТОТЫ ГЦ
        }//delitel 128
        flagFrec1=0;
        flagFrec3=0;
      }
    }
  }

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

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

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

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

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

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

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

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

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

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

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

      //************ ОСЬ РАЗВЕРТКИ ##########################################
      tft.drawLine(2, 115,158, 115, ST7735_BLUE); 
      //  Черточки ******************     
            for(byte i=6;i<160;i=i+17){
            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<255;y++){
        if(Vmax<mass[y]){
          Vmax=mass[y];
        } 
      }
      //максимальное значение сигнала ##########################
      
      //************************ ОТРИСОВКА ГРАФИКА *************************
      if(paus==0){
       
        tft.fillRect(6, 25, 153, 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=6;
        for(int y=sinhMASS;y<sinhMASS+145;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.drawLine(x,110-mass[y]/3, x+1,110-mass[y+1]/3, ST7735_GREEN);//график
        }
        sinhMASS=0;  
        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);
      //lcd.fillRect(10, 60, 175, 80, BLACK);//стирание поля
      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){
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_RED);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Treugolnik");
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       
   

    delay(400); 
    while(!(PIND & (1<<PIND2))){
    PWM=sinM[d];
    pwmWrite(dds,PWM);
    //delayMicroseconds(fr);
    d++;
    if(d==32){d=0;}}
     menuDDS++;
    //delay(200);
  }
if(menuDDS==1){
   tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);    
    tft.setTextColor(ST7735_RED);
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_WHITE);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.println("Pila Obr");       

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    //delay(400);
  }
if(menuDDS==2){
  tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");
    tft.setTextColor(ST7735_RED);
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_WHITE);
    tft.println("Pila Obr");       

    delay(400);
    while(!(PIND & (1<<PIND2))){
      PWM=pilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
      //delay(400);
  }
if(menuDDS==3){
    tft.setCursor(35, 30);
    tft.setTextColor(ST7735_WHITE);
    tft.setTextSize(1);
    tft.println("Sinus");     
    tft.setCursor(35, 50);        
    tft.println("Treugolnik");    
    tft.setCursor(35, 70); 
    tft.println("Pila");
    tft.setCursor(35, 90);
    tft.setTextColor(ST7735_RED);
    tft.println("Pila Obr");       

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

[/code]

 

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

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

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

sirota пишет:

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

Хорошо . чуть позже.

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

Ткните носом, как скетч переводить в файлы hex?

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

man_200, в гугле забанили штоль? вопрос "зачем" не задаю =)

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

Умеешь объяснять.

Есть UNO, но предпочитаю работать с отдельными кристаллами, отсюда и вопрос - зачем.

Спасибо за ссылку

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

man_200 пишет:

Умеешь объяснять.

Есть UNO, но предпочитаю работать с отдельными кристаллами, отсюда и вопрос - зачем.

Спасибо за ссылку

а что мешает в отдельный кристал записать скетч?

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

man_200 пишет:

Ткните носом, как скетч переводить в файлы hex?

так

https://www.youtube.com/watch?v=dXrJLycWf1Y

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

man_200 пишет:

Есть UNO, но предпочитаю работать с отдельными кристаллами, отсюда и вопрос - зачем.

я тож Пультоскоп делаю на отдельном МК и заливаю скетч туда средствами ИДЕ через программатор. 

понадобятся ещё фузы

Arduino Uno
Low Fuse 0xFF
High Fuse 0xDE
Extended Fuse 0x05

Arduino Duemilanove or Nano w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05

Arduino BT w/ ATmega328
Low Fuse 0xFF
High Fuse 0xD8
Extended Fuse 0x05

LilyPad Arduino w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05

Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05

 

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

Схема

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

bodriy2014 пишет:

man_200 пишет:

Ткните носом, как скетч переводить в файлы hex?

так

https://www.youtube.com/watch?v=dXrJLycWf1Y

Hex  с загрузчиком ?

Хорошо бы без загрузчика.

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

240265 пишет:

Hex  с загрузчиком ?

Хорошо бы без загрузчика.

Какой загрузчик, там будет просто ХЕКС, если его зальете загрузчик затрется.

Чтоб снова шить как Ардуино нужно будет залить загрузчик обратно.

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

Понял, нужно попробовать.

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

Схема есть еще в формате spl7 . Но здесь файлы не размещаются :(( .

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

Мужики подскажите на счет программного шим есть библиотеки?

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

Xumuk пишет:
Мужики подскажите на счет программного шим есть библиотеки?

А в чем трудности? Что конкретно надо шимить?

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

sirota пишет:

Xumuk пишет:
Мужики подскажите на счет программного шим есть библиотеки?

А в чем трудности? Что конкретно надо шимить?

мне нужно сделать 8 каналов шим светодиоды, а у 328 всего 6(

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

Xumuk пишет:

sirota пишет:

Xumuk пишет:
Мужики подскажите на счет программного шим есть библиотеки?

А в чем трудности? Что конкретно надо шимить?

мне нужно сделать 8 каналов шим светодиоды, а у 328 всего 6(

Открою для вас секрет, но в интернете давно придумали такую шикарную вещь как гугл или яндекс. Открываем скажем google.com, вбиваем в строке поиска "arduino программный шим" и радуемся 

https://www.google.ru/search?q=arduino+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0...

 

https://geektimes.ru/post/255772/

http://arduino.ru/forum/programmirovanie/gotovaya-biblioteka-programmnog...

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

Спасибо

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

отринув ложный стыд и скромность, присущую мне с децтва, я не постесняюсь и спрошу:

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

karl2233 пишет:

отринув ложный стыд и скромность, присущую мне с децтва, я не постесняюсь и спрошу:

Спасибо, поднял настроение.

Пока работа-семья-дача и так по кругу.

____

Пока скучаешь советую просмотреть фильм "мирный воин" особенно тот момент когда они взобрались на гору.

Тогда думаю будет ясно почему пультоскоп с внешним АЦП в моем исполнении еще не готов.

Всем удачных выходных, я только что закончил мариновать мясо-завтра дача!

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

Пока новое только на подходе.

Как я понимаю, старый пультоскоп планируется использовать в качестве второго канала. Вчера доделывал ДДС генератор от dimax и заметил такую вещь: На развертке 6 и больше в верхней части непрямоугольного сигнала (синус, треугольник, пила) появляются лишние "плечи". В виде прямоугольных выступов по бокам, почти на самом верху. Тот же самый сигнал, что на 5 ровный и гладкий, 6 и выше - с искажениями. Осциллограф на ЭЛТ утверждает, что исходный сигнал чистый. Дело в ослике.

Собственно в своей версии Пультоскопа на 3310 я и раньше замечал это, но относил за счет проникновения помех с 7660 (она работает на частотах около 10 кгц). Но в пробной версии Пультоскопа на ЛС020 это же искажение есть тоже. А там нет этой микросхемы. Правда есть два других преобразователя, но они работают на частотах гораздо выше доступных Пультоскопу.

Кто-то еще, кроме меня сталкивался с подобным явлением?

Поскольку эффект четко привязан к развертке 6, возможно это программые заморочки?

На снимке пример искажения о котором я говорил. Мой пультоскоп на 3310 - кварц 25 мгц. На ЛС020 - 20 мгц.

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

Еще вопрос к сообществу (ну, кроме bodriy2014. Ему - приятного аппетита!!!). В Осциллоскопе с внешним АЦП будут вставки на Ассемблере, как я понял. Их возможно примастырить к Пультоскопу? А то мне все не дает покоя двухканальный на Меге 88 (страница 17-18 данного обсуждения). Или они принципиально другие и повысить быстродействие исходного Пультоскопа таким способом не планируется?

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

сделал седня шилд для ls020 т.к. пока нет вариантов из чего сделать корпус, получилось как то так=)))

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

 Уважаемый VetalST, уменя дисплей l2f50,не могли бы вы выложить версию POWER-OFF скетч и библиотеку,думаю

многие в этом заинтересованы,экземпляр ls020 уже трудно найти.

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

Humuk выложите схемку RC-фильтра для DDS ,  а то лень номиналы подбирать.

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

Не нужно , увидел на сайте Автора.

Ghost_d
Offline
Зарегистрирован: 22.04.2014

Заранее прошу прощения за глупые вопросы...  Полез в блок осциллографа

Пока не разобрался с участком кода, который подсчитывает частоту

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++)
  { //перебираем первые 255 значений
    if(flagFrec1==0){if(mass[y]<SinU){flagFrec2=1;}} //если тек. значение меньше точки синхронизации взводим флажок flagFrec2
    if(flagFrec1==0){if(flagFrec2==1){if(mass[y]>SinU){flagFrec1=1;Frec1=y;}}}//находим первую точку по которой должна быть синхронизация Frec1
    if(flagFrec1==1){if(mass[y]<SinU){flagFrec3=1;}}//если пошло на убыль, взводим флаг flagFrec3
    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;}}}
//#######################################частоты сигнала

Самое важное: алгоритм вычисления частоты? Можно обьяснить на пальцах? Одним местом чувствую, что ищутся некие замеры относительно уровня синхронизации...

Остальные вопросы:

1)почему здесь и в части кода определяющего макс. значение анализу подвергается только первые 255 значений таблицы, хотя тип переменной счетчика  (int) способен просмотреть весь массив ?

2) в блоках пересчета почему-то для вариантов развертки 2 и 1 одинаковые формулы (делится на 32)

3) волщебная константа в пересчетах 3.27 - откуда такое значение? (у-frec1) - это количество замеров между двумя точками, а значит на один замер уходит 3.27 микросекунды? 

4) Для подсчета частоты , как я понимаю используется два варианта: библиотечное (count) и софтварное (Frec)

if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);} // если максим. значение в массиве больше логического уровня 1

if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}}
А зачем использовать еще и библиотеку FreqCount.h?
 
Автор рекомендует не трогать блок считывания замеров:
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;
      }
  }

Можно ли заменить его на более компактный вариант и уменьшить количество замеров до 512?

for(int i=0;i<511;i++)
    { 
          while ((ADCSRA & 0x10)==0); // пока бит ADIF 0b00010000 =1 , т.е. есть данные
          ADCSRA|=0x10; // сбрасываем 
          if (razv == 0) delayMicroseconds(500);
          mass[i]=ADCH; //считываем старшую часть замера
     } 
 
 
240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

Ghost_d пишет:

Можно ли заменить его на более компактный вариант и уменьшить количество замеров до 512?

for(int i=0;i<511;i++)
    { 
          while ((ADCSRA & 0x10)==0); // пока бит ADIF 0b00010000 =1 , т.е. есть данные
          ADCSRA|=0x10; // сбрасываем 
          if (razv == 0) delayMicroseconds(500);
          mass[i]=ADCH; //считываем старшую часть замера
     } 
 
 

можно только в начале скетча размер подправьте

byte mass[512];//массив АЦП

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

Заменил drawLine на Line из поста 1514 от Alex_Mirko (СПАСИБО Ему БОЛЬШОЕ !).

И скорость отрисовки реаль уменьшилась раза в 2 !

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

240265 пишет:

Заменил drawLine на Line из поста 1514 от Alex_Mirko (СПАСИБО Ему БОЛЬШОЕ !).

И скорость отрисовки реаль уменьшилась раза в 2 !

Скорость увеличилась, время уменьшилось. А тот как-то не логично вы поступили )

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

Ghost_d пишет:

Заранее прошу прощения за глупые вопросы...  Полез в блок осциллографа

Пока не разобрался с участком кода, который подсчитывает частоту

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++)
  { //перебираем первые 255 значений
    if(flagFrec1==0){if(mass[y]<SinU){flagFrec2=1;}} //если тек. значение меньше точки синхронизации взводим флажок flagFrec2
    if(flagFrec1==0){if(flagFrec2==1){if(mass[y]>SinU){flagFrec1=1;Frec1=y;}}}//находим первую точку по которой должна быть синхронизация Frec1
    if(flagFrec1==1){if(mass[y]<SinU){flagFrec3=1;}}//если пошло на убыль, взводим флаг flagFrec3
    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;}}}
//#######################################частоты сигнала

Самое важное: алгоритм вычисления частоты? Можно обьяснить на пальцах? Одним местом чувствую, что ищутся некие замеры относительно уровня синхронизации...

Остальные вопросы:

1)почему здесь и в части кода определяющего макс. значение анализу подвергается только первые 255 значений таблицы, хотя тип переменной счетчика  (int) способен просмотреть весь массив ?

2) в блоках пересчета почему-то для вариантов развертки 2 и 1 одинаковые формулы (делится на 32)

3) волщебная константа в пересчетах 3.27 - откуда такое значение? (у-frec1) - это количество замеров между двумя точками, а значит на один замер уходит 3.27 микросекунды? 

4) Для подсчета частоты , как я понимаю используется два варианта: библиотечное (count) и софтварное (Frec)

if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);} // если максим. значение в массиве больше логического уровня 1

if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}}
А зачем использовать еще и библиотеку FreqCount.h?
 
Автор рекомендует не трогать блок считывания замеров:
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;
      }
  }

Можно ли заменить его на более компактный вариант и уменьшить количество замеров до 512?

for(int i=0;i<511;i++)
    { 
          while ((ADCSRA & 0x10)==0); // пока бит ADIF 0b00010000 =1 , т.е. есть данные
          ADCSRA|=0x10; // сбрасываем 
          if (razv == 0) delayMicroseconds(500);
          mass[i]=ADCH; //считываем старшую часть замера
     } 
 
 

Привет. Ответы:

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

2--- эта строка не нужна описался((

if (razv==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128

//ошибка можно отследить только сигналом ниже 2,5В на скорости развертки 2

3---совершенно верно в моем блоке замеров АЦП на один замер уходит 3,27мкс

4--- библиотека FreqCount.h дает возможность аппаратно очень точно считать частоту, а программный подсчет я добавил как вынужденную меру если сигнал ниже 2,5В то счетчик аппаратный не считает и врубается программный. Он менее точен, это я все рассказывал в видео и объяснял как выставлять уровень синхронизации чтоб измеряло точнее.

Количество замеров можете уменьшать как вам угодно это можно, но больше ничего не меняйте будет делать один замер медленнее  чем 3,27 проверенно.

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

while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
mass[i]=ADCH;

Код сишный и в атмел студии я отладчиком смотрел сколько тактов занимает обработка разных вариантов сбора данных с АЦП.

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

240265 пишет:

Ghost_d пишет:

Можно ли заменить его на более компактный вариант и уменьшить количество замеров до 512?

for(int i=0;i<511;i++)
    { 
          while ((ADCSRA & 0x10)==0); // пока бит ADIF 0b00010000 =1 , т.е. есть данные
          ADCSRA|=0x10; // сбрасываем 
          if (razv == 0) delayMicroseconds(500);
          mass[i]=ADCH; //считываем старшую часть замера
     } 
 
 

можно только в начале скетча размер подправьте

byte mass[512];//массив АЦП

Нельзя!

АЦП будет медленнее делать семплы.

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

Часто требуется измерить длительность импульсов, предполагается ли это в перспективе?

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

sirota пишет:

240265 пишет:

Заменил drawLine на Line из поста 1514 от Alex_Mirko (СПАСИБО Ему БОЛЬШОЕ !).

И скорость отрисовки реаль уменьшилась раза в 2 !

Скорость увеличилась, время уменьшилось. А тот как-то не логично вы поступили )

ну да

 

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

 ???

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

bodriy2014 пишет:

240265 пишет:

Ghost_d пишет:

Можно ли заменить его на более компактный вариант и уменьшить количество замеров до 512?

for(int i=0;i<511;i++)
    { 
          while ((ADCSRA & 0x10)==0); // пока бит ADIF 0b00010000 =1 , т.е. есть данные
          ADCSRA|=0x10; // сбрасываем 
          if (razv == 0) delayMicroseconds(500);
          mass[i]=ADCH; //считываем старшую часть замера
     } 
 
 

можно только в начале скетча размер подправьте

byte mass[512];//массив АЦП

Нельзя!

АЦП будет медленнее делать семплы.

Да че то я ступил.

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

man_200 пишет:

Часто требуется измерить длительность импульсов, предполагается ли это в перспективе?

T = 1/ F  :)

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

bodriy2014 пишет:

Пока скучаешь советую просмотреть фильм "мирный воин" особенно тот момент когда они взобрались на гору.

Тогда думаю будет ясно почему пультоскоп с внешним АЦП в моем исполнении еще не готов.

посмарел...

неплохое, но не более кино.
и вот почему.
жуткая смесь Кастанеды(почти полные цитаты "Путешестивая в Исктлан") и Дзен 
вкупе с "Малыш-карате").
всё б хорошо, но жути добавляет авторское понимание этого.
неправильное понимание.
1. "служить людям"
такой хни даже у Аристотеля нет!
каким людям? зачем?
т.е. любой из ОСНОВНЫХ вопросов философии разрушает этот карточный домик.
Дон Хуан смеялся бы над этим.

2. далее, типоумный вопрос с котором тот слез с машины -
 "тяжело любить тех, кто нуждается".
н-дя...
ииии? как это связано с тем, что они отдали грабителям своё?
это просто бред, маскирующий основной вопрос Дзен - хлопок одной ладонью.
Воин в понятиях Дона Хуана и Дзен так бы не поступил - отдать НЕ ПРИНАДЛЕЖАЩИЕ ЕМУ ЧАСЫ.

3. гора.
у автора налицо смесь непонимания основ Дзен и Дона Хуана - 
если применить к Пультоскопу, то шаг=версии
и не иначе.
а весь путь = эффективному коду программы.
эффективному - значит с малым количеством знаков и быстрому.

камня нет вообще в этом раскладе =)

мне жаль, если я обидел своими выводами, но я значительно старше 18 лет,
 когда "Путешествие в Икстлан" вывело одного моего друга на шаг в окно..
.а Дзен был для меня чем-то волшено-непоятным.

таким образом, за кино - спасибо! некоторые моменты были приятно узнаваемы =)