Задать вопрос

Как объединить третий скейтч в один на Arduino?

Всех приветствую , ни как не получается объединить в своем проекте третий скейтч в едино. Проект состоит из трех скейтчей . Первый - страница приветствия , второй - генератор передаваемых сигнала частот и третий - таймер времени для программного отключения и включения питания этого устройства ( через транзисторный ключ ) . Первые два работают исправно , при объединении третьего , все виснет . По отдельности все скейтчи работают . Уже избавился от delay в loop в пользу millis в третьем скейтче , компилируется , но все равно все виснет, подскажите куда копать , что мог упустить ?
Вот общий скейтч , третий там же , закомментирован. Весь скейтч не влез , выкладываю основную часть . Третий скейтч в комментариях .

//Libraries
#include <Wire.h>                 //библиотека для работы с интерфейсом I2C
#include <Rotary.h>               //Ben Buxton https://github.com/brianlow/Rotary
#include <si5351.h>               //Etherkit https://github.com/etherkit/Si5351Arduino
#include <Adafruit_GFX.h>         //Adafruit GFX https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_SSD1306.h>     //Adafruit SSD1306 https://github.com/adafruit/Adafruit_SSD1306

//пользовательские настройки
//------------------------------------------------------------------------------------------------------------
#define F_MIN        1000UL     // Нижний предел частоты
#define F_MAX        225000000UL // Верхний предел частоты
#define quartz       25000000    // Действительная частота кварца 
/* При наличии точного частотомера, подключить прибор, выставить на выходе С1 или С0, частоту
    25 000 000 Гц,  затем вращая ручку энкодера получить на дисплее частотомера
    показания 25 000 000 герц,  полученное значение ввести в поле #define quartz
*/
#define IF         0         // введите вашу IF (промежуточную) частоту, ex: 455 = 455kHz, 10700 = 10.7MHz, 0 = прямое преобразование частоты приемника или радиочастоты генератора, "+" будет добавляться, а "-" будет вычитаться сдвиг промежуточной частоты.
#define BAND_INIT  11        // введите ваш начальный диапазон (Band) (1-21) в начале работы проекта, ex: 1 = Freq Generator, 2 = 800kHz (MW – средние волны), 7 = 7.2MHz (40m), 11 = 14.1MHz (20m).
#define S_GAIN     303       // настройка чувствительности входа измерителя мощности (Signal Meter A/D input): 101 = 500mv; 202 = 1v; 303 = 1.5v; 404 = 2v; 505 = 2.5v; 1010 = 5v (max).
#define tunestep   A0        // контакт, к которому подключена кнопка для настройки шага настройки.
#define band       A1        // контакт, к которому подключена кнопка для выбора частотного диапазона.
#define rx_tx      A2        //контакт, к которому подключена кнопка для выбора режима RX / TX, RX = switch open (переключатель открыт), TX = switch closed to GND (переключатель замкнут на землю). В режиме TX частота IF (промежуточная) не учитывается.
#define adc        A3        // контакт, используемый как вход измерителя мощности (Signal Meter A/D input).
#define XT_CAL_F  108500       //Коэффициент калибровки Si5351, отрегулируйте, чтобы получить точно 10 МГц. Увеличение этого значения приведет к уменьшению частоты и наоборот
//------------------------------------------------------------------------------------------------------------

Rotary r = Rotary(2, 3);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
Si5351 si5351(0x60); //Si5351 I2C Address 0x60 (адрес I2C для Si5351)

/**************************************************************************
* Заявления
**************************************************************************/
volatile uint32_t bfo_f =  7800000000ULL / SI5351_FREQ_MULT;   // CLK0 start IF
volatile uint32_t vfo_t =  8000000000ULL / SI5351_FREQ_MULT;   // CLK2 start Tx freq
volatile uint32_t vfo_r = vfo_t - bfo_f;                       // CLK1 start Rx freq
volatile uint32_t vfo_s = vfo_t;                               // Saved for RIT
unsigned long freq, freqold, fstep;
long interfreq = IF, interfreqold = 0;
long cal = XT_CAL_F;
unsigned int smval;
byte encoder = 1;
byte stp, n = 1;
byte count, x, xo;
bool sts = 0;
unsigned int period = 100;
unsigned long  time_now = 0;
//const int ledPin = 11;
//int State = LOW;
//(long previousMillis = 0;)
//const long interval_1 = 10000;
//const long interval_2 = 30000;
//const long interval_3 = 50000;


//------------------ Установка дополнительных функций здесь  ---------------------------
//Удалить коммент (//) для применения нужного варианта. Задействовать только одно.
//#define IF_Offset // Показание на ЖКИ плюс(минус) на значение ПЧ
#define Direct_conversion // чатота на выходе как на ЖКИ. Прямой выход. Генератор.
//#define FreqX4  // частота на выходе, умноженная на четыре ...
//#define FreqX2  // частота на выходе, умноженная на два ...
//---------------------------------------------------------------------------------------

/**************************************/
/* Прервать процедуру обслуживания для      */
/* изменение частоты кодирующего устройства */
/**************************************/
ISR(PCINT2_vect) {
  char result = r.process();
  if (result == DIR_CW) set_frequency(1);
  else if (result == DIR_CCW) set_frequency(-1);
}

void set_frequency(short dir) {
  if (encoder == 1) {                         //Увеличение/уменьшение частоты
    if (dir == 1) freq = freq + fstep;
    if (freq >= 225000000) freq = 225000000;
    if (dir == -1) freq = freq - fstep;
    if (fstep == 1000000 && freq <= 1000000) freq = 1000000;
    else if (freq < 10000) freq = 10000;
  }
  if (encoder == 1) {                         //Указатель настройки графика вверх/вниз
    if (dir == 1) n = n + 1;
    if (n > 42) n = 1;
    if (dir == -1) n = n - 1;
    if (n < 1) n = 42;
  }
}

void setup() { 
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.display();

  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(tunestep, INPUT_PULLUP);   // Шаг настройки
  pinMode(band, INPUT_PULLUP);       // Группа
  pinMode(rx_tx, INPUT_PULLUP);      // RX - передача сигнала. TX - прием сигнала
  //pinMode(ledPin, OUTPUT);
  
     
  statup_text();                    // Страница приветствия
   
  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
  si5351.set_correction(cal, SI5351_PLL_INPUT_XO);
  si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA);  // Выходной ток 2 МА, 4 МА, 6 МА или 8 МА
  si5351.output_enable(SI5351_CLK0, 1);                  //1 - Включить / 0 - Отключить CLK
  si5351.output_enable(SI5351_CLK1, 0);
  si5351.output_enable(SI5351_CLK2, 0);
  
  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();

  count = BAND_INIT;         //количество = ИНИЦИАЛИЗАЦИЯ ДИАПАЗОНА
  bandpresets();             //диапазонные настройки
  stp = 4;
  setstep();        
  layout();                  //Pасположение
  displayfreq();             //Отображение на OLED  частот
}

void loop() {
   if (freqold != freq) {
    time_now = millis();
    tunegen();
    freqold = freq;
  }

  if (interfreqold != interfreq) {
    time_now = millis();
    tunegen();
    interfreqold = interfreq;
  }

  if (xo != x) {
    time_now = millis();
    xo = x;
  }

  if (digitalRead(tunestep) == LOW) {
    time_now = (millis() + 300);
    setstep();
    delay(300);
  }

  if (digitalRead(band) == LOW) {
    time_now = (millis() + 300);
    inc_preset();
    delay(300);
  }

  if (digitalRead(rx_tx) == LOW) {
    time_now = (millis() + 300);
    sts = 1;
  } else sts = 0;

  if ((time_now + period) > millis()) {
    displayfreq();
    layout();
  }
  sgnalread();
  
  //{
   // unsigned long currentMillis = millis ( );
   //if ( State == LOW ) {
  //if ( currentMillis - previousMillis >= interval_1 ) {
    // previousMillis = currentMillis;      
    // State = HIGH;                               //потушили
   //  Serial.print(" Go to High ");
   // Serial.println(currentMillis);
  //  digitalWrite (ledPin, State );
   //}}

  //if ( State == HIGH ) {
 // if ( currentMillis - previousMillis >= interval_2 ) {
  //   previousMillis = currentMillis;              
  //   State = LOW;                                //включили
  //  Serial.print(" Go to Low ");
   //  Serial.println(currentMillis);
   //  digitalWrite ( ledPin, State );
  // }}

  //if ( State == LOW ) {
  //if ( currentMillis - previousMillis >= interval_3 ) {
    // previousMillis = currentMillis;      
    // State = HIGH;                               //потушили
    //Serial.print(" Go to High ");
   // Serial.println(currentMillis);
    // digitalWrite (ledPin, State );
   //} 
  //} 
// }
}
  
void tunegen() {
  si5351.set_freq((freq + (interfreq * 1000ULL)) * 100ULL, SI5351_CLK0);
}

void displayfreq() {
  unsigned int m = freq / 1000000;
  unsigned int k = (freq % 1000000) / 1000;
  unsigned int h = (freq % 1000) / 1;

  display.clearDisplay();
  display.setTextSize(2);

  char buffer[15] = "";
  if (m < 1) {
    display.setCursor(41, 1);
    sprintf(buffer, "%003d.%003d", k, h);
  }
  else if (m < 100) {
    display.setCursor(5, 1); 
    sprintf(buffer, "%2d.%003d.%003d", m, k, h);
  }
  else if (m >= 100) {
    unsigned int h = (freq % 1000) / 10;
    display.setCursor(5, 1);
    sprintf(buffer, "%2d.%003d.%02d", m, k, h);
  }
  display.print(buffer);
}

void setstep() {
  switch (stp) {
    case 1: stp = 2; fstep = 1; break;
    case 2: stp = 3; fstep = 10; break;
    case 3: stp = 4; fstep = 1000; break;
    case 4: stp = 5; fstep = 5000; break;
    case 5: stp = 6; fstep = 10000; break;
    case 6: stp = 1; fstep = 1000000; break;
  }
}

void inc_preset() {
  count++;
  if (count > 21) count = 1;
  bandpresets();
  delay(50);

}
  • Вопрос задан
  • 176 просмотров
Подписаться 2 Простой 8 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы