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);
}
}