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

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

Предлагаю просто сделать выход в меню длинным нажатием кнопки ОК а там уже меню с отключением дисплея. Так скажем компромисс)

VetalST
Offline
Зарегистрирован: 29.12.2015

Лекс 59 Емкости экрану до задници, не дергает ногами ISP ардуина. И это приводит к тому что контроллер экрана не занет что мы от него хотим. И пиксели продолжают светится плюс еще дольше от всяких емкостей. Ведь именно от это мы и хотели избавится.

Я лично для вас добавлю пункт в меню отключения. А себе оставлю первый вариант.

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

VetalST пишет:

Лекс 59 Емкости экрану до задници, не дергает ногами ISP ардуина. И это приводит к тому что контроллер экрана не занет что мы от него хотим. И пиксели продолжают светится плюс еще дольше от всяких емкостей. Ведь именно от это мы и хотели избавится.

Я лично для вас добавлю пункт в меню отключения. А себе оставлю первый вариант.


Не могли бы вы потом нарисовать всю схему как все подключено

VetalST
Offline
Зарегистрирован: 29.12.2015

Xumuk пишет:
Предлагаю просто сделать выход в меню длинным нажатием кнопки ОК а там уже меню с отключением дисплея. Так скажем компромисс)

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

А схемы как таковой и нет если вы хотите делать как хочет Лекс 59 себе. Будет просто добавлен пункт в меню отключить и  при нажатии кнопки ОК будет отключатся програмно экран. А питание отключатся просто выключателем.

А по первому варианту прошивки в посте 1443 уже нарисовоно что и куда подключить ( P-канальный мосфет и 1 транзистор, 4 резистра и 1 любой диод ) .

 

 

VetalST
Offline
Зарегистрирован: 29.12.2015

По просьбе Лекс 59 добавил 4 пункт в меню lcd.PowerOff ссилка на скетч https://yadi.sk/d/TlBDtbVKsJBt5

При нажатии кнопки ОК в меню отключается програмно экран. Питание ардуины и экрана отключаем ручками выключатель (отключаем АКБ). Переключение между программами через кнопку ресет.

 

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

Фу, потратил два вечера пытаясь разобраться в коде. Тяжеловато, однако!

Мне изначально не понравилось переход между режимами работы по ресету. И я попытался впихнуть в исходник код обработки кнопок: ДЛИННОЕ-КОРОТКОЕ. Судя по исходнику, автор изначально делал осцилограф (он находится в основном цикле loop), а остальной фарш - типа, пришлепки. Я вынес все в отдельные процедуры и получились следующие состояния для FSM: ОСНОВНОЕ МЕНЮ ВЫБОРА РЕЖИМА, ОСЦИЛОГРАФ, ГЕНЕРАТОР МЕАНДРА, DDS-ГЕНЕРАТОР и ТЕРМИНАЛ. Такой подход будет более удобен, так как разные люди могут независимо трудиться над каждой частью. И компилить под себя необходимые режимы (может кому-то DDS вовсе не нужно, но нужен ЛОГИЧЕСКИЙ анализатор и т.п.)

В таком варианте, переход к основному меню - длительное нажатие кнопки ОК. Однако есть засада: режимы DDS и ТЕРМИНАЛ - глухие, т.е. из них выхода нет. Их придется переделывать.

Надеюсь, что автор не против, что я "своими грязными" влез в его код :) Я основные процедуры не трогал (только обработку клавиш). Пока вот такой вариант. К сожалению, катастрофически не хватает времени

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <FreqCount.h> 
#include <PWM.h>
#include <CyberLib.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 4, 3, 2);//пины к которым у вас подключен дисплей
byte cont=52;//контрастность дисплея
byte menu=0;//переменная выбора меню 
bool opornoe=1; //флаг опорного напряжения
bool paus=0; //флаг режима паузы
long countX=0;
float VCC=5.0;  //напряжение питания, меряем мультиметром
#define overclock 16  //Частота на которой работает Ардуино 
byte SinU=30;   //уровень синхронизации 0 до 255 
byte razv=6;  
byte mass[701];
byte sinhMASS=0;
int prokr=0;
int Vmax=0;// максимальное напряжение long countX=0;
byte x=0; 
unsigned long count =0;
byte hag=0;
int mnog=0;
boolean flag=0;
byte PWM = 128;//стартовое значение ШИМ от 0 до 255
int32_t frequency = 500; //стартовое значение частоты в Гц
#define led  9   //пин для генератора сигналов (не менять)

#define dds  10   //пин для генератора dds (не менять)
byte menuDDS=0;

//масивы таблиц перенес во флеш
const byte PROGMEM sinM[32]={1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1};
const byte PROGMEM pilaM[32]={1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255};
const byte PROGMEM RpilaM[32]={250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1};
const byte PROGMEM trianglM[32]={1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1};
int d=0;

long speedTTL=9600; //скорость терминала 

//внутренние определения состояний FSM  обработки кнопок
//статус НИЧЕГО
#define bs_none 0 
//статус АНТИДРЕБЕЗГ
#define bs_deBounce 1
//Статус УДЕРЖАНИЕ
#define bs_hold 2
// флаги, которые нужно ловить в основной программе 
//значение флага НИЧЕГО
#define bf_none 0
//значение флага  КОРТКОЕ НАЖАТИЕ
#define bf_short 1
//значение флага ДЛИННОЕ НАЖАТИЕ
#define bf_long 2


//временные задержки (в мс)
//дл€ антидребезга
#define deBounceTime 40
//длительное удержание (секунда)
#define longTime 1000

// пины подключения кнопок
#define b_ok_pin 12
#define b_inc_pin 13
#define b_dec_pin 11


byte buttonState=0; //внутренняя переменная обработчика клавиш
byte curButton=0;   //текущая нажатая кнопка
long timerButton=0; //время, нажатия текущей кнопки
byte pressBut=0;
byte buttonFlag=0;

// название кнопок
#define ok_press 1
#define inc_press 2
#define dec_press 3 

//=========  
//именовынные режимы работы прибора для FSM
#define Main_menu 0
#define Oscil 1
#define Gen_meandr 2
#define DDS_Gen 3
#define TTL_Term 4
byte cur_FSM_state = 0;

//---------------- start ReadKey ----------------
// Функция возвращает номер нажатой клавиши 
byte ReadKey() //функция считывает нажатие кнопки
{
  if (digitalRead(b_ok_pin)) return ok_press;
  if (digitalRead(b_inc_pin)) return inc_press;
  if (digitalRead(b_dec_pin)) return dec_press;
  return 0;
}
//---------------- end ReadKey ----------------

//------------------------
// Start checkButton
//------------------------
void checkButton() {

  switch (buttonState) {
    //-----------------------------------------    
    case (bs_none): //если ничего не нажато
    curButton=ReadKey(); //считываем номер нажатой кнопки
    if (curButton!=0) //≈сли кнопка нажата (т.е., значение <>0)
    {
      buttonState=bs_deBounce; //следующий статус антидребезг
      timerButton=millis(); //запоминаем врем€
    }
    break;
    //------------------------------------------
    case (bs_deBounce): //јнтидребезг
    if ((ReadKey()==curButton))//если кнопка все еще нажата
    {
      if (millis()-timerButton>deBounceTime) //если прошло достаточно времени дл€ обработки антидребезга
      {
        buttonState=bs_hold; //ставим статус удержание
        timerButton=millis(); //оп€ть запоминаем врем€
        pressBut=curButton; //устанавливаем значение нажатой кнопки
        buttonFlag=bf_short; //флаг сработки ставим  ќ–ќ“ ќ≈ нажатие и  пока еще удержание
      }
    }
    else
    {
      buttonState=bs_none; //а если кнопка уже не нажата или нажата друга€ ставим статус Ќ»„≈√ќ
    }
    break;

    //------------------------------------------
    case (bs_hold): //Удержание

    if ((ReadKey()==curButton)) //если кнопка все еще нажата
    {
      if (millis()-timerButton>longTime)//если кнопка удерживаетс€ более времени дл€ длительного нажати€
      { 
        buttonFlag=bf_long; //флаг сработки = ƒЋ»“≈Ћ№Ќќ≈ нажатие
      }
    }
   
        else
      {
        buttonState=bs_none; //а если кнопка уже не нажата или нажата друга€ ставим статус Ќ»„≈√ќ
      }
    break;
    //------------------------------------------
  } //end switch
} //end checkButton
//------------------------

// указываем количество пунктов меню -1
#define MAX_menu 3
//названия пунктов меню
char *main_menu1="Пультоскоп";
char *main_menu2="Генератор";
char *main_menu3="DDSгенератор";
char *main_menu4="Терминал";
// Основное меню прибора
char *main_menu[]={main_menu1, main_menu2, main_menu3, main_menu4};

byte cur_menu_item=0;

//====================
//вывод стартового меню с выделением текущего пункта
void print_menu()
{
  display.clearDisplay();
  for(byte i=0;i<=MAX_menu;i++)
  {
    display.setCursor(10,(i*10));
    if (i==cur_menu_item) 
      {
        display.setTextColor(WHITE, BLACK); // 'inverted' text
      }
    else display.setTextColor(BLACK); 
    
    display.println(main_menu[i]);
  }
  display.display();
}
//====================
void start_menu()
{
if ((pressBut == inc_press)&&(buttonFlag == bf_short))
  {
    cur_menu_item++;
    if (cur_menu_item>MAX_menu)
      {
        cur_menu_item = 0;
      }
    buttonFlag=bf_none;
    print_menu();
  }

if ((pressBut == dec_press)&&(buttonFlag == bf_short))
  {
    cur_menu_item--;
    if ((cur_menu_item<0) || (cur_menu_item>MAX_menu))
      {
        cur_menu_item = MAX_menu;
      }
    buttonFlag=bf_none;
    print_menu();
  }

if ((pressBut == ok_press)&&(buttonFlag == bf_short))
  {
    if (cur_menu_item ==0) //если выбран режим осцилограф инициализируем какой-то счетчик
      {
        FreqCount.begin(1000);
      }
      
    if (cur_menu_item ==1) // для генератора меандра
      {
        InitTimersSafe(); 
        bool success = SetPinFrequencySafe(led, frequency);
      }
      
      if (cur_menu_item ==2) //для DDS генератора
      {
        InitTimersSafe(); 
        bool success = SetPinFrequencySafe(led,200000);
      }

   buttonFlag=bf_none;
   cur_FSM_state=cur_menu_item+1; //следующее состояние в которое будет переход ()
  }

} //end main menu 



//========================
void setup()
{
  pinMode(b_ok_pin, INPUT);
  pinMode(b_inc_pin, INPUT);
  pinMode(b_dec_pin, INPUT);
  display.begin();
  display.setContrast(cont); 

}
//==== End setup block ==========
void loop()
{
  checkButton(); //опрашиваем кнопки
  if ((pressBut == ok_press)&&(buttonFlag == bf_long)) //длительное удержание ОК - возврат в главное меню
  {
    cur_FSM_state=Main_menu;
    buttonFlag=bf_none; 
    
  }
  
  switch (cur_FSM_state) //а тут ветвимся согласно указанной задаче
  {
    case (Main_menu):
      print_menu();
      start_menu();
    break;

    case(Oscil):
    Oscilloscope();
    break;

    case(Gen_meandr):
    Generator();
    break;
    
    case(DDS_Gen):
    DDSGenerator();
    break;

    case(TTL_Term):
    TTL();
    break;
    
  }//end switch
   

}//end loop
//============================================
//====================
//процедура заполнения буфера считанными значениями   
void Zamer(){
  if (razv>=6){ADCSRA = 0b11100010;}//delitel 4
  if (razv==5){ADCSRA = 0b11100011;}//delitel 8
  if (razv==4){ADCSRA = 0b11100100;}//delitel 16
  if (razv==3){ADCSRA = 0b11100101;}//delitel 32
  if (razv==2){ADCSRA = 0b11100110;}//delitel 64
  if (razv<2){ADCSRA = 0b11100111;}//delitel 128
  if (razv==0){
      for(int i=0;i<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          delayMicroseconds(500);
          mass[i]=ADCH;
      }
  }
  if (razv>0){
      for(int i=0;i<700;i++){ 
          while ((ADCSRA & 0x10)==0);
          ADCSRA|=0x10;
          mass[i]=ADCH;
      }
  }
  
}
//========================
//========================
void Oscilloscope()
{
if(opornoe==0){ADMUX = 0b11100011;}//выбор внутреннего опорного 1,1В
if(opornoe==1){ADMUX = 0b01100011;}//Выбор внешнего опорного
delay(5);
if(paus==0){Zamer();}
//#######################################определение точки синхронизации
bool flagSINHRO=0;
bool flagSINHRnull=0;
for(int y=1;y<255;y++){
  if(flagSINHRO==0){if(mass[y]<SinU){flagSINHRnull=1;}}
  if(flagSINHRO==0){if(flagSINHRnull==1){if(mass[y]>SinU){flagSINHRO=1;sinhMASS=y;}}}}
//#######################################определение точки синхронизации
//максимальное значение сигнала##########################
Vmax=0; 
for(int y=1;y<255;y++){if(Vmax<mass[y]){Vmax=mass[y];} }
//максимальное значение сигнала##########################
//#######################################определение точки синхронизации
//#######################################отрисовка графика 
if(paus==0){
display.clearDisplay();
display.fillCircle(80,47-SinU/7, 2, BLACK);//рисуем уровень синхронизации    
x=3;
for(int y=sinhMASS;y<sinhMASS+80;y++){
      if(razv<7){x++;}
      if(razv==7){x=x+2;}
      if(razv==8){x=x+3;} 
      display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK);
      display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK);        
}
sinhMASS=0;}
if(paus==1){
display.clearDisplay();
display.drawLine(prokr/8,8,prokr/8+6,8, BLACK);//шкала прокрутки
display.drawLine(prokr/8,9,prokr/8+6,9, BLACK);//шкала прокрутки
          x=3;
          for(int y=prokr;y<prokr+80;y++){
                if(razv<7){x++;}
                if(razv==7){x=x+2;}
                if(razv==8){x=x+3;} 
                display.drawLine(x, 47-mass[y]/7, x+1, 47-mass[y+1]/7, BLACK);
                display.drawLine(x+1, 47-mass[y]/7+1, x+2, 47-mass[y+1]/7+1, BLACK); 
          }}
//#######################################отрисовка графика
for(byte i=47;i>5;i=i-7){display.drawPixel(0,i, BLACK);display.drawPixel(1,i, BLACK);display.drawPixel(2,i, BLACK);}//разметка экрана  вертикальная
//////////////////////////////////////////////////сетка
for(byte i=47;i>5;i=i-3){display.drawPixel(21,i, BLACK);display.drawPixel(42,i, BLACK);display.drawPixel(63,i, BLACK);}
for(byte i=3;i<84;i=i+3){display.drawPixel(i,33, BLACK);display.drawPixel(i,19, BLACK);}
//////////////////////////////////////////////////сетка
//#######################################отрисовка menu
if(menu==0){
    display.setCursor(0,0);
    display.setTextColor(WHITE,BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(BLACK); 
    display.print(" ");
    display.print(razv);
    display.print(" P");
    if((pressBut == dec_press)&&(buttonFlag == bf_short)){opornoe=!opornoe; buttonFlag=bf_none;}
    if((pressBut == inc_press)&&(buttonFlag == bf_short)){opornoe=!opornoe; buttonFlag=bf_none;}    
}
if(menu==1){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" ");
    display.print(razv);
    display.setTextColor( BLACK); // 'inverted' text
    display.print(" P");
    if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; razv=razv-1;if(razv==255){razv=0;}}
    if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; razv=razv+1;if(razv==9){razv=8;}}
}
if(menu==2){
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(WHITE, BLACK); // 'inverted' text 
    display.print(" P");
    paus=1;
    if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; prokr=prokr-10;if(prokr<0){prokr=0;}}
    if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; prokr=prokr+10;if(prokr>620){prokr=620;}}    
}
if(menu==3){
    prokr=0;
    paus=0;
    display.setCursor(0,0);
    display.setTextColor( BLACK);
    if(opornoe==0){display.print("1.1");}
    if(opornoe==1){display.print(VCC,1);}
    display.print(" ");
    display.print(razv);
    display.setTextColor(BLACK);
    display.print(" P");
    if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; SinU=SinU-20;if(SinU<20){SinU=20;}}
    if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; SinU=SinU+20;if(SinU>230){SinU=230;}}   
    display.fillCircle(80,47-SinU/7, 5, BLACK);
    display.fillCircle(80,47-SinU/7, 2, WHITE); 
}
if((pressBut == ok_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none; menu++;if(menu==4){menu=0;paus=0;}}//перебор меню
if (FreqCount.available()) { count = FreqCount.read();}//вывод частоты по готовности счетчика
//#######################################частоты сигнала
byte Frec1=0;
long Frec=0;
bool flagFrec1=0;
bool flagFrec2=0;
bool flagFrec3=0;
for(int y=1;y<255;y++){
  if(flagFrec1==0){if(mass[y]<SinU){flagFrec2=1;}}
  if(flagFrec1==0){if(flagFrec2==1){if(mass[y]>SinU){flagFrec1=1;Frec1=y;}}}
  if(flagFrec1==1){if(mass[y]<SinU){flagFrec3=1;}}
  if(flagFrec3==1){if(mass[y]>SinU){
  if (razv>=6){Frec=1000000/((y-Frec1-1)*3.27);}//delitel 4
  if (razv==5){Frec=1000000/((y-Frec1)*3.27)/2;}//delitel 8
  if (razv==4){Frec=1000000/((y-Frec1)*3.27)/4;}//delitel 16
  if (razv==3){Frec=1000000/((y-Frec1)*3.27)/8;}//delitel 32
  if (razv==2){Frec=1000000/((y-Frec1)*3.27)/16;}//delitel 64
  if (razv==2){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==1){Frec=1000000/((y-Frec1)*3.27)/32;}//delitel 128
  if (razv==0){Frec=1000000/((y-Frec1)*500);}//delitel 128
  flagFrec1=0;flagFrec3=0;}}}
//#######################################частоты сигнала
display.setTextColor( BLACK);
if(opornoe==1){
if((Vmax*VCC/255)>2.5){countX=count*(overclock/16.0);}
if((Vmax*VCC/255)<2.5){countX=Frec*(overclock/16.0);}}
if(opornoe==0){countX=Frec*(overclock/16.0);}
if(countX<1000){display.print(" ");display.print(countX);display.print("Hz");}
if(countX>1000){float countXK=countX/1000.0;display.print(countXK,1);display.print("KHz");}
if(opornoe==1){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*VCC/255,1);}
if(opornoe==0){display.setCursor(0,40);display.setTextColor(BLACK);
display.print(Vmax*1.1/255,1);}
display.print("V");
//#######################################отрисовка menu
////delay(200);  
display.display();
}
//------- end oscillograph


//#######################################режим ренератора
void Generator(){
display.clearDisplay();  
if (flag==0){//флаг выборов режима настройки ШИМ или Частоты
            if((pressBut == dec_press)&&(buttonFlag == bf_short)){
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              buttonFlag = bf_none;
              //delay(3);//защита от дребезга 
            }
            if((pressBut == inc_press)&&(buttonFlag == bf_short)){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              buttonFlag = bf_none;
              //delay(3);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима настройки ШИМ или Частоты
            if((pressBut == dec_press)&&(buttonFlag == bf_short)){
              PWM=PWM-1;
              if(PWM<0){PWM=255;}
              buttonFlag = bf_none; 
              //delay(3);//защита от дребезга
            
            }
            if((pressBut == inc_press)&&(buttonFlag == bf_short)){
              PWM=PWM+1;
              if(PWM>255){PWM=0;}
              buttonFlag =bf_none; 
              //delay(3);//защита от дребезга 
            }  
}      
if((pressBut == ok_press)&&(buttonFlag == bf_short)){//переключение разряда выбора частоты 
  //delay(3);//защита от дребезга
  buttonFlag =bf_none; 
  hag++;
  if(hag>=5){hag=0;}
} 
////////////
display.setTextSize(1);
display.setCursor(0,5);
display.print("PWM=");
display.print(PWM*100.0/255);
display.print(" %");
display.drawLine(0,0,83*PWM/255.0,0, BLACK);
display.drawLine(0,1,83*PWM/255.0,1, BLACK);
display.drawLine(0,2,83*PWM/255.0,2, BLACK);
display.drawLine(0,15,83*PWM/255.0,15, BLACK);
display.drawLine(0,16,83*PWM/255.0,16, BLACK);
display.drawLine(0,17,83*PWM/255.0,17, BLACK);
///////////    
display.setCursor(5,20);
 display.setTextSize(2);
long frequencyX=frequency*(overclock/16.0);
if(frequencyX<1000){display.print(frequencyX);display.setTextSize(1);display.println("Hz");}
if(frequencyX>1000){if(frequencyX<10000){display.print((frequencyX/1000.0),2);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=10000){if(frequencyX<100000){display.print((frequencyX/1000.0),1);display.setTextSize(1);display.println("KHz");}}
if(frequencyX>=100000){display.print((frequencyX/1000.0),0);display.setTextSize(1);display.println("KHz");}
display.setCursor(0,40);
display.setTextSize(1);
display.print(">>X ");    
      if(hag==0){//выбор множителя частоты
        
          display.print(1*(overclock/16.0),1); 
          mnog=1;
          flag=0;
      }
      if(hag==1){//выбор множителя частоты
          display.print(10*(overclock/16.0),0); 
          mnog=10;
      }
      if(hag==2){//выбор множителя частоты
          display.print(100*(overclock/16.0),0); 
          mnog=100;
      }
      if(hag==3){//выбор множителя частоты
          display.print(1000*(overclock/16.0),0); 
          mnog=1000;
      } 
      if(hag==4){//выбор  PWM
          display.print("PWM ");
          display.print(PWM*100.0/255);
          display.print("%"); 
          flag=1;
      } 
display.print("<<");        
pwmWrite(led, PWM);
//delay(300);  
display.display();
}
//======================

/////////////////////DDS
void DDSGenerator(){
int fr=10;
if(menuDDS==0){
    display.clearDisplay(); 
    display.setTextColor(WHITE, BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setCursor(10,20);
    display.println("Пила");
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    display.setCursor(0,40);
    //display.print("Частота=");
    //display.print(57);
    //display.print("Гц"); 
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=pgm_read_byte(&sinM[d]);
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    delay(200);}
if(menuDDS==1){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
    //display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=pgm_read_byte(&trianglM[d]);
      //PWM=trianglM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
    menuDDS++;
    delay(200);}
if(menuDDS==2){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setTextColor(BLACK);
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
    //display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=pgm_read_byte(&pilaM[d]);
      //PWM=pilaM[d];
      pwmWrite(dds,PWM);
     // delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==3){
    display.clearDisplay(); 
    display.setTextColor(BLACK); // 'inverted' text
    display.setCursor(10,0);
    display.println("Синус");
    display.setTextColor(BLACK);
    display.setCursor(10,10); 
    display.println("Треугольник");
    display.setTextColor(BLACK);
    display.setCursor(10,20);
    display.println("Пила");
    display.setTextColor(WHITE, BLACK);
    display.setCursor(10,30);
    display.println("Пила Обр");
    display.setTextColor(BLACK);
    //display.setCursor(0,40);
    //display.print("Частота=");
   // display.print(57);
   // display.print("Гц");
    delay(100);  
    display.display();
    while(D11_Read==LOW){
      PWM=pgm_read_byte(&RpilaM[d]);
      //PWM=RpilaM[d];
      pwmWrite(dds,PWM);
      //delayMicroseconds(fr);
      d++;
      if(d==32){d=0;}}
      menuDDS++;
    delay(200);}
if(menuDDS==4){menuDDS=0;}

}
/////////////////////DDS
/////////////////////TTL
void TTL(){
display.clearDisplay(); 
display.setTextColor(BLACK); 
display.setCursor(10,0);
display.println("Терминал");
display.setCursor(10,10);
display.println("Скорость");
display.setCursor(10,20);
display.print("-");
display.print(speedTTL);
display.println("+");
display.setCursor(0,30);
display.println("Нажми ОК-старт");
if((pressBut == inc_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none;speedTTL=speedTTL+100;}
if((pressBut == dec_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none;speedTTL=speedTTL-100;}
if(speedTTL<0){speedTTL=250000;}
if(speedTTL>250000){speedTTL=0;}
if((pressBut == ok_press)&&(buttonFlag == bf_short)){buttonFlag=bf_none;Serial.begin(speedTTL*(16/overclock));
      display.clearDisplay(); 
      //delay(100);  
      display.display();
      int x=0;
      int y=0; 
      while(1){ 
            char incomingBytes;  
            if (Serial.available() > 0) { // Если в буфере есть данные
                incomingBytes=Serial.read(); // Считывание байта в переменную incomeByte
                display.setCursor(x,y);
                display.print(incomingBytes); // Печать строки в буффер дисплея
                display.display(); x=x+6;
                if(x==84){x=0;y=y+8;}
                if(y==48){x=0;y=0;
                  display.clearDisplay(); 
                  delay(100);  
                  display.display();}}         
      }} 
//delay(100);  
display.display();  
}
/////////////////////TTL

 

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

Ghost_d, отлично получилось! 

Автор и правда делал Пультоскоп, а всё остальное были приятные плюшки.

Так что разбитие программы на куски это хорошее дело - мы как-то говорили тут про организацию нормального перехода между режимами(не через RESET), но чёт заглохло всё.

Спасибо!

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

Ghost_d пишет:

....

Надеюсь, что автор не против, что я "своими грязными" влез в его код :) Я основные процедуры не трогал (только обработку клавиш). Пока вот такой вариант. К сожалению, катастрофически не хватает времени

....

Автор для того и код выложил и комментировал, чтоб править под себя могли.))

это в помощь http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

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

VetalST пишет:

Лекс 59 Не знаю как у вас, но у меня после нажатия на кнопку ресет на ардуине нано на каком я это дело проверяю. Экран около 2-3 секунд продолжает показывать бред до полнго сброса и инециализации ардуины. И зачем тогда делать программное отключение экрана если после каждого ресета экрану постепенно будет приходить задница. 

 

Интересно. Я такого не замечал, правда я даже не помню когда пользовался резетом на ардуинке. А вот на голом МК (у меня сейчас так) - эффект мгновенный. Не обращал внимание, честно.

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

VetalST пишет:

По просьбе Лекс 59 добавил 4 пункт в меню lcd.PowerOff ссилка на скетч https://yadi.sk/d/TlBDtbVKsJBt5

При нажатии кнопки ОК в меню отключается програмно экран. Питание ардуины и экрана отключаем ручками выключатель (отключаем АКБ). Переключение между программами через кнопку ресет.

 

Спасибо. Поверьте, благодарю от души. А то каждый раз кошки на душе скребут при выключении. Я за такой вариант уцепился потому, что он самый простой. Дополнительного железа - одна кнопка резет. Которая и без того желательна. Изменения в программе - минимальны. Но выключение в 2 этапа.

Меня устраивает.

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

Пора тему с LS020 в отдельную ветку выводить.

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

пора окончательный(с АЦП и ОУ)  вариант Пультоскопа запускать ))))))

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

Для VetalST

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

   lcd.PowerOff(); // выключаем дисплей командой выключения, чтобы продлить срок его службы

пишет ошибку
class S65Display' has no member named 'PowerOff'

Библиотеки прикрутил. Версия 1.0.5.

Если эту строчку закомментировать, дальше проходит вроде и загружается в про-мини (чтобы снять хекс для меги328).

Как я понимаю, в этой строчке и есть команда на выключение. Возможно просто синтаксис?

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

Лекс 59 пишет:

Для VetalST

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

   lcd.PowerOff(); // выключаем дисплей командой выключения, чтобы продлить срок его службы

пишет ошибку
class S65Display' has no member named 'PowerOff'

Библиотеки прикрутил. Версия 1.0.5.

Если эту строчку закомментировать, дальше проходит вроде и загружается в про-мини (чтобы снять хекс для меги328).

Как я понимаю, в этой строчке и есть команда на выключение. Возможно просто синтаксис?

Скорее всего не та версия библиотеки. У нее нет такого класса.

VetalST
Offline
Зарегистрирован: 29.12.2015

Лекс 59  переводчик гугл на запрос has no member named выдал (не имеее ни одного члена с именем) вы не установили библиотеку или где то стоит старая удалите ее и установите S65Display_ls020_PowerOff

lcd.PowerOff(); // выключаем дисплей командой выключения, чтобы продлить срок его службы

Это и есть отключение всего одна строчка. Можите прописать где вам угодно.
 
 
VetalST
Offline
Зарегистрирован: 29.12.2015

240265 пишет:

Пора тему с LS020 в отдельную ветку выводить.

Я не против, а смысл плодить темы если все ждут версии с внешним АЦП. И получится ли переплюнуть на ардуине всем известний "хамелеон" на меге32 и экране LS020. Вот и подстраиваю экран под ардуину, может в будущем все обладатели "хамелеона" прейдут на ардуину (:

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

VetalST пишет:

 вы не установили библиотеку или где то стоит старая удалите ее и установите S65Display_ls020_PowerOff

lcd.PowerOff(); // выключаем дисплей командой выключения, чтобы продлить срок его службы

Это и есть отключение всего одна строчка. Можите прописать где вам угодно.
 
 

Вы правы. Ардуино брала библиотеку из Мои документы/Ардуино. Там ее переименовал. Все загрузилось. Сейчас буду пробовать. Спасибо.

...............................

Все четко. Пункт в меню. жму ОК экран белеет. На радостях тут же забыл об этой функии и выключил так. Ничего - привыкну.

Попробовал выход из режима Осциллоскоп резетом. Доли секунды до перехода в меню. Не понимаю, почему на Ардуине это не так. Та же самая мега.

Благодарю вас.

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

VetalST пишет:

240265 пишет:

Пора тему с LS020 в отдельную ветку выводить.

Я не против, а смысл плодить темы если все ждут версии с внешним АЦП. И получится ли переплюнуть на ардуине всем известний "хамелеон" на меге32 и экране LS020. Вот и подстраиваю экран под ардуину, может в будущем все обладатели "хамелеона" прейдут на ардуину (:

Я даже больше скажу. Мы ведь не ЛС020 обсуждали, а версию ПУЛЬТОСКОПА на нем. Нахождение в данной ветке закономерно. И вообще-то это решать Автору.

VetalST
Offline
Зарегистрирован: 29.12.2015

В ардуине если я не ошибаюсь после ресета сначала начинает грузится бодлоадер, а потом сама программа залита в ардуину.  Вот и эти 2-3 секунды. В чистом мк такого не должно быть.

Вопрос кто проверял код Ghost_d с переходом в общее меню. Я когда то делал подобное, но там глюки были без ресета. Нужно делать что бы переменные сбрасивались в начальное значение и т.д усложняя код. Я так и закинул тот вариант, не захотел заморачиватся.

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

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

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

Пожулайста, уважаемые владельцы LS020. Уйдите в другую тему! Решите там все вопросы с дисплеем. Надоело в день по 20 писем получать не по теме. Спасибо.

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

sirota пишет:

Пожулайста, уважаемые владельцы LS020. Уйдите в другую тему! Решите там все вопросы с дисплеем. Надоело в день по 20 писем получать не по теме. Спасибо.

извините больше не буду

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

Немного переосмыслил проект. И для себя решил так:

СХЕМА:

Arduino pro mini+LCD Nokia+RC-цепочка+2 диода на входе щупа (для защиты pin)+делитель входного сигнала (1:10)+Step-Up на MC34063 (3.7 to 5V)+китайская плата зарядника Li-ion+АКБ от сотового+четыре свободных вывода со стабилитронами под Logic Analizer+кнопка питания

 

СОФТ: уже имеющиеся осцилограф и генератор меандра+мини-логический анализатор+DDS-генератор (придется писать свой вариант) с регулировкой частоты.

P.S. А как отписаться от уведомлений? А то варианты прикручивания других дисплеев уже притомили.... А ничего толкового по допиливанию ПО - нет :(

VetalST
Offline
Зарегистрирован: 29.12.2015

Какая разница какой экран обсуждать?????????

Тема и была создана что бы разнообразить пультоскоп под разные экраны. И темы создают что бы вопросы решать, а если нужен готовый и испытанный проект то ищите на сайте у автора http://srukami.inf.ua/ там уже все розжовано, благодаря bodriy2014 и форуму .

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

P. S не правильно создавать темы и пользоватся чужим трудам !!!!!

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

VetalST пишет:

.....

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

P. S не правильно создавать темы и пользоватся чужим трудам !!!!!

Я за прогресс)))

Переносите обсуждение так как считаете будет эффективней.

______

Если нужно будет какой-то окончательный вариант выложить на сайте пишите,

выложу с ссылкой на автора.

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

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

VetalST
Offline
Зарегистрирован: 29.12.2015

bodriy2014 Хорошо будет две темы про пультоскоп.

Я жду не дождусь от вас с внешним АЦП.  

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

VetalST пишет:

bodriy2014 Хорошо будет две темы про пультоскоп.

Я жду не дождусь от вас с внешним АЦП.  

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

Окмор уже начал внишний АЦП+Ардуинку+LCD скрещивать.

Думаю от него будет интересный вариант!(смайл уверенный)

VetalST
Offline
Зарегистрирован: 29.12.2015

А что Окмор тогда не делется своими достижениями???

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

Xumuk пишет:

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

Переделайте питание на 3.3в , сигналы через резисторы 4.3К.

VetalST
Offline
Зарегистрирован: 29.12.2015

Xumuk

На 5110 плохой контакт между стеклом и платой через резинку. Плохо прижимат железка уж очень тонкая и легко гнется.  Я свои разбираю и между железкой и стеклом подкладываю маленький размером с контакы кусочек толстой изоленты или тоненький пористый двусторонний скотч. И проблема решена.

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

Линия осциллограммы пультоскопа толстовата - это так задумано? Если нет, то зачем затрачивать время на отрисовку дублирующих пикселей?

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

VetalST пишет:

А что Окмор тогда не делется своими достижениями???

У меня критически не хватает времени. 

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

Схема с виртуальной землей работает, но на высоких частотах по фронту сигнала наблюдается странный всплеск. Его природу не могу отследить. На рисунке всплеск есть на ниспадающем фронте, но он значительно больше на фронтальном плече. Когда доделаю генератор, смогу исследовать это явление на разных формах сигнала. Кстати рекомендую генератор предложенный выше. Он очень простой и позволяет генерировать синусоиду и пилу. Всплеск наблюдается на меандре. Частота 500 Кгц.

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

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

т.е. всплеск только на меандре?

может пальцем в небо, но по питанию ничего не может быть?

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

karl2233 пишет:

т.е. всплеск только на меандре?

может пальцем в небо, но по питанию ничего не может быть?

Соберу генератор, пойду попробую все проверить на нормальном осциллографе. Может сам генератор такой меандр выдавал. Проверю пульсации на опорном, до и после повторителя ОУ.

vasska
Offline
Зарегистрирован: 21.04.2016

Спасибо автору проекта.

 Собрал на коленке. Понравилось. Со своими функциями справляется на УРА. Сегодня оформил в корпус.

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

VetalST пишет:

Xumuk

На 5110 плохой контакт между стеклом и платой через резинку. Плохо прижимат железка уж очень тонкая и легко гнется.  Я свои разбираю и между железкой и стеклом подкладываю маленький размером с контакы кусочек толстой изоленты или тоненький пористый двусторонний скотч. И проблема решена.


Не помогло(((

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

vasska пишет:

Спасибо автору проекта.

 Собрал на коленке. Понравилось. Со своими функциями справляется на УРА. Сегодня оформил в корпус.

Ждем фото в корпусе!

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

Okmor пишет:
по фронту сигнала наблюдается странный всплеск. 

несколько мыслей:

1. самовозбуждение ОУ не может быть причиной?

2. может виртуальная земля давать такой эффект?

3. если виртуальная земля не при чём, может есть смысл выложить схему?   ОУ и АЦП, что б не искать по теме и не собирать из кусков - тогда количество проверяющих станет больше и вместе победим проблему.

vasska
Offline
Зарегистрирован: 21.04.2016

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

vasska, хорошо получилось!

только в такой корпус можно впихнуть ещё один Пультоскоп))))

ну или транзистортестер, что б работали на один экран.

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

vasska

Классно получилось!

vasska
Offline
Зарегистрирован: 21.04.2016

там ак.зарядник и преобразователь.Делать очень маленький -в руках плохо лежит.

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

karl2233 пишет:

1. самовозбуждение ОУ не может быть причиной?

2. может виртуальная земля давать такой эффект?

3. если виртуальная земля не при чём, может есть смысл выложить схему?   ОУ и АЦП, что б не искать по теме и не собирать из кусков - тогда количество проверяющих станет больше и вместе победим проблему.

Там гораздо интереснее тот факт, что всплеск на каждом третьем импульсе. Законы инерции работают и в электронике. На электронно-лучевых тоже приходится бороться с подобным. Но там понятно - большие токи выходных каскадов усилителей. Большую толпу электронов, образно говоря, трудно заставить изменить направление мгновенно. И тогда идут подобные всплески по передним фронтам. Но почему по заднему фронту? и почему на каждом третьем? Это уже похоже на хитрые эффекты во внутренних цепях. Возможно резонансные явления.

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

хе-хе, а ведь на резонанс это и похоже!

Joiner
Offline
Зарегистрирован: 04.09.2014

А почему устройство называется "Пультоскоп"?  слышал раньше "Осцилограф", "Осциллоскоп". Похоже на название нового брэнда :)

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

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

Joiner пишет:

А почему устройство называется "Пультоскоп"?  слышал раньше "Осцилограф", "Осциллоскоп". Похоже на название нового брэнда :)

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

Ответ на ваш вопрос в видео, причем на первых секундах !)))

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

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

karl2233 пишет:

Okmor пишет:
по фронту сигнала наблюдается странный всплеск. 

несколько мыслей:

1. самовозбуждение ОУ не может быть причиной?

2. может виртуальная земля давать такой эффект?

3. если виртуальная земля не при чём, может есть смысл выложить схему?   ОУ и АЦП, что б не искать по теме и не собирать из кусков - тогда количество проверяющих станет больше и вместе победим проблему.

Joiner
Offline
Зарегистрирован: 04.09.2014

bodriy2014 пишет:

Ответ на ваш вопрос в видео, причем на первых секундах !)))

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

Смотрел это видео. Склероз меня подвел, забыл :)

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

Okmor, а эти всплески после первого или второго ОУ?

как вариант - поменять ОУ(мож с особенностями он попался?). и может быть ещё в разводке дело, ибо Лекс 59 верно заметил.

за схему - спасибо! так понимаю, рубильнок для стандартного способа заливки скетча.