Лекс 59 Емкости экрану до задници, не дергает ногами ISP ардуина. И это приводит к тому что контроллер экрана не занет что мы от него хотим. И пиксели продолжают светится плюс еще дольше от всяких емкостей. Ведь именно от это мы и хотели избавится.
Я лично для вас добавлю пункт в меню отключения. А себе оставлю первый вариант.
Лекс 59 Емкости экрану до задници, не дергает ногами ISP ардуина. И это приводит к тому что контроллер экрана не занет что мы от него хотим. И пиксели продолжают светится плюс еще дольше от всяких емкостей. Ведь именно от это мы и хотели избавится.
Я лично для вас добавлю пункт в меню отключения. А себе оставлю первый вариант.
Не могли бы вы потом нарисовать всю схему как все подключено
Предлагаю просто сделать выход в меню длинным нажатием кнопки ОК а там уже меню с отключением дисплея. Так скажем компромисс)
Выход в меню без ресета тоже не получется. Нужно полностью переписывать логику программы, а это уже другой пультоскоп получается.
А схемы как таковой и нет если вы хотите делать как хочет Лекс 59 себе. Будет просто добавлен пункт в меню отключить и при нажатии кнопки ОК будет отключатся програмно экран. А питание отключатся просто выключателем.
А по первому варианту прошивки в посте 1443 уже нарисовоно что и куда подключить ( 1 P-канальный мосфет и 1 транзистор, 4 резистра и 1 любой диод ) .
При нажатии кнопки ОК в меню отключается програмно экран. Питание ардуины и экрана отключаем ручками выключатель (отключаем АКБ). Переключение между программами через кнопку ресет.
Фу, потратил два вечера пытаясь разобраться в коде. Тяжеловато, однако!
Мне изначально не понравилось переход между режимами работы по ресету. И я попытался впихнуть в исходник код обработки кнопок: ДЛИННОЕ-КОРОТКОЕ. Судя по исходнику, автор изначально делал осцилограф (он находится в основном цикле 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
Автор и правда делал Пультоскоп, а всё остальное были приятные плюшки.
Так что разбитие программы на куски это хорошее дело - мы как-то говорили тут про организацию нормального перехода между режимами(не через RESET), но чёт заглохло всё.
Надеюсь, что автор не против, что я "своими грязными" влез в его код :) Я основные процедуры не трогал (только обработку клавиш). Пока вот такой вариант. К сожалению, катастрофически не хватает времени
....
Автор для того и код выложил и комментировал, чтоб править под себя могли.))
Лекс 59 Не знаю как у вас, но у меня после нажатия на кнопку ресет на ардуине нано на каком я это дело проверяю. Экран около 2-3 секунд продолжает показывать бред до полнго сброса и инециализации ардуины. И зачем тогда делать программное отключение экрана если после каждого ресета экрану постепенно будет приходить задница.
Интересно. Я такого не замечал, правда я даже не помню когда пользовался резетом на ардуинке. А вот на голом МК (у меня сейчас так) - эффект мгновенный. Не обращал внимание, честно.
При нажатии кнопки ОК в меню отключается програмно экран. Питание ардуины и экрана отключаем ручками выключатель (отключаем АКБ). Переключение между программами через кнопку ресет.
Спасибо. Поверьте, благодарю от души. А то каждый раз кошки на душе скребут при выключении. Я за такой вариант уцепился потому, что он самый простой. Дополнительного железа - одна кнопка резет. Которая и без того желательна. Изменения в программе - минимальны. Но выключение в 2 этапа.
Лекс 59 переводчик гугл на запрос has no member named выдал (не имеее ни одного члена с именем) вы не установили библиотеку или где то стоит старая удалите ее и установите S65Display_ls020_PowerOff
lcd.PowerOff(); // выключаем дисплей командой выключения, чтобы продлить срок его службы
Это и есть отключение всего одна строчка. Можите прописать где вам угодно.
Я не против, а смысл плодить темы если все ждут версии с внешним АЦП. И получится ли переплюнуть на ардуине всем известний "хамелеон" на меге32 и экране LS020. Вот и подстраиваю экран под ардуину, может в будущем все обладатели "хамелеона" прейдут на ардуину (:
Я не против, а смысл плодить темы если все ждут версии с внешним АЦП. И получится ли переплюнуть на ардуине всем известний "хамелеон" на меге32 и экране LS020. Вот и подстраиваю экран под ардуину, может в будущем все обладатели "хамелеона" прейдут на ардуину (:
Я даже больше скажу. Мы ведь не ЛС020 обсуждали, а версию ПУЛЬТОСКОПА на нем. Нахождение в данной ветке закономерно. И вообще-то это решать Автору.
В ардуине если я не ошибаюсь после ресета сначала начинает грузится бодлоадер, а потом сама программа залита в ардуину. Вот и эти 2-3 секунды. В чистом мк такого не должно быть.
Вопрос кто проверял код Ghost_d с переходом в общее меню. Я когда то делал подобное, но там глюки были без ресета. Нужно делать что бы переменные сбрасивались в начальное значение и т.д усложняя код. Я так и закинул тот вариант, не захотел заморачиватся.
Пожулайста, уважаемые владельцы LS020. Уйдите в другую тему! Решите там все вопросы с дисплеем. Надоело в день по 20 писем получать не по теме. Спасибо.
Пожулайста, уважаемые владельцы LS020. Уйдите в другую тему! Решите там все вопросы с дисплеем. Надоело в день по 20 писем получать не по теме. Спасибо.
Немного переосмыслил проект. И для себя решил так:
СХЕМА:
Arduino pro mini+LCD Nokia+RC-цепочка+2 диода на входе щупа (для защиты pin)+делитель входного сигнала (1:10)+Step-Up на MC34063 (3.7 to 5V)+китайская плата зарядника Li-ion+АКБ от сотового+четыре свободных вывода со стабилитронами под Logic Analizer+кнопка питания
СОФТ: уже имеющиеся осцилограф и генератор меандра+мини-логический анализатор+DDS-генератор (придется писать свой вариант) с регулировкой частоты.
P.S. А как отписаться от уведомлений? А то варианты прикручивания других дисплеев уже притомили.... А ничего толкового по допиливанию ПО - нет :(
Тема и была создана что бы разнообразить пультоскоп под разные экраны. И темы создают что бы вопросы решать, а если нужен готовый и испытанный проект то ищите на сайте у автора http://srukami.inf.ua/ там уже все розжовано, благодаря bodriy2014 и форуму .
Если автор bodriy2014 даст добро на использование его матереалов в другой теме могу и перенести.
P. S не правильно создавать темы и пользоватся чужим трудам !!!!!
загрузил скетч пультоскопа на 5110 дисплей он сначало начал моросить темнеть и темнеть дисплей а теперь вообще ничего не показывает, я так полагаю что эти дисплеи не надежные?
загрузил скетч пультоскопа на 5110 дисплей он сначало начал моросить темнеть и темнеть дисплей а теперь вообще ничего не показывает, я так полагаю что эти дисплеи не надежные?
Переделайте питание на 3.3в , сигналы через резисторы 4.3К.
На 5110 плохой контакт между стеклом и платой через резинку. Плохо прижимат железка уж очень тонкая и легко гнется. Я свои разбираю и между железкой и стеклом подкладываю маленький размером с контакы кусочек толстой изоленты или тоненький пористый двусторонний скотч. И проблема решена.
Схема с виртуальной землей работает, но на высоких частотах по фронту сигнала наблюдается странный всплеск. Его природу не могу отследить. На рисунке всплеск есть на ниспадающем фронте, но он значительно больше на фронтальном плече. Когда доделаю генератор, смогу исследовать это явление на разных формах сигнала. Кстати рекомендую генератор предложенный выше. Он очень простой и позволяет генерировать синусоиду и пилу. Всплеск наблюдается на меандре. Частота 500 Кгц.
Второй затык, это незнание ассемблера. На высоких частотах захвата С уже не подходит в качестве языка программирования. Нужны ассемблерные вставки с которыми у меня пока проблема.
может пальцем в небо, но по питанию ничего не может быть?
Соберу генератор, пойду попробую все проверить на нормальном осциллографе. Может сам генератор такой меандр выдавал. Проверю пульсации на опорном, до и после повторителя ОУ.
На 5110 плохой контакт между стеклом и платой через резинку. Плохо прижимат железка уж очень тонкая и легко гнется. Я свои разбираю и между железкой и стеклом подкладываю маленький размером с контакы кусочек толстой изоленты или тоненький пористый двусторонний скотч. И проблема решена.
3. если виртуальная земля не при чём, может есть смысл выложить схему? ОУ и АЦП, что б не искать по теме и не собирать из кусков - тогда количество проверяющих станет больше и вместе победим проблему.
3. если виртуальная земля не при чём, может есть смысл выложить схему? ОУ и АЦП, что б не искать по теме и не собирать из кусков - тогда количество проверяющих станет больше и вместе победим проблему.
Там гораздо интереснее тот факт, что всплеск на каждом третьем импульсе. Законы инерции работают и в электронике. На электронно-лучевых тоже приходится бороться с подобным. Но там понятно - большие токи выходных каскадов усилителей. Большую толпу электронов, образно говоря, трудно заставить изменить направление мгновенно. И тогда идут подобные всплески по передним фронтам. Но почему по заднему фронту? и почему на каждом третьем? Это уже похоже на хитрые эффекты во внутренних цепях. Возможно резонансные явления.
3. если виртуальная земля не при чём, может есть смысл выложить схему? ОУ и АЦП, что б не искать по теме и не собирать из кусков - тогда количество проверяющих станет больше и вместе победим проблему.
Предлагаю просто сделать выход в меню длинным нажатием кнопки ОК а там уже меню с отключением дисплея. Так скажем компромисс)
Лекс 59 Емкости экрану до задници, не дергает ногами ISP ардуина. И это приводит к тому что контроллер экрана не занет что мы от него хотим. И пиксели продолжают светится плюс еще дольше от всяких емкостей. Ведь именно от это мы и хотели избавится.
Я лично для вас добавлю пункт в меню отключения. А себе оставлю первый вариант.
Лекс 59 Емкости экрану до задници, не дергает ногами ISP ардуина. И это приводит к тому что контроллер экрана не занет что мы от него хотим. И пиксели продолжают светится плюс еще дольше от всяких емкостей. Ведь именно от это мы и хотели избавится.
Я лично для вас добавлю пункт в меню отключения. А себе оставлю первый вариант.
Не могли бы вы потом нарисовать всю схему как все подключено
Выход в меню без ресета тоже не получется. Нужно полностью переписывать логику программы, а это уже другой пультоскоп получается.
А схемы как таковой и нет если вы хотите делать как хочет Лекс 59 себе. Будет просто добавлен пункт в меню отключить и при нажатии кнопки ОК будет отключатся програмно экран. А питание отключатся просто выключателем.
А по первому варианту прошивки в посте 1443 уже нарисовоно что и куда подключить ( 1 P-канальный мосфет и 1 транзистор, 4 резистра и 1 любой диод ) .
По просьбе Лекс 59 добавил 4 пункт в меню lcd.PowerOff ссилка на скетч https://yadi.sk/d/TlBDtbVKsJBt5
При нажатии кнопки ОК в меню отключается програмно экран. Питание ардуины и экрана отключаем ручками выключатель (отключаем АКБ). Переключение между программами через кнопку ресет.
Фу, потратил два вечера пытаясь разобраться в коде. Тяжеловато, однако!
Мне изначально не понравилось переход между режимами работы по ресету. И я попытался впихнуть в исходник код обработки кнопок: ДЛИННОЕ-КОРОТКОЕ. Судя по исходнику, автор изначально делал осцилограф (он находится в основном цикле loop), а остальной фарш - типа, пришлепки. Я вынес все в отдельные процедуры и получились следующие состояния для FSM: ОСНОВНОЕ МЕНЮ ВЫБОРА РЕЖИМА, ОСЦИЛОГРАФ, ГЕНЕРАТОР МЕАНДРА, DDS-ГЕНЕРАТОР и ТЕРМИНАЛ. Такой подход будет более удобен, так как разные люди могут независимо трудиться над каждой частью. И компилить под себя необходимые режимы (может кому-то DDS вовсе не нужно, но нужен ЛОГИЧЕСКИЙ анализатор и т.п.)
В таком варианте, переход к основному меню - длительное нажатие кнопки ОК. Однако есть засада: режимы DDS и ТЕРМИНАЛ - глухие, т.е. из них выхода нет. Их придется переделывать.
Надеюсь, что автор не против, что я "своими грязными" влез в его код :) Я основные процедуры не трогал (только обработку клавиш). Пока вот такой вариант. К сожалению, катастрофически не хватает времени
Ghost_d, отлично получилось!
Автор и правда делал Пультоскоп, а всё остальное были приятные плюшки.
Так что разбитие программы на куски это хорошее дело - мы как-то говорили тут про организацию нормального перехода между режимами(не через RESET), но чёт заглохло всё.
Спасибо!
....
Надеюсь, что автор не против, что я "своими грязными" влез в его код :) Я основные процедуры не трогал (только обработку клавиш). Пока вот такой вариант. К сожалению, катастрофически не хватает времени
....
Автор для того и код выложил и комментировал, чтоб править под себя могли.))
это в помощь http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Лекс 59 Не знаю как у вас, но у меня после нажатия на кнопку ресет на ардуине нано на каком я это дело проверяю. Экран около 2-3 секунд продолжает показывать бред до полнго сброса и инециализации ардуины. И зачем тогда делать программное отключение экрана если после каждого ресета экрану постепенно будет приходить задница.
Интересно. Я такого не замечал, правда я даже не помню когда пользовался резетом на ардуинке. А вот на голом МК (у меня сейчас так) - эффект мгновенный. Не обращал внимание, честно.
По просьбе Лекс 59 добавил 4 пункт в меню lcd.PowerOff ссилка на скетч https://yadi.sk/d/TlBDtbVKsJBt5
При нажатии кнопки ОК в меню отключается програмно экран. Питание ардуины и экрана отключаем ручками выключатель (отключаем АКБ). Переключение между программами через кнопку ресет.
Спасибо. Поверьте, благодарю от души. А то каждый раз кошки на душе скребут при выключении. Я за такой вариант уцепился потому, что он самый простой. Дополнительного железа - одна кнопка резет. Которая и без того желательна. Изменения в программе - минимальны. Но выключение в 2 этапа.
Меня устраивает.
Пора тему с LS020 в отдельную ветку выводить.
пора окончательный(с АЦП и ОУ) вариант Пультоскопа запускать ))))))
Для VetalST
Большая просьба, как появится время и желание вы не могли бы взглянуть. Ардуино тормозится вот на этой строчке
Библиотеки прикрутил. Версия 1.0.5.
Если эту строчку закомментировать, дальше проходит вроде и загружается в про-мини (чтобы снять хекс для меги328).
Как я понимаю, в этой строчке и есть команда на выключение. Возможно просто синтаксис?
Для VetalST
Большая просьба, как появится время и желание вы не могли бы взглянуть. Ардуино тормозится вот на этой строчке
Библиотеки прикрутил. Версия 1.0.5.
Если эту строчку закомментировать, дальше проходит вроде и загружается в про-мини (чтобы снять хекс для меги328).
Как я понимаю, в этой строчке и есть команда на выключение. Возможно просто синтаксис?
Скорее всего не та версия библиотеки. У нее нет такого класса.
Лекс 59 переводчик гугл на запрос has no member named выдал (не имеее ни одного члена с именем) вы не установили библиотеку или где то стоит старая удалите ее и установите S65Display_ls020_PowerOff
lcd.PowerOff(); // выключаем дисплей командой выключения, чтобы продлить срок его службы
Пора тему с LS020 в отдельную ветку выводить.
Я не против, а смысл плодить темы если все ждут версии с внешним АЦП. И получится ли переплюнуть на ардуине всем известний "хамелеон" на меге32 и экране LS020. Вот и подстраиваю экран под ардуину, может в будущем все обладатели "хамелеона" прейдут на ардуину (:
вы не установили библиотеку или где то стоит старая удалите ее и установите S65Display_ls020_PowerOff
lcd.PowerOff(); // выключаем дисплей командой выключения, чтобы продлить срок его службы
Вы правы. Ардуино брала библиотеку из Мои документы/Ардуино. Там ее переименовал. Все загрузилось. Сейчас буду пробовать. Спасибо.
...............................
Все четко. Пункт в меню. жму ОК экран белеет. На радостях тут же забыл об этой функии и выключил так. Ничего - привыкну.
Попробовал выход из режима Осциллоскоп резетом. Доли секунды до перехода в меню. Не понимаю, почему на Ардуине это не так. Та же самая мега.
Благодарю вас.
Пора тему с LS020 в отдельную ветку выводить.
Я не против, а смысл плодить темы если все ждут версии с внешним АЦП. И получится ли переплюнуть на ардуине всем известний "хамелеон" на меге32 и экране LS020. Вот и подстраиваю экран под ардуину, может в будущем все обладатели "хамелеона" прейдут на ардуину (:
Я даже больше скажу. Мы ведь не ЛС020 обсуждали, а версию ПУЛЬТОСКОПА на нем. Нахождение в данной ветке закономерно. И вообще-то это решать Автору.
В ардуине если я не ошибаюсь после ресета сначала начинает грузится бодлоадер, а потом сама программа залита в ардуину. Вот и эти 2-3 секунды. В чистом мк такого не должно быть.
Вопрос кто проверял код Ghost_d с переходом в общее меню. Я когда то делал подобное, но там глюки были без ресета. Нужно делать что бы переменные сбрасивались в начальное значение и т.д усложняя код. Я так и закинул тот вариант, не захотел заморачиватся.
нарисовал платку чтобы не городить кучу проводков на макетке, может кому понадобится
Пожулайста, уважаемые владельцы LS020. Уйдите в другую тему! Решите там все вопросы с дисплеем. Надоело в день по 20 писем получать не по теме. Спасибо.
Пожулайста, уважаемые владельцы LS020. Уйдите в другую тему! Решите там все вопросы с дисплеем. Надоело в день по 20 писем получать не по теме. Спасибо.
извините больше не буду
Немного переосмыслил проект. И для себя решил так:
СХЕМА:
Arduino pro mini+LCD Nokia+RC-цепочка+2 диода на входе щупа (для защиты pin)+делитель входного сигнала (1:10)+Step-Up на MC34063 (3.7 to 5V)+китайская плата зарядника Li-ion+АКБ от сотового+четыре свободных вывода со стабилитронами под Logic Analizer+кнопка питания
СОФТ: уже имеющиеся осцилограф и генератор меандра+мини-логический анализатор+DDS-генератор (придется писать свой вариант) с регулировкой частоты.
P.S. А как отписаться от уведомлений? А то варианты прикручивания других дисплеев уже притомили.... А ничего толкового по допиливанию ПО - нет :(
Какая разница какой экран обсуждать?????????
Тема и была создана что бы разнообразить пультоскоп под разные экраны. И темы создают что бы вопросы решать, а если нужен готовый и испытанный проект то ищите на сайте у автора http://srukami.inf.ua/ там уже все розжовано, благодаря bodriy2014 и форуму .
Если автор bodriy2014 даст добро на использование его матереалов в другой теме могу и перенести.
P. S не правильно создавать темы и пользоватся чужим трудам !!!!!
.....
Если автор bodriy2014 даст добро на использование его матереалов в другой теме могу и перенести.
P. S не правильно создавать темы и пользоватся чужим трудам !!!!!
Я за прогресс)))
Переносите обсуждение так как считаете будет эффективней.
______
Если нужно будет какой-то окончательный вариант выложить на сайте пишите,
выложу с ссылкой на автора.
загрузил скетч пультоскопа на 5110 дисплей он сначало начал моросить темнеть и темнеть дисплей а теперь вообще ничего не показывает, я так полагаю что эти дисплеи не надежные?
bodriy2014 Хорошо будет две темы про пультоскоп.
Я жду не дождусь от вас с внешним АЦП.
bodriy2014 Хорошо будет две темы про пультоскоп.
Я жду не дождусь от вас с внешним АЦП.
В нашем полку еще есть бравые вояки,
Окмор уже начал внишний АЦП+Ардуинку+LCD скрещивать.
Думаю от него будет интересный вариант!(смайл уверенный)
А что Окмор тогда не делется своими достижениями???
загрузил скетч пультоскопа на 5110 дисплей он сначало начал моросить темнеть и темнеть дисплей а теперь вообще ничего не показывает, я так полагаю что эти дисплеи не надежные?
Переделайте питание на 3.3в , сигналы через резисторы 4.3К.
Xumuk
На 5110 плохой контакт между стеклом и платой через резинку. Плохо прижимат железка уж очень тонкая и легко гнется. Я свои разбираю и между железкой и стеклом подкладываю маленький размером с контакы кусочек толстой изоленты или тоненький пористый двусторонний скотч. И проблема решена.
Линия осциллограммы пультоскопа толстовата - это так задумано? Если нет, то зачем затрачивать время на отрисовку дублирующих пикселей?
А что Окмор тогда не делется своими достижениями???
У меня критически не хватает времени.
Столкнулся с проблемой, что у меня нет нормального генератора. Пока делаю нормальный генератор сигнала для экспериментов. Как закончу, вернусь к пультоскопу.
Схема с виртуальной землей работает, но на высоких частотах по фронту сигнала наблюдается странный всплеск. Его природу не могу отследить. На рисунке всплеск есть на ниспадающем фронте, но он значительно больше на фронтальном плече. Когда доделаю генератор, смогу исследовать это явление на разных формах сигнала. Кстати рекомендую генератор предложенный выше. Он очень простой и позволяет генерировать синусоиду и пилу. Всплеск наблюдается на меандре. Частота 500 Кгц.
Второй затык, это незнание ассемблера. На высоких частотах захвата С уже не подходит в качестве языка программирования. Нужны ассемблерные вставки с которыми у меня пока проблема.
т.е. всплеск только на меандре?
может пальцем в небо, но по питанию ничего не может быть?
т.е. всплеск только на меандре?
может пальцем в небо, но по питанию ничего не может быть?
Соберу генератор, пойду попробую все проверить на нормальном осциллографе. Может сам генератор такой меандр выдавал. Проверю пульсации на опорном, до и после повторителя ОУ.
Спасибо автору проекта.
Собрал на коленке. Понравилось. Со своими функциями справляется на УРА. Сегодня оформил в корпус.
Xumuk
На 5110 плохой контакт между стеклом и платой через резинку. Плохо прижимат железка уж очень тонкая и легко гнется. Я свои разбираю и между железкой и стеклом подкладываю маленький размером с контакы кусочек толстой изоленты или тоненький пористый двусторонний скотч. И проблема решена.
Не помогло(((
Спасибо автору проекта.
Собрал на коленке. Понравилось. Со своими функциями справляется на УРА. Сегодня оформил в корпус.
Ждем фото в корпусе!
несколько мыслей:
1. самовозбуждение ОУ не может быть причиной?
2. может виртуальная земля давать такой эффект?
3. если виртуальная земля не при чём, может есть смысл выложить схему? ОУ и АЦП, что б не искать по теме и не собирать из кусков - тогда количество проверяющих станет больше и вместе победим проблему.
vasska, хорошо получилось!
только в такой корпус можно впихнуть ещё один Пультоскоп))))
ну или транзистортестер, что б работали на один экран.
vasska
Классно получилось!
там ак.зарядник и преобразователь.Делать очень маленький -в руках плохо лежит.
1. самовозбуждение ОУ не может быть причиной?
2. может виртуальная земля давать такой эффект?
3. если виртуальная земля не при чём, может есть смысл выложить схему? ОУ и АЦП, что б не искать по теме и не собирать из кусков - тогда количество проверяющих станет больше и вместе победим проблему.
Там гораздо интереснее тот факт, что всплеск на каждом третьем импульсе. Законы инерции работают и в электронике. На электронно-лучевых тоже приходится бороться с подобным. Но там понятно - большие токи выходных каскадов усилителей. Большую толпу электронов, образно говоря, трудно заставить изменить направление мгновенно. И тогда идут подобные всплески по передним фронтам. Но почему по заднему фронту? и почему на каждом третьем? Это уже похоже на хитрые эффекты во внутренних цепях. Возможно резонансные явления.
хе-хе, а ведь на резонанс это и похоже!
А почему устройство называется "Пультоскоп"? слышал раньше "Осцилограф", "Осциллоскоп". Похоже на название нового брэнда :)
Очень интересная и живая тема на форуме. Будет время, тоже попробую сделать.
А почему устройство называется "Пультоскоп"? слышал раньше "Осцилограф", "Осциллоскоп". Похоже на название нового брэнда :)
Очень интересная и живая тема на форуме. Будет время, тоже попробую сделать.
Ответ на ваш вопрос в видео, причем на первых секундах !)))
https://www.youtube.com/watch?v=OuyTVQXz458
несколько мыслей:
1. самовозбуждение ОУ не может быть причиной?
2. может виртуальная земля давать такой эффект?
3. если виртуальная земля не при чём, может есть смысл выложить схему? ОУ и АЦП, что б не искать по теме и не собирать из кусков - тогда количество проверяющих станет больше и вместе победим проблему.
Ответ на ваш вопрос в видео, причем на первых секундах !)))
https://www.youtube.com/watch?v=OuyTVQXz458
Смотрел это видео. Склероз меня подвел, забыл :)
Okmor, а эти всплески после первого или второго ОУ?
как вариант - поменять ОУ(мож с особенностями он попался?). и может быть ещё в разводке дело, ибо Лекс 59 верно заметил.
за схему - спасибо! так понимаю, рубильнок для стандартного способа заливки скетча.