miércoles, 8 de julio de 2020

VFO DDS AD9850 transceptor ORVA BLU-100 (parte 3) SOFTWARE

Soft para atmega328  (DESACTIVAR EL TRADUCTOR AUTOMÁTICO DE GOOGLE)


/////////////////////////////////////////////////////////////////////////////
//     DDS VFO Ver2.04
//                         JA2NKD 2016.07.19
//
//   <Rotary.h>           https://github.com/brianlow/Rotary
//   <EF_AD9850.h> http://forum.arduino.cc/index.php?topic=77483.0
//   "Ucglib.h"            https://github.com/olikraus/ucglib
//
//----------------------------------------------------------------------------
//   Added      EEPROM function             2016/7/31 JA2GQP
//   Added      Doble Rotary                      2020/4/12 LU1DEH
//
///////////////////////////////////////////////////////////////////////////////

// Library include
#include <SPI.h>
#include <Rotary.h>
#include <EEPROM.h>
#include "Ucglib.h"


//----------   I/O setting  ---------------

/////////////////////
//  Hardware SPI Pins:
//  Arduino nano sclk=13, data=11
/////////////////////

const byte   __CS = 10;
const byte   __DC = 9;
const byte   __RST = 8;

const byte  W_CLK = A0; 
const byte  FQ_UD = A1; 
const byte  DATA = A2;                     

const byte modeout1 = 7;               

const byte modesw = 1;                 
const byte stepsw = 12;             
const byte ritsw = 6;                      
const byte txsw = A3;                       
const byte s_meter = A5;                
const byte t_meter = A4;                 

/////////////////////                     
// DDS parameter
/////////////////////

const unsigned long  DDS_CLK = 125000000L; // AD9850 Clock
const unsigned long  TWO_E32 = 4294967295L;// 2^32
const byte  DDS_CMD = B00000000;           // AD9850 Command

//----------  EEPROM Memory Address   ---------- 

const byte  Frq_Eep = 0x00;              
const byte  Stp_Eep = 0x10;            
const byte  Chn_Eep = 0x20;              
const byte  Mode_Eep = 0x22;             
const byte  Eep_Int = 0x2e;               

const byte  Max_Chn = 1;             
const byte  Int_End = 73;               

//----------- Default Value -------------------- 

const long  DEF_FRQ = 7050000L;       
const long  DEF_STP = 100L;            
const byte  DEF_Mode = 0;              

//----------  Encorder Pin Assign(INT)  --------

Rotary r = Rotary(2, 3);
Rotary r1 = Rotary(4, 5);

//----------  TFT Ucglib Assign --------

Ucglib_ST7735_18x128x160_HWSPI ucg(/*sclk= 13, data= 11, */ /*cd=*/ 9 , /*cs=*/ 10, /*reset=*/ 8);

//----------  Memory Assign  --------------------------------

long int freq = DEF_FRQ;
long int freqmax = 10000000;
long int freqmin = 1000000;
long int freqold = 0;
long int freqrit = 0;
String freqt = String(freq);
long int ifshift = 0;
long int ifshiftLSB = -2000000;
long int ifshiftUSB = 2000000;
long int txshiftLSB = -2000000;
long int txshiftUSB = 2000000;
long int ddsfreq = 0;
char f10m, fmega, f100k, f10k, f1k, f100;
int ddsstep = 2;
int rit = 0;
int fstep = DEF_STP;
int fsteprit = 10;
int fmode;
int fmodeold = 1;
int flagrit = 0;
int fritold = 0;
int flagmode = 0;
int smeterval1 = 0;
int tmeterval = 0;
byte Byt_Chn;                       
byte Byt_Chnb;                     

//----------  Initialization  Program  ----------------------

void setup() {

  delay(100);
  Serial.begin(9600);
  ucg.begin(UCG_FONT_MODE_TRANSPARENT);  
  ucg.clearScreen();
  ucg.setRotate270();
  ucg.setFont(ucg_font_fub20_tf);
  ucg.setPrintPos(25, 75);           //75,45
  ucg.setColor(255, 255, 255);
  ucg.print("LU1DEH");
  delay(2000);
  ucg.clearScreen();

  pinMode(stepsw, INPUT_PULLUP);
  pinMode(ritsw, INPUT_PULLUP);
  pinMode(txsw, INPUT_PULLUP);
  pinMode(modesw, INPUT_PULLUP);
  pinMode(modeout1, OUTPUT);

  PCICR |= (1 << PCIE2) | (1 << PCIE1);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19) | (1 << PCINT20) | (1 << PCINT21);
  sei();

  pinMode(FQ_UD, OUTPUT);
  pinMode(W_CLK, OUTPUT);
  pinMode(DATA, OUTPUT);

  screen01();

  if (EEPROM.read(Eep_Int) != Int_End) {     
    delay(10);
    Fnc_Eep_Int();
  }

  Byt_Chn = EEPROM.read(Chn_Eep);        
  Byt_Chnb = Byt_Chn;                      
  Fnc_Eep_Rd();                         
  modeset();                           
  modeset(); 

  steplcd();
  freqt = String(freq);
  freqlcd();
}

//----------  Main program  ---------------------------------

void loop() {
  if (digitalRead(stepsw) == LOW) {
    setstep();
  }
  if (digitalRead(modesw) == LOW) {
    modeset();
  }
  if (digitalRead(ritsw) == LOW) {
    setrit();  // <JA2GQP>
    Fnc_Eep_Wt(Byt_Chn);
  }
  if (digitalRead(txsw) == LOW) {
    txset();
  }

  if (Byt_Chnb != Byt_Chn) {              
    Fnc_Eep_Wt(Byt_Chnb);
    Byt_Chnb = Byt_Chn;
    Fnc_Eep_Rd();
    steplcd();
  }

  if (flagrit == 1) {
    if (freqrit == fritold) {
      smeter();
    }

    if (freqrit != fritold) {
      ddswrite();
      fritold = freqrit;
    }
  }
  else {
    if (freq == freqold) {
      smeter();
    }
    ddswrite();
    freqt = String(freq);
    freqlcd();
    freqold = freq;
  }
}

//---------- Function Eeprom Initialization ------------  

void Fnc_Eep_Int() {
  int i;

  for (i = 0; i < 48; i++)                     
    EEPROM.write(i, 0);

  for (i = 0; i < Max_Chn; i++) {
    Fnc_Eep_Sav4(DEF_FRQ, Frq_Eep + i * 4);    
    Fnc_Eep_Sav4(DEF_STP, Stp_Eep + i * 4);    
  }

  EEPROM.write(Chn_Eep, 0);
  EEPROM.write(Mode_Eep, DEF_Mode);
  EEPROM.write(Eep_Int, Int_End);            
}

//----------  Function EEPROM Read  ---------     

void Fnc_Eep_Rd() {
  if ((0 <= Byt_Chn) && (Byt_Chn < Max_Chn))
    freq = Fnc_Eep_Lod4(Frq_Eep + Byt_Chn * 4);
  else {
    freq = Fnc_Eep_Lod4(Frq_Eep + 0);
    Byt_Chn = 0;
  }

  if ((0 <= Byt_Chn) && (Byt_Chn < Max_Chn))
    fstep = Fnc_Eep_Lod4(Stp_Eep + Byt_Chn * 4);
  else
    fstep = Fnc_Eep_Lod4(Stp_Eep + 0);

  fmode = EEPROM.read(Mode_Eep);
}

//----------  Function EEPROM Write  -------------------

void Fnc_Eep_Wt(byte chn) {
  if ((0 <= chn) && (chn < Max_Chn)) {
    Fnc_Eep_Sav4(freq, Frq_Eep + chn * 4);
    Fnc_Eep_Sav4(fstep, Stp_Eep + chn * 4);
  }

  EEPROM.write(Chn_Eep, Byt_Chn);
  EEPROM.write(Mode_Eep, fmode);
}

//----------  Function Save EEPROM 4byte  --------    

void Fnc_Eep_Sav4(long value, int address) {
  address += 3;
  for (int i = 0; i < 4; i++) {
    byte toSave = value & 0xFF;
    if (EEPROM.read(address) != toSave) {
      EEPROM.write(address, toSave);
    }
    value = value >> 8;
    address--;
  }
}

//----------  Function Load EEPROM 4byte  ---------      

long Fnc_Eep_Lod4(int address) {
  long value = 0;
  for (int i = 0; i < 4; i++) {
    value = value | EEPROM.read(address);
    if ( i < 3) {
      value = value << 8;
      address++;
    }
  }
  return value;
}

//----------  Function DDS set  ---------------          

void Fnc_Dds(double frquency) {
  unsigned long wrk = frquency * TWO_E32 / DDS_CLK;

  digitalWrite(FQ_UD, LOW);

  shiftOut(DATA, W_CLK, LSBFIRST, wrk);
  shiftOut(DATA, W_CLK, LSBFIRST, (wrk >> 8));
  shiftOut(DATA, W_CLK, LSBFIRST, (wrk >> 16));
  shiftOut(DATA, W_CLK, LSBFIRST, (wrk >> 24));
  shiftOut(DATA, W_CLK, LSBFIRST, DDS_CMD); 

  digitalWrite(FQ_UD, HIGH);
}

//---------- S-meter --------------------------

void smeter() {
  smeterval1 = analogRead(s_meter);
  smeterval1 = smeterval1 / 50;
  if (smeterval1 > 14) {
    smeterval1 = 14; 
  }
  int sx1 = sx1 + (smeterval1 * 9);    
  sx1 = sx1 + 21;                    
  int sx2 = 0;
  sx2 = sx2 + (40 + ((15 - smeterval1) * 9)); 
  ucg.setFont(ucg_font_fub20_tf);      
  ucg.setColor(0, 0, 0);               
  ucg.drawBox(sx1, 93, sx2, 8);
  ucg.setPrintPos(20, 104);            
  for (int i = 1; i <= smeterval1; i++) {
    if (i <= 8) {
      ucg.setColor(0, 255, 0);
      ucg.print("-");
    }
    else {
      ucg.setColor(255, 0, 0);
      ucg.print("-");
    }
  }
}

//---------- Transmission Power meter ------------------

void tmeter() {
  ucg.setColor(0, 0, 0);               
  ucg.drawBox(19, 69, 135, 8);          
  tmeterval = analogRead(t_meter);
  tmeterval = tmeterval / 50;
  if (tmeterval > 14) {
    tmeterval = 14;
  }
  int sx1 = sx1 + (tmeterval * 9);
  sx1 = sx1 + 21;
  int sx2 = 0;
  sx2 = sx2 + (40 + ((15 - tmeterval) * 9));
  ucg.setFont(ucg_font_fub20_tf);     
  ucg.setColor(0, 0, 0);               
  ucg.drawBox(sx1, 69, sx2, 8);
  ucg.setPrintPos(20, 80);            
  for (int i = 1; i <= tmeterval; i++) {
    if (i <= 10) {
      ucg.setColor(255, 185, 0);
      ucg.print("-");
    }
    else {
      ucg.setColor(250, 0, 0);
      ucg.print("-");
    }
  }
}

//---------- Encoder Interrupt -----------------------

ISR(PCINT2_vect) {
  if (flagrit == 1) {
    unsigned char result1 = r1.process();
    if (result1) {
      if (result1 == DIR_CW) {
        freqrit = freqrit + fsteprit;
        if (freqrit >= 3000) {
          freqrit = 3000;
        }
      }
      else {
        freqrit = freqrit - fsteprit;
        if (freqrit <= -3000) {
          freqrit = -3000;
        }
      }
    }
  }

  else {
    unsigned char result = r.process();
    if (result) {
      if (result == DIR_CW) {
        freq = freq + fstep;
        if (freq >= freqmax) {
          freq = freqmax;
        }
      }
      else {
        freq = freq - fstep;
        if (freq <= freqmin) {
          freq = freqmin;
        }
      }
    }
  }
}

//------------ On Air -----------------------------

void txset() {
  noInterrupts();
  if (flagmode == 0) {ddsfreq = freq + txshiftLSB;}
  if (flagmode == 1) {ddsfreq = freq + txshiftUSB;}

  Fnc_Dds(ddsfreq);                       

  ucg.setColor(0, 0, 0);
  ucg.drawBox(5, 3, 24, 22);

  while (digitalRead(txsw) == LOW) {
    tmeter();
    ucg.setFont(ucg_font_logisoso18_tr);
    ucg.setPrintPos(5, 23);
    ucg.setColor(255, 0, 0);
    ucg.print("Tx");
  }

  ddswrite();
  ucg.setColor(0, 0, 0);
  ucg.drawBox(19, 69, 135, 8);
  ucg.drawBox(19, 93, 135, 8);
  ucg.drawBox(5, 3, 24, 22);
  interrupts();
  ucg.setPrintPos(5, 23);
  ucg.setColor(0, 255, 0);
  ucg.print("Rx");
}

//------------- Mode change(LSB-USB) ------------

void modeset() {
  ucg.setFont(ucg_font_6x10_mf);  
  if (fmode == 1) {                         
    ifshift = ifshiftUSB;
    flagmode = 1;                          
    ucg.setColor(255, 255, 0);             
    ucg.setPrintPos(47, 43);                
    ucg.print("USB");
    ucg.setPrintPos(12, 43);               
    ucg.setColor(0, 0, 0);                  
    ucg.print("LSB");
  }

  if (fmode == 0) {                       
    ifshift = ifshiftLSB;
    flagmode = 0;                           
    ucg.setPrintPos(12, 43);               
    ucg.setColor(255, 255, 0);              
    ucg.print("LSB");
    ucg.setPrintPos(47, 43);                
    ucg.setColor(0, 0, 0);                
    ucg.print("USB");
  }

  fmode = fmode + 1;

  Byt_Chn++;                            
  if (Byt_Chn > 1)
    Byt_Chn = 0;

  if (fmode == 2) {
    fmode = 0;
  }
  while (digitalRead(modesw) == LOW);
}

//------------ Rit SET ------------------------------

void setrit() {
  if (flagrit == 0) {
    flagrit = 1;
    ucg.setFont(ucg_font_6x10_mf);        
    ucg.setPrintPos(82, 43);                 
    ucg.setColor(255, 255, 0);
    ucg.print("RIT");
  }
  else {
    flagrit = 0;
    ddsfreq = freq + ifshift;
    Fnc_Dds(ddsfreq);                    
    freqt = String(freq);
    ucg.setFont(ucg_font_6x10_mf);       
    ucg.setPrintPos(82, 43);             
    ucg.setColor(0, 0, 0);
    ucg.print("RIT");
    freqrit = 0;
  }
  while (digitalRead(ritsw) == LOW);
}

//-------------- Encorder frequency step set -----------

void setstep() {
  noInterrupts();
  if (fstep == 100) {
    fstep = 2500;
  }

  else {
    fstep = fstep * 4 / 100;
  }

  steplcd();
  while (digitalRead(stepsw) == LOW);
  interrupts();
}

//------------- Step Screen ---------------------------

void steplcd() {
  ucg.setColor(0, 0, 0);                 
  ucg.setFont(ucg_font_6x10_mf);        
  ucg.setPrintPos(120, 43);              
  if (fstep == 100) {
    ucg.print("Fast");
  }
  ucg.setColor(255, 255, 0);
  if (fstep == 2500) {
    ucg.print("Fast");
  }
}

//----------- Main frequency screen -------------------

void freqlcd() {
  ucg.setFont(ucg_font_logisoso18_hn);
  int mojisuu = (freqt.length());

  if (f10m != (freqt.charAt(mojisuu - 8))) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(55, 5, 14, 19);
    ucg .setPrintPos(55, 23);
    ucg.setColor(0, 255, 0);
    ucg.print(freqt.charAt(mojisuu - 8));
    f10m = (freqt.charAt(mojisuu - 8));
  }

  if (freq < 10000000) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(55, 5, 14, 19);
  }

  if (fmega != (freqt.charAt(mojisuu - 7))) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(70, 5, 14, 19);
    ucg .setPrintPos(70, 23);
    ucg.setColor(0, 255, 0);
    ucg.print(freqt.charAt(mojisuu - 7));
    fmega  = (freqt.charAt(mojisuu - 7));
  }

  if (freq >= 1000000) {
    ucg.setPrintPos(82, 23);
    ucg.setColor(0, 255, 0);
    ucg.print(".");
  }

  if (freq < 1000000) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(70, 5, 14, 19);          
    ucg.drawBox(82, 5, 7, 19);
  }

  if (f100k != (freqt.charAt(mojisuu - 6))) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(89, 5, 14, 19);        
    ucg.setPrintPos(89, 23);            
    ucg.setColor(0, 255, 0);
    ucg.print(freqt.charAt(mojisuu - 6));
    f100k = (freqt.charAt(mojisuu - 6));
  }

  if (freq < 100000) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(89, 5, 14, 19);         
  }

  if (f10k != (freqt.charAt(mojisuu - 5))) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(104, 5, 14, 19);         
    ucg.setPrintPos(104, 23);            
    ucg.setColor(0, 255, 0);
    ucg.print(freqt.charAt(mojisuu - 5));
    f10k = (freqt.charAt(mojisuu - 5));
  }

  if (freq < 10000) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(104, 5, 14, 19);          
  }

  if (f1k != (freqt.charAt(mojisuu - 4))) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(119, 5, 14, 19);    
    ucg.setPrintPos(119, 23);            
    ucg.setColor(0, 255, 0);
    ucg.print(freqt.charAt(mojisuu - 4));
    f1k  = (freqt.charAt(mojisuu - 4));
  }

  if (freq >= 1000) {
    ucg.setPrintPos(131, 23);          
    ucg.setColor(0, 255, 0);
    ucg.print(".");
  }

  if (freq < 1000) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(119, 5, 14, 19);         
  }

  if (f100 != (freqt.charAt(mojisuu - 3))) {
    ucg.setColor(0, 0, 0);
    ucg.drawBox(138, 5, 14, 19);        
    ucg.setPrintPos(138, 23);          
    ucg.setColor(0, 255, 0);
    ucg.print(freqt.charAt(mojisuu - 3));
    f100 = (freqt.charAt(mojisuu - 3));
  }

  if (freq <= 5000000) {
    digitalWrite(modeout1, HIGH);
  }

  else {
    digitalWrite(modeout1, LOW);
  }
}

//----------- Basic Screen -------------------------

void screen01() {
  ucg.setColor(255, 255, 255);         
  ucg.drawRFrame(0, 0, 35, 28, 3);     
  ucg.drawRFrame(40, 0, 120, 28, 3);
  ucg.setColor(55, 55, 55);          
  ucg.drawRBox(5, 33, 30, 13, 1);     
  ucg.drawRBox(40, 33, 30, 13, 1);     
  ucg.drawRBox(75, 33, 30, 13, 1);     
  ucg.drawRBox(110, 33, 45, 13, 1);     
  ucg.setFont(ucg_font_logisoso18_tr);
  ucg.setPrintPos(5, 23);
  ucg.setColor(0, 255, 0);
  ucg.print("Rx");
  ucg.setFont(ucg_font_6x10_mf);      
  ucg.setPrintPos(12, 43);             
  ucg.setColor(0, 0, 0);
  ucg.print("LSB");
  ucg.setPrintPos(47, 43);             
  ucg.print("USB");
  ucg.setPrintPos(82, 43);             
  ucg.print("RIT");
  ucg.setColor(255, 255, 100);         
  ucg.setPrintPos(7, 100);           
  ucg.print("S:");
  ucg.setPrintPos(7, 76);             
  ucg.print("P:");
  ucg.setColor(255, 255, 150);
  ucg.setPrintPos(20, 110);            
  ucg.print("_1___5__7__9__10__30_");
  ucg.setPrintPos(20, 86);            
  ucg.print("0__2__4__6__8__10__+_");
  ucg.setPrintPos(45, 124);             
  ucg.setColor(235, 0, 200);
  ucg.print("ORVA BLU-100");
}

//--------------- DDS Write -------------------------------

void ddswrite() {

  if (flagrit == 0) {
    ddsfreq = freq + ifshift;
    Fnc_Dds(ddsfreq);                            
  }

  if (flagrit == 1) {
    ddsfreq = freq + ifshift + freqrit;
    Fnc_Dds(ddsfreq);                          
  }
}

VFO DDS AD9850 transceptor ORVA BLU-100 (parte 2)


En esta parte del proyecto es donde las ideas cambian a diseños y reformas, para después ser funcionales al equipo

Fuente de alimentación.
Es un esquema básico de dos tensiones, 
9V para las distintas partes del equipo original y 
5V para la nueva parte digital.

Interfaz de acople
Acople, control y puesta en forma de señales 
entre las placas originales del equipo y la nueva parte digital

Microprocesador
Este es el cerebro del sistema, maneja todo el equipo por medio de dos Rotary Encoder, (RIT y frecuencia principal). Dos pulsadores, uno en el micrófono (modos) y otro en el frente del equipo (paso de frecuencia STEP). El cambio de bandas se hace a los 5Mhz, para arriba cambia a 40m y para abajo cambia a 80m (es cambio automático).

Cambio de filtros
Cambio de filtros BPF en RF y control relé LPF en la etapa de potencia.

Filtros LPF
Selección de filtros LPF en etapa de potencia.

Portadora
Una de las salidas del micro, esta dedicada al comando de la señal de portadora, para hacer ajuste de antena. La generación de portadora estaba en el circuito original del equipo, comandada por el sw en el potenciómetro de volumen, ahora el sw de cambio de modo (LSB, USB y Portadora) están en el micrófono de palma.

PCB`s